[APM32F4] 如何使用Delay_us()函数

[复制链接]
Tom952331 发表于 2025-8-14 13:18 | 显示全部楼层 |阅读模式
  1. void Delay_Init(void)
  2. {
  3.     SystemCoreClockUpdate();
  4. }
  5. void Delay_ms(__IO u32 nms)
  6. {
  7.     SysTick_Config(SystemCoreClock / 1000);

  8.     cntMs = nms;
  9.     while(cntMs != 0);
  10. }
  11. void Delay_us(__IO u32 nus)
  12. {
  13.     SysTick_Config(SystemCoreClock / 1000000);

  14.     cntUs = nus;
  15.     while(cntUs != 0);
  16. }
  17. void SysTick_Handler(void)
  18. {
  19.     if(cntMs)
  20.     {
  21.         cntMs --;
  22.     }

  23.     if(cntUs)
  24.     {
  25.         cntUs --;
  26.     }
  27. }
我用Delay_ms函数就好使,用Delay_us函数就会卡住。
请问高手,如何解决?谢谢
真的问题不大 发表于 2025-8-14 18:16 | 显示全部楼层
应该是中断频率过高了,你看看

评论

正解  发表于 2025-8-17 10:25
海洋凝视 发表于 2025-8-14 19:20 | 显示全部楼层
代码没有问题呀!
应该不会导致crash啊!
看看是不是systick还关联了其它函数或操作。
dffzh 发表于 2025-8-15 14:59 | 显示全部楼层
朋友,找到原因了吗?
 楼主| Tom952331 发表于 2025-8-15 15:17 | 显示全部楼层
dffzh 发表于 2025-8-15 14:59
朋友,找到原因了吗?

没有
xch 发表于 2025-8-15 17:21 | 显示全部楼层
MCU 的主频多少?
 楼主| Tom952331 发表于 2025-8-16 07:53 | 显示全部楼层
xch 发表于 2025-8-15 17:21
MCU 的主频多少?

168M
kai迪皮 发表于 2025-8-16 10:27 | 显示全部楼层
1. 系统里面只有滴答中断么?
2. 若不是只有滴答中断建议看看是不是有更高优先级的中断一直在相应
3.若只有滴答中断的情况下,建议仿真查看软件卡死在什么地方
alienmiller 发表于 2025-8-16 12:29 | 显示全部楼层
这种情况一般是重复引用了 SYSTICK
alienmiller 发表于 2025-8-16 12:31 | 显示全部楼层
建议改为纯软延时,不用SYSTICK试试
dirtwillfly 发表于 2025-8-17 10:26 | 显示全部楼层
滴答定时器中断频率太高了,占用了大量的mcu时间
mbutterfly 发表于 2025-8-18 08:00 | 显示全部楼层
延时真的要好好用
xch 发表于 2025-8-18 11:14 | 显示全部楼层

把其他中断优先级调低。systick优先级调到最高。

168MHZ 足够响应1MHZ 的中断。有168拍时间,你这中断大约只需要花60拍以内。还有100拍余量。
如果微秒中断和毫秒中断不可能同时存在,改一下服务函数cntUs/cntMs可以共享同一个变量。中断服务也快些。

建议打开速度优化

您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

142

帖子

0

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