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