STM32 10个工程篇:IAP远程升级详解(第五部分)

        伴随着催更不断,周日晚上来继续撰写STM32 IAP远程升级的项目例程,在这篇博客中笔者主要结合上位机报文发送机制来介绍下位机的报文解析设计,坚持做原创博客确实是一件很考验耐力的事情,一方面博客的文字和图片需要投入大量精力和时间,另一方面想要把意思表达清楚也需要多思考再动笔,只希望这些博客能真正帮助到需要的人吧。

       嵌入式ARM、DSP、FPGA、PCB的付费教程很多,可以说看起来市面似乎真的不缺教程,但是为什么就让人觉得入门很难提高更难呢,这里面原因无外乎是教程和项目之间的差距,比如说现实中很多人做嵌入式开发,从毕业到工作好几年,只掌握了PCB原理图、版图的简单设计和MCU一般性的裸机编程,并且做出来的产品还是感觉心里没底,不保证其可靠性和稳定性。市面上找来找去有不少告诉你怎么入门的付费教程,却没有告诉你怎么去举一反三、独当一面地承担具体项目开发的教程,并且入行以后再往上学习MCU的FREERTOS系统,ARM LIUNX开发、FPGA逻辑设计以及DSP编程就感觉非常吃力了。

       其实笔者最初只想把FPGA那块写好走专业路线,但是坦诚地说有很多粉丝私信表示想要看一看真实项目中FPGA或者ARM怎么联合工作的,或者在一个产品中ARM负责什么、FPGA负责什么、DSP负责什么,那么这就上升到一个嵌入式软件架构的问题,如何把三大处理器合理利用并且保证产品的可靠性、实时性、稳定性等,所以笔者就渐渐意识到只深耕FPGA,就算把高速接口、视频处理、数字信号都写上天也无法满足更多粉丝的需求,因为很显然这样就无法建立起一个完整的嵌入式软件架构概念,于是更新完“FPGA 20个例程”专栏就开始撰写姊妹篇“STM32 10个工程”专栏,“STM32 10个工程”专栏写完就开始做几个真实的产品项目让大家感受到产品嵌入式软件开发的过程。

       步入正文,上一期写到了STM32 IAP升级的上位机报文发送机制,那么显然在这篇博客里,我们需要把下位机和上位机对应起来让其可以正常进行数据交互,忘记上位机报文发送机制的朋友可以去看看上一篇博客,注意到上位机端把“7e 7e 5a”作为固定的报文报头,第4位字节“00”代表“boot检测”、“01”代表“发送app bin文件”、“02”代表“app跳入”、“03”代表“app检测”、“04”代表“boot跳入”,所以在下位机的bootloader程序设计中,我们需要分辨出上位机发送报文的前3字节固定包头、第4字节命令号、报文最后2字节的CRC校验正确,所以需要对前面用STM32CubeMX生成的代码进行改写。

         首先我们需要把CRC校验做好,这里笔者使用了查表法,这种方法更加适合STM32端使用减轻了计算压力,但是需要实现存储好对照表,具体计算查表函数如下图1所示。

图1 CRC校验函数

      其次在串口空闲中断里,需要对报文头进行判断对于非“7e 7e 5a”报文头直接进行过滤处理并不再置位USART1_Type.flag,这样在mian函数的裸机程序中,因为USART1_Type.flag为0则不会进行串口数据解析操作,如图2所示则是串口空闲中断函数的具体编码。

图2 串口空闲中断函数

      再次我们需要编写FLASH擦除函数和FLASH写入函数,以方便对STM32的自身FLASH擦除和写入,笔者参考了ST官方基于STM32F0系列的flash_if.c代码,这里不想过度赘述只想简单说明对于FLASH擦除因为STM32F103RCT6内部分为256页的FLASH且每页FLASH占1024字节而bootloader含32页即application的地址0x08008000,并对FLASH_If_Write官方函数进行了封装用FLASH_TYPEPROGRAM_HALFWORD即一次性写入2字节的方式写入片内FLASH,如图3和图4所示分别是FLASH的擦除函数和FLASH的写入函数,并且两个函数带有返回值操作正确返回0,操作错误返回1。

图3 FLASH擦除函数

图4 FLASH写入函数

       最后如图5所示是串口解析函数,这个函数主要把串口DMA空闲中断收到的报文数据(报头正确)进行解析,函数先进行了CRC校验判断,如果CRC校验错误直接发送“-error”报文上位机收到立刻显示错误,如果CRC校验正确则进行下一轮判断:对于命令码“00”则为BOOT检测命令,下位机收到后即可返回“+right”并直接置位Flag_Start为Jump_Boot,上位机收到即可显示正确;对于命令码“01”则为发送BIN文件指令,下位机收到第一报数据后就从application的地址0x08008000处开始擦除并解锁FLASH,并且当检测到最后一报数据后即可加锁FLASH;对于命令码“01”则为APP跳入命令,这里直接置位Flag_Start为Jump_App即可,详细过程放在下一篇博客展开讲解。

图5 串口解析函数

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 10个工程篇:IAP远程升级详解(第五部分)

发表评论