软件定时器简介
硬件定时器:STM32芯片自带的定时器模块,硬件定时器的精度一般很高,每次在定时时间达到之后就会自动触发一个中断,用户在中断服务函数中处理信息。
软件定时器:是指具有定时功能的软件,可设置定时周期,当指定时间到达后要会调用回调函数,用户在回调函数中处理信息。
软件定时器相对硬件定时器来说,精度没有那么高(因为他以时基为基准,系统时钟中断优先级又是最低,容易被打断)。对于高精度要求,不建议使用软件定时器。
可裁剪 :可以配置宏定义configUSE_TIMERS来决定是否使能软件定时器
单次和周期:支持设置单次定时器和周期定时器。
软件定时器的回调函数是由软件定时器服务任务调用的,软件定时器的回调函数本身不是任务,因此不能在该回调函数中使用可能会导致任务阻塞的API函数。
软件定时器相关配置
- configUSE_TIMERS配置为1的时候表示使能软件定时器,在启动任务调度器时,会自动创建软件定时器的服务任务。
- 软件定时器服务任务的优先级为configTIMER_TASK_PRIORITY宏定义,由用户设置,推荐31。
- 定时器的命令队列长度为configTIMER_QUEUE_LENGTH宏定义,由用户设置,默认为10。
- 定时器的堆栈大小为configTIMER_TASK_STACK_DEPTH宏定义,默认为256字。
软件定时器API函数
c
/**
* @brief 动态分配内存创建软件定时器
* @param pcTimerName:定时器的描述性名称,辅助调试用
* @param xTimerPeriod:定时器的周期,参考 "3.2.1、周期" 小节
* @param uxAutoReload:pdTRUE表示周期软件定时器,pdFASLE表示单次软件定时器
* @param pvTimerID:定时器ID
* @param pxCallbackFunction:定时器回调函数指针,参考 "3.1、软件定时器回调函数" 小节
* @retval 创建成功则返回创建的定时器的句柄,失败则返回NULL
*/
TimerHandle_t xTimerCreate(const char * const pcTimerName,
const TickType_t xTimerPeriod,
const UBaseType_t uxAutoReload,
void * const pvTimerID,
TimerCallbackFunction_t pxCallbackFunction);
c
/**
* @brief 启动定时器
* @param xTimer:要操作的定时器句柄
* @param xBlockTime:参考 "3.4.1、xTicksToWait 参数" 小节
* @retval 参考 "3.4.2、函数返回值" 小节
*/
BaseType_t xTimerStart(TimerHandle_t xTimer,
TickType_t xTicksToWait);
/**
* @brief 启动定时器的中断安全版本
* @param xTimer:要操作的定时器句柄
* @param pxHigherPriorityTaskWoken:用于通知应用程序编写者是否应该执行上下文切换
* @retval 参考 "3.4.2、函数返回值" 小节
*/
BaseType_t xTimerStartFromISR(TimerHandle_t xTimer,
BaseType_t *pxHigherPriorityTaskWoken);
c
/**
* @brief 停止软件定时器
* @param xTimer:要操作的定时器句柄
* @param xBlockTime:参考 "3.4.1、xTicksToWait 参数" 小节
* @retval 参考 "3.4.2、xTimerStart() 函数返回值" 小节
*/
BaseType_t xTimerStop(TimerHandle_t xTimer,
TickType_t xBlockTime);
/**
* @brief 删除软件定时器
* @param xTimer:要操作的定时器句柄
* @param xBlockTime:参考 "3.4.1、xTicksToWait 参数" 小节
* @retval 参考 "3.4.2、xTimerStart() 函数返回值" 小节
*/
BaseType_t xTimerDelete(TimerHandle_t xTimer,
TickType_t xBlockTime);
/**
* @brief 停止软件定时器的中断安全版本
* @param xTimer:要操作的定时器句柄
* @param pxHigherPriorityTaskWoken:用于通知应用程序编写者是否应该执行上下文切换
* @retval 参考 "3.4.2、xTimerStart() 函数返回值" 小节
*/
BaseType_t xTimerStopFromISR(TimerHandle_t xTimer,
BaseType_t *pxHigherPriorityTaskWoken);
软件定时器实验
c
TimerHandle_t myTimer;
void MyTimerCallback(TimerHandle_t xTimer );
myTimer =xTimerCreate("MyTimer", pdMS_TO_TICKS(1000),pdTRUE,NULL,MyTimerCallback);
void MyTimerCallback(TimerHandle_t xTimer )
{
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
printf("MyTimerCallback\r\n");
}
xTimerStart(myTimer,portMAX_DELAY);
xTimerStop(myTimer,portMAX_DELAY);