调试硬错误HardFault.

记录 MDK在线调试

硬件错误HardFault.

问题:Demo下的main只做一件事自增i,也会进入hardfault,什么情况?

参考大神笔记

、、、:

## https://blog.csdn.net/qq1226046245/article/details/124238835  // HardFault_Handler故障原因排查
## https://blog.csdn.net/u013184273/article/details/84440177    //手把手教你查找stm32 HardFault_Handler调试及问题方法
## http://www.ckzixun.com/jishuzixun/13794.html        // 单片机Hard-Fault错误问题分析与调试
## https://www.yyearth.com/article/21-09/297.html   //《ARM Cortex-M0 权威指南》笔记(10)—错误处理
## https://www.eet-china.com/mp/a181581.html      //聊聊程序分散加载启动的奥秘
## https://blog.csdn.net/qq_36973375/article/details/120137994    //超详细KEIL中查看堆栈 以及合理设置堆栈大小

参考文档

《616175 ARM Cortex-M0权威指南.pdf》

目标板:HC32L07X CM0+

# 2.98VDDA供电
# jlink从外供电时,VEFR<3V下载正常,>3v下载校验失败;给外供电输出3.3V时,下载校验失败;给供电输出5v时,调试器不能识别到目标板。
修改HardFault内容
HardFault_Handler\
                PROC
                IMPORT hard_fault_handler_c
;                TST LR, #4
;                MRS R0, MSP
;                MRS R0, PSP
;                B   hard_fault_handler_c
				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
				LDR	R2,=hard_fault_handler_c
				BX	R2
                ENDP
hard_fault_handler_c
void hard_fault_handler_c(uint32_t *hardfault_args,unsigned lr_value)
{
    static unsigned int stacked_r0;
    static unsigned int stacked_r1;
    static unsigned int stacked_r2;	
    static unsigned int stacked_r3;
    static unsigned int stacked_r12;		
    static unsigned int stacked_lr;
    static unsigned int stacked_pc;
    static unsigned int stacked_psr;
	static unsigned int value;
	  
	value = lr_value;
    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]);
    __breakpoint(0);
    while(1);
}
发现:未知操作导致后面跑到stacked_pc运行后,之前读到数据都没有了(call stack-locals窗口中的静态数据都为 no in scope)。未知原因。

操作过程

图片:
1在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/98abd47166f041ae8b4a634473000eee.png
在这里插入图片描述

在这里插入图片描述![请添加图片描述](https://img-blog.csdnimg.cn/49427da5e3894730939bf690eeb268d4.jpeg

首先执行:1,2,3,4。然后等待程序到 5.发生了硬件错误。打开窗口6,7,8查看数据。最后输入地址查看信息:stacked_lr、stacked_pc、stacked_psr
20230105记录未完 蓝饼~~

和许工一起来整。

使用到Demo中的引脚输出跳变程序,示波器检测输出波形(主频率RCH4Mhz)。
其中发现:1、程序开始一段时间波形输出周期稳定,接着过段时间,波形周期变快,直到最后死机,或者波形周期变慢直到死机。2、板子在重新上电程序不能跑,只有重新下载才能跑,这种情况怀疑是,板子电容余电暂时忽略不计。3、下一步询问fae例程,可能前面用网上例程不可靠。复测不行的话再询问解决方法。

20230107记录未完 蓝饼~~

和厂家FAE一起来整。

聊天记录:
烦恼的事:
	事情是这样的,原用一块板跑程序会死机(跑段时间不跑了,最简单的引脚跳变也不行,使用示波器也没了后续【重点在于重新上电都不跑了】)。
	后来我用官方例程和fae沟通这种现象,同样没有解决。
	后来DG说换板子试,我换了同一款板子也不行、换了同芯片的不同板子却没有问题。
	问题就在于我必须要找到证据才能说是板子的问题。

ME:
	钟工,目前使用到Demo是网络下载的HC32L07X中的引脚跳变程序。
	示波器检测跳变波形(主频率RCH4Mhz)。
	其中发现:
	1、程序前段时间波形周期稳定,一段时间后,波形周期变快,直到死机。或者波形周期变慢直到死机。
	2、硬件重上电,不能跑程序。死机后只有在重下才能运行起来,不过又会进入死机。
	3、可能前面用网上例程不可靠,需要原厂提供例程复测。
	4、若不行需要麻烦您帮忙想想办法。
ZG:
	你好,可以从我们官网下载到该芯片所有的驱动库及样例。
	http://xhsc.com.cn/Productlist/info.aspx?itemid=1784
ME:
	用官方已复测与之前情况一样。
	现在出现了另一个糟糕的情况:不能下载程序了。
	使用JlinkCommand在擦除片/扇时会擦除失败。
	我不确定是不是芯片自锁了。	重新上电的regs内容就硬件中断---》图片1。
	当我擦除内容会失败---》图片2。如果是自锁情况,我该如何给芯片解锁?
	未知原因可以下载了。
	我观察到JMem在程序波形正常时,几乎没有被改动。当死机后被改动的 地址数据有很多。
	红色表示发生变化了,死机后有很多被改动---》图片3。与正常比较改动少---》图片4。
	参考这些能否判断是受电路外部干扰进入了死机吗?
    (提供文件:gpio_out.txt。工程文件夹: HC32L07x_DDL_Rev1.2.0)
ZG:
    “受电路外部干扰进入了死机?”:Flash不会被修改的,看不出来为什么会变化。
	大概运行多久会异常呢?你是用什么下载的程序?
	我这边测试你的PA6,运行这么久没异常,意思是例程IO翻转正常,改成PA06就异常?
    用的demo板还是你们自己的板子呢?
    (配置,工程在他那边都行了)
ME:
	周期500ms时,运行大概20s左右会出现异常。
	之前用mdk下载程序,有出现过下载校验失败,也使用过JLINK6和JLINK7下载过。
	之前MDK仿真 老是会进入硬件中断继而改用官方例程验证,现在用MDK直接download。
	我们自己的板子,供电VDD2.98v,电压偏低,也在工作电压范围,换板子也是一样的现象。
ZG:
	建议换块板子试下,或者申请下我们Demo板对比测下是否能看出哪里不同。
DG:
	在确定之前。你要用一块好的开发板去验证下这个问题,然后如果开发板跑没问题,就是硬件问题。
	你要用排除法,先确定方向。如果用开发板试下就能排除是硬件问题还是软件问题了。
	或者你的板子只保留最小系统,然后其他外围电路干掉,然后再测试。方法很重要。
	晶振那重点看下,你手上是拿几块板子测试了?
ME:
	好的,我现在用另外同芯片的不同板子测同一个程序,已经过去30s还有波形。用的内部晶振。
	硬件重上电可以跑
DG:
	如果有多余的板子,就换其他板子继续调,坏板子就不纠结了,丢给硬件就行。
	按照你描述的,有9成把握是硬件问题。	
ME:
	感谢大大的帮助。
	

重新上电的regs内容就硬件中断—》图片1

当我擦除内容会失败—》图片2
请添加图片描述

死机后有很多被改动—》图片3请添加图片描述
与正常比较改动少—》图片4请添加图片描述
gpio_out.txt

/******************************************************************************
 * Copyright (C) 2021, Xiaohua Semiconductor Co., Ltd. All rights reserved.
 *
 * This software component is licensed by XHSC under BSD 3-Clause license
 * (the "License"); You may not use this file except in compliance with the
 * License. You may obtain a copy of the License at:
 *                    opensource.org/licenses/BSD-3-Clause
 *
 ******************************************************************************/

/******************************************************************************
 * @file   main.c
 *
 * @brief  Source file for GPIO example
 *
 * @author MADS Team 
 *
 ******************************************************************************/

/******************************************************************************
 * Include files
 ******************************************************************************/
#include "gpio.h"

/******************************************************************************
 * Local pre-processor symbols/macros ('#define')
 ******************************************************************************/

/******************************************************************************
 * Global variable definitions (declared in header file with 'extern')
 ******************************************************************************/

/******************************************************************************
 * Local type definitions ('typedef')
 ******************************************************************************/

/******************************************************************************
 * Local function prototypes ('static')
 ******************************************************************************/

/******************************************************************************
 * Local variable definitions ('static')                                      *
 ******************************************************************************/

/******************************************************************************
 * Local pre-processor symbols/macros ('#define')
 ******************************************************************************/

/*****************************************************************************
 * Function implementation - global ('extern') and local ('static')
 ******************************************************************************/
static void App_LedInit(void);

/**
 ******************************************************************************
 ** \brief  Main function of project
 **
 ** \return uint32_t return value, if needed
 **
 ** This sample
 **
 ******************************************************************************/
 #define TEST_PORT			GpioPortA
 #define TEST_PIN			GpioPin6
 
int32_t main(void)
{
    ///< LED端口初始化
    App_LedInit();

    while(1)
    {
        ///< LED点亮
        Gpio_SetIO(TEST_PORT, TEST_PIN);
        delay1ms(1000);

        ///< LED关闭
        Gpio_ClrIO(TEST_PORT, TEST_PIN);
        delay1ms(1000);
    }
}



static void App_LedInit(void)
{
    stc_gpio_cfg_t stcGpioCfg;
    
    ///< 打开GPIO外设时钟门控
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); 
    
    ///< 端口方向配置->输出(其它参数与以上(输入)配置参数一致)
    stcGpioCfg.enDir = GpioDirOut;
    ///< 端口上下拉配置->下拉
    stcGpioCfg.enPu = GpioPuDisable;
    stcGpioCfg.enPd = GpioPdEnable;
    
    ///< LED关闭
    Gpio_ClrIO(TEST_PORT, TEST_PIN);
    
    ///< GPIO IO LED端口初始化
    Gpio_Init(TEST_PORT, TEST_PIN, &stcGpioCfg);
    

}

/******************************************************************************
 * EOF (not truncated)
 ******************************************************************************/



HC32L07x_DDL_Rev1.2.0
链接:https://pan.baidu.com/s/1MiMq0v_8uOL_1ilnTqbwoQ?pwd=e5j9
提取码:e5j9。
示波器视频记录500ms周期(1)
链接:https://pan.baidu.com/s/1NeQSOU947PhVfZNsIESLlA?pwd=u2ey
提取码:u2ey
示波器视频记录500ms周期(2)
链接:https://pan.baidu.com/s/1TUmvlYcNpkcQD3WbnlSEgg?pwd=3von
提取码:3von
20230111记录未完 蓝饼~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

相信你可以

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值