做公司的一個項目,實現一個功能就是 機器在進行一項功能時(這項工作時間挺長),想要取消這項工作,重新選擇。想了半天沒想出來,結果同事提醒了一句,可以在程序中加一個外部中斷,在中斷中軟件復位程序。用到以下兩句話
__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官網給的一個答復,但是我也根據上面的說明把清中斷標志位往前提也不管用,還是進中斷兩次。具體原因待解決。