求解HC32F460中断经常进HardFault_Handler
项目使用两个按键,发现偶然性的进HardFault_Handler,如果频繁快速的按,就不一会就HardFault_Handler了,实在没招了,不知道哪位大神有没有寓到这样的问题,帮忙看看,是不是哪里的标志没有清除。以下是代码:void Zero_callback()
{
EXINT_Irq**Clr(ExtiCh12);
Zero_Key_flag=1;
}
void Switch_callback(void)
{
EXINT_Irq**Clr(ExtiCh02);
Switch_Key_flag=1;
}
void Init_intruppt2()
{
stc_exint_config_t stcExtiConfig; /* 外部中断配置结构体 */
stc_irq_regi_conf_t stcIrqRegiConf; /*irq配置结构体 */
stc_port_init_t stcPortInit; /*管脚配置结构体 */
/* configuration structure initialization */
MEM_ZERO_STRUCT(stcExtiConfig);
MEM_ZERO_STRUCT(stcIrqRegiConf);
MEM_ZERO_STRUCT(stcPortInit);
/* Set PD06 as External Int Ch.6 input */
stcPortInit.enExInt = Enable;
stcPortInit.enPinMode = Pin_Mode_In;
stcPortInit.enInvert=Enable;
PORT_Init(PortD, Pin02, &stcPortInit);
stcExtiConfig.enExitCh = ExtiCh02;
stcExtiConfig.enFilterEn = Enable;
stcExtiConfig.enFltClk = Pclk3Div8;
stcExtiConfig.enExtiLvl = ExIntRisingEdge;
EXINT_Init(&stcExtiConfig);
stcIrqRegiConf.enIntSrc = INT_PORT_EIRQ2;
stcIrqRegiConf.enIRQn = Int034_IRQn;
stcIrqRegiConf.pfnCallback = &Switch_callback;
enIrqRegistration(&stcIrqRegiConf);
/* Clear Pending */
NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn);
/* 配置优先级 */
NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_14);
/* 使能 NVIC */
NVIC_EnableIRQ(stcIrqRegiConf.enIRQn);
}
void Init_intruppt1()
{
stc_exint_config_t stcExtiConfig_pin12; /* 外部中断配置结构体 */
stc_irq_regi_conf_t stcIrqRegiConf_pin12; /*irq配置结构体 */
stc_port_init_t stcPortInit_pin12;
/* configuration structure initialization */
MEM_ZERO_STRUCT(stcExtiConfig_pin12);
MEM_ZERO_STRUCT(stcIrqRegiConf_pin12);
MEM_ZERO_STRUCT(stcPortInit_pin12);
/* Set PD06 as External Int Ch.6 input */
stcPortInit_pin12.enExInt = Enable;
stcPortInit_pin12.enPinMode = Pin_Mode_In;
stcPortInit_pin12.enInvert=Enable;
PORT_Init(PortC, Pin12, &stcPortInit_pin12);
stcExtiConfig_pin12.enExitCh = ExtiCh12;
stcExtiConfig_pin12.enFilterEn = Enable;
stcExtiConfig_pin12.enFltClk = Pclk3Div8;
stcExtiConfig_pin12.enExtiLvl = ExIntRisingEdge;
EXINT_Init(&stcExtiConfig_pin12);
stcIrqRegiConf_pin12.enIntSrc = INT_PORT_EIRQ12;
stcIrqRegiConf_pin12.enIRQn = Int035_IRQn;
stcIrqRegiConf_pin12.pfnCallback = &Zero_callback;
enIrqRegistration(&stcIrqRegiConf_pin12);
/* Clear Pending */
NVIC_ClearPendingIRQ(stcIrqRegiConf_pin12.enIRQn);
/* 配置优先级 */
NVIC_SetPriority(stcIrqRegiConf_pin12.enIRQn, DDL_IRQ_PRIORITY_15);
/* 使能 NVIC */
NVIC_EnableIRQ(stcIrqRegiConf_pin12.enIRQn);
} 请大家帮忙,哪位大神方案可以解决重赏500元 HardFault_Handler后,会有寄存器指示原因的,虽然不是100%准确,但还是很有参考价值,先反查一下。 zengxing3624 发表于 2021-11-18 11:38
请大家帮忙,哪位大神方案可以解决重赏500元
1、你贴出来的代码没什么毛病,如果非要说有毛病的话,那你看下你硬件上作为按键是否有上拉,没有的话就需要在软件上做内部上拉。
2、你代码跑到了硬件失效中断里,所以我不认为是你贴出来的代码的问题,是你其他部分代码问题 wubangmi 发表于 2021-11-18 12:29
1、你贴出来的代码没什么毛病,如果非要说有毛病的话,那你看下你硬件上作为按键是否有上拉,没有的话就 ...
堆栈大小是否有影响?我也不知道突然间看到一篇**,说数组大于1024,就是大于2K,0x00000400的堆栈就不够,会出错,于是我就找到那个Stack_Size,把它改成0x00000800,以前会重启的毛病没有了,好像进HardFault_Handler 也不进了,我代码中确实有用到很大的数组,再改回0x00000400多按两次必重启。但愿这次能解决问题,感谢您的思路,给了我肯定不是中断的问题,谢谢!方便的话留个QQ,,待我解决请你吃饭,谢谢! zengxing3624 发表于 2021-11-18 15:01
堆栈大小是否有影响?我也不知道突然间看到一篇**,说数组大于1024,就是大于2K,0x00000400的堆栈就不 ...
有大数据组把堆栈冲掉,从而造成PC指针地址不对造成你说的结果。另外数组越界也可能把PC指针冲掉导致你这个结果,慢慢查总能查到问题的 楼主检查下时钟配置,我之前也碰到过这种情况 zengxing3624 发表于 2021-11-18 11:38
请大家帮忙,哪位大神方案可以解决重赏500元
先检查时钟配置,按照官方给的例程来 搞定,就是 堆栈设小了,设大一点,就没事了,目前一切正常 我们公司主做IC和电容电阻的,有相关的物料可以找我询价,QQ:286838158 TEL:18673773005微信同号 总结一下,其实程序不是中断的事,上面有位老哥也看了,本身这段代码也是从官方的例程copy过来的,程序跑的时候串口也有时候发数据多的时候就HardFault_Handler了,当时以为是串口中断的事,改了用串口字符推送的方式,串口不出事了,再调按键,发现只要一中断,就有可能HardFault_Handler,不定时的,也不规律,所以查也特别难,然后就找CPU指针,可查询到出错时前一句运行的哪条语句,无意中看到一个Stack溢出的一个**,大致内容是说如果使用超过1024的数组,0x00000400的堆栈大小就不够,可能出问题,而我的程序里肯定有超过1024的数组,就试着改了一下,结果,一片大好,因为工程默认就是0x00000400,所以也从来没有想过,从开始进入HC43F460确实踩不少坑,很多用法都不会,网上能参考的东西也特别少,不过目前我所需要的功能,都基本完全实现,搞了差不多一个月,基本从以前的工程里移植过来了,
页:
[1]