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

}

相关推荐
FreakStudio5 小时前
亲测可用!可本地部署的 MicroPython 开源仿真器
python·单片机·嵌入式·面向对象·并行计算·电子diy·电子计算机
rit84324997 小时前
STM32 + DS3231 + TM1640 实时时钟数码管显示系统
stm32·单片机·嵌入式硬件
zjxtxdy8 小时前
STM32开发
stm32·单片机·fpga开发
集和诚JHCTECH8 小时前
BRAV-7120加持,让有毒有害气体无处遁形
大数据·人工智能·嵌入式硬件
LCG元8 小时前
STM32实战:基于STM32F103的I2C通信(AT24Cxx EEPROM读写)
stm32·单片机·嵌入式硬件
徐某人..8 小时前
基于i.MX6ULL平台的智能网关系统开发
arm开发·c++·单片机·qt·物联网·学习·arm
星恒讯工业路由器11 小时前
MCU+WiFi与CPU+WiFi模块区别
单片机·嵌入式硬件
LCMICRO-1331084774611 小时前
长芯微LD7940完全P2P替代AD7940,是一款14位、逐次逼近型模数转换器(ADC)
单片机·嵌入式硬件·fpga开发·硬件工程·dsp开发·模数转换器adc
进击的小头12 小时前
20_第20篇:嵌入式外设驱动开发基础:寄存器级开发与库函数开发对比实战
arm开发·驱动开发·单片机
guygg8813 小时前
基于STM32的智能小区管理系统设计
stm32·单片机·嵌入式硬件