[其他] 关于MM32G0001微秒延时函数的疑问

[复制链接]
1615|6
 楼主| momoto 发表于 2023-9-7 00:04 | 显示全部楼层 |阅读模式
本帖最后由 momoto 于 2023-9-7 00:06 编辑

版主以及各位大佬好,我是小白菜鸟。最近iceasy白**的MM32G0001板子到了,测试学习过程中有个疑问,就是微秒级延时函数的问题。在标准库中的例程中只有毫秒延时函数,学习中需要使用到US级,我就尝试修改。
修改如下:
初始化延时
  1. void PLATFORM_InitDelay(void)
  2. {
  3.     if (SysTick_Config(RCC_GetHCLKFreq() / 1000000))
  4.     {
  5.         while (1)
  6.         {
  7.         }
  8.     }

  9.     NVIC_SetPriority(SysTick_IRQn, 0x0);
  10. }
微秒延时函数
  1. void PLATFORM_DelayUS(uint32_t n)
  2. {
  3.     PLATFORM_DelayTick = n;
  4.     while (0 != PLATFORM_DelayTick)
  5.     {
  6.     }
  7. }
毫秒延时函数
  1. void PLATFORM_DelayMS(uint32_t n)
  2. {
  3.         uint32_t i;
  4.         for(i=0;i<n;i++)
  5.         {
  6.                 PLATFORM_DelayUS(1000);
  7.         }
  8. }

结果怎么测试都无法通过,毫秒延时函数也不能使用。刚学这方面没多久,还是新手小白,望各位大佬指点一二,感谢感谢

zhaocyNJ 发表于 2023-9-7 09:45 | 显示全部楼层
由于systick进出中断也会耗时且频繁打断CPU,想要微秒级的延迟建议使用
  1. SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
  1. void DELAY_Us(uint32_t nus)
  2. {
  3.     uint32_t temp;
  4.     SysTick->LOAD = nus * hclk / 1000000;
  5.     SysTick->VAL = 0x00;
  6.     SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ;
  7.     do
  8.     {
  9.         temp = SysTick->CTRL;
  10.     }while((temp & 0x01) && !(temp & (1<<16)));
  11.     SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
  12.     SysTick->VAL = 0x00;
  13. }
或者直接用定时器实现。
ayb_ice 发表于 2023-9-7 13:17 | 显示全部楼层
中断太快了,微秒级延时可以用指令延时,就是用__nop
 楼主| momoto 发表于 2023-9-7 20:12 | 显示全部楼层
zhaocyNJ 发表于 2023-9-7 09:45
由于systick进出中断也会耗时且频繁打断CPU,想要微秒级的延迟建议使用或者直接用定时器实现。 ...

好呢,好呢,谢谢大佬。终于知道原因了
 楼主| momoto 发表于 2023-9-7 20:16 | 显示全部楼层
ayb_ice 发表于 2023-9-7 13:17
中断太快了,微秒级延时可以用指令延时,就是用__nop

大佬,针对MM32G0001这款芯片,执行__nop,48次就是1um吗
chenqianqian 发表于 2023-9-7 21:54 来自手机 | 显示全部楼层
us级延时如果精确需要,就用定时器,若不是则可以用指令来实现。
supernan 发表于 2023-9-7 22:30 | 显示全部楼层
中断太快
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

16

帖子

0

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