问题描述
延时函数delay_ms()的实现原理是根据滴答定时器中断来实现的。滴答定时器中断优先级设置为15,即最低优先级。另外开启外部中断EXTI0,EXTI0的中断优先级设置为4,EXTI0的中断优先级高于滴答定时器的中断优先级。此时在中断服务函数内部调用delay_ms()函数,STM32单片机还可以正常进行延时吗?考虑到优先级的原因,这令我很疑惑。我给你举个例子如void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
delay_ms(100); …}
答案解释
因为:
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
/* EXTI line interrupt detected */
if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
HAL_GPIO_EXTI_Callback(GPIO_Pin);
}
}
EXTI0进入中断之后,立马清除中断挂起标志位,使得NVIC可以立马响应别的中断(优先级较低的中断也可以,因为此时没有其他优先级更高的中断请求在排队)。所以,即使延时delay_ms()函数依靠的滴答定时器中断优先级最低,也可以实现在回调函数中的延时功能。