IAP是使用FOTA的代码做的。基于NANO V3.13,没有增加变动。
APP是裸机代码运行。
使用裸机IAP跳转裸机代码正常运行。
使用FOTA代码跳转只有串口输出的APP正常运行。
使用FOTA代码跳转裸机代码运行失败。
经过排查发现,在RTT进入系统调度之前跳转到裸机app后可以正常运行。
进入系统调度后,跳转裸机app运行失败。
失败现象为进入硬件错误中断。
rt_system_scheduler_start();这句函数后面就进行跳转会失败,在这前面跳转正常
IAP跳转前代码如下
__disable_irq();
for (IRQn_Type irq = WWDG_IRQn; irq <= FPU_IRQn; irq++)
{
HAL_NVIC_DisableIRQ(irq);
HAL_NVIC_ClearPendingIRQ(irq);
}
//Resets the RCC clock configuration to the default reset state.
HAL_RCC_DeInit();
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
HAL_DeInit();
extern int uart_deinit(void);
uart_deinit();
//用户代码区第二个字为程序开始地址(复位地址)
app_func = (rt_fota_app_func)*(__IO uint32_t *)(app_addr + 4);
/* Configure main stack */
__set_MSP(*(__IO uint32_t *)app_addr);
/* jump to application */
app_func();
app运行前代码如下
__enable_irq();
__set_FAULTMASK(0);//开启总中断
#define VECT_TAB_OFFSET 0x00020000U /*!< Vector Table base offset field.
This value must be a multiple of 0x200. */
void SystemInit(void)
{
/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
#endif
#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
/* Configure the Vector Table location -------------------------------------*/
#if defined(USER_VECT_TAB_ADDRESS)
SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#endif /* USER_VECT_TAB_ADDRESS */
}
更多回帖