STM32实现微秒级延时函数的3种方法(含独创内容)
好像在使用超声波雷达测距的时候用到了这个函数
方式1:重载HAL_Delay()函数:自己发现的未验证(错误的方法)
__weak void HAL_Delay(uint32_t Delay)
{
uint32_t tickstart = HAL_GetTick();
uint32_t wait = Delay;
/* Add a freq to guarantee minimum wait */
if (wait < HAL_MAX_DELAY)
{
wait += (uint32_t)(uwTickFreq);
}
while ((HAL_GetTick() - tickstart) < wait)
{
}
}
把上述代码修改一下:
//这里已经去掉weak了,重载了
void HAL_Delay(uint32_t Delay)
{
uint32_t tickstart = HAL_GetTick();
uint32_t wait = Delay;
/* Add a freq to guarantee minimum wait */
if (wait < HAL_MAX_DELAY)
{
wait += (uint32_t)(uwTickFreq)/1000;
}
while ((HAL_GetTick() - tickstart) < wait)
{
}
}
唯一不同的就是除了一个1000.
方式2:(已经验证的方法)
void delay_us(uint8_t SYSCLK, int i){
//比如SYSCLK=72,或者SYSCLK=8,i是需要延时的微秒数
uint32_t fac_us=0;
uint32_t temp;
fac_us=SYSCLK/8;
SysTick->LOAD=i*fac_us;
SysTick->VAL=0;
SysTick->CTRL=1;
do{
temp=SysTick->CTRL;
}while(temp&1&&!(temp&(1<<16)));
SysTick->CTRL=0;
SysTick->VAL=0;
}
或者:
uint32_t fac_us=0;
void delay_init(uint8_t SYSCLK){
fac_us=SYSCLK/8;
}
void delay_us(int i){
uint32_t temp;
SysTick->LOAD=i*fac_us;
SysTick->VAL=0;
SysTick->CTRL=1;
do{
temp=SysTick->CTRL;
}while(temp&1&&!(temp&(1<<16)));
SysTick->CTRL=0;
SysTick->VAL=0;
}
void delay_us(int i){
//比如SYSCLK=72,或者SYSCLK=8,i是需要延时的微秒数
uint32_t fac_us=0;
uint32_t temp;
uint8_t SYSCLK;
SYSCLK=HAL_RCC_GetHCLKFreq()/1000/1000;
fac_us=SYSCLK/8;
SysTick->LOAD=i*fac_us;
SysTick->VAL=0;
SysTick->CTRL=1;
do{
temp=SysTick->CTRL;
}while(temp&1&&!(temp&(1<<16)));
SysTick->CTRL=0;
SysTick->VAL=0;
}
另外还可以通过定时器TIM来实现微妙延时
作者:geniusNMRobot顶级专家