嵌入式技术论坛
直播中

jsqueh

8年用户 1135经验值
私信 关注
[问答]

新手求助使用NANO做的IAP跳转裸机制作的APP失败咋办

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 */

}

回帖(1)

王斌

2022-9-7 11:30:39
得加入__set_conctol(0);
取消RTT设置CPU的特权模式;
这样目前没有进入错误中断中,目前测试没有问题
举报

更多回帖

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