1,定时器
定时器预分配系数为:系统时钟-1
定时器比较值:默认即可,如果最大值为65535,则最大us级延时为65535us==65ms
一定是向上计数!!
void delay_us(uint16_t nus)
{
//减5是为了补偿函数调用和指令执行的时间开销
uint16_t differ = 0xffff-nus-5;
//设置定时器2的计数初始值
__HAL_TIM_SetCounter(&htim2,differ);
//开启定时器
HAL_TIM_Base_Start(&htim2);
while(differ<0xffff-5)
differ = __HAL_TIM_GetCounter(&htim2);
//关闭定时器
HAL_TIM_Base_Stop(&htim2);
}
2,空循环
系统主频为168MHz每个__NOP()指令大约需要4个时钟周期执行
void for_delay_us(uint32_t nus)
{
volatile uint32_t Delay = nus * 168/4;//
do
{
__NOP();
}
while (Delay --);
}
3,使用SysTick
void delay_us(uint32_t udelay)
{
uint32_t startval,tickn,delays,wait;
startval = SysTick->VAL;
tickn = HAL_GetTick();
//sysc = 72000; //SystemCoreClock / (1000U / uwTickFreq);
delays =udelay * 72; //sysc / 1000 * udelay;
if(delays > startval)
{
while(HAL_GetTick() == tickn)
{
}
wait = 72000 + startval - delays;
while(wait < SysTick->VAL)
{
}
}
else
{
wait = startval - delays;
while(wait < SysTick->VAL && HAL_GetTick() == tickn)
{
}
}
}