从4.0.2升级到4.1.1时遇到以下问题:
(1)usb操作U盘异常。
最终发现时新的hal库驱动文件不匹配,更换4.0.2的hal文件(包括stm32f4xx_hal_hcd.c、stm32f4xx_ll_usb.c)。
(2)bootloader异常,仿真调试发现,执行HAL_RCC_DeInit();后tick定时器被开启。将该函数的执行放在tick关之前执行就可以了。对比发现两个版本的rcc_ex的hal文件不同,可能时该文件的变动导致的。
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); //此处修改为关闭所有中断
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.");
}