STM32F4X UCOSIII软件定时器

news2025/1/16 14:06:28

STM32F4X UCOSIII软件定时器

定时器概念

定时器在MCU中是一个很常用的外设,其作用是可以在某个事件点触发MCU中断,告知MCU处理事情。定时器跟生活中的闹钟很类似,可以设置闹钟每天什么时候响,还能设置响的次数,是响一次还是每天都响。定时器也有硬件定时器和软件定时器之分。

硬件定时器

硬件定时器通常是MCU的内部资源,当用户需要使用硬件定时器时,需要配置硬件定时器的分频系数,重装载数,使其满足用户的需要。硬件定时器的精度一般都很高,可以达到纳秒级别,而且硬件定时器通常跟中断一起配合使用。缺点就是硬件定时器资源有限,配置也比较复杂。

软件定时器

软件定时器是由操作系统提供的一类系统接口,软件定时器是基于硬件定时器之上,使系统可以不受硬件定时器的资源限制,理论上只要系统的存储空间充足,用户就可以创建很多的软件定时器。软件定时器通常会绑定一个回调函数,当定时时间到的时候,就调用回调函数,相当于硬件定时器的中断。

UCOSIII软件定时器

UCOSIII支持软件定时器,在MCU资源允许的情况下,用户可以创建多个软件定时器,UCOSIII的软件定时器有以下特点。

UCOSIII软件定时器运行模式

UCOSIII软件定时器的运行模式有两种,分别是单次模式和周期模式,两种模式的区别如下

  • 单次模式:软件定时器的定时时间到了之后,只会执行一次回调函数,然后就不会继续执行,用户可以再次调用OSTmrStart函数继续执行
  • 周期模式:软件定时器开始工作后,会按照设定的定时时间循环运行。
    在这里插入图片描述
    上图设置两个定时器,其中定时器1定时时间是200个tick,周期运行。定时器2定时时间是100个tick,单次运行。定时器开始运行后,当定时2达到定时时间时,会调用一次回调函数然后就停止,定时器1则会循环执行。

UCOSIII软件定时器周期模式

UCOSIII中软件定时器的周期模式也有两种,一种是初始化延时,一种是无初始化延时

  • 初始化延时:在软件定时器创建的时候,其第一个定时周期是由定时器中的 dly 参数决定,然后在运行完第一个周期后,其以后的定时周期均由period 参数决定。
  • 无初始化延时:定时器一直按周期运行
    在这里插入图片描述
    上图设置两个定时器,其中定时器1定时时间是100个tick,周期运行。定时器2定时的初始化周期是150tick,周期是100tick。定时器开始运行后,当定时2达到初始化周期时会调用一次回调函数,之后定时器2就会按照100tick的定时周期循环运行。而定时器1则会按照100tick定时周期循环执行。

UCOSIII软件定时器API

软件定时器创建函数

/*
	* p_tmr:定时器对象
	* p_name:定时器名字
	* dly:定时器初始值
	* period:定时器周期
	* opt:用户选项
	* p_callback:回调函数
	* p_callback_arg:回调函数参数
	* p_err:错误代码
*/
void  OSTmrCreate (OS_TMR               *p_tmr,
                   CPU_CHAR             *p_name,
                   OS_TICK               dly,
                   OS_TICK               period,
                   OS_OPT                opt,
                   OS_TMR_CALLBACK_PTR   p_callback,
                   void                 *p_callback_arg,
                   OS_ERR               *p_err)

其中opt可以选择OS_OPT_TMR_ONE_SHOT和OS_OPT_TMR_PERIODIC

  • OS_OPT_TMR_ONE_SHOT:单次模式
  • OS_OPT_TMR_PERIODIC:周期模式

软件定时器启动函数

/*
	* p_tmr:定时器对象
	* p_err:错误代码
返回值 : DEF_TRUE:定时器开始运行
		DEF_FALSE:没有定时器
*/
CPU_BOOLEAN  OSTmrStart (OS_TMR  *p_tmr,
                         OS_ERR  *p_err)

定时器停止函数

/*
	* p_tmr:定时器对象
	* opt:用户选项
	* p_callback_arg:用户新设置的回电函数参数
	* p_err:错误代码
返回值 : DEF_TRUE:定时器停止成功
		DEF_FALSE:定时器失败
*/
CPU_BOOLEAN  OSTmrStop (OS_TMR  *p_tmr,
                        OS_OPT   opt,
                        void    *p_callback_arg,
                        OS_ERR  *p_err)

opt参数可以选择OS_OPT_TMR_NONE、OS_OPT_TMR_CALLBACK和OS_OPT_TMR_CALLBACK_ARG

  • OS_OPT_TMR_NONE:直接停止定时器,不做任何操作
  • OS_OPT_TMR_CALLBACK:在停止定时器前再执行一次回调函数
  • OS_OPT_TMR_CALLBACK_ARG:在停止定时器前再执行一次回调函数,并且可以设置新参数

定时器删除函数

/*
	* p_tmr:定时器对象
	* p_err:错误代码
返回值 : DEF_TRUE:定时器已经删除
		DEF_FALSE:没有定时器
*/
CPU_BOOLEAN  OSTmrDel (OS_TMR  *p_tmr,
                       OS_ERR  *p_err)

UCOSIII软件定时器例程

/*
*********************************************************************************************************
*                                              EXAMPLE CODE
*
*                             (c) Copyright 2013; Micrium, Inc.; Weston, FL
*
*                   All rights reserved.  Protected by international copyright laws.
*                   Knowledge of the source code may not be used to write a similar
*                   product.  This file may only be used in accordance with a license
*                   and should not be redistributed in any way.
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*
*                                            EXAMPLE CODE
*
*                                       IAR Development Kits
*                                              on the
*
*                                    STM32F429II-SK KICKSTART KIT
*
* Filename      : app.c
* Version       : V1.00
* Programmer(s) : YS
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                             INCLUDE FILES
*********************************************************************************************************
*/

#include  <includes.h>

/*
*********************************************************************************************************
*                                            LOCAL DEFINES
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*                                       LOCAL GLOBAL VARIABLES
*********************************************************************************************************
*/

                                                                /* ----------------- APPLICATION GLOBALS -------------- */
static  OS_TCB   AppTaskStartTCB;
static  CPU_STK  AppTaskStartStk[APP_CFG_TASK_START_STK_SIZE];



static OS_TMR timr1;
static void timr1_callback_func(void *p_tmr, void *p_arg);
/*
*********************************************************************************************************
*                                         FUNCTION PROTOTYPES
*********************************************************************************************************
*/

static  void  AppTaskStart          (void     *p_arg);


/*
*********************************************************************************************************
*                                                main()
*
* Description : This is the standard entry point for C code.  It is assumed that your code will call
*               main() once you have performed all necessary initialization.
*
* Arguments   : none
*
* Returns     : none
*********************************************************************************************************
*/

int main(void)
{

    OS_ERR  err;


    OSInit(&err);                                               /* Init uC/OS-III.                                      */
   
    OSTaskCreate((OS_TCB       *)&AppTaskStartTCB,              /* Create the start task                                */
                 (CPU_CHAR     *)"App Task Start",
                 (OS_TASK_PTR   )AppTaskStart,
                 (void         *)0u,
                 (OS_PRIO       )APP_CFG_TASK_START_PRIO,
                 (CPU_STK      *)&AppTaskStartStk[0u],
                 (CPU_STK_SIZE  )AppTaskStartStk[APP_CFG_TASK_START_STK_SIZE / 10u],
                 (CPU_STK_SIZE  )APP_CFG_TASK_START_STK_SIZE,
                 (OS_MSG_QTY    )0u,
                 (OS_TICK       )0u,
                 (void         *)0u,
                 (OS_OPT        )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                 (OS_ERR       *)&err);

    OSStart(&err);                                              /* Start multitasking (i.e. give control to uC/OS-III). */


}


/*
*********************************************************************************************************
*                                          STARTUP TASK
*
* Description : This is an example of a startup task.  As mentioned in the book's text, you MUST
*               initialize the ticker only once multitasking has started.
*
* Arguments   : p_arg   is the argument passed to 'AppTaskStart()' by 'OSTaskCreate()'.
*
* Returns     : none
*
* Notes       : 1) The first line of code is used to prevent a compiler warning because 'p_arg' is not
*                  used.  The compiler should not generate any code for this statement.
*********************************************************************************************************
*/

static  void  AppTaskStart (void *p_arg)
{
    CPU_INT32U  cpu_clk_freq;
    CPU_INT32U  cnts;
    OS_ERR      err;


   (void)p_arg;

    BSP_Init();                      
    CPU_Init();                                                 /* Initialize the uC/CPU services                       */

    cpu_clk_freq = BSP_CPU_ClkFreq();                           /* Determine SysTick reference freq.                    */
    cnts         = cpu_clk_freq                                 /* Determine nbr SysTick increments                     */
                 / (CPU_INT32U)OSCfg_TickRate_Hz;

    OS_CPU_SysTickInit(cnts);                                   /* Init uC/OS periodic time src (SysTick).              */

    Mem_Init();                                                 /* Initialize memory managment module                   */
    Math_Init();                                                /* Initialize mathematical module                       */


#if OS_CFG_STAT_TASK_EN > 0u
    OSStatTaskCPUUsageInit(&err);                               /* Compute CPU capacity with no task running            */
#endif

#ifdef CPU_CFG_INT_DIS_MEAS_EN
    CPU_IntDisMeasMaxCurReset();
#endif


#if (APP_CFG_SERIAL_EN == DEF_ENABLED)
    App_SerialInit();                                           /* Initialize Serial communication for application ...  */
#endif
	
	OSTmrCreate(&timr1,
				(CPU_CHAR*)"timr1",
				(OS_TICK)100,
				(OS_TICK)100,
				(OS_OPT)OS_OPT_TMR_PERIODIC,   // 周期定时
				(OS_TMR_CALLBACK_PTR)timr1_callback_func, // 定时器回调函数
				"timer callback",                         // 定时器回调函数参数
				 &err);
	if(err == OS_ERR_NONE)
	{
		printf("timr1 Create Success\r\n");
		OSTmrStart(&timr1,&err);	 // 定时器开始工作	
	}
	else
		printf("timr1 Create Fail\r\n");
	
	 
	OSTaskDel ( & AppTaskStartTCB, & err );		 

}

static void timr1_callback_func(void *p_tmr, void *p_arg)
{
	printf("%s\r\n",p_arg);
}


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

山西电力市场日前价格预测【2023-10-01】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-01&#xff09;山西电力市场全天平均日前电价为254.94元/MWh。其中&#xff0c;最高日前电价为399.30元/MWh&#xff0c;预计出现在19: 00。最低日前电价为0.00元/MWh&#xff0c;预计出…

源码编译安装systemtap

目录 编译环境 编译步骤 编译环境 阿里云ubuntu20.04 编译步骤 1 先安装elfutils&#xff0c;参见我的前一篇博客 源码编译elfutils_金色熊族的博客-CSDN博客 2 下载systemtap源码 3 解压 解压后的文件夹与elfutils的文件夹应该是平行的&#xff0c;如下图&#xff1a…

利用mAP计算yolo精确度

当将yolo算法移植部署在嵌入式设备上&#xff0c;为了验证算法的准确率。将模型测试的结果保存为txt文件&#xff08;每一个txt文件&#xff0c;对应一个图片&#xff09;。此外&#xff0c;需要将数据集中的标签由[x,y,w,h]转为[x1,y1,x2,y2]。最后&#xff0c;运行验证代码 …

轻松整理电脑文件:按大小归类保存,高效管理你的数据

你是否曾经在电脑中迷失在纷繁复杂的文件海洋中&#xff1f;你是否曾经花费大量时间搜索需要的文件&#xff0c;却发现它们并不在你想找的地方&#xff1f;如果你也遇到了这样的问题&#xff0c;那么是时候采取行动&#xff0c;对电脑文件进行整理和归类了。 首先。进入文件批…

问答区混赏金的集合贴

此贴专记录CSDN问答社区里面&#xff0c;一些回答者在临近结题时胡乱回答&#xff0c;只为分取结题赏金的人。 为了截图方便&#xff0c;给回答者点赞和点踩不是对其回答的认可和不认可&#xff0c;只是为了方便截图而已 文章目录 第一位——夜深人静的哝玛 (PS:与本人的头像和…

【CUDA编程概念】一、什么是bank conflict?

前言 搜了不少答案&#xff0c;大多是在避免Bank Conflict&#xff0c;很难找到一个关于Bank Conflict的详细定义&#xff0c;这里找了些资料来尝试解释下&#xff1b; 一、基础概念 先简单复习下相关概念 GPU调度执行流程&#xff1a; SM调度单位为一个warp&#xff08;一…

AI-FGNet降噪算法

上一篇文章介绍AI-CGNet降噪算法和AI-GruNet降噪算法&#xff0c;本篇文章介绍一个新的轻量级降噪做法AI-FGNet。 一、模型结构 AI-FGNet网络相比AI-GruNet&#xff0c;额外添加一层全连接实现特征的维度变换&#xff0c;作为频谱压缩、控制计算量的一种手段。此外&#xff0c…

Win11下无法打开丛林之狐,提示未检测到DirectX 8.1

新装的win11系统&#xff0c;打开丛林之狐提示未检测到DirectX 8.1. 运行dxdiag检查DirectX版本&#xff1a; DX版本已经是12了&#xff1a; 最终参考了这篇文章解决了&#xff1a; 罪恶都市出现XX-directx version 8.1处理方法 - 知乎 控制面板 > 程序 > 启用或关闭Wi…

(三) gitblit管理员手册

(一)gitblit安装教程 (二) gitblit用户使用教程 (三) gitblit管理员手册 目录 权限管理创建仓库时创建用户普通用户 管理员用户访问限制和访问权限仓库创建权限分配 Teams普通组管理员组 参考资料 权限管理 创建仓库时 选择指定的人员查看,克隆,推送 不允许fork 对应Anonymo…

9.30小任务

消息队列实现进程之间通信方式 实现了父子进程之间的通信 #include <myhead.h>//消息结构体 typedef struct {long msgtype; //消息类型char data[1024]; //消息正文 }Msg_ds;#define SIZE sizeof(Msg_ds)-sizeof(long) //正文大小int main(int arg…

从私服上拉取jar包,就是拉取不下来

明明私服上有jar包&#xff0c;但是就是拉取不下来&#xff0c;原因有很多种&#xff0c;我这里分享一种情况&#xff0c;我是因为idea的maven配置忘记改过来了&#xff0c;如下&#xff1a; 因为setting配置文件是拷贝来的&#xff0c;嫌麻烦&#xff0c;配置文件里的本地仓库…

10链表-单链表构造LinkedList

目录 LeetCode之路——707. 设计链表 分析&#xff1a; Code&#xff1a; LeetCode之路——707. 设计链表 你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;n…

如何写一份完整的职业规划书?

写职业规划书&#xff0c;确定今后几年的一个发展方向&#xff08;职业规划建议越早越好&#xff09;&#xff0c;帮助自己收获更大的成功。普通的职业规划书书写起来十分简单&#xff0c;没有想象中那样复杂&#xff0c;只需要包括基本的部分&#xff0c;就可以轻轻松松完成。…

Go-Ldap-Admin | openLDAP 同步钉钉、企业微信、飞书组织架构实践和部分小坑

目录 一、Docker-compose快速拉起demo测试环境 二、原生部署流程 安装MySQL&#xff1a;5.7数据库 安装openLDAP 修改域名&#xff0c;新增con.ldif 创建一个组织 安装OpenResty 下载后端 下载前端 部署后端 部署前端 三、管理动态字段 钉钉 企业微信 飞书 四、…

源码编译elfutils

编译环境 阿里云ubuntu20.04 编译步骤&#xff1a; 1 下载elfutils-0.170源码 2 解压 3 按照elfutils-0.170 (linuxfromscratch.org) 的描述&#xff0c;首先 ./configure --prefix/usr --program-prefix"eu-" 4 make 此时发生一个问题&#xff0c;报错&#x…

支付宝电脑网站支付,支付退款

一&#xff1a;支付宝退款 示例代码&#xff1a; AlipayClient alipayClient new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key&qu…

CSS 选择器Day01

CSS 定义&#xff1a;层叠样式表(Cascading Style Sheets&#xff0c;缩写为 CSS)&#xff0c;是一种用于定义网页或文档的外观和样式的标记语言。 CSS是一种 样式表 语言&#xff0c;用来描述 HTML 文档的呈现 (美化内容)。它用于控制文本的字体、颜色、间距、布局、背景等各…

Java安全之servlet内存马分析

目录 前言 什么是中间键 了解jsp的本质 理解servlet运行机制 servlet的生命周期 Tomcat总体架构 查看Context 的源码 servlet内存马实现 参考 前言 php和jsp一句话马我想大家都知道&#xff0c;早先就听小伙伴说过一句话木马已经过时了&#xff0c;现在是内存马的天下…

力扣:114. 二叉树展开为链表(Python3)

题目&#xff1a; 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。…

【WebGIS实例】(11)Cesium自定义区域裁剪(挖除挖出)

前言 本篇博客完全参考cesium-地面裁剪(多个剪切面)_cesium clippingplane-CSDN博客&#xff0c;感谢孙霸天大佬提供的实现方法。在此博客的基础上&#xff0c;本篇博客做了以下工作&#xff1a; 修复点位集合逆时针和顺时针导致不同的结果的问题新增了挖出的实现方案创建裁切面…