jump_to_app

/*在STM32的启动过程中,Flash中的前4字节存储的是栈顶指针(SP),接下来的4字节存储的是复位处理程序的入口地址。因此,app_addr + 4 指向的是复位处理程序的入口地址~app地址。*/

#define APP_VECTOR() //{SCB->VTOR = 0x8000000| 0c0005000UL;} //https://blog.csdn.net/karaxiaoyu/article/details/106913621

#define OTA_CODE_START_ADD (0x08007800) /* app区域储存的首地址 keil魔术棒IORM1定义的STARTAddress*/

/*不能在中断中跳转:无论在Bootloader跳转到app还是在app跳转到Bootloader时,都不能在中断中进行跳转,否则跳转后app程序仍处中断状态,

再次使能中断时钟可能触发硬件中断。若app使用ucos系统,跳转到bootloader时需将psp修改成msp,否则也可能出现硬件中断

*/

void bootloader_to_app(void) {

typedef void (*app_func_t)(void);

u32 app_addr = OTA_CODE_START_ADD;

u32 stk_addr = *((__IO uint32_t*)app_addr);

app_func_t app_func = (app_func_t)(*((__IO uint32_t*)(app_addr + 4))); //栈顶地址+4=app地址

__disable_irq(); /* 关闭总中断 */

/* 关闭滴答定时器,复位到默认值 */

SysTick->CTRL = 0;

SysTick->LOAD = 0;

SysTick->VAL = 0;

HAL_DeInit(); /* 复位所有模块 */

__set_CONTROL(0); /*设置CONTROL寄存器的值。在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针*/

__set_MSP(stk_addr); /* 设置主堆栈指针 */

app_func(); /* 跳转到应用程序 */

}

相关推荐
程序员杰森13 小时前
ESP32开发板+TB6612 x 2 四电机小车笔记
笔记·单片机·嵌入式硬件
阿拉斯攀登13 小时前
第 10 篇 RK 平台安卓驱动实战 3:PWM 驱动开发,实现 LED 呼吸灯 + 电机调速
驱动开发·嵌入式硬件·pwm·瑞芯微·嵌入式驱动·rk3576·嵌入式安卓
集芯微电科技有限公司13 小时前
氮化镓GaN FET/GaN HEMT功率驱动器选型一览表
人工智能·单片机·嵌入式硬件·深度学习·神经网络·生成对抗网络
7yewh1 天前
jetson_yolo_deployment 01_linux_dev_env
linux·嵌入式硬件·yolo·机器人·嵌入式
WinstonMao1 天前
STM32上电不能开机运行问题排查
stm32·单片机·嵌入式硬件
csg11071 天前
PIC单片机高阶实战(四):PIC32MX串口与4G模块通信
单片机·嵌入式硬件·物联网
BackCatK Chen1 天前
STM32保姆级入门教程|第3章:从新建工程到LED闪烁点灯(Hex生成+ST-Link/J-Link切换全攻略)
stm32·单片机·stm32cubeide·led 闪烁点灯·st-link/j-link
辰哥单片机设计1 天前
MPU6050陀螺仪(STM32)
stm32·单片机·嵌入式硬件
梦..1 天前
电路EMC问题(二)
嵌入式硬件·硬件架构·硬件工程·pcb工艺
我不是程序猿儿1 天前
【嵌入式】stm32的时钟配置入门及切入
stm32·单片机·嵌入式硬件