STM32单片机实现中断后不继续向下执行而是返回到main函数

  做公司的一个项目,实现一个功能就是 机器在进行一项功能时(这项工作时间挺长),想要取消这项工作,重新选择。想了半天没想出来,结果同事提醒了一句,可以在程序中加一个外部中断,在中断中软件复位程序。用到以下两句话

__set_FAULTMASK(1); // 关闭所有中断
NVIC_SystemReset(); // 复位

在中断最后执行这两句话就系统复位了。但是在运行过程中出现了一下两个问题:

①发现我的程序死在复位函数中了 如下

static __INLINE void NVIC_SystemReset(void)
{
SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */
__DSB(); /* Ensure completion of memory access */
while(1); /* wait until reset */
}

一直在while(1)中。

解决办法:在网上查到有时复位芯片SP809会导致无法软件复位,把复位芯片拆掉后果然实现复位。

分析:有网友说是因为复位芯片导致系统无法把复位引脚拉低导致,但是我同事的另一个项目中使用了复位芯片也可以实现软件复位,待解决是什么原因。

②在调试过程中又发现另一个问题,一次外部中断触发却进入了两次中断服务子程序。

解决办法:在进入中断后关闭外部中断,然后在中断服务子程序最后在开启外部中断,这样就解决了进两次外部中断的问题。

分析:后来在网上查到一个比较权威的说法:https://my.st.com/public/Faq/Lists/faqlst/DispForm.aspx?ID=143&level=1&objectid=141&type=product&Source=/public/Faq/Tags.aspx?tags=%20interrupt  这是ST官网给的一个答复,但是我也根据上面的说明把清中断标志位往前提也不管用,还是进中断两次。具体原因待解决。

上一篇:C++程序中调用WebService的实现


下一篇:linux文件管理 文件操作