STM32单片机Bootloader设计(下)

原创 乐创客 2021-07-14 07:05


之前一篇的《STM32单片机的Bootloader设计(上)》文章中,主要介绍了STM32的启动流程和内存主要空间的分配,这篇文章将在上一篇文章的基础上,来阐述一下STM32 Bootloader的实现。


   STM32的内存划分

前面文章我们说了,STM32上电后会从0x08000000地址处开始运行,因此,如果我们想要使得STM32在上电之处直接进入进Bootloader,那么其内存的起始地址必须要从0x08000000处开始。这一步是由单片机的硬件所决定的,无法通过软件干预。

因此,在我们使用Keil软件设计STM32 Bootloader的时候,一定要在Keil的工程中设置这个地址,当然,如果你不设置也没关系,因为Keil默认就是将单片机的软件编译到此地址的。如图1所示。


图1 Keil上电起始地址的设置


另外在说一点,起始地址右边的Size我们也需要关注下,因为这个参数会影响到后续的内存空间分配。

好了,接下来假设我们有一块Flash容量为64KB的芯片,我们来为其划分一下内存空间。我们来计算下它的地址范围为多少。

起始地址不需要多说,就是0x08000000。

64K的地址空间该怎么算呢?这个其实是一个进制转换的问题,我们知道,在十进制中,1KB=1024个字节,而我们计算机中的一个字节就是一个地址单元,因此只要要使用64KB*1024就可以得出有多少个(十进制)地址单元了。又由于计算机中的地址都是按照十六进制编码来排列的,所以还需要将这个十位数的地址空间转换成十六进制,这个地址空间就是0x10000。注意,以上这个0x10000指的是地址空间,指明64K Flash中有0x10000个字节的存储单元,而我们的内存地址又是从0开始计算的,因此最终的地址范围就是0x08000000~0x08010000。


计算出以上的地址范围之后,我们就需要对其来划分功能区了,首先假设我们的Bootloader不带OTA(On The Air)升级功能,因此整个内存空间至少要划分成两个部分,第一个部分是从0x08000000起始的Bootloader区域,假设长度为X,第二个部分是紧接着(当然也可以不仅接着)Bootloader区域的应用区域,其地址范围为0x08000000 + X,其长度为Y。


这个地址的划分可以现根据Bootloader最终编译的大小进行动态改变,不过需要注意的是,STM32内存划分要以半页为最小单位,因为在对Flash编程时,都是按照半页来擦除的,所以如果你的程序不按照半页来对齐,那么擦出的时候就会很尴尬,半页=32个字=128个字节。


基于上述原因,我们暂定STM32中,前10K地址存放Bootloader程序,后面的地址,存放应用,如图2所示。


图2 STM32内存划分


   Bootloader代码设计

Bootloader这个东西,对于我们来说是一个特殊的程序,但是对于计算机来说,它和千千万万的普通程序没有任何差别,因此我们也需要对这个程序进行初始化,你可以设置时钟,设置串口或者CAN总线资源等。这些都是必须要进行的,我们文中就不讨论。


比较重要的需要讨论的一点是跳转程序,因为Bootloader除了完成一些额外的不适宜在应用中完成的工作之外,最重要的一点就是程序跳转,即“JampToApp()”。所谓的程序跳转,那么程序跳转该怎么实现呢?

思考下,跳转最终就是通过Bootloader跳转到APP的地址处,在C语言中和跳转直接相关的便是指针了,因此既能保证跳转到某个地址,又能保证是类似于函数能被运行的,就只有“指向函数的指针“这一项了。没错,Bootloader的“JampToApp()”操作就是一个函数指针,只需要获知APP区的地址,就可以进行跳转了。


我们在上一节中以及指定了APP的地址就是0x08002800,那么是否只要跳转到这个地址就可以了呢?答案当然是否定的,因为我们之前说过,STM32内存空间最起始的4个字节地址,存放的是栈顶指针,因此我们需要跳转到0x08002800+4的地址处。


在跳转的过程中,关闭中断等工作也是必须的,具体代码如图3所示。


图3 Bootloader中的跳转程序


上面代码中,有一个自定义的“TYP_drcPtr”类型,它起始只是一个void类型。

typedef void (*TYP_drcPtr)(void); //Define the jump pointer


跳转问题解决了,接下来的问题就是何时跳转?

这个何时跳转很重要,我建议在程序的一开始,初始化Systemclock之前就去判断和跳转,因为STM32如果你在Bootloader中初始化了Systemclock之后,再去APP区初始化,会造成硬件错误,因此我建议大家在设计Bootloader的时候,程序一开始就是去检测能否满足跳转条件,满足了立马跳,不满足再去执行硬件的初始化程序。如图4所示。


图4 STM32跳转时机


好了,最后说一句,Talk is easy, show me your code,我已经调试成功的bootloader请自行git。

https://gitee.com/huangqilong119/STM32_bootloader.git


关于STM32的Flash编程又是另外一个故事了,我们后续再说。

乐创客 我们从来不培养程序猿,我们只是嵌入式技术的搬运工
评论
  • 光耦合器,也称为光隔离器,是一种利用光在两个隔离电路之间传输电信号的组件。在医疗领域,确保患者安全和设备可靠性至关重要。在众多有助于医疗设备安全性和效率的组件中,光耦合器起着至关重要的作用。这些紧凑型设备经常被忽视,但对于隔离高压和防止敏感医疗设备中的电气危害却是必不可少的。本文深入探讨了光耦合器的功能、其在医疗应用中的重要性以及其实际使用示例。什么是光耦合器?它通常由以下部分组成:LED(发光二极管):将电信号转换为光。光电探测器(例如光电晶体管):检测光并将其转换回电信号。这种布置确保输入和
    腾恩科技-彭工 2025-01-03 16:27 171浏览
  • 自动化已成为现代制造业的基石,而驱动隔离器作为关键组件,在提升效率、精度和可靠性方面起到了不可或缺的作用。随着工业技术不断革新,驱动隔离器正助力自动化生产设备适应新兴趋势,并推动行业未来的发展。本文将探讨自动化的核心趋势及驱动隔离器在其中的重要角色。自动化领域的新兴趋势智能工厂的崛起智能工厂已成为自动化生产的新标杆。通过结合物联网(IoT)、人工智能(AI)和机器学习(ML),智能工厂实现了实时监控和动态决策。驱动隔离器在其中至关重要,它确保了传感器、执行器和控制单元之间的信号完整性,同时提供高
    腾恩科技-彭工 2025-01-03 16:28 166浏览
  •     为控制片内设备并且查询其工作状态,MCU内部总是有一组特殊功能寄存器(SFR,Special Function Register)。    使用Eclipse环境调试MCU程序时,可以利用 Peripheral Registers Viewer来查看SFR。这个小工具是怎样知道某个型号的MCU有怎样的寄存器定义呢?它使用一种描述性的文本文件——SVD文件。这个文件存储在下面红色字体的路径下。    例:南京沁恒  &n
    电子知识打边炉 2025-01-04 20:04 53浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 63浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 57浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 57浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 57浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 68浏览
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 91浏览
  • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
    丙丁先生 2025-01-06 09:23 59浏览
  • 随着市场需求不断的变化,各行各业对CPU的要求越来越高,特别是近几年流行的 AIOT,为了有更好的用户体验,CPU的算力就要求更高了。今天为大家推荐由米尔基于瑞芯微RK3576处理器推出的MYC-LR3576核心板及开发板。关于RK3576处理器国产CPU,是这些年的骄傲,华为手机全国产化,国人一片呼声,再也不用卡脖子了。RK3576处理器,就是一款由国产是厂商瑞芯微,今年第二季推出的全新通用型的高性能SOC芯片,这款CPU到底有多么的高性能,下面看看它的几个特性:8核心6 TOPS超强算力双千
    米尔电子嵌入式 2025-01-03 17:04 36浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦