打印
[技术问答]

求解HC32F460中断经常进HardFault_Handler

[复制链接]
2016|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zengxing3624|  楼主 | 2021-11-18 11:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
项目使用两个按键,发现偶然性的进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);

}

使用特权

评论回复
沙发
zengxing3624|  楼主 | 2021-11-18 11:38 | 只看该作者
请大家帮忙,哪位大神方案可以解决重赏500元

使用特权

评论回复
板凳
aozima| | 2021-11-18 12:13 | 只看该作者
HardFault_Handler后,会有寄存器指示原因的,虽然不是100%准确,但还是很有参考价值,先反查一下。

使用特权

评论回复
地板
wubangmi| | 2021-11-18 12:29 | 只看该作者
zengxing3624 发表于 2021-11-18 11:38
请大家帮忙,哪位大神方案可以解决重赏500元

1、你贴出来的代码没什么毛病,如果非要说有毛病的话,那你看下你硬件上作为按键是否有上拉,没有的话就需要在软件上做内部上拉。
2、你代码跑到了硬件失效中断里,所以我不认为是你贴出来的代码的问题,是你其他部分代码问题

使用特权

评论回复
5
zengxing3624|  楼主 | 2021-11-18 15:01 | 只看该作者
wubangmi 发表于 2021-11-18 12:29
1、你贴出来的代码没什么毛病,如果非要说有毛病的话,那你看下你硬件上作为按键是否有上拉,没有的话就 ...

堆栈大小是否有影响?我也不知道突然间看到一篇**,说数组大于1024,就是大于2K,0x00000400的堆栈就不够,会出错,于是我就找到那个Stack_Size,把它改成0x00000800,以前会重启的毛病没有了,好像进HardFault_Handler 也不进了,我代码中确实有用到很大的数组,再改回0x00000400多按两次必重启。但愿这次能解决问题,感谢您的思路,给了我肯定不是中断的问题,谢谢!方便的话留个QQ,,待我解决请你吃饭,谢谢!

使用特权

评论回复
6
wubangmi| | 2021-11-18 15:20 | 只看该作者
zengxing3624 发表于 2021-11-18 15:01
堆栈大小是否有影响?我也不知道突然间看到一篇**,说数组大于1024,就是大于2K,0x00000400的堆栈就不 ...

有大数据组把堆栈冲掉,从而造成PC指针地址不对造成你说的结果。另外数组越界也可能把PC指针冲掉导致你这个结果,慢慢查总能查到问题的

使用特权

评论回复
7
abcd文刀三皮| | 2021-11-18 15:33 | 只看该作者
楼主检查下时钟配置,我之前也碰到过这种情况

使用特权

评论回复
8
abcd文刀三皮| | 2021-11-18 15:34 | 只看该作者
zengxing3624 发表于 2021-11-18 11:38
请大家帮忙,哪位大神方案可以解决重赏500元

先检查时钟配置,按照官方给的例程来

使用特权

评论回复
9
zengxing3624|  楼主 | 2021-11-18 15:55 | 只看该作者
搞定,就是 堆栈设小了,设大一点,就没事了,目前一切正常

使用特权

评论回复
10
sevnig| | 2021-11-18 16:13 | 只看该作者
我们公司主做IC和电容电阻的,有相关的物料可以找我询价,QQ:286838158   TEL:18673773005微信同号

使用特权

评论回复
11
zengxing3624|  楼主 | 2021-11-18 16:19 | 只看该作者
总结一下,其实程序不是中断的事,上面有位老哥也看了,本身这段代码也是从官方的例程copy过来的,程序跑的时候串口也有时候发数据多的时候就HardFault_Handler了,当时以为是串口中断的事,改了用串口字符推送的方式,串口不出事了,再调按键,发现只要一中断,就有可能HardFault_Handler,不定时的,也不规律,所以查也特别难,然后就找CPU指针,可查询到出错时前一句运行的哪条语句,无意中看到一个Stack溢出的一个**,大致内容是说如果使用超过1024的数组,0x00000400的堆栈大小就不够,可能出问题,而我的程序里肯定有超过1024的数组,就试着改了一下,结果,一片大好,因为工程默认就是0x00000400,所以也从来没有想过,从开始进入HC43F460确实踩不少坑,很多用法都不会,网上能参考的东西也特别少,不过目前我所需要的功能,都基本完全实现,搞了差不多一个月,基本从以前的工程里移植过来了,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

17

帖子

2

粉丝