Keil软复位不会清除NVIC中的PendingIRQ。我们在调试过程中,会习惯使用Keil中的软复位,下图中的左起第一个按钮,
通常操作顺序为先停止程序运行(halt PC),软复位reset PC,然后点击run令程序重新开始执行
在LKS08x芯片中,软复位仅仅将CPU的PC(Program Counter)重置为程序入口。而所有外设寄存器配置仍然保持,RAM中的内容亦不受复位影响。
可以在Hardware Init过程中,使用如下语句来进行模块级的软复位,如下语句对Timer进行了软复位
SYS_SFT_RST|=BIT2;
SYS_SFT_RST=0;
如果程序开启了某个外设中断,当在调试模式下,程序暂停运行时,如果有外设中断请求,会使得Cortex-M0中的NVIC pending IRQ置位。
即使后续对模块进行软复位清除了外设中断标志如UTIMER_IF。PendingIRQ标志仍然会保留。
如果软复位后,程序重新开始执行,运行至开启中断的位置,即使此时外设的中断标志仍然为0,也会导致立即进入相应中断函数,从而导致进入中断的时机和预期不符。
推荐使用如下代码,在开始外设中断前,先清除NVIC中的Pending位。
NVIC_ClearPendingIRQ (TIMER0_IRQn);
NVIC_EnableIRQ (TIMER0_IRQn);
__enable_irq();
|