momoto 发表于 2023-9-7 00:04

关于MM32G0001微秒延时函数的疑问

本帖最后由 momoto 于 2023-9-7 00:06 编辑

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

    NVIC_SetPriority(SysTick_IRQn, 0x0);
}微秒延时函数
void PLATFORM_DelayUS(uint32_t n)
{
    PLATFORM_DelayTick = n;
    while (0 != PLATFORM_DelayTick)
    {
    }
}毫秒延时函数void PLATFORM_DelayMS(uint32_t n)
{
        uint32_t i;
        for(i=0;i<n;i++)
        {
                PLATFORM_DelayUS(1000);
        }
}
结果怎么测试都无法通过,毫秒延时函数也不能使用。刚学这方面没多久,还是新手小白,望各位大佬指点一二,感谢感谢{:smile:}

zhaocyNJ 发表于 2023-9-7 09:45

由于systick进出中断也会耗时且频繁打断CPU,想要微秒级的延迟建议使用SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);void DELAY_Us(uint32_t nus)
{
    uint32_t temp;
    SysTick->LOAD = nus * hclk / 1000000;
    SysTick->VAL = 0x00;
    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ;
    do
    {
      temp = SysTick->CTRL;
    }while((temp & 0x01) && !(temp & (1<<16)));
    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
    SysTick->VAL = 0x00;
}或者直接用定时器实现。

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

中断太快
页: [1]
查看完整版本: 关于MM32G0001微秒延时函数的疑问