[学习资料] 单片机实现非阻塞延时

[复制链接]
1647|14
 楼主| pixhw 发表于 2023-5-25 15:24 | 显示全部楼层 |阅读模式
  非阻塞式延时是指程序在执行延时函数时可以继续执行其他任务,不会一直等待。
  1. E_Bool Ticker_Out(u32 *pTicker, u32 uCompareValue)
  2. {
  3.     u32 uTicks = 0;
  4.         uTicks = BSP_Get_SysTick();
  5.    
  6.     if(0 == uCompareValue)
  7.         {
  8.                   *pTicker = uTicks;
  9.           return True;               
  10.         }
  11.     else
  12.         {
  13.             if(uTicks >= (*pTicker))
  14.                         {
  15.                                   uTicks = uTicks - (*pTicker);
  16.                         }
  17.             else
  18.                         {
  19.                                   uTicks = (U32_MAX_VALUE - (*pTicker)) + uTicks;
  20.                         }
  21.             if (uTicks >= uCompareValue)
  22.                         {
  23.                             return True;
  24.                         }
  25.     }
  26. return False;
  27. }
上述代码中,BSP_Get_SysTick()是得到在滴答定时器中断函数中计数的值:
  1. u32 BSP_Get_SysTick(void)
  2. {
  3.     return gSystickTimes;    /* 获取系统心跳 */              
  4. }
  5. void SysTick_Handler(void)
  6. {
  7.    gSystickTimes++;      /* 系统心跳计数 */
  8. }
  1. int main()
  2. {
  3.     E_Bool eState = False;
  4.         static u32 uSampleTicker = 0;

  5.     while(1)
  6.     {
  7.         eState = Ticker_Out(&uSampleTicker, 500);
  8.             if(True == eState)
  9.             {
  10.             Ticker_Out(&uSampleTicker, 0);
  11.             LED_ON();
  12.         }
  13.     }
  14. }






caigang13 发表于 2023-6-8 23:10 来自手机 | 显示全部楼层
非阻塞延时用定时器中断实现
chenjun89 发表于 2023-6-8 23:45 来自手机 | 显示全部楼层
这种用法很巧妙
olivem55arlowe 发表于 2023-6-10 15:43 | 显示全部楼层
并不能完全保证精确的计时               
kkzz 发表于 2023-6-10 15:57 | 显示全部楼层
定义了一个延时计数器delay_counter,在延时函数delay_ms()中将要等待的毫秒数作为参数传入,并通过SysTick_Config()函数配置SysTick定时器为1ms中断,并开启定时器。当delay_counter计数器倒计时到0后,函数返回并禁用SysTick定时器;在主程序中调用delay_ms()函数时,如果需要等待一定时间,则传入对应的毫秒数即可。
primojones 发表于 2023-6-10 16:21 | 显示全部楼层
单片机实现延时一般有几种方法              
phoenixwhite 发表于 2023-6-10 16:27 | 显示全部楼层
传统的阻塞延时 方式会导致程序停顿,无法同时执行其他任务,因此通常不适用于多任务系统或对时序精度要求较高的场合。
louliana 发表于 2023-6-10 16:43 | 显示全部楼层
在单片机的程序设计中,常需要使用延时函数来实现某些功能或任务。
wangdezhi 发表于 2023-6-10 16:48 | 显示全部楼层
需要考虑其他因素,如系统资源的占用、中断处理函数的编写等。
zerorobert 发表于 2023-6-10 17:10 | 显示全部楼层
单片机延时程序怎么写?是根据什么原理写的?
maudlu 发表于 2023-6-10 17:22 | 显示全部楼层
这种方法具有精度高、可重复性好、计算量小等优点。
iyoum 发表于 2023-6-10 17:35 | 显示全部楼层
使用非阻塞延时时,要根据具体场景选择合适的方法,并进行相关参数的设置和优化
uytyu 发表于 2023-6-10 17:53 | 显示全部楼层
需要使用非阻塞延时实现定时功能,即不占用CPU处理资源的同时可以进行延时计数。
chenqianqian 发表于 2023-6-11 15:44 来自手机 | 显示全部楼层
用定时器计数实现非阻塞
earlmax 发表于 2023-6-13 20:55 | 显示全部楼层
基于系统时钟的时间戳计数               
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

4985

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部