STM32复习笔记(六):STM32远程升级BootLoader相关

目录

Preface:

(一)STM32上电启动流程

(二)BootLoader相关

(三)Clion配置


Preface:

有关STM32的BootLoader主要还是参考了许多大佬的文章,这里只是简单地列举一下,做一个总结,方便日后用到的时候能够快速找到。

(一)STM32上电启动流程

这篇文章讲得很详细了,这里做一个个人总结:

cortex-m系列中,中断向量表存放在 Flash 开始部分,Flash中第一个字存放栈顶指针,第二个字存放复位中断服务函数入口地址,其他中断服务函数入口地址依次存放在Flash中。STM32上电的时候首先会自动去读取flash的第一个字,并赋给MSP(主栈顶指针),然后读取第二个字,并赋给PC(程序计数器);而因为PC存放的是下一个要执行的指令,所以接下来就会跳转到复位中断服务函数中执行;

此外,因为内核默认读的是0x0000 0000处的内容,而STM32的Flash地址被设置到了0x0800  0000,因此TM32内部自动将地址0x0800 0000开始的内容重映射到首地址0x0000 0000中,这样就解决了从0x0000 0000读取中断向量表的问题。

然后,复位中断服务函数中调用了SystemInit()函数,该函数主要作用是设置中断向量表的偏移地址(VOTR寄存器)。也就是说中断向量表位置是可变的,当使用BOOT后,就需要在APP修改该偏移地址。执行完SystemInit()函数后,就会跳转到__main()函数,注意这个__main()和平时说的main()并不一样,如下图所示,__main()执行的是左边的过程,执行完毕之后才会跳转到我们熟悉的main()函数(图片及内容参考自大佬:不咸不要钱的文章):


(二)BootLoader相关

首先,这里主要参考了这几篇文章,结合在一起看一遍就会非常清晰了(感谢各位大佬):

  • STM32单片机bootloader扫盲
  • STM32固件升级详解(BootLoader)
  • 【STM32】制作一个bootloader
  • 【嵌入式实战】STM32 Bootloader 快速实现(超详细)

bootloader本质上也是一个app程序,只不过它具备跳转到用户app,以及接收外部数据更新用户app的功能;

而MCU上电后,主要就是先去取第一个字赋给MSP,然后取第二个字赋给PC,接下来就执行复位中断服务函数(第二个字就是该函数的入口地址);在复位中断服务函数中设置中断向量表的偏移地址,准备C环境,最后跳转到main()函数。同理,从bootloader跳到APP也需要干这两件事情,只不过上电时是单片机自动加载的MSP和PC,而从bootloader跳到APP则需要我们编写函数进行跳转。

也就是说,我如果想实现bootloader,就要搞两个工程,并将代码下载到flash中的不同区域:

一个是bootloader工程,下载到上电起始执行位置;当MCU上电时跟之前大体上一样,首先读取第一个字赋给MSP,然后读取第二个字赋给PC,接下来执行PC中的内容,但此时PC中的内容不再是普通的复位中断服务函数,而是下载进去的bootloader中的跳转函数,在跳转函数中判断是否需要升级(OTA,Over-The-Air,也就是远程更新app程序),如果需要升级,则先下载新的程序进flash中的另外一片区域暂存(就是OTA DATA区),防止升级失败导致系统一直在bootloader中,下载完成之后进行数据校验,无误后才擦除原app程序,并将OAT DATA区的内容copy到app区,再擦除升级指令(因为已经升级完毕了),最后重启系统,完成远程升级。

另外一个则是用户app工程,该工程要下载到某一片区域,而且需要知道区域的起始地址,因为bootloader需要跳到此处;此外注意还需要在system中修改app工程下系统的中断向量表的偏移地址,修改为该程序的起始地址+4字节(一个字的偏移);因为bootloader跳到此处后,第一个字将赋给MSP,第二个字就是app程序的复位中断服务函数了,就类似于app程序复位了一样;如果没有修改中断向量表的偏移的话,默认就跳转到了0x0000 0000+4字节(一个字)出了,将会导致app程序无法执行。


(三)Clion配置

以前用Keil比较多,修改下载地址在魔法棒那里的Target就能修改了;而现在主要用Clion,需要做一点修改,下面记录一下如何修改:

首先找到工程中的xxx_FLASH.ld文件,找到FLASH大小的一行,如下所示:

编译后,找到cmake中的.map文件,搜索FLASH,发现与ld文件中的一致;

接下来修改.ld文件中的值,设定为需要下载到的起始地址,比如说0x0800 1000,再对CmakeLists.txt选择从cubemx中更新工程,再编译,就会发现.map文件中就是刚刚设置的flash起始地址,大功告成!

完~


以上均为个人学习心得,如有错误,请不吝赐教~

THE END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148741.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot的体育馆场地赛事预约管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

【C++】基础入门

万字复习C基础入门语法&#xff0c;适合学过C的朋友用来复习查阅&#xff0c;可能不太适合0基础的朋友。 一.c初识 (1) 第一个c程序 最简单的格式&#xff1a; // 导入头文件 #include<iostream> // 简化对命名空间std下函数和对象的使用 using namespace std; // …

Java基于SSM的校园一卡通系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

go语法入门2

字符串 使用双引号或反引号引起来的任意个字符。它是字面常量。 func main() {var a "abc\n测试" // \n换行fmt.Println(a) } abc 测试func main() {var a "abc\n\t测试" \\换行后在tabfmt.Println(a) } abc测试func main() {var a abc测试 …

好奇喵 | Surface Web ---> Deep Web ---> Dark Web

前言 我们可能听说过深网(deep Web)、暗网(dark Web)等名词&#xff0c;有些时候可能会认为它们是一个东西&#xff0c;其实不然&#xff0c;两者的区别还是比较大的。 什么是deep web&#xff1f; 深网是网络的一部分&#xff0c;与之相对应的是表层网络&#xff08;surface …

SketchUp Pro 2023 for Mac——打造你的创意之城

SketchUp Pro 2023 for Mac是一款专业级的3D建模软件&#xff0c;为你提供最佳的设计和创意工具。不论你是建筑师、室内设计师&#xff0c;还是爱好者&#xff0c;SketchUp Pro都能满足你对于创意表达的需求。 SketchUp Pro 2023拥有强大而直观的界面&#xff0c;让你轻松绘制…

C++入门-day01

一、认识C C融合了三种不同的编程方式 C代表的过程性语言在C基础上添加的类、结构体puls代表的面向对象语言C模板支持泛型编程 C完全兼容C的特性 Tips&#xff1a;侯捷老师提倡的Modren C是指C11、C14、C17和C20这些新标准所引入的一系列新特性和改进。在我们练习的时候也应当去…

PG 多表连接查询

写法&#xff1a; 使用 select 表名.键名 from 表1 join表2 on 相同的主键 构造出来一张新表 多表要用表名.键名 才能知道是哪一张表 传统写法也行 类型&#xff1a; 内 而外的要这样写

复习C语言数组的用法

实验内容 1.1设计一个函数fun&#xff0c;功能是有N*N的矩阵&#xff0c;根据给定的m值&#xff0c;m<N,将每行元素中的值&#xff0c;均往右移m个位置&#xff0c;左边置0 #include<stdio.h> void fun(int (*a)[3],int m){int n,j,i,k,num;int p2;//右移位置列数nu…

Debezium日常分享系列之:使用数据库中的数据流进行在线机器学习

Debezium日常分享系列之&#xff1a;使用数据库中的数据流进行在线机器学习 一、背景介绍二、数据集准备三、使用 Apache Flink 进行分类四、使用 Debezium 和 Kafka 作为源数据流五、构建 Flink 流 k-means六、评估模型七、使用 Apache Spark 进行分类八、定义数据流九、定义和…

Qt+openCV学习笔记(十六)Qt6.6.0rc+openCV4.8.1+emsdk3.1.37编译静态库

前言&#xff1a; 有段时间没来写文章了&#xff0c;趁编译库的空闲&#xff0c;再写一篇记录文档 WebAssembly的发展逐渐成熟&#xff0c;即便不了解相关技术&#xff0c;web前端也在不经意中使用了相关技术的库&#xff0c;本篇文档记录下如何编译WebAssembly版本的openCV&…

Allegro174版本如何关闭模块复用后铜皮自动从动态变成静态操作指导

Allegro174版本如何关闭模块复用后铜皮自动从动态变成静态操作指导 在用Allegro进行PCB设计的时候,模块复用是使用的十分频繁的操作,当Allegro升级到了174 S034版本的时候,当使用模块复用的功能的时候,模块内的铜皮会自动动静转换,大部分情况是不需要的。 如下图 如何关闭…

力扣 -- 377. 组合总和 Ⅳ

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int combinationSum4(vector<int>& nums, int target) {int nnums.size();vector<double> dp(target1);//初始化dp[0]1;//填表for(int i1;i<target;i){for(int j0;j<n;j){//填表if(…

基于郊狼优化的BP神经网络(分类应用) - 附代码

基于郊狼优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于郊狼优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.郊狼优化BP神经网络3.1 BP神经网络参数设置3.2 郊狼算法应用 4.测试结果&#xff1a;5.M…

力扣-350.两个数组的交集||

Idea 首先遍历第一个数组&#xff0c;用哈希表存储每个数字及其出现的次数。 然后遍历第二个数组&#xff0c;每出现重复的数字&#xff0c;并判断该数字在哈希表的次数是不是大于0&#xff0c;如果大于则存入答案数组&#xff0c;并将哈希表次数减1&#xff0c;直接遍历结束。…

剑指offer——JZ18 删除链表的节点 解题思路与具体代码【C++】

一、题目描述与要求 删除链表的节点_牛客题霸_牛客网 (nowcoder.com) 题目描述 给定单向链表的头指针和一个要删除的节点的值&#xff0c;定义一个函数删除该节点。返回删除后的链表的头节点。 1.此题对比原题有改动 2.题目保证链表中节点的值互不相同 3.该题只会输出返回…

计算机毕业设计 基于SpringBoot的图书馆管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

[BJDCTF2020]Mark loves cat

先用dirsearch扫一下&#xff0c;访问一下没有什么 需要设置线程 dirsearch -u http://8996e81f-a75c-4180-b0ad-226d97ba61b2.node4.buuoj.cn:81/ --timeout2 -t 1 -x 400,403,404,500,503,429使用githack python2 GitHack.py http://8996e81f-a75c-4180-b0ad-226d97ba61b2.…

《机器学习实战》学习记录-ch2

PS: 个人笔记&#xff0c;建议不看 原书资料&#xff1a;https://github.com/ageron/handson-ml2 2.1数据获取 import pandas as pd data pd.read_csv(r"C:\Users\cyan\Desktop\AI\ML\handson-ml2\datasets\housing\housing.csv")data.head() data.info()<clas…

JUC第十四讲:JUC锁: ReentrantReadWriteLock详解

JUC第十四讲&#xff1a;JUC锁: ReentrantReadWriteLock详解 本文是JUC第十四讲&#xff1a;JUC锁 - ReentrantReadWriteLock详解。ReentrantReadWriteLock表示可重入读写锁&#xff0c;ReentrantReadWriteLock中包含了两种锁&#xff0c;读锁ReadLock和写锁WriteLock&#xff…