我一直试图让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,据我所知,矢量/标签是正确的。
是的,我知道。为什么要在装配中完成这一切。
任何想法都将不胜感激。第一次发帖:)
答案 0 :(得分:0)
我可以看到Systick中断正在等待NVIC
Systick在NVIC中既没有启用也没有挂起寄存器位。这种方式很特殊,与MCU核心本身紧密耦合。
使用0x20作为重载值也很危险。您可能会在Systick处理程序中“卡住”,无法离开它,因为下一个中断会过早触发。请记住,Cortex M4需要至少12个时钟才能进入和退出中断处理程序 - 这会消耗32个周期中的24个。
附加提示:您最后一条指令将用于SP的寄存器从MSP更改为PSP,但我没有看到您的代码首先设置PSP。 确保实现Hardfault_Handler - 您的代码最有可能触发它。