STM32 R14 0xffffffff1 : 返回handler模式
时间: 2023-10-09 20:15:06 浏览: 59
在STM32中,R14通常指的是堆栈指针(SP)。0xffffffff1是一个错误的地址,不应该被加载到R14中。如果在执行过程中R14中加载了0xffffffff1,那么会导致异常发生,并且系统会自动进入异常处理程序(handler mode)来处理异常。在处理程序中,可以检查错误,并采取相应的措施来解决问题。
相关问题
stm32有通用寄存器r0-r15 xPSR
通用寄存器r0-r15和xPSR是STM32微控制器中的寄存器,其中r0-r12是通用寄存器,r13是堆栈指针SP,r14是链接寄存器LR,r15是程序计数器PC,xPSR是扩展程序状态寄存器,用于保存程序运行状态信息。
r0-r12通用寄存器可以用于存储数据和地址,其中r0-r3还可以用于函数调用时传递参数。堆栈指针SP用于指向当前堆栈顶部的地址,链接寄存器LR用于保存函数返回地址,程序计数器PC用于保存下一条指令的地址。xPSR中包含了程序状态标志位、异常优先级、控制位等信息。
stm32使用jlink进行hardfault定位的方法
您可以按照以下步骤使用J-Link进行STM32的HardFault定位:
1. 首先,在代码中添加HardFault异常处理函数,并通过操作寄存器将其地址存储在VTOR寄存器的第29位和第30位中。代码示例:
```c
void HardFault_Handler(void)
{
__asm volatile (
" tst lr, #4 \n"
" ite eq \n"
" mrseq r0, msp \n"
" mrsne r0, psp \n"
" ldr r1, [r0, #24] \n"
" ldr r2, handler2_address_const \n"
" bx r2 \n"
" handler2_address_const: .word HardFault_Handler2 \n"
);
}
void HardFault_Handler2(unsigned int * hardfault_args)
{
unsigned int stacked_r0;
unsigned int stacked_r1;
unsigned int stacked_r2;
unsigned int stacked_r3;
unsigned int stacked_r12;
unsigned int stacked_lr;
unsigned int stacked_pc;
unsigned int stacked_psr;
stacked_r0 = ((unsigned long) hardfault_args[0]);
stacked_r1 = ((unsigned long) hardfault_args[1]);
stacked_r2 = ((unsigned long) hardfault_args[2]);
stacked_r3 = ((unsigned long) hardfault_args[3]);
stacked_r12 = ((unsigned long) hardfault_args[4]);
stacked_lr = ((unsigned long) hardfault_args[5]);
stacked_pc = ((unsigned long) hardfault_args[6]);
stacked_psr = ((unsigned long) hardfault_args[7]);
printf ("[HardFault]\n");
printf ("- Stack frame:\n");
printf (" R0 = 0x%08x\n", stacked_r0);
printf (" R1 = 0x%08x\n", stacked_r1);
printf (" R2 = 0x%08x\n", stacked_r2);
printf (" R3 = 0x%08x\n", stacked_r3);
printf (" R12 = 0x%08x\n", stacked_r12);
printf (" LR [R14] = 0x%08x subroutine call return address\n", stacked_lr);
printf (" PC [R15] = 0x%08x program counter\n", stacked_pc);
printf (" PSR = 0x%08x\n", stacked_psr);
while (1);
}
```
2. 然后,打开J-Link GDB服务器,并连接到目标设备。代码示例:
```
$ JLinkGDBServer -device STM32F103ZE -if SWD
```
3. 通过GDB连接到J-Link服务器并加载程序文件。代码示例:
```
$ arm-none-eabi-gdb -ex "target remote localhost:2331" firmware.elf
```
4. 在GDB中设置读取HardFault异常原因的断点。代码示例:
```
(gdb) target remote localhost:2331
(gdb) break HardFault_Handler
(gdb) continue
```
5. 当程序触发HardFault异常时,程序将停止在HardFault异常处理函数中的断点处。您可以使用GDB检查寄存器的值,以及输出您在HardFault异常处理函数中添加的调试信息。代码示例:
```
[HardFault]
- Stack frame:
R0 = 0x00000000
R1 = 0x200048c4
R2 = 0x00000012
R3 = 0xffffffff
R12 = 0x00000000
LR [R14] = 0x080034b9 subroutine call return address
PC [R15] = 0x08002ccb program counter
PSR = 0x81000000
```
以上是使用J-Link进行STM32的HardFault定位的方法。希望能对您有所帮助。