打印
[其他]

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

[复制链接]
619|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
momoto|  楼主 | 2023-9-7 00:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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);
        }
}

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

使用特权

评论回复
沙发
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,想要微秒级的延迟建议使用或者直接用定时器实现。 ...

好呢,好呢,谢谢大佬。终于知道原因了

使用特权

评论回复
5
momoto|  楼主 | 2023-9-7 20:16 | 只看该作者
ayb_ice 发表于 2023-9-7 13:17
中断太快了,微秒级延时可以用指令延时,就是用__nop

大佬,针对MM32G0001这款芯片,执行__nop,48次就是1um吗

使用特权

评论回复
6
chenqianqian| | 2023-9-7 21:54 | 只看该作者
us级延时如果精确需要,就用定时器,若不是则可以用指令来实现。

使用特权

评论回复
7
supernan| | 2023-9-7 22:30 | 只看该作者
中断太快

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

14

帖子

0

粉丝