打印
[其他ST产品]

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

[复制链接]
1998|54
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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来充当下载器的功能实现更新程序的作用。

使用特权

评论回复
沙发
个百zz分点个|  楼主 | 2023-8-27 16:40 | 只看该作者
bootloader是IAP不可缺少的,它存在于用户APP程序(即我们真正具有实现某种功能的单片机程序)之前,单片机一上电后执行的程序。本质上bootloader的也是一个完整的程序,有main函数,中断向量表,栈顶指针,它可以检查有没有新的固件,如果有,则将新的固件的数据写入到我们指定的flash地址中,之后跳到新的程序中去就OK了。下图为bootloader和APP存储于flash中的位置。

使用特权

评论回复
板凳
个百zz分点个|  楼主 | 2023-8-27 16:40 | 只看该作者

使用特权

评论回复
地板
个百zz分点个|  楼主 | 2023-8-27 16:40 | 只看该作者

使用特权

评论回复
5
个百zz分点个|  楼主 | 2023-8-27 16:41 | 只看该作者
二、根据上述实现IAP的过程,有四个问题,程序从哪里来,何时更新,如何更新,更新完成后呢?下面就这四点,简单阐述。

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

使用特权

评论回复
6
个百zz分点个|  楼主 | 2023-8-27 16:41 | 只看该作者
什么时候更新
        当然是收到指令的时候,指令从哪里下达?上位机软件通过PC串口下发给单片机。可以想象,当我们单击上位机下载按钮,就是让上位机下发了指令传给了单片机,单片机收到指令反馈给上位机(这个过程就叫“握手”)。然后开始执行更新程序。我定义的握手协议是上位机下发字符串“AABBCC”,当单片机接收后判断一致后反馈给上位机字符串“DDEEFF”,此时表示握手成功,准备更新。

使用特权

评论回复
7
个百zz分点个|  楼主 | 2023-8-27 16:41 | 只看该作者
如何更新
       更新的过程无非是把旧的程序擦除,把新的程序写入进单片机。如何擦除flash,如何写入flash并不难,demo程序里有说明,重要的是这个过程需要上位机PC与下位机单片机之间定义一个协议。有了协议我们就能知道上位机何时下发的数据开始存入、何时下发的数据表示完成、一次发送了多少数据、还有多少数据没有传输完、收发数据是否一致等等。demo程序中每次下发 2k Byte 数据,每次校验一致再下发数据,否则重新发送。具体内容参见demo程序。

使用特权

评论回复
8
个百zz分点个|  楼主 | 2023-8-27 16:41 | 只看该作者
      包头表示一帧数据的开始,当单片机收到0x5A时开始缓存上位机下发的数据,当单片机收到包尾0xAA表示上位机下发完一帧数据,当单片机收到包尾0xF5,0x5F两个字节表示上位机下发完最后一帧数据。

使用特权

评论回复
9
个百zz分点个|  楼主 | 2023-8-27 16:42 | 只看该作者
帧协议如下:

使用特权

评论回复
10
个百zz分点个|  楼主 | 2023-8-27 16:42 | 只看该作者
更新完成后
        前面说过了,bootloader程序是存在于用户APP程序之前的,所以更新过后,我们需要跳转到用户APP程序中。具体如何跳转参见最下方参考资料或者我的demo程序里。

使用特权

评论回复
11
个百zz分点个|  楼主 | 2023-8-27 16:42 | 只看该作者
三、需要注意的点

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,其它为预留。

使用特权

评论回复
12
个百zz分点个|  楼主 | 2023-8-27 16:42 | 只看该作者
   bootloader工程文件设置如下

使用特权

评论回复
13
个百zz分点个|  楼主 | 2023-8-27 16:42 | 只看该作者

使用特权

评论回复
14
个百zz分点个|  楼主 | 2023-8-27 16:42 | 只看该作者

使用特权

评论回复
15
个百zz分点个|  楼主 | 2023-8-27 16:43 | 只看该作者
    APP工程文件设置如下

使用特权

评论回复
16
个百zz分点个|  楼主 | 2023-8-27 16:43 | 只看该作者

使用特权

评论回复
17
个百zz分点个|  楼主 | 2023-8-27 16:43 | 只看该作者

使用特权

评论回复
18
个百zz分点个|  楼主 | 2023-8-27 16:43 | 只看该作者
2、中断向量偏移地址

使用特权

评论回复
19
个百zz分点个|  楼主 | 2023-8-27 16:43 | 只看该作者
    理解了STM32它的运行流程就能明白为什么设置它。STM32F1中存在一个中断向量表,它存放在代码起始后4个字节处(即0x08000004),代码开始的4个字节存放的是堆栈栈顶地址,当发生中断后,程序通过查找该表得到相应的中断服务程序入口地址,再跳到相应的中断服务程序中执行。

使用特权

评论回复
20
个百zz分点个|  楼主 | 2023-8-27 16:44 | 只看该作者
流程:上电后从0x08000004处取出复位中断向量的地址,再跳转到复位中断程序的入口(标号①所示),执行结束后跳转到main函数中(标号②所示)。在执行main函数的过程中如果发生中断,则强制将PC指针指回中断向量表处(标号③所示),从中断向量表中找到相应的中断函数入口地址,跳转到相应的中断服务函数(标号④所示),执行完中断函数后再返回到main函数中来(标号⑤所示)。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

631

帖子

0

粉丝