stm32 Bootloader设计(YModem协议)-CSDN博客

Chapter1 stm32 Bootloader设计(YModem协议)

原文链接https://blog.csdn.net/qinrenzhi/article/details/82771527

相信很多人都希望不开盖就可以对固件进行升级吧就像手机那些。下文中的bootload就来实现这样的功能。

前段时间有项目关于Bootload设计。所以就仔细的去了研究了一翻。以前都是用的stm32官方的没有去深入了解。这次做完了过后发现官方的版本存在一些问题。比如说YModem传送过程中完全没有对数据区进行效验只是核对了下编号就进行烧写。整个程序完全为阻塞式浪费了大量的cpu做无用功。当然这在升级程序方面也用不了多少时间。有一个重要的问题官方代码只可以用超级终端进行传输。这样如果你用的是64位的win7那就没有办法升级。因为只有xp或32位的win7才可以使用 超级终端。64位的win7下超级终端没办法使用。 不过SecureCRT工具到是可以在64位win7使用但是官方代码不对其支持。SecureCRT下支持的是最原始的YModem协议第一帧数据包中不包含总字节数。超级终端下的YModem应该是改进版的所以官方的dome只可以在超级终端下传输。下面会对YModem进行详细说明。就会知道其中的原因。

首先奉上一个精简的Bootloader工程。

网盘失效。

支持协议YModem, YModem-G。

所支持的PC软件超级终端SecureCRT。

http://pan.baidu.com/share/link?shareid=373637&uk=118334538

YModem协议

YModem协议是由XModem协议演变而来的每包数据可以达到1024字节是一个非常高效的文件传输协议。下面有一些相关的文档。这里要感谢关注我微博的一些朋友提供的资料。省去了不少时间。

下面先看下YModem协议传输的完整的握手过程先看下图

SENDER:发送方。

RECEIVER:接收方。

第一步先由接收方发送一个字符’C’

发送方收到’C’后发送第一帧数据包内容如下

SOH 00 FF Foo.c NUL[123] CRC CRC

第1字节SOH : 表示本包数据区大小有128字节。如果头为STX表示本包数据区大小为1024

第2字节00 : 编号第一包为00,第二包为01第三包为02依次累加。到FF后继续从0循环递增。

第3字节FF : 编号的反码。 编号为00 对应FF为01对应FE以此类推。

第4字节到最后两字节 若第1字节为SOH时有128字节为STX时有1024字节这部分为数据区。“Foo.c” 文件名 超级终端下在文件名后还有文件大小。官方dome也是因为使用了这个文件大小进行比对。这就是为什么用SecureCRT中的YMODEM协议而无法正确传输的原因。

在文件名和文件大小之后如果不满128字节以0补满。

最后两字节这里需要注意只有数据部分参与了效CRC验,不包括头和编码部分。

16位CRC效验高字节在前低字节在后。

接收方收到第一帧数据包后发送ACK正确应答。

然后再发送一个字符’C’。

发送方收到’C’后开始发送第二帧第二帧中的数据存放的是第一包数据。

接收方收到数据后发送一个ACK然后等待下一包数据传送完毕继续ACK应答。直到所有数据传输完毕。

数据传输完毕后发送方发EOT第一次接收方以NAK应答进行二次确认。

发送方收到NAK后重发EOT接收方第二次收到结束符就以ACK应答。

最后接收方再发送一个’C’发送方在没有第二个文件要传输的情况下

发送如下数据

SOH 00 FF 00~00(共128个) CRCH CRCL

接收方应答ACK后正式结束数据传输。

以上部分为YMODEM协议的基本操作流程。

STM32 Bootloader软件设计

笔者一开始软件的基本思想串口接收数据和写数据到ROM中两者可以同步进行。这样可以让cpu得到最大程度的有效利用。

比如说接收一帧1024的数据所用的时间= 当前波特率单字符所用时间 * 1024 + 1头 + 2编码 + 2CRC)= (1/115200 * 10) * (1024 + 1 + 2 + 2) = 89.323ms

也是就是在接收的这90ms左右的时间里在接收下一帧结束这一期间内可以把上一帧的数据写入到ROM中。 串口接收数据是中断的方式所以收写操作基本上算同步运行。程序流程如下

STM32 Bootloader使用方法

这个STM32 Bootloader程序使用起来很简单如果你以前没有用过IAP升级方式也没关系下面会详细说明。

准备工作

硬件有串口目标板1串口连接线。

软件PC工具超级终端 或SecureCRTstm32目标板程序.binstm32 Bootloader。

  1.     先把上面的工程stm32 Bootloader下载到目标板中
    
  2.     打开超级终端 或SecureCRT设置波特特115200停止位1数据位8效验无。
    
  3.     先按下‘C’再给目标板上电注意先后顺序
    
  4.     选择1然后使用YModem, YModem-G协议发送"stm32目标板程序.bin"文件。
    
  5.     传输完毕后会自动运行。
    

注意以下两处根据自己的需求调整

stm32 Bootloader修改

找到工程下的common.h文件

以下三个宏定义根据自己目标板的需求来定

#define ApplicationAddress 0x8002000 //程序首地址

#define ApplicationSize 120000 //目标程序预留空间

#define STM32F10X_HD //目标板芯片类型

stm32目标板程序.bin偏移地址修改

有两个地方

1找到system_stm32f10x.c

#define VECT_TAB_OFFSET 0x2000 /*!< Vector Table base offset field.

Chapter2 STM32 + IAP + Ymodem完美结合

对于软件工程师来说代码升级或程序更新算是必备基础知识。

下面将介绍关于编程的基础知识以及结合STM32官方提供的Demo讲述一下关于编程的内容。

一、关于ISP、ICP、IAP

1.ISP

ISPIn System Programing在系统编程。

比如使用STC-ISP对STC芯片编程利用Flash loader对STM32编程等。

支持ISP的芯片一般在芯片内部固化了一段用ISP升级的boot程序。

2.ICP

In Circuit Programing在电路编程。

ICSPIn-Circuit Serial Programming在电路串行编程。如对EEPROM编程等。

ICP编程方式网上各有说法从字面含义在电路来说所有处于编程的芯片都需要上电都处于电路中。不严格来说利用J-Link、ST-Link、e-Link32等工具进行编程也属于在电路编程ICP。

在维基百科中在系统编程(ISP)也称为在电路串行编程(ICSP)。

3.IAP

In applicating Programing在应用编程。

这里是本文说的重点可以简单理解为在程序运行的过程中进行编程升级程序更新固件。

IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。[来自百度百科]

IAP通信口

IAP的通信口有许多种UART串口、ETH以太网、I2C、SPI…等。按理说只要能传输数据的通信口都能实现IAP的功能。

本文结合STM32官网提供的例程利用UART在应用编程IAP。

二、关于Ymodem协议

YModem是一种文件传输的协议由XModem协议演变而来的每包数据可以达到1024字节是一个非常高效的文件传输协议。

更多介绍可参考百度百科

https://baike.baidu.com/item/Ymodem

协议传输流程

在这里插入图片描述
其中几个字符的ASCII码
在这里插入图片描述

1.起始帧

SOH + 00 + FF + filename + filesize + NULL + CRCH + CRCL

起始帧是文件传输发送端发的第一条重要消息.

filename表示传输文件的文件名.

filesize表示需要传输文件的大小.

CRCH + CRCL 表示整条帧(去掉前三个字节)的CRC16校验.

2.数据帧格式

STX/SOH + [编号] + 编号的反码 + data[0] + data[1] + data[2] + … + CRCH + CRCL

SOH 表示有128个字节, 有的也只用SOH传输数据.

STX 表示有1024个字节.

CRCH + CRCL 表示整条帧(去掉前三个字节)的CRC16校验.

如果传输最后一条字节不足128个字节, 则用1A填充

3.结束帧的数据格式

SOH + 00 + FF + NULL + NULL + … + NULL + CRCH + CRCL

以上部分内容授权转自

https://blog.csdn.net/weixin_41294615/article/details/104652105

三、ST官网IAP例程

ST官网提供的IAP例程有很多很多比如

库有使用标准外设库SPL的、有使用硬件抽象层库HAL的

通信口有使用USART的有使用I2C的有使用ETH的等。

MCU型号STM8S、STM32F1、F4、L1等几乎全系列都有。

ST官网提供的各种IAP其方法和原理其实都类似就是将程序文件二进制文件写入FLASH。

本文以最简单的基于STM32F10x利用SPL库+UART的IAP为例来给大家讲述一下。复杂都是从基础开始后续逐步为大家更新更高级的IAP功能

STM32F10xxx in-application programming using the USART官方地址

https://www.stmicroelectronics.com.cn/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-library-expansion/stsw-stm32008.html

提示公众号不支持外部链接请复制链接到浏览器下载
在这里插入图片描述
相关参考文档和代码例程都在这个网址下载下一章节针对这里该IAP讲述几点重要内容。

四、IAP例程几个要点

1.例程概要说明

该代码工程基于STM32F1使用UART通信口利用超级终端上位机、通过YModem协议实现代码程序的数据传输和写入Flash。

2.IAP软件工程

我们解压上面下载好的软件工程包进入目录通过MDK-ARM为例如下图;
在这里插入图片描述
本文以MDK-ARM为例你也可以通过EWARM、TrueSTUDIO等工具打开。

因该工程代码是之前用MDK-ARM V4版本建立的现在用V5版本打开会提示如下信息
在这里插入图片描述
只需要点击“Migrate to Device Pack”即可V5版本使用了“设备支持包”这里大概意思就是使用设备支持包兼容以前老版本工程。

选择对应的目标我们以F103ZE为例选择大容量、小容量在于他们的FLASH页大小不一样 选择10E-EVAL如下图
在这里插入图片描述
直接编译没有错误警告此时如果有对应的板卡可直接下载。

3.说明

这个程序只是IAP程序放在以0x0800 0000为起始的地址。而IAP程序的作用是将应用程序二进制文件下载到应用程序对应的地址。

因此我们会将FLASH划分我两个区域IAP程序区域APP程序区域。
在这里插入图片描述
这里IAP程序有两个作用1.对APP程序编程2.引导程序跳转至应用程序。所以这段APP程序也叫BootLoader。

为防止IAP程序不被(第一部分代码)不被意外破坏一般建议对IAP程序进行“写保护”。

这个APP地址0x0800 3000是怎样来的呢

见IAP程序代码
在这里插入图片描述
所以我们APP应用程序的其起始地址就必须对应为0x0800 3000 才行。不然跳转之后没有应用程序则会出错。

提示

它这里是通过按键方式选择执行IAP还是执行APP一般建议通过倒计时比如5s5s之内通过串口选择下载否则自动跳转到APP程序执行。这里就需要自己根据情况修改代码。

Demo里程可以通过选择3跳转到APP程序初学者可以直接不使用按键判断进行测试如下图修改一下
在这里插入图片描述

五、APP代码和地址问题

上一章节是讲述的IAP程序本节讲APP程序修改地址的问题。

1.添加代码

在代码开始设置向量表偏移

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000);

0x3000代表偏移量

2.修改配置

project -> Options
在这里插入图片描述

3.生成Bin

4.APP程序代码生成

六、超级终端安装程序下载

1.超级终端下载、安装

官方提供的文档是HyperTerminal超级终端下载程序这个可以百度谷歌搜索下载安装。我这后面一直使用SecureCRT这款终端这终端属于商业软件但在网上可以找到很多po解的办法。

2.程序下载

硬件连接好将生成的程序文件Demo.bin放在指定位置为方便测试下载我拷贝到桌面-> 打开终端 -> 键盘按1 ->选择文件 ->下载完成 -> 键盘按3 执行程序。
在这里插入图片描述
以上内容就是关于STM32 + IAP + Ymodem的基础知识和例程说明希望对你有帮助。

版权声明本文来源网络免费传达知识版权归原作者所有。如涉及作品版权问题请联系我进行删除。

Chapter3 SecureCRTYomden协议传输文件的相关使用说明

原文链接https://blog.csdn.net/Go_RoCo/article/details/87375366

使用SecureCRT的Yomden传输文件传输文件的相关使用说明和设置
这里不做Ymodem协议的展开仅仅记录使用。

1、传输文件的单个数据包大小128byte和1024byte两种选择

菜单栏->Options->Sessions Options->Timinal->X/Y/Zmodem->X/Ymodem send packet size
在这里插入图片描述
可以设置文件的开发路径和包的大小设置后需要重新启动一下才能生效。

2、打开文件

菜单栏->Transfer->Send Ymodem->选择文件->选择后在下面的Files to send 会有需要被发送的文件发送成功文件会被自动清除。

3、发送文件

在这里插入图片描述
1、打开文件后会等待节点设备的 “C”字符然后进入数据传输。
2、如果没收数据或者数据发送中错误就一直等界面提示的可以使用 CTRL+C也关不掉只能断开连接重新连接才可以.
3、数据传输正确并结束后发现还是卡着。多次试验后发现在文件发送结束后可以延迟一小会几十或几百毫秒然后重新发一个任意字符就可以重新使用了.

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6