RT_thread系統(tǒng)升級(jí)問(wèn)題

從4.0.2升級(jí)到4.1.1時(shí)遇到以下問(wèn)題:
(1)usb操作U盤(pán)異常。
最終發(fā)現(xiàn)時(shí)新的hal庫(kù)驅(qū)動(dòng)文件不匹配,更換4.0.2的hal文件(包括stm32f4xx_hal_hcd.c、stm32f4xx_ll_usb.c)。
(2)bootloader異常,仿真調(diào)試發(fā)現(xiàn),執(zhí)行HAL_RCC_DeInit();后tick定時(shí)器被開(kāi)啟。將該函數(shù)的執(zhí)行放在tick關(guān)之前執(zhí)行就可以了。對(duì)比發(fā)現(xiàn)兩個(gè)版本的rcc_ex的hal文件不同,可能時(shí)該文件的變動(dòng)導(dǎo)致的。

RT_WEAK void qbt_jump_to_app(void)
{
    typedef void (*app_func_t)(void);
    u32 app_addr = QBOOT_APP_ADDR;
    u32 stk_addr = *((__IO uint32_t *)app_addr);
    app_func_t app_func = (app_func_t)(*((__IO uint32_t *)(app_addr + 4)));

    if ((((u32)app_func & 0xff000000) != 0x08000000) || ((stk_addr & 0x2ff00000) != 0x20000000))
    {
        LOG_E("No legitimate application.");
        return;
    }

    rt_kprintf("Jump to application running ... \n");
    rt_thread_mdelay(200);
    
    //__disable_irq();
    __set_PRIMASK(1);   //此處修改為關(guān)閉所有中斷
    HAL_DeInit();

    for(int i=0; i<128; i++)
    {
        HAL_NVIC_DisableIRQ(i);
        HAL_NVIC_ClearPendingIRQ(i);
    }

    HAL_RCC_DeInit();

    SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;

    __set_CONTROL(0);
    __set_MSP(stk_addr);

    app_func();//Jump to application running

    LOG_E("Qboot jump to application fail.");
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容