记录 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)。未知原因。
操作过程
图片:
![在这里插入图片描述](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记录未完 蓝饼~~