本文主要是介绍STM32 bootload 跳转到 app 方法记录_裸机版,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
调试环境:STM32G474RBT6 + Keil
说明:本文介绍如何从 bootload 跳转到 app 的方法
1:bootload 的跳转代码
在 app 代码接收完成并成功写入片内flash后,可调用以下代码实现跳转到 app;
#define OTA_CODE_START_ADD (0x08007800) /* app 区域储存的首地址 */
void jump_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)));
if ((((u32)app_func & 0xff000000) != 0x08000000) || ((stk_addr & 0x2ff00000) != 0x20000000))
{
return;
}
//rt_kprintf("Jump to application running ... \n");
rt_thread_mdelay(200);
__disable_irq(); /*关闭总中断*/
HAL_DeInit(); /*函数通过写复位寄存器,将所有模块复位。*/
for(int i=0; i<128; i++)
{
HAL_NVIC_DisableIRQ(i); /*失能中断*/
HAL_NVIC_ClearPendingIRQ(i);/*清除中断标志位*/
}
/* 关闭滴答定时器,复位到默认值 */
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
HAL_RCC_DeInit(); /*将RCC时钟配置重置为默认重置状态。*/
__set_CONTROL(0); /*设置CONTROL寄存器的值。在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针*/
__set_MSP(stk_addr); /* 设置MSP跳转的地址;设置主堆栈指针 */
app_func(); /* Jump to application running */
}
2:APP 代码设置
1.在 app 的 main()函数的第一段添加如下代码
SCB->VTOR = FLASH_BASE | OTA_CODE_START_ADD; /* 跳转到APP地址 */
__enable_irq();
3.修改KEIL 配置
点击魔术棒,打开设置界面,按如下图示设置。
4.完成配置
完成以上设置后 就能成功从 bootload 跳转到 app
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/yutian0606/article/details/134953478
这篇关于STM32 bootload 跳转到 app 方法记录_裸机版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!