基于STM32F407的FreeRTOS学习笔记(9)

描述

在嵌入式编程中,定时器是一个非常重要且强大的功能,用来帮我们定时性的调用中断服务函数来帮助我们处理程序。定时器通常是用硬件来实现的,例如STM32F407就有8个硬件定时器。

而在FreeRTOS中则可以用软件实现定时器。大大的扩展了定时器的数量。

STM32F407

STM32F407

阅读FreeRTOS开发者文档我们可以知道,软件定时器的回调函数会在定时器服务函数中执行。

同时,软件定时器的回调函数中不能调用然后可以导致阻塞的函数例如vTaskDelay()等等,包括等待信号量的函数这些也会造成阻塞。

STM32F407

FreeRTOS会使用队列向定时器服务任务发送命令,这个队列就是定时器命令队列。

创建软件定时器

STM32F407

在API引用文档中,我们可以查询有关创建软件定时器创建的函数。内容有许多,但是还是总归是分三个步骤:包含相关头文件、启动相关的宏、配置软件定时器。

软件定时器配置时也有三个参数需要注意,一个定时器的定时时间,一个是设置定时器重复使用还是一次项,最后需要注意的是传入调用函数的句柄。

STM32F407

定义相关的回调函数与定时器句柄。

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使用说明。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分