You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

以内存地址末端作为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 15:14:52