良许Linux教程网 干货合集 STM32 + IAP + Ymodem完美结合

STM32 + IAP + Ymodem完美结合

对于软件工程师来说,代码升级(或程序更新)是一项必备的基础知识。下面将介绍与编程相关的基础概念,并结合STM32官方提供的Demo,详细讲解编程的内容。

一、关于ISP、ICP、IAP

1.ISP
ISP即In System Programing,也即在系统中进行编程。例如,对STC芯片进行编程时可以使用STC-ISP工具,对STM32芯片进行编程时可以使用Flash loader。

ISP所支持的芯片通常在芯片内部固化了一段boot程序,用于进行ISP升级。

2.ICP
ICP即In Circuit Programing,也即在电路中进行编程。

ICP编程方式存在各种说法,从字面含义来理解,所有需要进行编程的芯片都需要通电,都处于电路中。因此,利用J-Link、ST-Link、e-Link32等工具进行编程也可以归类为ICP编程。

在维基百科中,ISP也被称为ICSP,即In-Circuit Serial Programming。

3.IAP
IAP即In Applicating Programing,也即在应用程序运行的过程中进行编程,实现程序的升级和固件的更新。这是本文的重点内容。

以上是关于ISP、ICP和IAP的基本概念。接下来将详细讲解IAP的相关知识。

 

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

IAP通信口

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

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

二、关于Ymodem协议

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

更多介绍可参考百度百科:

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

协议传输流程:

image-20240114182533276
image-20240114182533276

其中几个字符的ASCII码

字符 ASCII码16进制
SOH 0x01
STX 0x02
ACK 0x06
NAK 0x15
EOT 0x04
C 0x43

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

提示:公众号不支持外部链接,请复制链接到浏览器下载)

image-20240114182540733
image-20240114182540733

相关参考文档和代码例程都在这个网址下载,下一章节针对这里该IAP讲述几点重要内容。

四、IAP例程几个要点

1.例程概要说明

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

2.IAP软件工程

我们解压(上面)下载好的软件工程包,进入目录,通过MDK-ARM(为例),如下图;

image-20240114182545907
image-20240114182545907

本文以MDK-ARM为例,你也可以通过EWARM、TrueSTUDIO等工具打开。

因该工程代码是之前用MDK-ARM V4版本建立的,现在用V5版本打开会提示如下信息:

image-20240114182548236
image-20240114182548236

只需要点击“Migrate to Device Pack”即可,V5版本使用了“设备支持包”,这里大概意思就是使用设备支持包兼容以前老版本工程。

选择对应的目标(我们以F103ZE为例,选择大容量、小容量在于他们的FLASH页大小不一样),选择10E-EVAL,如下图:

image-20240114182551055
image-20240114182551055

直接编译,没有错误警告,此时,如果有对应的板卡,可直接下载。

3.说明

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

因此,我们会将FLASH划分我两个区域:IAP程序区域,APP程序区域。

image-20240114182554740
image-20240114182554740

这里IAP程序有两个作用:1.对APP程序编程;2.引导程序跳转至应用程序。所以,这段APP程序也叫BootLoader

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

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

见IAP程序代码:

image-20240114182558451
image-20240114182558451

所以,我们APP应用程序的其起始地址就必须对应为0x0800 3000 才行。不然,跳转之后没有应用程序,则会出错。

 

提示:

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

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

image-20240114182602083
image-20240114182602083

五、APP代码和地址问题

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

1.添加代码

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

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000);

0x3000代表偏移量

2.修改配置

project -> Options

image-20240114182605318
image-20240114182605318

3.生成Bin

4.APP程序代码生成

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

1.超级终端下载、安装

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

2.程序下载

硬件连接好,将生成的程序文件(Demo.bin)放在指定位置(为方便测试下载,我拷贝到桌面)-> 打开终端 -> 键盘按1 ->选择文件 ->下载完成 -> 键盘按3 执行程序。

以上内容就是关于STM32 + IAP + Ymodem的基础知识和例程说明,希望对你有帮助。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部