STM32---FreeRTOS软件定时器

一、简介

1、定时器介绍

2、软件定时器优缺点

3、FreeRTOS定时器特点

4、软件定时器相关配置

5、软件定时器的状态

6、单次定时器和周期定时器

1、举例

2、软件定时器状态转换图

二、 FreeRTOS软件定时器相关API函数

三、实验

1、代码

main.c

cs 复制代码
#include "stm32f10x.h"
#include "FreeRTOS.h"
#include "task.h"
#include "freertos_demo.h"
#include "Delay.h"
#include "sys.h"
#include "usart.h"
#include "LED.h"
#include "Key.h"

 
 int main(void)
 {	
	 
	 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组 4 
	 uart_init(115200);	 
	 delay_init();
	 Key_Init();
	 LED_Init();
	 
	    // 创建任务
   FrrrRTOS_Demo();
		 	  
}

freertos_demo.c

cs 复制代码
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
#include "event_groups.h"
#include "LED.h"
#include "Key.h"
#include "usart.h"
#include "delay.h"



void Timer1Callback( TimerHandle_t pxTimer );
void Timer2Callback( TimerHandle_t pxTimer );


/******************************************************************任务配置****************************************************/
//任务优先级
#define START_TASK_PRIO					1
//任务堆栈大小	
#define START_TASK_STACK_SIZE 	128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);


//任务优先级
#define TASK1_PRIO							2
//任务堆栈大小	
#define TASK1_STACK_SIZE 				128  
//任务句柄
TaskHandle_t Task1_Handler;
//任务函数
void task1(void *pvParameters);
 
//任务优先级



/******************************************************************任务函数****************************************************/
TimerHandle_t	Timer1_handle = 0;													//单次定时器
TimerHandle_t	Timer2_handle = 0;													//周期定时器

void FrrrRTOS_Demo(void)
{
			 //创建开始任务
		xTaskCreate((TaskFunction_t )start_task,            			//任务函数
                ( char*         )"start_task",          			//任务名称
                (uint16_t       )START_TASK_STACK_SIZE, 			//任务堆栈大小
                (void*          )NULL,                  			//传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       			//任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   			//任务句柄 
	  // 启动任务调度
		vTaskStartScheduler();
	 
}


 void start_task(void *pvParameters)
{
	  taskENTER_CRITICAL();           //进入临界区
	
	
	/**创建单次定时器**/
	
	  Timer1_handle  = xTimerCreate( "timer1", 1000,pdFALSE,(void *)1,Timer1Callback);
																		
	/**创建周期定时器**/		

	  Timer2_handle  = xTimerCreate( "timer2", 1000,pdTRUE,(void *)1,Timer2Callback);	
																
		


    //创建1任务
    xTaskCreate((TaskFunction_t )task1,     	
                (const char*    )"task1",   	
                (uint16_t       )TASK1_STACK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )TASK1_PRIO,	
                (TaskHandle_t*  )&Task1_Handler); 
  
		
    vTaskDelete(NULL); 							//删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}


//1按键扫描并控制任务定时器
void task1(void *pvParameters)
{
	uint8_t				key = 0;
	
	while(1)
	{
		key = Key_GetNum();
		if(key ==2)
		{
			printf("开启定时器\r\n");
			xTimerStart(Timer1_handle,portMAX_DELAY);
			xTimerStart(Timer2_handle,portMAX_DELAY);
		}else if(key ==3){
			printf("关闭定时器\r\n");
			xTimerStop(Timer1_handle,portMAX_DELAY);
			xTimerStop(Timer2_handle,portMAX_DELAY);
		
		}
		vTaskDelay(10);
	}
}

//timer1超时回调函数
void Timer1Callback( TimerHandle_t pxTimer )
{
		static uint32_t	timer = 0;
		printf("timer1的运行次数%d\r\n",++timer);
}

//timer2超时回调函数
void Timer2Callback( TimerHandle_t pxTimer )
{
		static uint32_t	timer = 0;
		printf("timer2的运行次数%d\r\n",++timer);	

}

key.c

cs 复制代码
#include "stm32f10x.h"                  // Device header
#include "FreeRTOS.h"
#include "task.h"
#include "usart.h"
#include "Delay.h"
 
/**
  * 函    数:按键初始化
  * 参    数:无
  * 返 回 值:无
	* 按键:PB4/PB12/PB14
  */
void Key_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//开启GPIOB的时钟
 
	/*GPIO初始化*/
	GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_4 | GPIO_Pin_12 | GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);						
}
 
 
/**
  * 函    数:按键获取键码
  * 参    数:无
  * 返 回 值:按下按键的键码值,范围:0~3,返回0代表没有按键按下
  * 注意事项:此函数是阻塞式操作,当按键按住不放时,函数会卡住,直到按键松手
  */
uint8_t Key_GetNum(void)
{
	uint8_t KeyNum = 0;																				//定义变量,默认键码值为0
	
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4) == 0)			  //读PB4输入寄存器的状态,如果为0,则代表按键1按下
	{
		KeyNum= GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4);
		delay_xms(20);																					//延时消抖
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4) == 0);	//等待按键松手
		delay_xms(20);																					//延时消抖
		KeyNum = 1;																							//置键码为1
	}
	
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 0)			
	{
		KeyNum= GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12);
		delay_xms(20);											
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 0);	
		delay_xms(20);									
		KeyNum = 2;											
	}
	
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0)			
	{
		KeyNum= GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14);
		delay_xms(20);											
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0);	
		delay_xms(20);									
		KeyNum = 3;											
	}
	
	return KeyNum;																						//返回键码值,如果没有按键按下,所有if都不成立,则键码为默认值0
}
 
 
 
 

2、实验解析

四、重点

使用函数前,需要先将宏置1(默认是1)

#define configUSE_TIMERS 1

创建软件定时函数:

TimerHandle_t xTimerCreate( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload,

void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction );

开启软件定时器函数:

BaseType_t xTimerStart( TimerHandle_t xTimer,

const TickType_t xTicksToWait );

停止软件定时器函数:

BaseType_t xTimerStop( TimerHandle_t xTimer,

const TickType_t xTicksToWait);

复位软件定时器函数:

BaseType_t xTimerReset( TimerHandle_t xTimer,

const TickType_t xTicksToWait);

更改软件定时器超时时间API函数 :

BaseType_t xTimerChangePeriod( TimerHandle_t xTimer,

const TickType_t xNewPeriod, const TickType_t xTicksToWait);

相关推荐
梁朝辉2 小时前
STM32H750VBT6中ADCINP与INN什么区别
stm32·单片机·嵌入式硬件
省四收割者3 小时前
一文详解信号完整性(1)
python·嵌入式硬件·数学建模·信息与通信·信号处理·智能硬件
崇山峻岭之间4 小时前
单片机无感FOC驱动之ADC
单片机·嵌入式硬件
Ligocious4 小时前
1.点亮一颗小小的LED
单片机·嵌入式硬件
KaifuZeng8 小时前
通信与接口协议面试八、CAN通信
单片机·嵌入式硬件·面试·通信与接口协议
智源单片机设计9 小时前
基于单片机的直流电机双闭环调速系统设计
单片机·嵌入式硬件
kebidaixu9 小时前
两轮车换电 BMS 的模拟前端中颖 SH367306 AFE 芯片详解
stm32
kebidaixu10 小时前
两轮车换电 BMS 的模拟前端中颖 SH367306 AFE 芯片调试实录:四个关键问题与解决方案
stm32
KaifuZeng1 天前
通信与接口协议面试一、基本概念
嵌入式硬件·通信与接口协议