本期话题:
聊一聊:
在跳转APP的程序代码需要注意以下几点:
if(((*(__IO uint32_t *)APP_FLASH_ADDR) & 0x2FFE0000) == 0x20000000)
其具体的跳转代码如下:
/* 定义类型 */
typedef void (*pFunction)(void);
/* APP flash address */
#define APP_FLASH_ADDR (0x8010000)
void jump_to_app(void)
{
uint32_t JumpAddress;
pFunction Jump_To_Application;
/* 检查栈顶地址是否合法 */
if(((*(__IO uint32_t *)APP_FLASH_ADDR) & 0x2FFE0000) == 0x20000000)
{
/* 屏蔽所有中断,防止在跳转过程中,中断干扰出现异常 */
__disable_irq();
/* 用户代码区第二个 字 为程序开始地址(复位地址) */
JumpAddress = *(__IO uint32_t *) (APP_FLASH_ADDR + 4);
/* Initialize user application's Stack Pointer */
/* 初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址) */
__set_MSP(*(__IO uint32_t *) APP_FLASH_ADDR);
/* 类型转换 */
Jump_To_Application = (pFunction) JumpAddress;
/* 跳转到 APP */
Jump_To_Application();
}
}
APP程序代码需要进行如下配置:
SCB->VTOR
APP运行后,初始化函数中,开启中断,否则程序会运行异常
正常来说,在启动文件中执行调用 SystemInit()
函数,这个函数会配置 Flash 的接口信息。 SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET
。
修改宏定义 VECT_TAB_OFFSET
的值为 0x10000。
APP程序启动之后,需要先使能全局中断,可将下边的代码放在初始化的地方:
/* 使能中断 */
__enable_irq();
那么,如何实现 APP 跳转到 BootLoader 呢?有两种方法:
硬件方式,设备断电重启或复位按键
软件方式,通过软件控制复位MCU
/* 复位芯片 */
HAL_NVIC_SystemReset();
END
→点关注,不迷路←