Stm32 Bootloader整理
一. 基本概念
1.IAP
IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。
通常在用户需要实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信管道(如USB、USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。
2.Bootloader
在上述IAP的概念中,bootloader就是其第一个项目程序。bootloader主要实现的功能:从串口、USB等媒介接收数据;存储和搬运数据;程序跳转等功能。
3.App程序
对IAP概念中,对第二个项目代码的一种称呼。
4.Ymodem
YModem协议是由XModem协议演变而来的,每包数据可以达到1024字节,是一个非常高效的文件传输协议。
Ymodem一帧数据的结构
|
第一字节 |
第二字节 |
第三字节 |
Data[0..128]/ Data[0..1027] |
倒数第二字节 |
最后一个字节 |
|
SOH/STX |
编号 |
编号反码 |
有效数据区 |
CRC校验高位 |
CRC校验低位 |
图1. Ymodem一帧数据的结构
解释:
第一字节:1.为SOH,有效数据包大小为128字节;
2.为STX,有效数据包大小为1024字节。
第二字节:数据包的编号,第一帧数据,编号为00。
第三字节:数据包编号的反码,第一帧数据,为FF。
有效数据区:根据第一个字节的内容,有效数据区大小为128字节或1024字节。
倒数第二个字节:CRC校验高位。
最后一个字节:CRC校验低位。
注:参加CRC校验的只有有效数据区。
第一帧数据结构:
SOH 00 FF Foo.cNUL[123] CRC(high) CRC(low)
其中:Foo.c为传输文件的文件名;有效数据区的剩余字节用0补足。(就是’\0’).
在超级终端中,在文件名后,还有文件大小的信息。结构为:
SOH00FFFoo.c’\0’+文件字节数+’’+’0’…CRC(high) CRC(low),字节数后为空格。
第二帧,有效数据区内存放的是正式的数据。
Ymodem通信协议:略。
二. Smt32-bootloader设计思路
本bootloader的主要作用是,通过串口进行程序的升级。
1. Nand flash分区情况

图2. 自定义flash分区情况
2. 大致流程
板子开机后,由用户触发进入程序更新界面。
a.通过串口接收上位机发送的bin文件,并存储在分区C。
b.接收完bin文件后,将分区C中的bin文件搬运到分区B,并将搬运的状态保存在分区D。
c.bin文件全部搬运到分区B后,重置中断向量表,并实现程序跳转。
d.如果在步骤b,搬运代码的过程中,出现意外状况,导致搬运中断,则在下次开机后,会再次重新搬运,直到搬运成功。
三. 具体实现
3.1各类设置
1.定义芯片flash大小
方法a.在FlashàConfigure flash tools…àC/C++-àDefine中定义宏,
比如STM32F10X_HD(stm32单片机的内置flash为大容量)
方法b.在stm32f10x.h文件中,
#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)
#define STM32F10X_HD/*!< STM32F10X_MD: STM32 Medium density devices */
#endif
设置红色的宏。
使用方法a和方法b都可以设置。选择不同的宏,则内嵌的nand flash的总大小及每页的大小是不一样的。并且对于内嵌的nand flash,其擦除是以页为单位的,而不是块。

图3. 片内flash大小与宏定义的关系
2.设置程序下载的地址
1.在FlashàConfigure flash tools…àTarget中,

设置IROM1的Start和Size。
2.system_stm32f10x.c文件中,
#define VECT_TAB_OFFSET 0x00000设置中断向量表的偏移地址。(以flash的起始地址为基准)
所以bootloader程序和app程序的这两个设置都是不一样的。
3.2程序跳转实现
typedef void (*iapfun)(void);
iapfun jump2app;
__asm void MSR_MSP(u32 addr)
{
MSR MSP, r0 //set Main Stack value
BX r14
}
voidCloseIQHard(void)
{
GPIO_DeInit(GPIOA);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, DISABLE); //关使能PA端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,DISABLE); //关辅助时能时钟
__disable_irq(); // 关闭总中断
//关中断
}
void BootloaderJump2App(uint32_t appxaddr)
{
BSPClose();
CloseIQHard();
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)//检查栈顶地址是否合法.
{
jump2app = (iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP(*(vu32*)appxaddr);//初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app(); //跳转到APP.
}
}
在void BootloaderJump2App(uint32_t appxaddr),其中appxaddr为需要跳转到的flash地址。
因为在跳转程序中,将总中断关闭,所以在应用程序中,要将总中断打开。
3.3.程序流程

图4.程序流程图
注:串口下载的具体流程:
串口接收文件使用Ymodem协议。使用串口中断接收。首先根据第一帧数据判断文件的大小,然后进行flash的擦陈。接收正式数据时,先接收一帧数据并校验,然后在将数据存储到flash中,再接收下一帧数据。
四. 注意事项
1.超级终端的使用
a.设置连接选项时,将校验选为“无”,否则可能会收不到数据。
2.串口连接
a.串口要接TX,RX,GND.
Stm32 Bootloader整理的更多相关文章
- stm32 Bootloader设计(YModem协议) (转)
源:stm32 Bootloader设计(YModem协议) 相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些.下文中的bootload就来实现这样的功能. 前段时间有项目关于Bootlo ...
- STM32 Bootloader基于ymodem传输协议串口IAP升级详解
硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0 文章目录 1 预备知识 2 Bootloader 2.1 启动流程 2.2 校验跳转地址是否有效 ...
- STM32 BootLoader升级固件
一.知识点 1.BootLoader就是单片机启动时候运行的一段小程序,这段程序负责单片机固件的更新,也就是单片机选择性的自己给自己下程序.可以更新,也可以不更新,更新的话,BootLoader更新完 ...
- stm32最简单的实现BootLoader
BootLoader大家应该都知道是干什么的,简单的来说就是程序开始运行前的一段程序. 在成熟的产品中,通常都是采用BootLoader方式来升级产品的程序.也就是IAP升级.在了解完基本的实现原理后 ...
- 【STM32系列汇总】小白博主的STM32实战快速进阶之路(持续更新)
我把之前在学习和工作中使用STM32进行嵌入式开发的经验和教程等相关整理到这里,方便查阅学习,如果能帮助到您,请帮忙点个赞: 本文的宗旨 STM32 只是一个硬件平台,同样地他可以换成MSP430,N ...
- STM32f4 ARM Bootloader
参考资料: 基于ARM 的嵌入式系统Bootloader 启动流程分析 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计) Android系统启动 ...
- Ymodem协议(参考STM32)
相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些.下文中的bootload就来实现这样的功能. 前段时间有项目关于Bootload设计.所以就仔细的去了研究了一翻.以前都是用的stm32官 ...
- 如何使用STM32F4的BootLoader和APP程序
源:如何使用STM32F4的BootLoader和APP程序 STM32 BootLoader升级固件
- stm32-arduino-f103
希望给工作中偶尔要用的一些辅助板卡(例如运行信息现场记录)找一个快速开发的手段,Arduino作为流行的开源嵌入硬件框架,组件丰富,资料众多,所以想以Arduino作为平台.但是Arduino板子基本 ...
随机推荐
- SpringMVC 学习-返回字符串中文乱码问题解决
一.使用 SpringMVC 框架时,如果 HTTP 请求资源返回的是中文字符串,则会出现乱码.原因如下: SpringMVC 框架可以使用 @RequestBody 和 @ResponseBody ...
- Java中自己实现枚举
public class MyEnum { private final String name; public static final MyEnum red = new MyEnum(" ...
- Velocity China 2016 Web 性能与运维大会:构建快速、可扩展的弹性网站
Velocity China 2016 Web 性能与运维大会是一场关于构建快速.可扩展的弹性网站所需要的Web性能.运维及开发运维的训练.大会将于2016年12月1日在北京拉开帷幕,此次大会被众多业 ...
- infix expression 计算完全版
#include<iostream> #include<stack> #include<string> using namespace std; char comp ...
- Gentoo安装详解(二)-- 编译内核
编译内核: 安装内核源码: 选择内核:如gentoo-sources emerge gentoo-sources ls -l /usr/src/linux 手动编译内核: cd /usr/src/li ...
- winform/wpf 程序部署
(1):一些发布方式 ClickOnce是什么玩意儿,这个问题嘛,在21世纪的互联网严重发达的时代,估计也没有必要大费奏章去介绍了,弄不好的话,还有抄袭之嫌.因此,有关ClickOnce的介绍,各位朋 ...
- android Tweened Animations
Android提供了两种类型的动画: 一类是Tween动画:提供了旋转.移动.伸展和淡出等效果: 第二类是Frame-by-frame动画:这一类Animations可以创建一个Drawable序列, ...
- EXEC 和 SP_EXECUTESQL的区别
摘要: MSSQL为我们提供了两种动态执行sql语句的命令:EXEC 和 SP_EXECUTESQL.通常SP_EXECUTESQL更具优势,因为它提供了输入输出的接口,且能够重用执行计划,大大提高执 ...
- [Mark] openvswitch megaflow
Megaflow is an OpenVSwitch (OVS) feature than enables us to install flows for which some fields are ...
- oracle日期的处理
字符长转换为日期,有两种写法 SELECT date'2016-06-03' FROM dualselect to_date('2016-06-03','yyyy-mm-dd') from dual ...