STM32单片机Bootloader的实现

发布者:星尘散落最新更新时间:2023-05-25 来源: elecfans关键字:STM32  单片机  Bootloader 手机看文章 扫描二维码
随时随地手机看文章

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


STM32的内存划分


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


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

poYBAGO-gO-AC07PAAJNeEMhWsU765.png

图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所示。

pYYBAGO-gSGAYznOAAFC_NOAORw301.png

图2 STM32内存划分

Bootloader代码设计

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


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


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


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


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

poYBAGO-gS6AGOD6AAIVWCRubCQ426.png

图3 Bootloader中的跳转程序

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

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

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

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

poYBAGO-gUOAEkh8AAL-sBQqKhQ840.png

图4 STM32跳转时机

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

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

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


关键字:STM32  单片机  Bootloader 引用地址:STM32单片机Bootloader的实现

上一篇:STM32串口中断应用实例
下一篇:STM32CubeMX系列的开发配置步骤解析

推荐阅读最新更新时间:2024-11-17 10:25

AT89C51单片机高速串行输出口设计
AT89C51(与MCS-51兼容)单片机的串行口在方式0工作状态下,使用移位寄存器芯片可以扩展多个8位并行I/O口。在LED点阵显示屏应用系统中,一般都采用数据同步移位输出方式,并使用移位寄存器芯片(如74LS595)扩展并行I/O口驱动LED点阵显示。LED 点阵显示采用扫描方式,为不产生闪烁感,每秒需要传送50屏点阵显示数据,因此有大量的数据要通过同步移位的方式送到显示驱动电路部分,这就要求单片机能够快速地输出数据。AT89C51单片机的串行口在方式0工作状态下,数据以fosc/12的波特率输出,1个字节数据写入SBUF后,需检查中断标志位 TI是否为“1”并清“0”TI或延时几个机器周期后才能继续写入了一个数据,输出速度慢
[单片机]
AT89C51<font color='red'>单片机</font>高速串行输出口设计
单片机中ICP和ISP有哪些不同?
PS: 1.ICP program and update 2.几个flash相关概念 Flash memory for program memory(FLASH中的用户程序存储器)=APROM Flash memory for loader(FLASH中的程序管理区)=LDROM LDROM是用来装载ISP固件或者说是BOOTLOADER固件的,APROM是用来装载用户的代码文件的。从名字上就可以看出来的,LDROM------LOAD ROM;APROM----APPLICATION ROM 物理地址不同。容量大小不同。应用上可能也就不同。其余没有什么不同。 随便你用。你可以用LDROM
[单片机]
<font color='red'>单片机</font>中ICP和ISP有哪些不同?
PIC单片机简介
PIC单片机简介: PIC单片机(Peripheral Interface Controller)是一种用来可开发的去控制外围设备的可编程集成电路(IC)。由美国Microchip(微星)公司推出的PIC单片机系列产品,首先采用了RISC结构的嵌入式微控制器,其高速度、低电压、低功耗、大电流LCD驱动能力和低价位OTP技术等都体现出单片机产业的新趋势。现在PIC系列单片机在世界单片机市场的份额排名中已逐年升位,尤其在8位单片机市场,据称已从1990年的第20位上升到目前的第二位。PIC单片机从覆盖市场出发,已有三种(又称三层次)系列多种型号的产品问世,所以在全球都可以看到PIC单片机从电脑的外设、家电控制、电讯通信、智能仪器、
[单片机]
PIC<font color='red'>单片机</font>简介
51单片机复位电路详解
复位电路的工作原理 在书本上有介绍,51单片机要复位只需要在第9引脚接个高电平持续2us就可以实现,那这个过程是如何实现的呢?在单片机系统中,系统上电启动的时候复位一次,当按键按下的时候系统再次复位,如果释放后再按下,系统还会复位。所以可以通过按键的断开和闭合在运行的系统中控制其复位。 开机的时候为什么为复位 在电路图中,电容的的大小是10uf,电阻的大小是10k。所以根据公式,可以算出电容充电到电源电压的0.7倍(单片机的电源是5V,所以充电到0.7倍即为3.5V),需要的时间是10K*10UF=0.1S。也就是说在电脑启动的0.1S内,电容两端的电压时在0~3.5V增加。这个时候10K电阻两端的电压为从5~1.5V减少(串
[单片机]
AVR单片机外部中断实例及下载烧录的方法
存储器锁定位(2)保护类型LB模式LB2LB1111没有使能存储器保护特性210在并行和SPI/JTAG串行编程模式中Flash和EEPROM的进 一步编程被禁止,熔丝位被锁定。(1)300在并行和SPI/JTAG串行编程模式中Flash和EEPROM的进一步编程及验证被禁止,锁定位和熔丝位被锁定(1)BLB0模式BLBO2BLB01111SPM 和LPM 对应用区的访问没有限制210不允许SPM 对应用区进行写操作300不允许SPM指令对应用区进行写操作,也不允许运行于Boot Loader 区的LPM指令从应用区读取数据。 若中断向量位于Boot Loader 区,那么执行应用区代码时中断是禁止的。401不允许运行于Boot
[单片机]
AVR<font color='red'>单片机</font>外部中断实例及下载烧录的方法
单片机实现通用存贮器IC卡读写
本文对AT24系列存贮器和AT89系列单片机的特征及总线状态作为介绍,并以AT24C01与AT89C2051为例详细描述了通用存贮器IC卡的工作原理及用单片机对其进行读写操作的基本电路连接和软件编程方法。 通用存贮器IC卡是由通用存贮器芯片封装而成的,由于它的结构和功能简单,生产成本低,使用方便,因此在各领域都得到了广泛的应用。目前用于IC卡的通用存贮器芯片多为E2PROM,其常用的协议主要有两线串行连接协议(I2C)和三线串行链接协议,其中比较常用的是ATMEL公司生产的AT24系列芯片。以该系列中的AT24C01为例,它具有1k的存贮容量,适用于2V~5V的低电压/标准电压的操作,具有低功耗和高可靠性等优点。而AT8
[单片机]
一种基于stm32的多通道ADC和DMA的设置问题详解
一、多通道ADC和DMA的配置问题: 刚开始不知道怎么去配置,到处找资料发现很多不是很适用。很盲目的找了很久的资料,后来发现官方的固件库里面有很详细的资料。稍微改了一下官方的demo一下就编译成功了。这个例子的启示是:别忙着去网上找现成的例子,启示固件库里面的例程很给力了。 程序需求是开通三个ADC通道分别采集3V 的基准电压、控制反馈温度和环境温度。 因为用示波器测试时发现TED控制PWM的开关的高频噪声耦合到控制地中来了,所以会有一些高频尖刺。我的解决办法是每组数据通过DMA采集100个点,除去最大的10个数和最小的10数然后取平均值。 配置代码如下: uint16_t Rec_buff[100][3]; void DMA
[单片机]
一种基于<font color='red'>stm32</font>的多通道ADC和DMA的设置问题详解
GD32代码移植STM32(一)
GAIWEI例子:GD32F103移植STM32F103 使用相同FLASH和管脚数量相同的芯片,例如GDF103C8T6移植STM32F103C8T6程序。虽然两个款芯片的寄存器地址以及架构基本相同。但是需要注意的是GD32F10x主频是108兆,但是STM32F10x主频是72兆。所以需要针对以RCC时钟进行修改。 1.先将芯片的选项进行修改:查找对应芯片。 2.将STM32的启动文件替换成GD的启动文件。 3.修改时钟相关配置。 打开stm32f10x.h文件,#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*! Time out for HSE start up
[单片机]
GD32代码移植<font color='red'>STM32</font>(一)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved