嵌入式技术论坛
直播中

王尚岱

8年用户 1441经验值
擅长:电源/新能源
私信 关注
[问答]

使用nano做的IAP跳转裸机制作的APP失败咋办

IAP是使用FOTA的代码做的。基于NANO V3.13,没有增加变动。

APP是裸机代码运行。

使用裸机IAP跳转裸机代码正常运行。

使用FOTA代码跳转只有串口输出的APP正常运行。

使用FOTA代码跳转裸机代码运行失败。

经过排查发现,在RTT进入系统调度之前跳转到裸机app后可以正常运行。

进入系统调度后,跳转裸机app运行失败。

失败现象为进入硬件错误中断。

2.jpg

rt_system_scheduler_start();这句函数后面就进行跳转会失败,在这前面跳转正常

2.jpg

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 << 102)|(3UL << 112)); /* 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 */
}

回帖(1)

李莉

2023-1-29 15:28:45
得加入__set_conctol(0);
取消RTT设置CPU的特权模式;
这样目前没有进入错误中断中,目前测试没有问题
举报

更多回帖

发帖
×
20
完善资料,
赚取积分