STM32 IAP BootLoader总结(C#上位机+单片机程序)

Demo下载地址:https://download.csdn.net/download/weixin_38222172/12048285

本文章原创,不讲解代码,只帮助梳理思绪,帮助理解demo程序。

一、首先要清楚什么是IAP?摘抄一段话,大家感受一下

       ISP:In System Programming (在系统中编程),通过芯片专用的串行编程接口对其内部的程序存储器进行擦写。

       IAP:In Application Programming( 在应用中编程),通过调用特定的bootloader程序,对程序存储器的指定段进行读/写操作,从而实现对目标板的程序的修改。

        简单来说ISP就是平时我们用JLINK之类的下载器通过专门的SWD接口来下载程序,IAP就是通过调用bootloader来充当下载器的功能实现更新程序的作用。

        bootloader是IAP不可缺少的,它存在于用户APP程序(即我们真正具有实现某种功能的单片机程序)之前,单片机一上电后执行的程序。本质上bootloader的也是一个完整的程序,有main函数,中断向量表,栈顶指针,它可以检查有没有新的固件,如果有,则将新的固件的数据写入到我们指定的flash地址中,之后跳到新的程序中去就OK了。下图为bootloader和APP存储于flash中的位置。

 

二、根据上述实现IAP的过程,有四个问题,程序从哪里来,何时更新,如何更新,更新完成后呢?下面就这四点,简单阐述。

  • 程序从哪里来

         我的实验是基于上位机,下位机是STM32F103RCT6的,通过PC的串口发送数据来升级下位机单片机程序。上位机用的是C#,通过调用函数读取bin文件(STM32如何生成bin文件参考最下面资料或自行百度),并保存在缓存中,等待传输。

  • 什么时候更新

        当然是收到指令的时候,指令从哪里下达?上位机软件通过PC串口下发给单片机。可以想象,当我们单击上位机下载按钮,就是让上位机下发了指令传给了单片机,单片机收到指令反馈给上位机(这个过程就叫“握手”)。然后开始执行更新程序。我定义的握手协议是上位机下发字符串“AABBCC”,当单片机接收后判断一致后反馈给上位机字符串“DDEEFF”,此时表示握手成功,准备更新。

  • 如何更新

       更新的过程无非是把旧的程序擦除,把新的程序写入进单片机。如何擦除flash,如何写入flash并不难,demo程序里有说明,重要的是这个过程需要上位机PC与下位机单片机之间定义一个协议。有了协议我们就能知道上位机何时下发的数据开始存入、何时下发的数据表示完成、一次发送了多少数据、还有多少数据没有传输完、收发数据是否一致等等。demo程序中每次下发 2k Byte 数据,每次校验一致再下发数据,否则重新发送。具体内容参见demo程序。

       包头表示一帧数据的开始,当单片机收到0x5A时开始缓存上位机下发的数据,当单片机收到包尾0xAA表示上位机下发完一帧数据,当单片机收到包尾0xF5,0x5F两个字节表示上位机下发完最后一帧数据。

帧协议如下:

上位机发送协议
包头帧序列数据 包尾校验
0x5A1 byte2048 byte

0xAA

0xF5,0x5F(尾帧)

 1 byte
上位机接收协议(下位机发送)
包头帧序列校验包尾
0x5A1 byte1byte

0xAA

0xF5,0x5F(尾帧)

 

  • 更新完成后

        前面说过了,bootloader程序是存在于用户APP程序之前的,所以更新过后,我们需要跳转到用户APP程序中。具体如何跳转参见最下方参考资料或者我的demo程序里。

三、需要注意的点

1、keil工程设置

        需要准备两个工程,一个为bootloader,一个为APP。bootloader通过ISP下载,APP编译生成bin文件通过IAP下载。实验中将flash分了几个区域,bootloader存储于0x08000000地址处,分配的大小为0x5000字节,用户APP存储于0x08005000处,分配大小为0x30000个字节。预留的容量多少根据单片机flash及程序大小而定,比如我选用的为STM32F103RCT5, flash大小为256KB = 256*1024 = 0x40000,我把前0x0~0x4FFF用于存储bootloader,0x5000~0x34FFF用于存储APP,其它为预留。

        bootloader工程文件设置如下

         APP工程文件设置如下

2、中断向量偏移地址

     

        理解了STM32它的运行流程就能明白为什么设置它。STM32F1中存在一个中断向量表,它存放在代码起始后4个字节处(即0x08000004),代码开始的4个字节存放的是堆栈栈顶地址,当发生中断后,程序通过查找该表得到相应的中断服务程序入口地址,再跳到相应的中断服务程序中执行。

        流程:上电后从0x08000004处取出复位中断向量的地址,再跳转到复位中断程序的入口(标号①所示),执行结束后跳转到main函数中(标号②所示)。在执行main函数的过程中如果发生中断,则强制将PC指针指回中断向量表处(标号③所示),从中断向量表中找到相应的中断函数入口地址,跳转到相应的中断服务函数(标号④所示),执行完中断函数后再返回到main函数中来(标号⑤所示)。

        bootloader和APP都是一样的流程,只不过存放到flash的不同地址处,相当于单片机里存放了两个子程序。 由于bootloader程序从0x08000000地址处开始,用户APP程序从0x08005000处开始,所以APP的中断向量表偏移0x5000。

       bootloader程序main函数中需添加如下一段代码

        APP程序main函数中需添加如下一段代码

3、参考资料如下,参考如下内容能帮助你理解一些细节。

https://blog.csdn.net/jxgxlm2008/article/details/78677681

https://blog.csdn.net/tq384998430/article/details/81010002

https://www.cnblogs.com/ZzJan/p/11564060.html

https://blog.csdn.net/qq_23229787/article/details/84579567

https://www.cnblogs.com/wanjianjun777/p/10252303.html

https://wenku.baidu.com/view/e831d14728ea81c759f57842.html

四、实验结果

  • 23
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值