STM32CubeMX学习笔记28---FreeRTOS软件定时器

一、软件定时器简介

1 、基本概念

         定时器,是指从指定的时刻开始,经过一个指定时间,然后触发一个超时事件,用户 可以自定义定时器的周期与频率。类似生活中的闹钟,我们可以设置闹钟每天什么时候响, 还能设置响的次数,是响一次还是每天都响。

      定时器有硬件定时器和软件定时器之分:

      硬件定时器是芯片本身提供的定时功能。一般是由外部晶振提供给芯片输入时钟,芯 片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产 生时钟中断。硬件定时器的精度一般很高,可以达到纳秒级别,并且是中断触发方式。

      软件定时器是由操作系统提供的一类系统接口,它构建在硬件定时器基 础之上,使系统能够提供不受硬件定时器资源限制的定时器服务,它实现的功能与硬件定 时器也是类似的。

      使用硬件定时器时,每次在定时时间到达之后就会自动触发一个中断,用户在中断中 处理信息;而使用软件定时器时,需要我们在创建软件定时器时指定时间到达后要调用的 函数(也称超时函数/回调函数,为了统一,下文均用回调函数描述),在回调函数中处理 信息。

      注意:软件定时器回调函数的上下文是任务,下文所说的定时器均为软件定时器。

      软件定时器在被创建之后,当经过设定的时钟计数值后会触发用户定义的回调函数。 定时精度与系统时钟的周期有关。一般系统利用 SysTick 作为软件定时器的基础时钟,软件定时器的回调函数类似硬件的中断服务函数,所以,回调函数也要快进快出,而且回调函数中不能有任何阻塞任务运行的情况(软件定时器回调函数的上下文环境是任务),比如 vTaskDelay() 以及其它能阻塞任务运行的函数,两次触发回调函数的时间间隔 xTimerPeriodInTicks 叫定时器的定时周期。

        FreeRTOS 提供的软件定时器支持单次模式和周期模式,单次模式和周期模式的定时时间到之后都会调用软件定时器的回调函数,用户可以在回调函数中加入要执行的工程代码。

  • 单次模式:当用户创建了定时器并启动了定时器后,定时时间到了,只执行一次回调函数之后就将该定时器删除,不再重新执行。
  • 周期模式:这个定时器会按照设置的定时时间循环执行回调函数,直到用户将定时器删除。

FreeRTOS 通过一个 prvTimerTask 任务(也叫守护任务 Daemon)管理软定时器,它是在启动调度器时自动创建的,为了满足用户定时需求。prvTimerTask 任务会在其执行期间检查用户启动的时间周期溢出的定时器,并调用其回调函数。只有设置 FreeRTOSConfig.h 中的宏定义configUSE_TIMERS 设置为 1 ,将相关代码编译进来,才能正常使用软件定时器相关功能。

2 、时间精度

        在操作系统中,通常软件定时器以系统节拍周期为计时单位。系统节拍是系统的心跳节拍,表示系统时钟的频率,就类似人的心跳,1s 能跳动多少下,系统节拍配置为 configTICK_RATE_HZ,该宏在 FreeRTOSConfig.h 中有定义,默认是 1000。那么系统的时钟节拍周期就为 1ms(1s 跳动 1000 下,每一下就为 1ms)。软件定时器的所定时数值必须是这个节拍周期的整数倍,例如节拍周期是 10ms,那么上层软件定时器定时数值只能是10ms,20ms,100ms 等,而不能取值为 15ms。由于节拍定义了系统中定时器能够分辨的精确度,系统可以根据实际系统 CPU 的处理能力和实时性需求设置合适的数值,系统节拍周期的值越小,精度越高,但是系统开销也将越大,因为这代表在 1 秒中系统进入时钟中断的次数也就越多。 

3、 注意要点 

  • 软件定时器的回调函数中应快进快出,绝对不允许使用任何可能引软件定时器起任务挂起或者阻塞的 API 接口,在回调函数中也绝对不允许出现死循环。
  • 软件定时器使用了系统的一个队列和一个任务资源,软件定时器任务的优先级默
  • 认为 configTIMER_TASK_PRIORITY,为了更好响应,该优先级应设置为所有任务中最高的优先级。
  • 创建单次软件定时器,该定时器超时执行完回调函数后,系统会自动删除该软件定时器,并回收资源。
  • 定时器任务的堆栈大小默认为 configTIMER_TASK_STACK_DEPTH 个字节。

4、软件定时器应用场景

       在很多应用中,我们需要一些定时器任务,硬件定时器受硬件的限制,数量上不足以 满足用户的实际需求,无法提供更多的定时器,那么可以采用软件定时器来完成,由软件 定时器代替硬件定时器任务。但需要注意的是软件定时器的精度是无法和硬件定时器相比 的,而且在软件定时器的定时过程中是极有可能被其它中断所打断,因为软件定时器的执 行上下文环境是任务。所以,软件定时器更适用于对时间精度要求不高的任务,一些辅助 型的任务。

二、STM32CubeMX设置

1、配置RCC、USART1、时钟72M
2、配置SYS,将Timebase Source修改为除滴答定时器外的其他定时器。
3、初始化LED的两个引脚
4、开启FreeRTOS,v1与v2版本不同,一般选用v1即可
5、创建两个线程:任务LED1用作发送,LED2用作接收。

以上步骤可参考:STM32CubeMX学习笔记22---FreeRTOS(任务创建和删除)-CSDN博客

6、创建软件定时器Timer

要想使用软件定时器必须在 Config parameters 中把 USE_TIMERS 选择 Enabled 来使能。

在 Timers and Semaphores 中创建两个定时器,一个周期定时器,一个单次定时器。

  • Timer Name: 定时器名称
  • Callback: 回调函数名称
  • Type: 定时器类型,osTimerPeriodic周期定时器,osTimerOnce单次定时器
  • Code Generation Option: 代码生成选项
  • Parameter: 回调函数形参,不用的时候配置为0或NULL即可
  • Allocation: 分配方式:Dynamic 动态内存创建
  • Conrol Block Name: 控制块名称
7、生成代码

三、相关API函数说明

1、创建软件定时器:osTimerCreate

创建一个软件定时器,并返回一个定时器ID。

例:

osTimerId myTimer01Handle;
osTimerId myTimer02Handle;

//创建周期定时器
  osTimerDef(myTimer01, Callback01);
  myTimer01Handle = osTimerCreate(osTimer(myTimer01), osTimerPeriodic, NULL);

//创建单次定时器
  osTimerDef(myTimer02, Callback02);
  myTimer02Handle = osTimerCreate(osTimer(myTimer02), osTimerOnce, NULL);
2、启动定时器:osTimerStart,可以在中断中使用,单位为ms

例: 

osTimerStart(myTimer01Handle,1000);
3、停止定时器:osTimerStop

停止一个软件定时器,让其进入休眠态。该函数可以在中断中使用。

函数osStatus osTimerStop (osTimerId timer_id)
参数timer_id: 定时器ID
返回值错误码

例: 

osTimerStop(myTimer01Handle);
4、删除定时器

用于删除一个已经被创建成功的软件定时器,删除之后就无法使用该定时器,并且定时器相应的资源也会被系统回收释放。

函数osStatus osTimerDelete (osTimerId timer_id)
参数timer_id: 定时器ID
返回值错误码

例: 

osTimerDelete(myTimer01Handle)

四、程序编程

在cubemx中设置了两个定时器,会自动生成两个定时回调函数,定时器需要执行的程序可以在回调函数中编写,但在使用定时器之前需要开启一下定时器并设定定时时间。

1、在空闲任务中开启定时器,将循环定时器定时1000ms,单次定时器定时3000ms

void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN StartDefaultTask */
	//开始软件定时器
	 osTimerStart(myTimer01Handle, 1000);
   osTimerStart(myTimer02Handle, 3000);
  /* Infinite loop */
  for(;;)
  {
    osDelay(1);
  }
  /* USER CODE END StartDefaultTask */
}

2、在定时器回调函数中编写程序。

void Callback01(void const * argument)
{
  /* USER CODE BEGIN Callback01 */
	  static uint32_t TmrCb_Count1 = 0; /* 记录软件定时器 1 回调函数执行次数 */
	
		TickType_t tick_num1; 
    TmrCb_Count1++; /* 每回调一次加一 */ 
   
    tick_num1 = osKernelSysTick(); /* 获取滴答定时器的计数值 */ 
	
   	HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);   //LED1状态每500s翻转一次
    printf("定时器1 %d,tick_num=%d\n", TmrCb_Count1,tick_num1);   
  /* USER CODE END Callback01 */
}

/* Callback02 function */

void Callback02(void const * argument)
{
  /* USER CODE BEGIN Callback02 */
	  static uint32_t TmrCb_Count2 = 0; /* 记录软件定时器 2 回调函数执行次数 */
    TickType_t tick_num2; 
  
    TmrCb_Count2++; /* 每回调一次加一 */ 
   
    tick_num2 = osKernelSysTick(); /* 获取滴答定时器的计数值 */ 
   	HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);   //LED1状态每500s翻转一次
    printf("定时器2 %d,tick_num=%d\n", TmrCb_Count2,tick_num2); 
  /* USER CODE END Callback02 */
}

下载验证: 

程序编译无误后下载到板子上查看串口输出,可以看到定时器1每隔1000ms运行一次,定时器2定时3000ms运行一次后不再运行了。

 

五 、参考文献

韦东山freeRTOS系列教程之【第十章】软件定时器(software timer)_xtimerstart-CSDN博客

STM32CubeMX学习笔记(33)——FreeRTOS实时操作系统使用(软件定时器)_freertos cubemx 会占用定时器几-CSDN博客

FreeRTOS软件定时器 基于STM32_xtimerstart-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/499742.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【linux深入剖析】文件描述符 | 对比 fd 和 FILE | 缓冲区

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1.文件描述符fd2.文件描述…

【网络安全技术】——密码技术基础与身份认证技术(学习笔记)

📖 前言:加密技术是目前网络安全的基础。数据加密技术是指对在网络中所发送的明文消息用加密密钥加密成密文进行传送,接收方用解密密钥进行解密再现明文消息,从而保证传输过程中密文信息即使被泄漏,在无密钥的情况下仍…

基于单片机三路信号故障诊断仿真设计

单片机设计介绍,基于单片机三路信号故障诊断仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机三路信号故障诊断仿真设计概要主要涵盖了系统设计的整体框架、关键模块功能、仿真方法以及预期实现的目…

2D与动画

2D转换 1.移动 translate 1. 语法 transform: translate(x,y); 或者分开写 transform: translateX(n); transform: translateY(n); 2.重点 定义 2D 转换中的移动,沿着 X 和 Y 轴移动元素 translate最大的优点:不会影响到其他元素的位置 translat…

HarmonyOS 应用开发之UIAbility组件间交互(设备内)

UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时,会涉及到启动特定的UIAbility,该UIAbility可以是应用内的其他UIAbility,也可以是其他应用的UIAbility(例如启动三方支付UIAbility)。 本文将从如下场景…

HarmonyOS实战开发-实现Ability内页面间的跳转和数据传递。

介绍 本篇Codelab基于Stage模型下的Ability开发,实现Ability内页面间的跳转和数据传递。 最终效果图如下: 相关概念 页面路由:提供通过不同的url访问不同的页面,包括跳转到应用内的指定页面、用应用内的某个页面替换当前页面、…

数据分析之Power BI

POWER QUERY 获取清洗 POWER PIVOT建模分析 如何加载power pivot 文件-选项-加载项-com加载项-转到 POWER VIEW 可视呈现 如何加载power view 文件-选项-自定义功能区-不在功能区中的命令-新建组-power view-添加-确定 POWER MAP可视地图

HTTP(1)

目录 一、认识HTTP协议 理解 应用层协议 二、fiddler的安装以及介绍 1、fiddler的安装 2、fiddler的介绍 三、HTTP 报文格式 1、http的请求 2、http的响应 五、认识URL 六、关于URL encode 一、认识HTTP协议 HTTP 全称为:“超文本传输协议”,是…

【01-20】计算机网络基础知识(非常详细)从零基础入门到精通,看完这一篇就够了

【01-20】计算机网络基础知识(非常详细)从零基础入门到精通,看完这一篇就够了 以下是本文参考的资料 欢迎大家查收原版 本版本仅作个人笔记使用1、OSI 的七层模型分别是?各自的功能是什么?2、说一下一次完整的HTTP请求…

Mybatis-plus + 通用mapper(tk.mybatis)

推荐课程:MyBatisPlus实战教程02-课程介绍与案例演示_哔哩哔哩_bilibili 官网:MyBatis-Plus (baomidou.com) 目录 01 引言 1)MyBatis与MyBatis-Plus区别 2)Mybatis-plus入门案例 案例一:spring容器版本的案例 案例…

pip永久修改镜像地址

修改命令: pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/ 效果: 会在C:\Users\PC(用户名)\AppData\Roaming\pip目录下新增或修改文件pip.ini 文件内容: [global] index-url https://pypi.tuna.tsinghua.e…

通过keil MDK生成静态库以减少编译时间

当我们的程序复杂度提高,代码量增大,每次编译都会花费更多的时间,虽然相比较Linux动则好几个小时的编译时间,单片机编译的时间已经算很短了,但是一个200多KB的程序编译也得需要好几分钟。如果将一些成熟固定,几乎不会再去修改的程序编译成静态库,那么可以减少一部分编译…

HarmonyOS实战开发-实现UIAbility内和UIAbility间页面的跳转

介绍 本篇Codelab基于Stage模型下的UIAbility开发,实现UIAbility内和UIAbility间页面的跳转。包含如下功能: UIAbility内页面的跳转。跳转到指定UIAbility的首页。跳转到指定UIAbility的指定页面(非首页)。 最终效果图如下&…

新数据显示,寻求博士后职位的美国科学家越来越少

戈罗登科夫/盖蒂图片社 美国国家科学基金会(NSF)发布的新数据显示,美国公民从事博士后工作的人数急剧下降,特别是在生物和生物医学科学领域。这一趋势凸显了人们对学术界正面临博士后短缺的担忧,以及早期职业科学家越来…

PPP、RRE、MGRE综合实验

一、实验拓扑图 二、实验要求 1.R5为ISP,只能进行IP地址配置,其所有地址均配为公有IP地址; 2.R1和R5间使用PPP的PAP认证,R5为主认证方: R2与R5之间使用ppp的CHAP认证, R5为主认证方;R3与R5之间使用HDLC封装; 3.R1、R2、…

Python:执行py命令,提示: Can‘t find a default Python.

1.Python运行环境罢工 今天,要运行一个前年用python编写的爬虫程序,先检测python运行环境是否正常: D:\Python38-32\works>c:\windows\py.exe Cant find a default Python. 再试: D:\Python38-32\works>py --list Installe…

Keepalived+MySQL简单搭建实现数据库高可用

需求:想要实现当MySQL服务挂了之后,能够自动切换到另一台,不对当前服务造成过多影响。查找了很多实现数据库高可用方案,比较常见的有MHA(至少三台,一主多从)、开源数据库中间件(Myca…

浅试Kimi

最近KIMI大模型挺火的,擅长处理中文文本,咱也来试试吧! 测试问题: 写一篇800字以上的短片小说:主要故事是以一位上进但其他方面表现平平的大男孩小贱,刚到公司不久,就被一位名叫大弟的女同事看…

量化交易入门(二十八)什么是布林带,量化中怎么使用

什么叫布林带 布林带(Bollinger Bands)是一种常用的技术分析指标,由约翰布林(John Bollinger)于20世纪80年代开发。它由三条线组成:中轨(通常为20日移动平均线)、上轨(中…

python编程软件有什么

Python开发软件可根据其用途不同分为两种,一种是Python代码编辑器,一种是Python集成开发工具,两者的配合使用可以极大的提高Python开发人员的编程效率,以下是常用的几款Python代码编辑器和Python集成开发工具。 一、Python代码编…