Cortex-M3 / M4硬故障处理程序 打印处理

本文介绍了Cortex-M3和M4处理器在遇到硬故障时的处理程序,包括如何进行故障诊断和打印处理。同时,内容涉及STM32汇编语言操作,讲解了常见的汇编指令及其在STM32中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Cortex-M3 / M4硬故障处理程序

https://blog.frankvh.com/2011/12/07/cortex-m3-m4-hard-fault-handler/

 

第5章   任务切换设计

http://blog.sina.com.cn/s/blog_98ee3a930102v7zv.html

 

STM32常见Hard+Fault的诊断

https://wenku.baidu.com/view/3c1146ddd5bbfd0a795673f3.html

 

__ASM void HardFault_Handler(void)
{
      TST lr, #4     // Test for MSP or PSP 测试EXC_RETURN的比特2
      ITE EQ         //如果为0,
      MRSEQ r0, MSP  //则使用的是主堆栈,故把MSP的值取出
      MRSNE r0, PSP  //否则, 使用的是进程堆栈,故把MSP的值取出
      IMPORT HardFault_Handler_C  //从栈中读取PC的值
      B HardFault_Handler_C  //从SVC指令中读取立即数放到R0
}

//HardFault_Handler

void HardFault_Handler_C (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 ("\n\n[Hard fault handler - all numbers in hex]\r\n");
  printf ("R0 = 0x%08X\r\n", stacked_r0);
  printf ("R1 = 0x%08X\r\n", stacked_r1);
  printf ("R2 = 0x%08X\r\n", stacked_r2);
  printf ("R3 = 0x%08X\r\n", stacked_r3);
  printf ("R12 = 0x%08X\r\n", stacked_r12);
  printf ("LR [R14] = 0x%08X  subroutine call return address\r\n", stacked_lr);
  printf ("PC [R15] = 0x%08X  program counter\r\n", stacked_pc);
  printf ("PSR = 0x%08X\r\n", stacked_psr);
  printf ("BFAR = 0x%X\r\n", (*((volatile unsigned long *)(0xE000ED38))));
  printf ("CFSR = 0x%X\r\n", (*((volatile unsigned long *)(0xE000ED28))));
  printf ("HFSR = 0x%X\r\n", (*((volatile unsigned long *)(0xE000ED2C))));
  printf ("DFSR = 0x%X\r\n", (*((volatile unsigned long *)(0xE000ED30))));
  printf ("AFSR = 0x%X\r\n"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值