【问题标题】:SysTick Interrupt pending but won't execute, debug interrupt mask issue?SysTick 中断挂起但不会执行,调试中断屏蔽问题?
【发布时间】:2017-04-10 16:09:54
【问题描述】:

我一直在尝试让 SysTick 中断在 TM4C123GH6PM7 上工作。这是一个基于皮质 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,据我所知,向量/标签是正确的。

是的,我知道。为什么要费心在汇编中做这一切。

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

【问题讨论】:

    标签: debugging arm interrupt keil cortex-m


    【解决方案1】:

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

    Systick 在 NVIC 中既没有 Enable 也没有 Pending 寄存器位。这种方式很特别,与 MCU 内核本身紧密耦合。

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

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

    【讨论】:

    • 感谢您的帮助!如果 systick 没有通过 NVIC 耦合,那么它是一个例外,所以它不能被硬件中断抢占?很抱歉没有发布我所有的代码,但其中有很多。但我确实在其他地方设置了 PSP。我使用 0x20 只是为了让它直接跳转到处理程序今天我使用了 keil 模拟器并且处理程序正确执行但我仍然无法让它与电路调试器一起工作。
    • 您可以使用SCB 中的SHP 寄存器设置Systick(和其他系统中断)的优先级。
    • 我只是快速阅读了代码,所以可能是错误的(评论您的代码!)但您似乎没有在开始之前清除计数器。我认为计数器值在启动时未定义(但模拟器可能会将其归零)。如果计数器为 0x21 并且您将重新加载设置为 0x20,则您必须等待它回绕,然后才能触发。也就是说,只要 SysTick 计数器只有 24 位,它就不会那么长。
    猜你喜欢
    • 2021-05-28
    • 2011-06-22
    • 2016-10-23
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    相关资源
    最近更新 更多