Debugging SysTick中断挂起,但获胜';t执行、调试中断掩码问题?

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

我一直在尝试让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_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位,它就不会那么长。