当前位置: 首页 > article >正文

STM32F407ZGT6-UCOSIII笔记6:UCOS-III软件定时器

今日学习使用UCOS系统的软件定时器功能

本文学习与程序编写基于 正点原子的 STM32F1 UCOS开发手册

文章提供测试代码讲解、完整工程下载、测试效果图

软件定时器卡柱UCOS III 系统问题解决

目录

UCOS-III 软件定时器:

单次定时器:

周期定时器:

开启软件定时器:

定时器分辨率:

定义周期定时器:

初始化周期定时器:

开启周期定时器:

测试效果截图:

测试工程下载:

遇到问题与解决:


UCOS-III 软件定时器:

单次定时器:

周期定时器:

开启软件定时器:

将os_cfg.h里的宏定义 OS_CFG_TMR_DEL_EN  设置为1

定时器分辨率:

软件定时器分辨率由系统节拍频率决定:

OS_RATE_HZ     const  OSCfg_TickRate_Hz          = (OS_RATE_HZ  )OS_CFG_TICK_RATE_HZ;

我这里定义为200Hz,那分辨率就是1/200 s = 5ms:

但定时器 实际分辨率 由  OS_CFG_TMR_TASK_RATE_HZ 决定,这里是1/100=10ms

定时器最终的定时时长就是初始化的 延迟值 * 分辨率 ( 分辨率10ms )

定义周期定时器:

现在我在Public.h定义与声明一个周期定时器以及它的回调函数:

OS_TMR OS_Timer1_Periodic;   //OS系统 软件定时器 1 周期模式 

周期定时器的回调函数:


// OS_Timer1_Periodic 定时器回调函数 
// 打印提示信息
void OS_Timer1_Periodic_callback(void *p_tmr,void *p_arg)
{
	//static int Timer1_count=0;
	//Timer1_count++;
	UsartPrintf(USART1, "OS_Timer1_Periodic Print \r\n");
}

初始化周期定时器:

随后在  main.h  文件的  void start_task(void *p_arg)  函数里为其进行初始化:

	//初始化 OS_Timer1_Periodic 软件定时器
	OSTmrCreate((OS_TMR *) &OS_Timer1_Periodic ,   //OS系统 软件定时器 1 周期模式 
							(CPU_CHAR *) "OS_Timer1_Periodic", //定时器名称
							(OS_TICK ) 100,  // 启动延时 为100*10 ms
							(OS_TICK ) 20,   // 周期为 20*10 ms
							(OS_OPT  ) OS_OPT_TMR_PERIODIC, //周期定时模式
							(OS_TMR_CALLBACK_PTR ) OS_Timer1_Periodic_callback,//回调函数
							(void * )  0,//参数为0
							(OS_ERR *) &err		
							);

开启周期定时器:

在 #include "ComTask.h" 文件中,在任务 ComTask 里开启与关闭定时器:

#include "ComTask.h"


/*
	ComTask 
	打印系统节拍,删除CalculateTask,打开软件定时器 OS_Timer1_Periodic
	ComTask 计数自己运行次数
	等待800ms
	运行五次后停止定时器 OS_Timer1_Periodic 
*/	

void comTask(void * p_arg)
{
	OS_ERR err;
	int i=0,OSTime_tickRate;
	
	//char ComTask_str[]="ComTask_write";
	
	p_arg = p_arg;
	OSTime_tickRate=OSCfg_TickRate_Hz;            //获取系统节拍频率,(该宏定义在 OS_CFG_APP.H)
	UsartPrintf(USART1, "OSCfg_TickRate_Hz = %d Hz \r\n",OSTime_tickRate);  //打印系统节拍频率
	OSTaskDel((OS_TCB*)&CalculateTaskTaskTCB,&err);             //删除CalculateTask 
	UsartPrintf(USART1, "ComTask delete CalculateTask !\r\n");	//打印删除 CalculateTask 提示
	OSTmrStart(&OS_Timer1_Periodic,&err); //开启OS_Timer1_Periodic定时器
	UsartPrintf(USART1, "ComTask open the OS_Timer1_Periodic\r\n");			
	
	while (DEF_TRUE)
	{
		i++;
		UsartPrintf(USART1, "ComTask Print%d\r\n",i);	
		if(i==5)
		{
			OSTmrStop(&OS_Timer1_Periodic,OS_OPT_TMR_NONE,OS_Timer1_Periodic_callback,&err);//关闭OS_Timer1_Periodic定时器
			UsartPrintf(USART1, "ComTask closed the OS_Timer1_Periodic\r\n");				
		}
		
		OSTimeDlyHMSM(0,0,0,800,OS_OPT_TIME_HMSM_STRICT,&err); //延时800ms
	}
}

测试效果截图:

随后就是运行第五次关闭了这个定时器:

测试工程下载:

工程包含一份程序设计框架说明,不明白可以看看:

 https://download.csdn.net/download/qq_64257614/90145113

遇到问题与解决:

第一次进定时器回调函数系统就卡住了:

后来注释掉这个static 类型的 变量 就好了:

有可能是这个定时器栈大小 太小 的问题:


http://www.kler.cn/a/441614.html

相关文章:

  • py脚本部署到服务器定时启动
  • 大语言模型与水文水资源领域的深度融合:如何高效完成时间序列分析、空间数据处理、水文模型优化以及智能科学写作等
  • UNIAPP-微信小程序实现文本纠错功能
  • 《深入浅出HTTPS​​​​​​​​​​​​​​​​​》读书笔记(19):密钥
  • 02. Docker:安装和操作
  • supervision - 好用的计算机视觉 AI 工具库
  • java后端环境配置
  • Linux栈帧
  • Ubuntu22.04搭建FTP服务器保姆级教程
  • SSM 电脑配件销售系统的高效设计与 JSP 实现技巧分享
  • sql server一些冷知识
  • node_modules文件夹删除失败解决办法
  • vue3 echarts tree结构实现点击添加子节点和修改图标样式
  • 基于streamlit搭简易前端页面
  • 二、STM32MP257安全启动流程简介
  • oracle多次替换字符,批量替换,循环替换------------gxl
  • 实战攻防中针对JS路径的泄露和Webpack漏洞的初探
  • 无人机故障安全模式设计逻辑与技术!
  • SQL -- 条件分支
  • OpenCV及基本用法