写一段时钟频率为20MHz的us级别的延迟函数
时间: 2024-03-25 21:42:15 浏览: 14
在时钟频率为20MHz的单片机中,可以使用以下代码实现us级别的延时函数:
```c
void Delay_us(uint32_t nus)
{
uint32_t ticks;
uint32_t told, tnow, tcnt = 0;
uint32_t reload = SysTick->LOAD;
ticks = nus * (SystemCoreClock / 1000000);
tcnt = 0;
told = SysTick->VAL;
while (1) {
tnow = SysTick->VAL;
if (tnow != told) {
if (tnow < told)
tcnt += told - tnow;
else
tcnt += reload - tnow + told;
told = tnow;
if (tcnt >= ticks)
break;
}
}
}
```
这段代码与上面的代码类似,仅需修改计算ticks的公式即可。因为时钟频率为20MHz,所以SystemCoreClock的值应该为20MHz。因此,ticks的计算公式为:
```c
ticks = nus * (SystemCoreClock / 1000000);
```
其中,nus表示需要延时的us数。该函数基于系统滴答定时器(SysTick)实现。需要注意的是,实际使用中可能会受到其他中断的干扰,因此需要进行一定的优化和调试。