首页 > 其他分享 >ARM Cortex-M0单片机进Hardfault后串口如何打印输出错误信息

ARM Cortex-M0单片机进Hardfault后串口如何打印输出错误信息

时间:2023-01-07 10:55:36浏览次数:33  
标签:hardfault stacked 打印输出 int args unsigned 串口 PRINT Hardfault

如果在程序运行时进hardfault想要打印出现问题前的错误信息,可按如下操作实现:

我们先找到系统启动文件中的HardFault_Handler汇编入口,将其整个替换为如下写法:

HardFault_Handler\
                PROC                
                MOVS r0, #4
                MOV r1, LR
                TST r0, r1
                BEQ stacking_used_MSP
                MRS R0, PSP
                B get_LR_and_branch
stacking_used_MSP
                MRS R0, MSP
get_LR_and_branch
                MOV R1, LR
                IMPORT  hard_fault_handler_c
                BL hard_fault_handler_c
                ENDP

在系统出错时,单片机内部会将出错前的信息记录下来并传送给Hardfault中断,将信息打印出来;

紧接着,我们到main.c中编写Hardfault中断处理函数:

void hard_fault_handler_c(unsigned int * hardfault_args,unsigned lr_value) 
{
    PRINT("HardFault_Handler\r\n");
    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]);
    PRINT("Enter HardFault_Handler\r\n");
    PRINT("R0 = %x\n",stacked_r0);
    PRINT("R1 = %x\n",stacked_r1);
    PRINT("R2 = %x\n",stacked_r2);
    PRINT("R3 = %x\n",stacked_r3);
    PRINT("R12 = %x\n",stacked_r12);
    PRINT("Stacked LR = %x\n",stacked_lr);
    PRINT("Stacked PC = %x\n",stacked_pc);
    PRINT("Stacked PSR = %x\n",stacked_psr);
    PRINT("Current LR = %x\n",lr_value);
    while(1);
}

 

标签:hardfault,stacked,打印输出,int,args,unsigned,串口,PRINT,Hardfault
From: https://www.cnblogs.com/azou/p/17032235.html

相关文章

  • STM32用串口printf打印消息时使用条件编译
    程序调完以后我们可能不希望再打印调试信息,这个时候可以写一个条件编译,让printf失效。#defineLOG 1intfputc(intch,FILE*f){ #ifLOG USART_SendData(USAR......
  • STM32串口函数移植以后打印不出数据的可能原因
    MicroLib是STM32中的精简过的C库,提供了有限的stdio.h文件内容。......
  • 2.4寸串口屏应用于家用包装封口机
    由于长时间的放置,食物发生变质后被浪费丢弃的情况屡见不鲜,尤其是在我们的家庭厨房中,没有被及时烹制的食材,其归宿就是垃圾桶。对于食物的储存与保鲜,人们从古至今尝试了不少......
  • java读取虚拟串口数据
    语言:java虚拟串口工具:VirtualSerialPortDriverPro9.0,选择pairing模块下,点击addvirtualparing按钮即可创建串口对,还无法自定义out和in。串口助手:xcom2.6,在串口选择......
  • 使用插件式开发称重仪表驱动,RS232串口对接各类地磅秤数据实现ERP管理
    在ERP系统中,采集一线的生产数据是重要工作之一,而称重计量是企业的核心资产数据,人工计重费时费力,还容易出错,重量数据是否正确,直接影响企业的采购或销售额。基于此,由系统对接......
  • STM32串口代码
    介绍在usart.c中进行了:usart的初始化发送字符串函数的编写printf和scanf的C库重定向中断中根据STM32接受到的信息进行开灯和关灯操作在led.c中进行了:led的GPIO的......
  • Linux的串口非标准波特率设置更改
    用的是全志的R528SDK,Linux内核是5.4,新增加一个250000的非标准波特率参考网络大神文档,实践并记录宝贵的经验。方法:1、修改内核的/include/uapi/asm-generic/termbits.h......
  • 消息队列+串口事件
    #include<stdio.h>#include"freertos/FreeRTOS.h"#include"freertos/task.h"#include"driver/ledc.h"#include"esp_err.h"#include"string.h"#include"esp_l......
  • 自主设置串口并测试
    #include<stdio.h>#include"freertos/FreeRTOS.h"#include"freertos/task.h"#include"driver/ledc.h"#include"esp_err.h"#include"string.h"#include"esp_l......
  • 串口回环测试
    #include<stdio.h>#include"freertos/FreeRTOS.h"#include"freertos/task.h"#include"driver/ledc.h"#include"esp_err.h"#include"string.h"#include"esp_l......