在线时间2091 小时
UID267320
注册时间2011-3-7
NXP金币2708
TA的每日心情 | 无聊 昨天 11:00 |
---|
签到天数: 2406 天 连续签到: 3 天 [LV.Master]伴坛终老
金牌会员
 
- 积分
- 25993
- 最后登录
- 2025-8-26
|
发表于 2019-11-19 17:38:06
|
显示全部楼层
触发DefaultISR中断大概率是触发了硬件故障中断(不一定真的是硬件问题),可以使用如下方式查找
重新定义DefaultISR,便于设置断点。定义HardFault_Handler,捕获硬件故障。在函数中增加如下代码,最后调用getStackFrame函数,出现异常后查看pc寄存器的值。通过map文件查找具体问题出现在代码的位置。基本都可以查找到问题所在。如果实在找不到问题,可以考虑使用SystemSoftwareReset对系统进行软复位。
/**********************************************************************************************************
*函 数 名: DefaultISR
*功能说明: 系统默认中断服务函数,主要是用来处理可能产生的错误中断
*形 参: 无
*返 回 值: 无
**********************************************************************************************************/
void DefaultISR(void)
{
#define VECTORNUM (*(volatile uint8_t*)(0xE000ED04))
printf("\n****default_isr entered on vector %d*****\r\n\n", VECTORNUM);
return;
}
/**********************************************************************************************************
*函 数 名: HardFault_Handler
*功能说明: 系统硬件故障处理函数,当系统产生硬件故障时,会由次函数处理,目前的处理方式是系统软复位
*形 参: 无
*返 回 值: 无
**********************************************************************************************************/
void HardFault_Handler(void)
{
// LR provides information of the return stack PSP/MSP
__asm("MOVS R0, #4");
__asm("MOV R1, LR");
__asm("TST R0, R1");
__asm("BEQ _MSP");
__asm("MRS R0, PSP");
__asm("B getStackFrame");
__asm("_MSP:");
__asm("MRS R0, MSP");
__asm("B getStackFrame");
//SystemSoftwareReset();
return;
}
/**********************************************************************************************************
*函 数 名: getStackFrame
*功能说明: 获取栈指针函数,当系统有异常中断产生时,通过此函数获取导致异常的指令所在地址,便于查找引起异常中断的代码。
*形 参: 栈指针
*返 回 值: 无
**********************************************************************************************************/
uint32_t r0;
uint32_t r1;
uint32_t r2;
uint32_t r3;
uint32_t r12;
uint32_t lr;
uint32_t pc;
uint32_t psr;
void getStackFrame(uint32_t *stackFrame)
{
r0 = stackFrame[0];
r1 = stackFrame[1];
r2 = stackFrame[2];
r3 = stackFrame[3];
r12 = stackFrame[4];
lr = stackFrame[5];
pc = stackFrame[6];//程序计数器(pc)保存导致异常的指令的地址。
psr = stackFrame[7];
__asm("BKPT"); //断点中断指令
}
|
|