针对STM32的SysTick中断,网上有很多说法,有人说SysTick是属于内核里面的中断,除了NMI等不可屏蔽中断,SysTick可以无视一切外设中断,即使外设中断的抢占优先级高于SysTick中断,对于这种说法,我本人的态度是半信半疑的,于是,我做了以下实验来进行验证。
实验芯片:STM32L052
中断类型:SysTick 、LPTIM1(update)
NVIC中断寄存器组:2(2位抢占优先级,2位子优先级,由于stm32L0不支持子优先级,故只有高2位有效)
1.首先将SysTick中断优先级设置为最高(0),LPTIM1设置为最高(0)
SysTick中断服务函数:
void SysTick_Handler(void)
{
HAL_IncTick();
printf("SysTick\r\n");
}
LPTIM更新中断服务函数,里面有个while(1)用来判断其他任务是否能够抢占当前中断。
void LPTIM1_IRQHandler(void)
{
HAL_LPTIM_IRQHandler(&hlptim1);
while(1)
{
unsigned int i=0xFFFFFF;
printf("LPTIM_interrupt\r\n");
for(;i>0;i--);
}
}
实验现象:
仅仅有“LPTIM_interrupt”字符串打印,说明没有发生抢占行为,也就是说当外设中断优先级和systick中断优先级一致时,Systick中断并不能抢占其他的中断。
实际上在《Cortex-M0权威指南》中也有说明:
2.接下来,再进行第二个实验,将LPTIM中断优先级调低,保证SysTick>LPTIM
此时,LPTIM中断优先级已经被调到1 ,SysTick中断是可以抢占的。
但是还需要对LPTIM中断服务函数作些修改,否则,难以观察到LPTIM中的
串口打印。
void LPTIM1_IRQHandler(void)
{
HAL_LPTIM_IRQHandler(&hlptim1);
printf("LPTIM_interrupt\r\n");
}
可以看到,SysTick已经抢占了LPTIM中断。
但是由于串口是查询方式发送,其在发送过程中发生了抢占,所以会发生上述情况。