程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> STM32單片機實現中斷後不繼續向下執行而是返回到main函數,

STM32單片機實現中斷後不繼續向下執行而是返回到main函數,

編輯:關於C語言

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved