Debugging SysTick中断挂起,但获胜';t执行、调试中断掩码问题?
我一直在尝试让SysTick中断在TM4C123GH6PM7上工作。这是一个基于cortex m4的微控制器。当使用Keil调试器时,我可以看到Systick中断挂起int NVIC,但它不会执行处理程序。没有启用其他异常,我已清除PRIMASK寄存器。下面的代码是我初始化中断的方式:Debugging SysTick中断挂起,但获胜';t执行、调试中断掩码问题?,debugging,arm,interrupt,keil,cortex-m,Debugging,Arm,Interrupt,Keil,Cortex M,我一直在尝试让SysTick中断在TM4C123GH6PM7上工作。这是一个基于cortex m4的微控制器。当使用Keil调试器时,我可以看到Systick中断挂起int NVIC,但它不会执行处理程序。没有启用其他异常,我已清除PRIMASK寄存器。下面的代码是我初始化中断的方式: systck_init LDR R0,=NVIC_ST_CTRL_R LDR R1,=NVIC_ST_RELOAD_R LDR R2,=NVIC_ST_CURREN
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
经过大量搜索,我发现可能是调试器屏蔽了所有中断。控制这一点的位位于名为调试停止状态和控制寄存器的寄存器中。尽管我似乎无法在调试器中查看它,也无法使用调试命令对其进行读/写操作
我使用了Keil提供的Startup.s,据我所知,向量/标签是正确的
是的,我知道。为什么要费心在组装中完成这一切呢
任何想法都将不胜感激。首次投寄:)
我可以看到Systick中断在NVIC中挂起
Systick在NVIC中既没有启用寄存器位,也没有挂起寄存器位。这种方式很特别,它与MCU内核本身紧密耦合
使用0x20作为重新加载值也很危险。您可能会“卡在”Systick处理程序中,无法离开它,因为下一个中断触发得太早。请记住,Cortex M4需要至少12个时钟才能进入和退出中断处理程序,这将消耗32个周期中的24个周期
附加提示:您上一条指令将用于SP的寄存器从MSP更改为PSP,但我没有看到您的代码先设置PSP。
确保实现Hardfault_处理程序-您的代码很可能会触发它
我可以看到Systick中断在NVIC中挂起
Systick在NVIC中既没有启用寄存器位,也没有挂起寄存器位。这种方式很特别,它与MCU内核本身紧密耦合
使用0x20作为重新加载值也很危险。您可能会“卡在”Systick处理程序中,无法离开它,因为下一个中断触发得太早。请记住,Cortex M4需要至少12个时钟才能进入和退出中断处理程序,这将消耗32个周期中的24个周期
附加提示:您上一条指令将用于SP的寄存器从MSP更改为PSP,但我没有看到您的代码先设置PSP。
确保实现Hardfault_处理程序-您的代码很可能会触发它。谢谢您的帮助!如果systick未通过NVIC耦合,则它是一个例外,因此不能被硬件中断抢占?我很抱歉没有公布我所有的代码,但有很多。但我确实在别处安装了PSP。我使用0x20只是为了让它直接跳转到处理程序中。今天我使用了keil模拟器,处理程序执行正确,但我仍然无法让它与电路内调试器一起工作。您可以设置Systick(和其他系统中断)的优先级使用
SHP
在SCB
中的寄存器。我只是快速读取了代码,因此可能是错误的(请注释您的代码!),但您似乎没有在启动计数器之前清除计数器。我认为计数器值在启动时是未定义的(但模拟器可能会将其归零)。如果计数器为0x21,并且您将重新加载设置为0x20,则您必须等待它在启动之前结束。也就是说,只要SysTick计数器只有24位,就不会那么长了。谢谢你的帮助!如果systick未通过NVIC耦合,则它是一个例外,因此不能被硬件中断抢占?我很抱歉没有公布我所有的代码,但有很多。但我确实在别处安装了PSP。我使用0x20只是为了让它直接跳转到处理程序中。今天我使用了keil模拟器,处理程序执行正确,但我仍然无法让它与电路内调试器一起工作。您可以设置Systick(和其他系统中断)的优先级使用SHP
在SCB
中的寄存器。我只是快速读取了代码,因此可能是错误的(请注释您的代码!),但您似乎没有在启动计数器之前清除计数器。我认为计数器值在启动时是未定义的(但模拟器可能会将其归零)。如果计数器为0x21,并且您将重新加载设置为0x20,则您必须等待它在启动之前结束。也就是说,只要SysTick计数器只有24位,它就不会那么长。