打印
[LKS32 软件]

Keil软复位不会清除NVIC中的PendingIRQ

[复制链接]
256|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
robertesth|  楼主 | 2023-4-24 11:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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();










使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

1166

帖子

0

粉丝