欢迎访问 生活随笔!

ag凯发k8国际

当前位置: ag凯发k8国际 > 编程资源 > 编程问答 >内容正文

编程问答

iap升级问题 stm32f103r8-ag凯发k8国际

发布时间:2024/10/12 编程问答 11 豆豆
ag凯发k8国际 收集整理的这篇文章主要介绍了 iap升级问题 stm32f103r8_stm32的基于串口的iap固件升级与加密 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

大家好,我是川楠,最近,在问答频道上看到有人对iap升级心存疑惑。恰好,我本人在这方面的做过功课,也实战使用到很多的项目上,所以我就来为大家做个抛砖引玉吧。

         本次例程,我用的是stm32f103vet6单片机开发板,这个是我2012年买的,有没有人和我用的一样的呢?

          

         所谓的iap( inapplication programming)即在线应用编程。其主要的应用就是对程序的在线升级更新。比如,我们开发的产品,在已经大量出货的情况下,突然发现我们产品的程序有个bug,在这种情况下,总不能把所有的产品都召回吧,这样成本太高了。iap就可以很好避免这个问题。

         如果你的设备上有iap功能,你可以要求把你的产品接到网口、usb、插个有新程序的tf卡、或者串口等等,就能对产品设备进行固件升级。就像我们的手机刷机一样。

iap升级原理

         stm32单片机,根据boot电平的设置,其上电启动的地址也是不一样的,常用的是从flash启动。对应的boot电平设置如下:

         

在flash启动模式下,上电的启动地址是:0x0800 0000,也是flash的起始地址。

         比如,本次使用的stm32f103vet6单片机,其flash大小为512k,ram尺寸为64k。这里我将程序设计成两个boot程序和app程序。

boot程序:位于flash的起始地址,及0x08000000.主要进行对后面app程序的flash扇区进行编程,上电默认执行。

app程序:位于flash的后半段,为用户实现功能的程序。

         所以这里将512k的flash分成了两部分从0x0800000 -0x0800 ffff 为boot程序区,合计64k;剩下的从0x0801 0000-0x0808 0000为用户app程序区,合计448k。

程序的启动流程是:

单片机上电之后,首先从0x08000000启动,运行boot程序,在boot程序中检测是否需要进行固件升级:

如果需要升级,则按照规定的方式,从串口接收数据对单片机的flash进行改写,改写完成之后,需要对改写的固件进行校验。校验通过后,则进行程序跳转。

如果不需要升级,则判断app程序的起始地址是否正常,若正常,则进行程序跳转,运行app即可。

说了这么多,下面开始实操。

boot程序设计

boot程序的核心功能有两个:

1、程序跳转

2、对app程序的flash扇区内容进行改写

程序跳转很简单,也就几句话:

其中的 app_start 就是我们app程序的起始地址:0x0801 0000

而flash的改写稍微麻烦些,需要将0x0801 0000 后面的flash扇区进行擦除和重写。重写的类容为我们新的app程序类容。

         这里说明下,新的app程序数据,有多种来源方式:可以将新的app程序的bin文件放到tf卡中,boot程序根据tf卡的bin文件,去改写app扇区。也可以用过can、rs485、串口、usb等串行接口接收新的app程序数据包,并把数据包依次写到app扇区。本次使用的是串口。

配置工程:默认的是rom1的起始地址为0x0800 0000 size 为0x8 0000

而本次我们分配的boot程序为64k,所以需要修改size为0x1 0000

其他的地方编程和我们平时编程是一样的。

程序编写成功之后,点击“load”下载就可以了。

这里需要主要的是:

1、每个单片机的flash大小和扇区是不一样的,两个程序的分割点,一定要选择某个扇区的起始地址。

2、本次是使用的单片机有256个扇区,每个扇区为2k,但是并不是所有单片机的page都是一样大小的,比如stm32f407的扇区就不是平均分配的。

3、boot的功能建议设计为越简单越好,其主要功能就是为了下载程序。所以,越简单,其可能出问题的几率就越小。如果boot程序出了问题,那一般只能进行产品召回了。

4、安全很重要。在boot程序里,一定要记得,要将其他的控制引脚保持在合适的电平。比如:做小车控制板,在boot程序升级的时候,忘记了把运动控制引脚的电平拉低,导致在升级的时候,小车乱跑,容易撞到东西。

========================示例:我设计的boot程序升级流程=====================

正常情况下,程序上电启动之后从mcu起始地址0x0800 0000直接启动,读取bkp_dr1寄存器,判断是否需要固件升级,如果不要升级,则进入固件跳转,运行app程序。

当需要更新固件的时候,需要严格按照如下的步骤和通讯要求进行操作,具体操作如下:

l  目标设备上电之后(程序已经完成了跳转),上位机发送“固件更新命令”,目标设备重新复位启动,在这个过程中目标设备不能断电(此时固件更新命令将保存到bkp_dr1备份寄存器中)。

l  上位机可以使用相关的命令获取设备的mcu型号、内存、id、版本、固件起始地址(主要是固件起始地址参数,如果知道可以跳过此步骤)等相关信息。

l  上位机发送“开始更新固件”命令,该命令包含固件的起始地址,目标设备收到后需要应答。

l  上位机开始分包发送固件数据帧,目标设备校验并保存固件数据,同时需要应答上位机;如果数据校验失败,可以要求上位机重传。

l  上位机收到应答数据帧之后,才能继续发送固件数据帧。当上位机发送完整个固件数据帧之后,上位机需要发送固件数据更新完毕命令,目标设备应答,开始重启,此刻目标设备固件更新完成。

具体流程如下图所示:

    在bootloader程序中,固件的起始地址、bootloader版本都在程序的代码中固化好了;cpuid、内存尺寸直接读取mcu相关的寄存器即可...

点击文末“阅读原文”,查看完整文章!

↓↓↓ 爆品推荐:安信可wifi模块 esp8266,仅售4.99

与50位技术专家面对面20年技术见证,附赠技术全景图

总结

以上是ag凯发k8国际为你收集整理的iap升级问题 stm32f103r8_stm32的基于串口的iap固件升级与加密的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得ag凯发k8国际网站内容还不错,欢迎将ag凯发k8国际推荐给好友。

网站地图