SysTick中断挂起,但不会执行,调试中断屏蔽问题?

时间:2016-11-26 13:33:18

标签: debugging arm interrupt keil cortex-m

我一直试图让SysTick中断在TM4C123GH6PM7上工作。它是基于cortex m4的微控制器。使用Keil调试器时,我可以看到Systick中断在NVIC中处于挂起状态,但它不会执行处理程序。没有启用其他异常,我已经清除了PRIMASK寄存器。下面的代码是我如何初始化中断:

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命令对其进行读/写。

我使用了Keil提供的Startup.s,据我所知,矢量/标签是正确的。

是的,我知道。为什么要在装配中完成这一切。

任何想法都将不胜感激。第一次发帖:)

1 个答案:

答案 0 :(得分:0)

  

我可以看到Systick中断正在等待NVIC

Systick在NVIC中既没有启用也没有挂起寄存器位。这种方式很特殊,与MCU核心本身紧密耦合。

使用0x20作为重载值也很危险。您可能会在Systick处理程序中“卡住”,无法离开它,因为下一个中断会过早触发。请记住,Cortex M4需要至少12个时钟才能进入和退出中断处理程序 - 这会消耗32个周期中的24个。

附加提示:您最后一条指令将用于SP的寄存器从MSP更改为PSP,但我没有看到您的代码首先设置PSP。 确保实现Hardfault_Handler - 您的代码最有可能触发它。