关于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:}
由于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;
}或者直接用定时器实现。 中断太快了,微秒级延时可以用指令延时,就是用__nop zhaocyNJ 发表于 2023-9-7 09:45
由于systick进出中断也会耗时且频繁打断CPU,想要微秒级的延迟建议使用或者直接用定时器实现。 ...
好呢,好呢,谢谢大佬。终于知道原因了 ayb_ice 发表于 2023-9-7 13:17
中断太快了,微秒级延时可以用指令延时,就是用__nop
大佬,针对MM32G0001这款芯片,执行__nop,48次就是1um吗 us级延时如果精确需要,就用定时器,若不是则可以用指令来实现。 中断太快
页:
[1]