在嵌入式编程中,定时器是一个非常重要且强大的功能,用来帮我们定时性的调用中断服务函数来帮助我们处理程序。定时器通常是用硬件来实现的,例如STM32F407就有8个硬件定时器。
而在FreeRTOS中则可以用软件实现定时器。大大的扩展了定时器的数量。
阅读FreeRTOS开发者文档我们可以知道,软件定时器的回调函数会在定时器服务函数中执行。
同时,软件定时器的回调函数中不能调用然后可以导致阻塞的函数例如vTaskDelay()等等,包括等待信号量的函数这些也会造成阻塞。
FreeRTOS会使用队列向定时器服务任务发送命令,这个队列就是定时器命令队列。
创建软件定时器
在API引用文档中,我们可以查询有关创建软件定时器创建的函数。内容有许多,但是还是总归是分三个步骤:包含相关头文件、启动相关的宏、配置软件定时器。
软件定时器配置时也有三个参数需要注意,一个定时器的定时时间,一个是设置定时器重复使用还是一次项,最后需要注意的是传入调用函数的句柄。
定义相关的回调函数与定时器句柄。
Timer_Handler = xTimerCreate
( (const char * const) "xTimerCreate",
(const TickType_t) 500,//500ms一次
(const UBaseType_t) pdTRUE,//重复
(void * const) 1,//定时器ID
(TimerCallbackFunction_t) CallBacl );//中断服务函数句柄
接着我们定义一个轮询函数,当按键按下时,我们就开启定时器
void Low_Task(void * pvParameters)//参数为 void * pvParameters
{
while(1)
{
if(KEY_Scan(0)==1)
{
xTimerStart(Timer_Handler,100);//开始定时器传入句柄以及最大等待时间
}
}
}
在回调函数中我们让LED灯进行翻转
void CallBacl( TimerHandle_t xTimer)
{
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);
}
同样的,在官方的API文档中我们还可以看到许多和软件定时器有关的内容,在这里不一一介绍,有感兴趣的小伙伴可以去官网查看API使用说明。
全部0条评论
快来发表一下你的评论吧 !