2016-11-26 252 views
1

我一直在試圖讓一個SysTick中斷在TM4C123GH6PM7上工作。這是一個基於皮層m4的微控制器。當使用Keil Debugger時,我可以看到Systick中斷正在掛起int NVIC,但它不會執行處理程序。沒有其他例外被啓用,我已經清除了PRIMASK寄存器。下面的代碼是我如何初始化中斷:SysTick中斷掛起但不會執行調試中斷屏蔽問題?

systck_init LDR R0,=NVIC_ST_CTRL_R 
      LDR R1,=NVIC_ST_RELOAD_R 
      LDR R2,=NVIC_ST_CURRENT_R 
      MOV R3,#0 
      STR R3,[R0] 
      STR R3,[R2] 
      MOV R3,#0x000020 
      STR R3,[R1] 
      MOV R3,#7 
      STR R3,[R0] 
      LDR R3,=NVIC_EN0_R 
      LDR R4,[R3] 
      ORR R4,#0x00008000 
      STR R4,[R3] 
      CPSIE I 
      MOV R3,#0x3 
      MSR CONTROL,R3 

經過大量的搜索後,我發現它可能是調試器屏蔽所有中斷。控制該位的位在一個名爲Debug Halting Status and Control Register的寄存器中。雖然我似乎無法在調試器中查看它,也無法通過調試命令讀取/寫入它。

我使用了Keil提供的Startup.s,並且據我所知,矢量/標籤是正確的。

是的,我知道。爲什麼還要在裝配中完成這一切。

任何想法將不勝感激。第一次發佈:)

回答

0

我可以看到,系統定時器中斷掛起INT NVIC

SYSTICK既沒有授權或正在申請中的NVIC寄存器位。這非常特殊,與MCU內核緊密耦合。

使用0x20作爲重載值的危險性也很低。您可能會陷入Systick Handler中,無法離開它,因爲下一個中斷觸發得太早。請記住,Cortex M4需要至少12個時鐘才能進入和退出中斷處理程序 - 這消耗了32個週期中的24個時鐘。

附加提示:您最後一條指令將用於SP的寄存器從MSP更改爲PSP,但我沒有看到您的代碼先設置了PSP。 一定要實現Hardfault_Handler - 你的代碼很可能觸發它。

+0

感謝您的幫助!如果systick沒有通過NVIC耦合,那麼它是一個例外,所以它不能被硬件中斷搶佔? 我很抱歉沒有發佈我的所有代碼,但有很多。但我確實在其他地方設置了PSP。我使用0x20只是爲了讓它直接跳到處理程序 今天我使用了keil模擬器,並且處理程序正確執行,但我仍然無法使它與電路調試器一起工作。 – MHilton

+0

您可以使用'SCB'中的'SHP'寄存器來設置Systick(和其他系統中斷)的優先級。 –

+0

我只能快速讀取代碼,因此可能是錯誤的(註釋您的代碼!),但在啓動計數器之前似乎沒有清除計數器。我認爲在啓動時計數器的值是未定義的(但模擬器可能會將其清零)。如果計數器是0x21,並且您將重載設置爲0x20,則必須等待它在發射之前環繞。也就是說,只要SysTick計數器只有24位就不會有問題。 –