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官網給的一個答復,但是我也根據上面的說明把清中斷標志位往前提也不管用,還是進中斷兩次。具體原因待解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM