STM32 bootload 跳转到 app 方法记录_裸机版

2024-03-22 04:36

本文主要是介绍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 方法记录_裸机版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/834546

相关文章

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac