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(); /* 跳转到应用程序 */

}

相关推荐
周洲08301 天前
STM32 GPIO 外部中断深度解析:边沿触发 / 电平触发、NVIC 优先级配置、中断嵌套实战
stm32·单片机·嵌入式硬件
LCG元1 天前
STM32F103 CAN 总线通信实战:标准库双机通信与过滤器配置精讲
stm32·单片机·嵌入式硬件
zlinear数据采集卡1 天前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
Kuakewei8881 天前
平芯微42V热拔插OVP过压保护芯片:PW1600
嵌入式硬件
ACP广源盛139246256731 天前
WAIC2026 国产超节点算力浪潮下@ACP#IX9104 在算力矩阵中的定位与落地场景
大数据·数据库·人工智能·嵌入式硬件·线性代数·矩阵
z20348315201 天前
STM32单片机控制无源蜂鸣器播放《晴天》
stm32·单片机·嵌入式硬件
国科安芯1 天前
详解ADC 规则组外部触发:CH2、CH3 与 TRGO2
运维·网络·单片机·嵌入式硬件·mcu·系统架构
ACP广源盛139246256731 天前
WAIC2026 国产算力浪潮@ACP#YLB3118 在算力矩阵中的存储定位与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件
ACP广源盛139246256731 天前
WAIC2026 国产算力浪潮下@ACP#IX8024 在算力矩阵中的定位与落地场景
大数据·数据库·人工智能·嵌入式硬件·线性代数·矩阵
Dr.kangder1 天前
嵌入式面试总结(十四)——中断处理
单片机·面试·职场和发展·架构·硬件架构·嵌入式