以内存地址末端作为PSP值导致STM32L432KC出现INVPC硬故障
STM32L432KC切换PSP后SysTick中断返回触发INVPC硬故障问题
问题背景
我使用的是STM32L432KC(ARM Cortex-M4+FPU)芯片,该芯片包含两块RAM存储区,链接脚本片段如下:
_e_ram2_stack = ORIGIN(RAM2) + LENGTH(RAM2); _e_ram_stack = ORIGIN(RAM ) + LENGTH(RAM ); ... RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K RAM2 (xrw) : ORIGIN = 0x10000000, LENGTH = 16K
将主栈指针(MSP)设置为_e_ram_stack或_e_ram2_stack时无任何异常,但尝试将线程模式切换为使用进程栈指针(PSP)后,SysTick中断执行返回指令pop {r7, pc}时触发了INVPC硬故障。
只有当从_e_ram_stack或_e_ram2_stack的值中减去112后,PSP才能正常工作。我查阅了ARMv7-M架构手册,未找到相关限制,希望得到原因分析。
代码修改说明
我在STM32CubeIDE项目中仅做了以下代码修改,主程序为简单的while(1)循环,仅启用了SysTick中断:
Reset_Handler: ldr sp, =_e_ram_stack ldr r0, =_e_ram2_stack msr psp, r0 ldr r1, =2 msr control, r1 isb
相关寄存器状态信息
- SysTick中断处理程序进入时:寄存器值截图显示进入中断时的状态
- SysTick中断处理程序退出时(执行
pop {r7, pc}触发硬故障):寄存器值截图显示退出中断时的状态 - 硬故障异常进入时:寄存器值截图显示硬故障发生时的状态
内容的提问来源于stack exchange,提问作者zenprogrammer
相关产品推荐
相关产品推荐

