OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 14690|回复: 26

STM32F103 串口-IAP程序升级

[复制链接]

132

主题

340

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1036
金钱
1036
注册时间
2017-10-30
在线时间
163 小时
发表于 2018-7-30 14:07:01 | 显示全部楼层 |阅读模式

STM32F103 串口-IAP程序升级

    通常情况下我们给STM32系列的单片机烧录程序文件的时候,使用SWD、J-link或者通过设置BOOT引脚后,使用串口进行程序下载,这样的方式直接一次性将程序文件下载到单片机的flash中,比较适合绝大部分的应用。但是有些应用中产品装配完成后,下载口不便引出的情况下,或者是某些设备需要具有远程更新程序情况下,使用串口IAP的方式将会更加便捷。


    一般我们常见的51单片机内部的flash空间,只能使用下载器进行烧录程序。芯片自身无法擦写内部flash空间。这样的情况下,如果我们后期需要升级芯片中的程序时,只能到现场使用下载器重新烧录程序,这样比较繁琐。但是STM32单片机内部的flash可以在程序中让单片机自身去擦写编程,同时官方也提供了相应的操作函数固件库。这样就可以实现单片机程序的远程升级,通过芯片外设的某种通信接口(一般常用串口),将程序文件发送给芯片,让芯片自身把程序文件写入内部flash,实现程序的远程升级操作。如果要实现让单片机自身去升级程序,就必须要将内部flash空间进行划分,分不同的区域写入不同工程的程序代码,才能实现该功能。


    一般情况下,我们将单片机的内部flash空间划分为两大区域,为了方便理解,我们叫做bootloader区域和app区域(这里的bootloader和app为自定义名称,也可叫做其他名称)。分为两大区域的原因是,我们要给一块芯片(单片机)写入两个不同的工程文件,这个两个工程分别是“程序升级工程(bootloader)”和“应用程序工程(app)”。两个工程的区别是:


    “程序升级工程”存放在flash的bootloader区域。它的作用:接收新版本的程序文件,将收到的文件写入内部flash的app区域中。这个工程的任务比较单一,所以它只占用较小的一部分flash空间”。


    “应用程序工程”存放在flash的app区域。它的作用:执行真正的功能操作。如数据采集、执行一些运算等操作。也是单片机实际发挥作用的程序。升级程序的方式是,可以灵活应用,主要看开发人员的编程思路,在这里我们使用上电检测的方式进行程序的更新。


    单片机上电后,首先在bootloader区域运行程序升级函数,检测是否有新版本的程序需要升级,如果需要升级时,就将接收的新版本程序数据写入app区域,之后跳转到app区域去运行正在的应用程序函数。如果不需要升级程序时,就直接跳转到app区域去执行程序。流程如下:


      


    串口IAP程序的操作方式是,分时切换flash区域进行执行不同功能的函数,而不是两个区域中的程序都在运行。任何时候,单片机都不能同时执行两个工程代码,我们将flash空间划分如下(以STM32F103CB为例)flash的总大小是128Kb,划分bootloader区域大小为8Kb,app区域为120Kb。示意图和相关地址如下:



    如果想要将程序按照如上图所示的flash空间存放的话,就必须对编译环境进行一些设置,才能到达我们的目的,不再使用默认的编译设置。bootloader工程设置在编程软件keil5中设置如下:

app工程设置在编程软件keil5中设置如下:

   


在app工程的程序代码中除了设置工程代码的编译地址之外,还要将中断向量表偏移寄存器的值进行相对应的设置。设置中断向量表偏移寄存器的方法有两种:

    ①→可以在app应用程序的主程序while循环之前设置,设置格式为:
        CB->VTOR = FLASH_BASE | 0x2000;

    ②→还可以在官方的固件库设置,在固件库system_stm32f10x.c文件中,第267行使用了如下的设置:



而上述表达式中的“VECT_TAB_OFFSET”在该固件库文件的第128行进行了声明和初值定义:


   可以看出,默认情况下,“VECT_TAB_OFFSET”的值等于0。也就是不进行偏移,我们在进行IAP编程的时候,可以将此处的初值改为对应的偏移量即可。通常我们不对官方固件库进行更改,所以常用第一种方式进行设置中断偏移量。在这里要注意的是,偏移量不能随意任意设置,由于ARM Cortex®-M3内核规定,中断向量表必须对齐原则。因此中断偏移量的值必须是0x200的倍数。


IAP代码中关于跳转部分的详解:

    在编程中我们要清楚的知道,单片机任何时候只能运行一个代码工程,并不是两个区域的代码都在运行。所以就必须使单片机要在两个区域(bootloader区域和app区域)或者是两个工程代码之间进行跳转。跳转之前除了要将app工程代码中的中断偏移量进行相对应的设置外,还要在单片机跳转时,设置app区域代码的主堆栈栈顶地址。通过官方手册就可以知道,STM32默认启动地址是0x08000000,而这个首地址中保存的就是堆栈的栈顶地址,这个地址是在代码编译后,有编译器自动产生。同时根据相关手册可以看到STM32的程序存放规则和编译后的可执行文件的规则是,编译后的可执行文件中第一个字就是被下载到STM32内部flash中的第一个存储单元中,而这个就是我们需要的堆栈栈顶地址。


    重新设置STM32的堆栈栈顶地址是属于内核级别的操作,因此C语言无法进行内核操作,只能借助嵌入汇编的形式进行操作,一般是使用MSR指令进行操作的。MSR指令是用于访问内核中特殊功能寄存器(如堆栈栈顶寄存器)专用汇编指令。其编写形式一般为如下:



完成对工程的设置与程序代码的编写之后,我们还需要得到相应工程的BIN格式文件,keil软件自带输出BIN文件的功能,但是一般情况下我们不使用BIN文件,所以程序代码编译完毕后,软件默认是不输出BIN格式的文件。如想要keil在编译完成之后,同时输出BIN文件,则需要进行设置,设置方法是在工程管理的选项卡的User选项中的Run #1处编写命令“fromelf.exe --bin -o "$L@L.bin" "#L"”即可,如图:


               


最后说明:本次编写仅陈述出主要和关键的操作部分(因为细致的操作部分和程序的实现代码现在网络上都有很多),希望本次的编写对大家有一些帮助,如果文中有陈述错误之处,还请指正!谢谢。

学习交流群:769843038
参考资料:http://www.makeru.com.cn/       

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2019-5-13
在线时间
26 小时
发表于 2019-7-30 12:35:55 | 显示全部楼层
回复 支持 1 反对 0

使用道具 举报

10

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
362
金钱
362
注册时间
2018-5-14
在线时间
46 小时
发表于 2018-7-30 15:51:19 | 显示全部楼层
好贴 顶
回复 支持 反对

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-1 14:23:03 | 显示全部楼层
写的不错
回复 支持 反对

使用道具 举报

0

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2018-3-21
在线时间
45 小时
发表于 2018-9-25 16:08:20 | 显示全部楼层
好贴,多谢分享
回复 支持 反对

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3566
金钱
3566
注册时间
2016-1-8
在线时间
544 小时
发表于 2018-9-25 20:45:22 | 显示全部楼层
cool!
回复 支持 反对

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
发表于 2018-9-26 08:38:16 | 显示全部楼层
收藏先
回复 支持 反对

使用道具 举报

10

主题

232

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2288
金钱
2288
注册时间
2012-8-24
在线时间
247 小时
发表于 2018-9-27 11:23:34 | 显示全部楼层
楼主你好,其他的都看懂了,但是APP堆栈栈顶地址怎么写入程序中,谢谢
单片机技术交流请加127034610
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2018-9-27
在线时间
2 小时
发表于 2018-9-27 14:29:40 | 显示全部楼层
好贴,多谢分享
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2018-9-27
在线时间
2 小时
发表于 2018-9-27 14:30:36 | 显示全部楼层
好贴,多谢分享
回复 支持 反对

使用道具 举报

3

主题

288

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2018-8-28
在线时间
130 小时
发表于 2018-9-30 16:01:57 | 显示全部楼层
MARK 一下
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2017-12-5
在线时间
18 小时
发表于 2019-7-18 14:59:45 | 显示全部楼层
先收藏了,多谢楼主
回复 支持 反对

使用道具 举报

1

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2019-3-5
在线时间
42 小时
发表于 2019-7-29 16:02:47 | 显示全部楼层
收藏了!
回复 支持 反对

使用道具 举报

4

主题

59

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2018-12-27
在线时间
82 小时
发表于 2019-7-29 17:08:00 | 显示全部楼层
好贴,顶一个
回复 支持 反对

使用道具 举报

1

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2018-4-24
在线时间
53 小时
发表于 2019-7-30 15:00:22 | 显示全部楼层
很直观,赞一个
回复 支持 反对

使用道具 举报

13

主题

38

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
274
金钱
274
注册时间
2011-10-27
在线时间
26 小时
发表于 2019-11-29 14:00:40 | 显示全部楼层
以后程序运行APP区域  是不是只能运行一次更新,后面再更新怎么办?
回复 支持 反对

使用道具 举报

8

主题

169

帖子

0

精华

高级会员

Rank: 4

积分
564
金钱
564
注册时间
2015-7-4
在线时间
105 小时
发表于 2020-1-13 09:20:36 | 显示全部楼层
好贴,值得学习
回复 支持 反对

使用道具 举报

6

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
833
金钱
833
注册时间
2019-12-17
在线时间
157 小时
发表于 2020-1-13 10:26:48 | 显示全部楼层
kama_ya 发表于 2019-11-29 14:00
以后程序运行APP区域  是不是只能运行一次更新,后面再更新怎么办?

可以在app中跳转回bootloader 也可以直接在app中下载更新数据到flash中,然后重启进入Bootloader将app程序写入到对应的flash中,也可以直接重启进入bootloader进行更新。
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2013-9-3
在线时间
8 小时
发表于 2020-2-3 15:57:55 | 显示全部楼层
感谢楼主分享!很经典的方法
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2019-7-15
在线时间
3 小时
发表于 2020-3-13 13:33:03 | 显示全部楼层
谢谢分享!!!
回复 支持 反对

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
862
金钱
862
注册时间
2015-2-12
在线时间
354 小时
发表于 2020-3-13 16:47:04 | 显示全部楼层
做个标记
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2020-3-19
在线时间
3 小时
发表于 2020-4-2 11:16:43 | 显示全部楼层
求解答
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2020-4-18
在线时间
1 小时
发表于 2020-4-18 06:54:36 | 显示全部楼层
先收藏了,多谢楼主
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2020-4-27
在线时间
4 小时
发表于 2020-4-27 10:58:44 | 显示全部楼层
顶起,学习一下
回复 支持 反对

使用道具 举报

17

主题

170

帖子

0

精华

高级会员

Rank: 4

积分
562
金钱
562
注册时间
2018-7-8
在线时间
118 小时
发表于 2020-5-2 20:02:40 | 显示全部楼层
谢谢分享,写的不错
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2018-5-12
在线时间
2 小时
发表于 2020-8-5 14:57:24 | 显示全部楼层
好帖  收藏先
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2017-6-16
在线时间
10 小时
发表于 2021-10-22 14:50:38 | 显示全部楼层
进入了APP程序如果想要再更新咋办?还得通过烧录器重新烧程序吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 05:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表