【8】uC/OS-III应用开发————>软件定时器(STM32F767)

  1. 简述
    1. 定时器:是指从指定的时刻开始,经过一个指定时间,然后触发一个超时事件,用户可以自定义定时器的周期与频率
  2. 分类:
    1. 硬件定时器:
      1. 芯片本身提供的功能
      2. 每次在定时时间到达之后就会自动触发一个中断,用户在中断中处理信息
    2. 软件定时器:
      1. 由操作系统提供的一类系统接口,构建在硬件定时器(SysTick)基础上
      2. 软件定时器指定时间到过后要调用的函数(也称超时函数/回调函数,为了统一,下文均用回调函数),在回调函数中处理信息
  3. uC/OS定时模式
    1. 单次模式:启动定时器,时间到达,只执行一次回调函数后,将不再重复执行
    2. 周期模式:定时器会按照设置的定时时间,循环执行回调函数,直到用户将定时器删除
  4. 应用场景
    1. 适合于对时间精度要求不高的任务
  5. 软件定时器的精度
    1. 系统节拍是系统的心跳节拍,表示系统时钟的频率,OS_CFG_TICK_RATE_HZ,默认是1000,周期1ms
    2. 精度决定于系统时基频率,也就是变量OS_CFG_TMR_TASK_RATE_HZ的值,默认100,周期10ms
    3. 定时器任务的频率不能大于系统时基频率
  6. 相关函数
    1. OSTmrCreat();  创建定时器
    2. OSTmrDel();  删除定时器
    3. OSTmrStart();  启动定时器计数
    4. OSTmrStop();  停止定时器计时
    5. OSTmrRemainGet();  获取定时器剩余时间
    6. OSTmrStateGet();  获取当前定时状态
  7. 例程
    1. 创建,启动
      /**************************************************
       * 函数名:static void AppTaskTmr(void *p_arg)
       * 描述  :创建软件定时器
       * 输入  :无
       * 输出  :无
       * 返回  :无 
       * 调用  :内部调用 
       **************************************************/
      static void AppTaskTmr(void *p_arg)
      {
          OS_ERR err;
      
          OS_TMR my_tmr;  //声明软件定时器对象
          
          (void)p_arg;
          
          //创建软件定时器
          OSTmrCreate( (OS_TMR            *)&my_tmr,              //软件定时器对象
                       (CPU_CHAR          *)"MySoftTimer",        //命名软件定时器
                       (OS_TICK            )100,                   //定时器初始值,依10hz时基计算,即为1S
                       (OS_TICK            )100,                   //定时器周期重装值,依10Hz时基计算,即为1S
                       (OS_OPT             )OS_OPT_TMR_PERIODIC,  //周期性定时
                       (OS_TMR_CALLBACK_PTR)TmrCallback,          //回调函数
                       (void              *)"Time over!!!",       //传递实参给回调函数
                       (OS_ERR            *)&err);                //返回错误类型
          //启动软件定时器             
          OSTmrStart( (OS_TMR             *)&my_tmr,              //软件定时器对象
                      (OS_ERR             *)&err);                //返回错误类型
              
          ts_start = OS_TS_GET();     //获取定时前时间戳
                       
          while(DEF_TRUE)
          {
              OSTimeDly(1000, OS_OPT_TIME_DLY, &err);;   //不阻塞该任务
          }
      }

       

    2. 回调函数
      /**************************************************
       * 函数名:void TmrCallback (OS_TMR *p_tmr, void *p_arg)
       * 描述  :软件定时器的回调函数
       * 输入  :无
       * 输出  :无
       * 返回  :无 
       * 调用  :内部调用 
       **************************************************/
      void TmrCallback (OS_TMR *p_tmr, void *p_arg)
      {
          CPU_INT32U  cpu_clk_freq;
          printf("%s", (char *)p_arg);
          cpu_clk_freq = BSP_CPU_ClkFreq();   //获取CPU时钟
          
          LED1_TOGGLE;
          
          ts_end = OS_TS_GET() - ts_start;    //获取定时后的时间戳
          
          printf("\r\n 定时1S,通过时间戳测得定时 %07d us, 即%04d ms; \r\n",
                                                  ts_end / (cpu_clk_freq / 1000000),  //将定时时间折算成us
                                                  ts_end / (cpu_clk_freq / 1000) );   //将定时时间折算成Ms
          ts_start = OS_TS_GET();     //获取定时前的时间戳
      }

       

  8. 下载验证
  9. 总结
    1. 软件定时器核心是在底层的硬件定时器(SysTick内核定时器)上进行软件分频
    2. 回调函数是在定时器任务中被调用,所以回调函数的上、下文环境是在任务中,并且运行回调函数时调度器处于被锁状态
    3. 回调函数越简短越好,并且不能在回函函数中等待消息队列、信号量、事件等操作
  10. 参考资料:
    1. 正点原子《STM32F767 UCOS开发手册》
    2. 野火《uC/OS-III内核应用与开发》
    3. 《嵌入式实时操作系统 uC/OS-II原理及应用(第二版)》
    4. 官方源码
  11. 硬件平台:
    1. 正点原子阿波罗F767
  12. 软件平台:
    1. MDK5.2.5
  13. 库版本:
    1. TM32Cube_FW_F7_V1.4.0
  14. uC/OS-III版本
    1. UCOSIII 3.04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值