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.

转载于:https://www.cnblogs.com/LittleTiger/p/5950029.html

Stm32 Bootloader整理相关推荐

  1. STM32 资料整理贴(更新到10年1月)[转]

    看到9G从QQ群上转的,后来还有没贴完 ,后面还有一大堆 链接地址 http://www.stmsky.com/bbs/viewthread.php?tid=2103&extra=page%3 ...

  2. stm32 Bootloader设计(YModem协议)

    相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些.下文中的bootload就来实现这样的功能. 前段时间有项目关于Bootload设计.所以就仔细的去了研究了一翻.以前都是用的stm32官 ...

  3. STM32 资料整理贴

    STM32 资料整理贴(更新到10年3月) http://www.stmsky.com/bbs/viewthread.php?tid=2103 很好多资料不错的. 转载于:https://www.cn ...

  4. 浅析STM32 Bootloader设计

    不需要拆机就能对产品进行固件升级是很多人想要的效果,不仅方便而且节省精力和成本.那么如何完成这项工作呢?接下来所介绍的Bootloader就可以完成这项工作,通过Bootloader引导程序完成固件的 ...

  5. STM32 BootLoader升级固件

    BootLoader 关于Bootloader,从书上的文字描述,很难理解这个名词是什么,有什么用.这次用到了,算是有了更进一步的认识. 一.知识点 1.BootLoader就是单片机启动时候运行的一 ...

  6. stm32 bootloader跳转

    stm32执行完loader程序后如何跳转到应用程序呢,一共有四件事要做: 第一,关闭外设中断,关闭外设时钟,失能外设功能,如果不关闭,跳转到app区后会产生各种奇怪的问题 第二,重设中断向量表位置, ...

  7. win11中无法识别STM32 BOOTLOADER的解决方法

    如图,按照PYBoard的官方手册说可以直接右键选择自动更新驱动即可.但是我在WIN11上并没有成功. 主要是原因是,DFU模式下的STM设备驱动程序没有自动安装成功. 解决方法是手动安装一下驱动:点 ...

  8. STM32 之十四 System Memory、Bootloader

      由于工作的需要,最近学习了一下 STM32F4 MCU 中的 BootLoader.对比了 ST 的其他系列的的 MCU,关于 Bootloader 这部分原理基本都是一样的,无非就是配置项多少的 ...

  9. stm32 通用bootloader_stm32最简单的实现BootLoader

    BootLoader大家应该都知道是干什么的,简单的来说就是程序开始运行前的一段程序. 在成熟的产品中,通常都是采用BootLoader方式来升级产品的程序.也就是IAP升级. 在了解完基本的实现原理 ...

最新文章

  1. Android中点击按钮获取星级评分条的评分
  2. 微信开源项目讲解使用公开课
  3. 基于JAVA+Servlet+JSP+MYSQL的校园一卡通管理系统
  4. 转载:WMS、TMS、OMS、WCS都是什么?
  5. Happy Necklace
  6. Java添加过期注解
  7. access与sqlserver数据转换
  8. java笔试涉及编程题
  9. 第7集 驱动与电气原理图绘制
  10. 原生android系统换主题字体,Android 自定义字体,更换系统默认显示的字体使用自定义字体...
  11. 那智机器人带CClink模块和三菱Q系列PLC通信
  12. phpnow mysql_phpnow重新安装mysql数据库的方法
  13. 【业务安全06】接口参数账号修改漏洞——基于metinfov4.0平台
  14. VMware虚拟机下载安装教程
  15. logx求x怎么用计算机,logx(logx等于什么)
  16. c语言中float是什么类型的数据,float是什么数据类型?
  17. fstream —文件读写操作
  18. python学习日记
  19. 解决opencv保存视频打不开问题
  20. card_list_operation.erl

热门文章

  1. python datetime.datetime 当前_python之time和datetime的常用方法
  2. js 获取鼠标在画布的位置_javascript求鼠标在canvas画布里的坐标
  3. Java面试题及答案2020,mysql时间类型以及获取当前时间
  4. 【深度思考】javaweb框架技术心得
  5. 【微信小程序企业级开发教程】订阅消息功能
  6. python【力扣LeetCode算法题库】219 -存在重复元素 II
  7. 网络推广产品浅析网站想要保持稳定的SEO排名和流量需要做什么?
  8. 网站文章不收录怎么办!
  9. 移动端、PC端网站优化需齐头并进
  10. 怎么将html字符串转换成标签并展示,将字符串转为html标签-续