zoukankan      html  css  js  c++  java
  • 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官网给的一个答复,但是我也根据上面的说明把清中断标志位往前提也不管用,还是进中断两次。具体原因待解决。

  • 相关阅读:
    ADO.NET Entity Framework之ObjectQuery
    高效byte[]和string互转的方法
    异步邮件发送
    ADO.NET Entity Framework之ObjectContext
    【转】Memcache and Mongodb
    一周工作总结一次SQL优化记录
    Ubuntu下有关Java和数据库的一些工作记录(一)
    自定义函数,替换字符串中指定位置的字符
    一次优化记录
    对比shrink和move
  • 原文地址:https://www.cnblogs.com/kevin-salt/p/5481610.html
Copyright © 2011-2022 走看看