STM32学习笔记之简易Bootloader串口升级设计

发布者:钱币之歌最新更新时间:2019-01-08 来源: eefocus关键字:STM32  Bootloader  串口升级 手机看文章 扫描二维码
随时随地手机看文章

概念简介


在学习制作串口升级 Bootloader 之前,我们先了解一下STM32的 IAP (In Application Programming)即在应用编程,IAP是用户自己的程序在运行过程中对 User Flash 的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级. 


设计这样的功能需要有两个项目代码:


Bootloader 程序: 该部分代码用于实现通过某种通信方式(如 USB,USART)接收程序或数据,执行对第二部分代码的更新,通常存储于 Flash 的起始地址(0x08000000);


App 程序: 该部分代码是产品实现业务逻辑正常运行的代码,该部分代码需要在存储的 Flash 中进行相对的地址偏移.


复位执行流程


当芯片上电或者复位后,首先是Bootloader代码开始运行,它作如下操作:


(1) 检查是否需要对第二部分代码进行更新; 

(2) 如果不需要更新则转到(4); 

(3) 执行更新操作; 

(4) 跳转到第二部分代码执行.


加了 Bootloader 程序后,程序运行流程图: 


这里写图片描述


实现要点


Bootloader程序实现


(1) 完成 USART 串口数据接收传输功能,并将接收到的数据绝对定位到 SRAM 的设定地址中,地址的设定根据实际情况而定,应保证设定的地址大于 Bootloader 执行需要的 RAM 的空间;


(2) 需要实现对 STM32 Flash 读写操作相关的驱动,并将绝对定位 SRAM 处的固件数据写入到 Flash 中;


(3) 完成固件数据接收和写入 Flash 后,需要对 PC 指针进行程序跳转,跳转完成后,即运行固件中的程序.


注: 程序跳转之前需要关闭所有的中断.


App程序实现


(1) 在 main 函数最开头处设置 VTOR 寄存器,实现固件中断向量表的重定向.例如:

SCB->VTOR = FLASH_BASE | 0X10000; /*中断向量表偏移量设置*/

1


(2) 设置 App 程序的存储偏移地址,这里以 STM32F103ZE系列的单片机为例,Flash为512k,SRAM为64k.这里设置Flash前64k用于存储 Bootloader 程序,后448k为固件程序空间,SRAM地址不需要设置偏移.

 

这里写图片描述 


可以用jflash查看生成的HEX文件,查看HEX起始地址是否为设置的偏移地址,如下图所示: 


这里写图片描述


若程序跳转时,发生 HardFault 异常中断,可能是设置的地址偏移量没有生效,应该勾选 MDK 的相关配置. 


这里写图片描述


(3) 将编译生成的 .axf 文件 (要勾选生成HEX文件) 通过 MDK 安装时自带的 fromelf.exe 程序转成可以通过串口升级的 bin文件.


语法格式为: [MDK安装目录/fromelf.exe] –bin -o [bin文件生成目录] [axf文件目录] 


点击编译即可生成可以通过串口升级的 bin 文件. 


这里写图片描述


总结: App 程序在代码上除了需要设置中断向量表偏移和程序存储地址偏移以外,其余和不加 Bootloader 的程序代码并无差别,难点在于理解 Flash 偏移地址的设置.

关键字:STM32  Bootloader  串口升级 引用地址:STM32学习笔记之简易Bootloader串口升级设计

上一篇:STM32启动文件(Reset_Handler函数)
下一篇:stm32 通过stm32 cubemx配置中断函数

推荐阅读最新更新时间:2024-03-16 16:22

STM32 flash操作
对芯片内部flash进行操作的函数,包括读取,状态,擦除,写入等等,可以允许程序去操作flash上的数据。 基础应用1,FLASH时序延迟几个周期,等待总线同步操作。推荐按照单片机系统运行频率,0—24MHz时,取Latency=0;24—48MHz时,取Latency=1;48~72MHz时,取Latency=2。所有程序中必须的 用法:FLASH_SetLatency(FLASH_Latency_2); 位置:RCC初始化子函数里面,时钟起振之后。 基础应用2,开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的 用法:FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_En
[单片机]
STM32串口波特率大小计算案例
波特率的计算 STM32下的波特率和串口外设时钟息息相关,USART 1的时钟来源于APB2,USART 2-5的时钟来源于APB1。在STM32中,有个波特率寄存器USART_BRR,如下: STM32串口波特率通过USART_BRR进行设置,STM32的波特率寄存器支持分数设置,以提高精确度。USART_BRR的前4位用于表示小数,后12位用于表示整数。但是它还不是我们想要设置的波特率,想要设置我们串口的波特率大小还需要进行计算。其实有关波特率的计算是下面这一条表达式: 从上面的表达式,我们引入了一个新量USARTDIV,它表示对串口的时钟源fck进行分频。假设我们已知道了波特率和fck时钟频率的大小,那么通过上式便可
[单片机]
<font color='red'>STM32</font><font color='red'>串口</font>波特率大小计算案例
STM32 Cotex-M3处理器系列编程】定时器输出PWM波
//使用定时器TIM4的3通道CH3输出占空比为25%的PWM波 #include stm32f10x.h int main(void) { // SystemInit(); //配置IO口 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE,ENABLE);//IO口使能设置 GPIO_InitTypeDef GPIO_InitStructure; //定义结构体 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM3的C
[单片机]
STM32定时器时钟源问题
STM32中有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。其它6个为普通定时器,时钟由APB1的输出产生。 下图是STM32参考手册上时钟分配图中,有关定时器时钟部分的截图: 从图中可以看出,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,图中的蓝色部分。 下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟
[单片机]
<font color='red'>STM32</font>定时器时钟源问题
stm32的I2C主从模式
1,stm32的I2C总线既可以作为主模式也可以作为从模式 作为主模式和作为从模式在CUBE中的配置是一样的,只是i2c设备的地址不一样 Timing是时序,是在配置的时候生成的,不需要修改 当总线的频率设置为100KHZ的时候,rise time 和fall time 要设置为100ns ownAddress就是指的i2c总线的设备地址,该地址可以选择7bit 或者10bit 2,测试的时候使用两块开发板,一块作为master另一块作为slave,主机向从机发送 I2C ,当从机收到之后然后发给主机,主机收到之后才能向下运行,然后循环打印收到的内容。 主机代码如下: /** ********
[单片机]
<font color='red'>stm32</font>的I2C主从模式
CPLD被STM32读写VHDL程序
1 2 3 --本程序用来测试STM32对CPLD的读写操作 4 5 --测试功能如下: 6 7 --向0x05地址写入0x01,LED灯停止闪烁,写入其他数据闪烁继续 8 9 --0x03,0x04寄存器为定值,可以通过STM32读取然后使用串口输出看看是否一致 10 11 12 13 --文件名:AD.vhd 14 15 library ieee; 16 17 use ieee.std_logic_1164.all; 18 19 use ieee.std_logic_unsigned.all; 20 21 22 23 entity AD is 24 25 port
[单片机]
STM32电机方波】记录1——GPIO基础配置
GPIO库函数: GPIO初始化: typedef struct { u16 GPIO_Pin; //选择待设置的GPIO管脚,使用操作符“|”可以一次选中多个管脚 GPIOSpeed_TypeDef GPIO_Speed; //10MHz 、2MHz、 50MHz GPIOMode_TypeDef GPIO_Mode; //输入输出的8种方式 } GPIO_InitTypeDef; GPIO的缺省初始化值: GPIO_Pin = GPIO_Pin_All ; GPIO_Speed = GPIO_Speed_2MHz; GPIO_Mode = GPIO_Mode_IN_FLOATING GPIO的输入输出模
[单片机]
【<font color='red'>STM32</font>电机方波】记录1——GPIO基础配置
STM32外部中断解决方法
01 单片机外部中断简介 所谓外部中断,就是通过外部信号所引起的中断,如单片机引脚上的电平变化(高电平、低电平)、边沿变化(上升沿、下降沿)等。51单片机有5个中断源,其中有两个是外部中断,分别为INT0和INT1,INT0被分配在P3.2引脚,INT1被分配在P3.2引脚,也即是说如果使用51单片机的外部中断0,则必须将信号接在P3.2上,否则无效。 02 举例说明什么是中断 单片机在执行程序时有两种方式: 查询方式 中断方式 所谓查询方式就是单片机一遍一遍的扫描,查看所监视的目标有没有发生变化,是一种主动式的监视方法,用一个成语可以很客观的描述:守株待兔。 所谓中断方式就是单片机不主动去监视目标,而是目标主动通知单片机状态
[单片机]
<font color='red'>STM32</font>外部中断解决方法
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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