良许Linux教程网 干货合集 STM32固件IAP程序实现

STM32固件IAP程序实现

1. 写在前面

IAP全称In Application Programming,指的是用户程序在运行过程中通过对用户Flash的特定区域进行烧写,其目的是为了实现产品发布后的固件程序更新和升级。

2. 系统Bootloader

对于STM32芯片而言,出厂时已经预先烧录了系统Bootloader。然而,要启动系统Bootloader需要设置单片机的BOOT引脚:BOOT1=0,BOOT0=1,并在复位之后进入系统Bootloader。可以通过硬件设计来实现BOOT引脚的自动设置和复位,从而利用系统Bootloader实现IAP功能。下图展示了相应的电路图:

image-20230911221805281
image-20230911221805281

电路比较简单就不详细分析了。程序升级需要配合专用的软件MCUISP。升级时MCUISP软件会控制DTR引脚和RTS引脚将BOOT0引脚拉高,并实现单片机复位,从而进入系统Bootloader。之后可以通过USB转串口对程序进行升级。

image-20230911221808774
image-20230911221808774

3.自己编写BootLoader

系统Bootloader只能通过特定的接口对程序进行升级,且会增加额外的硬件设计,有时候并不适用。这时候就需要自己编写Bootloader程序实现IAP。

实现IAP需要两个程序:Bootloader程序和应用程序。系统启动后首先进入Bootloader程序,判断是否需要升级,如果不需要直接跳转到应用程序运行;如果需要则通过指定的接口和协议接收数据并写入到Flash中,实现应用升级。这种方式灵活很多,接口和协议都可以自定义,实现的关键是协议的设计和对Flash进行读写。这里以STM32F1系列单片机为例,采用串口1和通用的Ymodem协议进行介绍。

YModem协议

YModem协议是一个非常高效的文件传输协议,每包数据可以达到1024字节。YModem协议传输的完整的握手过程如下。这里就不进行详细介绍了,用户也可以采用自定义的协议,协议设计要主要发送、反馈和校验,保证传输数据的正确性。

image-20230911221812143
image-20230911221812143

Bootloader程序

STM32Cube库文件中提供了相关的例程,可以进行参考:

STM32Cube_FW_F1_V1.8.0\Projects\STM3210C_EVAL\Applications\IAP\IAP_Main

可以看到,程序初始化后通过检测按键来判断是否需要升级应用程序。

image-20230911221815279
image-20230911221815279

很多时候,用户的硬件上可能没有按键,则需要通过其它办法来实现判断。比如,需要升级时,应用程序在Flash某个位置写入一个标志,然后复位进入BootLoader程序,BootLoader程序读取该标志来自动判断是否需要升级应用程序。

应用程序

由于BootLoader程序的存在,应用程序在Flash中的存储位置也发生了改变,需要对程序中的中断向量表偏移地址进行修改。首先在Bootloader程序中确定应用程序的起始地址:

image-20230911221822621
image-20230911221822621

在应用程序工程中修改程序编译的地址:

image-20230911221818951
image-20230911221818951

在应用程序中system_stm32f10x.c文件,找到:

image-20230911221826379
image-20230911221826379

修改为:

图片
图片

该地址为偏移地址,不是绝对地址,与上面的地址有区别。

最后,MDK默认只生成HEX文件,要生成bin文件需要添加一条指令。在User选项卡中,勾选 “Run # 1”,在后面输入框写入bin文件生成方式:

$K\ARM\ARMCC\bin\fromelf.exe –bin –output=Bin@L.bin !L

image-20230911221835980
image-20230911221835980
**上位机**

上位机采用SecureCRT,该软件支持YModem协议打开软件后,连接串口,使电路板进入Bootloader程序,根据菜单进行操作即可。

image-20230911221841104
image-20230911221841104

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

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

作者: 良许

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

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

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

微信扫一扫关注我们

关注微博
返回顶部