查看原文
其他

【经典】解析一个STM32在线升级实例(usart版本)

bug菌 最后一个bug 2021-01-31

1、简单聊一聊


    今天为大家推荐一首BIGBANG的《IF YOU》,应该很多90后小伙伴听到过这首歌,毕竟也是之前非常火的一首歌曲,还有很多翻唱版本都非常得不错。

    好了,今天C++连载篇歇一歇吧,确实对于一些语法知识挺枯燥的,就像当年在学校学习各种高等数学或者复变函数一样,对于很多小伙伴或许都是噩梦吧,不不过我们都知道工科之母--数学必不可少,在工作中照样得恶补。最近作者发布了一篇《【重磅】剖析MCU的IAP升级软件设计(设计思路篇)》获得了许多小伙伴的好评,也有很多小伙伴问作者有没有参考实例,所以最近找了一下ST官网上的一个Usart_IAP工程跟大家简单讲解下,大家可以以此为基础根据上篇文章对IAP进行模仿,优化和升级。

2、获得ST的IAP工程

    现在芯片厂家的服务都做得非常完整了,特别是一些大厂,为了芯片的使用和推广都会有非常多的开发案例和开源开发资料,来供大家学习和参考,便于快速上手以缩短产品开发的周期!所以当拿到一块新款芯片,我们寻找资料的一种方式就是上对应官网。好了,我们现在到ST官网搜索"IAP"关键字(关键字也非常重要),

搜索地址:

    https://www.st.com/content/st_com/en.html

搜索结果如下图:

    上图结果是我们在ST官网搜索的结果,我们先看到第二项和第三项分别是关于SD卡的IAPUSART的IAP,我们前面讲过PC机在升级过程中主要是起到传输固件的目的,那么如果我们的bootloader程序中有SD卡驱动,通过检测SD卡中是否有固件,然后比较版本也可以进行升级,和PC机传输固件是一样的道理。我们今天主要是以简单的串口IAP为例子跟大家分析一下,我们点击USART_IAP,便进入如下界面:

    通过点击红色Get Softwave然后输入相关信息便可以获得IAP工程,同时ST公司也为该IAP简单的几部分描述了一下:

    1)Flash的擦除和编程;

    2)使用Ymode协议进行固件传输;

    3)把程序分为Loader和App。

    (下载到的IAP工程文件如下图所示)

3、分析一下ST官方IAP工程

    我们打开任意一个工程文件,便出现如下图所示的两个目录:IAP_Main表示对应BootLoader,而IAP_Binary_Template表示App参考模板,确实做的挺用心的。

    作者用IAR打开了其中对应的工程(其中也包含Keil所建立的工程),ST公司把IAP的使用方法、设计思路和注意事项全部都写在了Readme.txt文件中,同时作者从其中截取了非常关键的两张图供大家阅读,基本上把IAP都说完了。



    简单解析一下 : 该工程中IAP程序位于0x08000000~0x08003FFFF;其余部分属于App部分,同时ST公司还为大家在图中标记出了Vector table,程序的两个部分都存在中断向量表,这就涉及到大家在平时自己设计IAP中经常忽略的中断向量表的重映射问题了。

4、整体程序把握

    作者通过阅读ST的官方串口IAP代码,为大家画一幅流程图让大家从整体上把握工程代码:

    对于ST官网这套串口IAP工程基本上可是适用于大部分的IAP升级需求,不过一些常用的好方案大家可以参考我写的IAP设计方案篇,该IAP有一个不错的设计就是支持App上传,这种功能的好处就是在进行烧录程序之前我们可以通过网络通信等获取原来的App程序作为备份,相对于我之前的方案节省了空间。


5、回头看看代码

    1)首先我们看看ST提供的App和Bootloader程序的映射,用IAR工程打开对应的.icf文件查看程序映射地址,如下图所示:

    解析一下 : 可能有些小伙伴会疑惑,怎么bootloader的链接地址是整个程序区域,bootloader程序实际的大小是不会超过0x3FFF的,同时在进行IAP烧录的时候顺便可以擦除所有的Flash。其Bootloader的起始地址从0开始,而App从0x4000地址开始。

    2)如下图所示Bootloader程序中进行按键判断,按键按下进入Main_Menu串口菜单,否则检查栈是否OK,如果栈OK,直接Jump到App执行,否则不执行。

    3)我们进入Main_Menu函数,其主要工作是等待用户发送串口指令,然后执行相应的处理,如“1”表示串口下载,“2”表示串口升级,“3”表示跳转执行App程序等等

    4)串口IAP下载为了能够保证固件完整和传输效率,ST_IAP程序中采用了Ymode协议来进行接收固件(Ymode协议大家可以网上查阅,作者以后也会对XYZ协议进行讲解);我们再来看看图二,在Ymode内部接收到一包数据后通过调用FLASH写函数把接收到的数据包写入到App地址区域;而对于上传App是下载的一个逆过程,然后使用Ymode传输到PC端,作者就不再进行具体分析了。

    5)对于一些小伙伴会问了,我进行IAP升级是不是还得自己做一个Ymode协议的上位机呀?个人觉得,如果大家对桌面应用程序开发感兴趣可以进行相关协议开发,也便于以后调试程序。如果没有那样的精力可以使用:超级终端、SecureCRT等等终端软件一般都支持Ymode传输协议。如下图超级终端界面:


    6)最后我们简单看一下App程序中如何处理中断向量表重映射,在App工程开头初始化部分进行了如下提示:

    然后我们在system_stm32f1xx.c中找到对应的中断向量重定位寄存器,代码中进行了如下处理:

   7)好了,对于该IAP基本上就讲完了,该IAP没有采用作者之前文章中保存相关参数到IAP进行相关状态切换的处理,也没有进行从App程序跳转到Bootloader的指令处理,不过该指令与Bootloader跳转到App执行程序类似,大家可以以该IAP为Demo进行更加丰富的开发练习。对于具体每条语句的的详细说明和使用方法,大家可以阅读内核相关技术文档和《权威指南》


6、最后小结

     今天就为大家讲这么多吧,写出一个方便的IAP还有很多工作需要做,经常有一些小伙伴问作者有哪些比较炫酷的项目能够让自己练习一下,其实很多大型的项目都是一个个模块构成的,我们只有把每个小部分做好做细,一个好项目就做出来了,以上资料均来自于ST官网,大家可以到对应地址下载,也可以加作者微信,我这边有下载好的压缩文件。

    好了,这里是公众号:“最后一个bug”,一个为大家打造的技术知识提升基地。同时非常感谢各位小伙伴的支持,我们下期精彩见!

推荐好文  点击蓝色字体即可跳转

【连载】重温C++之“重载”(第三篇)

顿悟,神秘的register关键字(C语言篇) 

【典藏】深度剖析单片机程序的运行(C程序版) 

【重磅】剖析MCU的IAP升级软件设计(设计思路篇)

☞ C语言为什么一般不在.h中定义函数或者变量?(精华)

手把手教你写Modbus-RTU协议(理论篇)

【典藏】大佬们都在用的结构体进阶小技巧

听说因为代码没"对齐"程序就奔了?(深度剖析)

【典藏】自制小型GUI界面框架(设计思想篇)


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存