FreeRTOS学习笔记-基于stm32(12)软件定时器

一、软件定时器简介

        软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能,执行功能的函数称为回调函数。相比于硬件定时器,软件定时器精度能差点(因为优先级低容易被打断)但是却不像硬件定时器那样资源有限。

        软件定时器的回调函数是在定时器服务任务中执行的,所以不能在回调函数中调用任何会阻塞任务的 API 函数!比如 vTaskDelay()、 vTaskDelayUnti(),还有一些访问队列或者信号量的非零阻塞时间的 API 函数也不能调用。

二、定时器服务任务

        FreeRTOS 提供了很多定时器相关API函数,这些函数通过队列将数据发送到定时器服务任务中,再由定时器服务任务来读取这些命令,这个队列就叫做命令队列。定时器命令队列操作如下图:应用程序是通过函数 xTimerReset() 间接的向定时器命令队列发送了复位命令,并不是直接调用类似 xQueueSend()这样的队列操作函数发送的。

三、 定时器相关配置

        上面说的定时器服务任务定时器命令队列 都是需要配置的,他们的宏在 FreeRTOSConfig.h 文件中。

1、configUSE_TIMERS

        如果要使用软件定时器的话宏 configUSE_TIMERS 一定要设置为 1,当设置为 1 的话定时 器服务任务就会在启动 FreeRTOS 调度器的时候自动创建。

2、configTIMER_TASK_PRIORITY

        设置软件定时器服务任务的任务优先级,可以为 0~( configMAX_PRIORITIES-1)。优先级 一定要根据实际的应用要求来设置。如果定时器服务任务的优先级设置的高的话,定时器命令队列中的命令和定时器回调函数就会及时的得到处理。

3、configTIMER_QUEUE_LENGTH

        此宏用来设置定时器命令队列的队列长度。

4、configTIMER_TASK_STACK_DEPTH

        此宏用来设置定时器服务任务的任务堆栈大小,单位为字,对于 STM32 来说 一个字是 4 字节。由于定时器服务任务中会执行定时器的回调函数,因此任务堆栈的大小一定要根据定时器的回调函数来设置。

四、单次定时器和周期定时器

        两个的区别其实就是一个只调用一次回调函数,另一个重复调用回调函数。重复调用的方法其实就是自动重启。单次定时器也可以重启,只不过需要手动重启。

五、定时器相关API函数

1、软件定时器复位 

函数描述
xTimerReset()复位软件定时器,用在任务中
xTimerResetFromISR()复位软件定时器,用在中断服务函数中

函数xTimerReset():

BaseType_t xTimerReset( TimerHandle_t xTimer, 
                        TickType_t xTicksToWait )

        参数:xTimer:要复位的软件定时器的句柄;

                   xTicksToWait:设置阻塞时间。

        返回值: pdPASS: 命令发送成功;

                       pdFAIL: 命令发送失败。

2、创建软件定时器

函数描述
xTimerCreate()使用动态方法创建软件定时器
xTimerCreateStatic()使用静态方法创建软件定时器

函数xTimerCreate():

TimerHandle_t xTimerCreate( const char * const pcTimerName,
                            TickType_t xTimerPeriodInTicks,
                            UBaseType_t uxAutoReload,
                            void * pvTimerID,
                            TimerCallbackFunction_t pxCallbackFunction )

        新创建的软件定时器处于休眠状态。

        参数:pcTimerName:软件定时器名字,名字是一串字符串,用于调试使用;

                   xTimerPeriodInTicks :软件定时器的定时器周期,单位是时钟节拍数。可以借助portTICK_PERIOD_MS 将 ms 单位转换为时钟节拍数。例如:定时器的周期为 100 个时钟节拍的话,那么 xTimerPeriodInTicks 就为 100,当定时器周期为 500ms 的时候 xTimerPeriodInTicks 就可以设置为(500/ portTICK_PERIOD_MS);

                   uxAutoReload:设置定时器模式。pdTRUE 表示创建的是周期定时器;pdFALSE 表示创建的是单次定时器;

                   pvTimerID:定时器 ID 号,一般情况下每个定时器都有一个回调函数,当定时器定时周期到了以后就会执行这个回调函数。但是 FreeRTOS 也支持多个 定时器共用同一个回调函数,在回调函数中根据定时器的 ID 号来处理不同的定时器;

                   pxCallbackFunction:定时器回调函数,当定时器定时周期到了以后就会调用这个函数。

        返回值:NULL: 软件定时器创建失败;其他值: 创建成功的软件定时器句柄。

3、开启软件定时器

函数描述
xTimerStart()开启软件定时器,用于任务中
xTimerStartFromISR()开启软件定时器,用于中断中

函数 xTimerStart():

BaseType_t xTimerStart( TimerHandle_t xTimer, 
                        TickType_t xTicksToWait )

        如果软件定时器没有运行的话调用函数 xTimerStart()就会计算定时器到期时间,如果软件定时器正在运行的话调用函数 xTimerStart()的结果和 xTimerReset()一样。

        参数:xTimer:要开启的软件定时器的句柄;

                   xTicksToWait: 设置阻塞时间。

        返回值:pdPASS: 命令发送成功;pdFAIL: 命令发送失败。

4、停止软件定时器

函数描述
xTimerStop()停止软件定时器,用于任务中
xTimerStopFromISR()停止软件定时器,用于中断服务函数中

函数 xTimerStop():

BaseType_t xTimerStop ( TimerHandle_t xTimer, 
                        TickType_t xTicksToWait )

        参数:xTimer:要停止的软件定时器的句柄;

                   xTicksToWait:设置阻塞时间。

        返回值:pdPASS: 命令发送成功;pdFAIL: 命令发送失败。

  • 35
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: FreeRTOS是一个开源的实时操作系统内核,为嵌入式设备提供了实时多任务处理、优先级管理和多线程等功能,非常适合一些资源有限的嵌入式设备进行开发。CANopen则是一种通信协议,可以用于各种嵌入式系统中的控制和数据传输,通常用于工业控制和自动化领域。 STM32F407则是意法半导体生产的一款Cortex-M4内核的微控制器,具有高性能、低功耗、高集成度等特点,非常适合应用于需要高要求的嵌入式设备中。而将这三者结合起来,可以实现很多嵌入式应用的功能,提高设备 控制的精度和可靠性。 具体而言,使用FreeRTOS可以使得STM32F407实现多任务处理,并在任务之间进行调度管理,提高系统的运行效率。CANopen则可以方便地实现各种设备之间的通信,实现控制指令和数据传输功能。在整个开发过程中,通过FreeRTOS和CANopen的结合,可以快速开发出高效、可靠的嵌入式系统。 ### 回答2: FreeRTOS是一个免费的实时操作系统内核,可用于大量基于嵌入式系统的微控制器的开发。CanOpen是针对CAN总线的一个通信协议,它能够实现不同的设备之间的通讯。而STM32F407是由ST推出的基于ARM Cortex-M4微控制器的产品系列之一。 在使用STM32F407进行嵌入式系统的开发时,FreeRTOS和CanOpen是非常有用的工具。FreeRTOS可以提供实时多任务支持,从而可以在单个系统中运行多个任务,并减少系统的复杂性。而CanOpen可实现在CAN总线上的设备之间的通信,从而实现大规模设备的控制和监控。 在使用这些工具时,需要注意一些配置和设置,以确保系统和设备的正常运行。例如,需要在STM32F407上启用CAN总线功能和FreeRTOS支持,这需要了解其软件开发工具,如Keil和IAR等。同时,在设备之间设置正确的CanOpen节点ID,使其互相识别并进行通信。 总之,对于使用STM32F407进行嵌入式系统开发的人员来说,FreeRTOS和CanOpen是非常有用的工具。它们可以帮助优化系统性能,提高设备之间的互操作性,从而实现更好的系统控制和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值