HAL库延时函数HAL_Delay()遇坑,初学HAL库感受着它强大的封装库可以拿来直接用,对于初学者很容易上手,看来以后小学生都能写单片机了
问题:延时函数一直用的HAL_Delay()毫秒级延时,但是在中断中调用延时函数却卡死在这里,从封装函数中可以发现函数中有中断获取系统时钟HAL_IncTick(void),由于优先级系统给的低,所以在高优先级的中断中无法产生这个低级的中断,导致程序卡死在HAL_Delay()中
由此建议直接不用HAL_Delay(),直接自己写延时函数:
void delay_ms(int32_t nms)
{
int32_t temp;
SysTick->LOAD = 8000*nms;
SysTick->VAL=0X00;//清空计数器
SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
do
{
temp=SysTick->CTRL;//读取当前倒计数值
}
while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
代码直接用就可以,但是要注意根据自己单片机的系统时钟来配置