华大HC32F460_IAP固件升级遇到的问题记录(一)

项目场景:

由于项目需求,最近在做华大HC32F460单片机的IAP固件升级功能,在项目开发过程中遇到了一些问题,特此记录一下并附上解决办法以备不时之需。

问题描述:

提示:在程序正常通过boot领导APP跳转之后,每当APP程序运行到某个中断时,MCU必定死机导致程序无法运转。

如上图所示,APP程序为一个LED流水灯程序,由定时器中断触发LED灯翻转,程序正常运转的话应该是可以看到LED灯闪烁,但是由于APP程序遇到中断后死机导致LED维持一个常亮的状态。


原因分析及解决方案:

提示:这里填写问题的分析:
根据查阅的相关资料分析,一般造成这种现象的原因有两种。
(1)boot程序中使用了并注册了相关中断功能,但是在程序跳转APP之前没有将中断注册清除复位导致错误。
针对这种错误,解决办法便是在boot程序中,跳转APP之前将所有中断注册清除,可以使用hc库函数enIrqResign()执行操作。

@Override
        /**
 *******************************************************************************
 ** \brief IRQ Resign
 **
 ** param [in]                          enIRQn, IRQ enumunation (Int000_IRQn ~
 **                                     Int127_IRQn
 **
 ** retval                              Ok, IRQ resign sucessfully.
 **                                     ErrorInvalidParameter, IRQ No. is out
 **                                     of range
 **
 *****************************************************************************/
en_result_t enIrqResign(IRQn_Type enIRQn)
{
    stc_intc_sel_field_t *stcIntSel;
    en_result_t enRet = Ok;

    if ((enIRQn < Int000_IRQn) || (enIRQn > Int127_IRQn))
    {
        enRet = ErrorInvalidParameter;
    }
    else
    {
        stcIntSel = (stc_intc_sel_field_t *)((uint32_t)(&M4_INTC->SEL0) + (4ul * enIRQn));
        stcIntSel->INTSEL = 0x1FFu;
        IrqHandler[enIRQn] = NULL;
    }
    return enRet;
}

(2)如果你的boot程序中没有写入中断向量偏移的话,也会导致APP程序的中断运行出错。
针对这种问题,解决办法便是在程序跳转APP之前指定偏移量,具体操作如下

在APP跳转之前加入如下一行代码,其中APP_START_ADDRESS代表程序APP的起始地址

@Override
SCB->VTOR = ((uint32_t) APP_START_ADDRESS & SCB_VTOR_TBLOFF_Msk);

你可能感兴趣的:(单片机,嵌入式硬件,iap)