您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > STM32CubeMX+FreeRTOS学习[7]-软定时器(Lu)
FreeRTOS学习之七:软定时器前提:默认已经装好MDKV5和STM32CubeMX,并安装了STM32F1xx系列的支持包。硬件平台:STM32F1xx系列。目的:学习软定时器的使用。有时候我们需要定时进行一些例行处理,FreeRTOS提供了软定时器来满足这种需求。软定时器不是FreeRTOS内核的组成部分,它本质上是一种任务,周期性地调用其回调函数。本文例子使用STM32CubeMX配置创建一个软定时器和一个任务,软定时器在回调函数控制LED0的状态,任务控制LED1的状态。Step1.打开STM32CubeMX,点击“NewProject”,选择芯片型号,STM32F103RBTx。Step2.配置时钟引脚。Step3.配置PA8和PD2为Output,并把用户标签分别改为LED0,LED1。Step4.将系统时基源改为TIM4。Step5.使能FreeRTOS。Step6.配置时钟树。8M输入时,通过PLL得到72M内部时钟。Step7.配置FreeRTOS。在TasksandQueues选项卡中,默认配置了一个名为defaultTask的任务,其优先级为普通,任务堆栈大小为128字,任务函数名为StartDefaultTask。双击蓝色的地方,弹出对话框,将任务名修改为LED1,将任务函数名修改为LED1_Task。在Configureparameters选项卡,使能软定时器,定时器任务的优先级默认为2,定时器队列深度默认为10。(后两个参数在后文有详细说明。)在TimersandSemaphores选项卡,点击Timers项右边的“Add”按钮,添加一个软定时器,函数改为Timer01_Callback,类型为周期定时器。注:其他的都使用默认参数。Step8.生成代码。等完成后直接打开工程。工程基本组织结构如下图,其中Application/User组中的文件是用户可以修改的,而其他组中的文件一般不进行修改。Step9.分析程序结构。在进入main函数之前,先定义了几个变量,声明了几个函数。再看main函数。将main函数整理,删除很多注释之后,得到下图所示内容。其中第①部分,是硬件配置;第②部分,创建一个软定时器和一个任务;第③部分,启动调度器。Step10.添加代码。在main.c文件中,在任务函数LED1_Task添加代码如下。在软定时器回调函数中添加代码如下。在main函数的/*USERCODEBEGINRTOS_TIMERS*/和/*USERCODEENDRTOS_TIMERS*/注释行之间添加启动软定时器的代码。Step11.编译下载运行。LED0和LED1分别闪烁,LED0每秒闪2次,LED1每秒闪1次。特别说明:软定时器不是FreeRTOS内核的组成部分,它本质上是一种任务,周期性地调用其回调函数。要注意的是,在回调函数中,不应该调用造成阻塞的API函数,如vTaskDelay(),vTaskDelayUntil()等。前面Step7配置FreeRTOS时,有两个参数TIMER_TASK_PRIORITY和TIMER_QUEUE_LENGTH,下面详细说明一下。因为软定时器是一种任务,所以它就应该有优先级。和一般的FreeRTOS任务一样,它的优先级也是从0到(configMAX_PRIORITIES-1)之间。TIMER_TASK_PRIORITY的作用就是指定软定时器任务的优先级。下图是官网上对该参数的描述:另外,软定时器不是一般的任务,在创建它时,同时还创建了一个消息队列,成为“定时器命令队列”。软定时器服务任务(或称守护任务)通过这个队列来接收用户发送的命令。当用户的程序调用xTimerReset()等定时器API函数时,就是向该队列发送命令。TIMER_QUEUE_LENGTH的作用就是指定软定时器的命令队列的深度。下图是官网上对该参数的描述:需要特别注意红框中描述的信息,可能造成定时器命令队列满载的原因包括:·在RTOS调度器启动前,多次调用定时器API函数;·在(硬件)中断服务程序(ISR)中多次调用定时器API函数;·在优先级高于定时器服务任务的任务中,多次调用定时器API函数。更多关于定时器的描述,请访问FreeRTOS官网。S.D.Lu于深圳2016年8月
本文标题:STM32CubeMX+FreeRTOS学习[7]-软定时器(Lu)
链接地址:https://www.777doc.com/doc-5045661 .html