打印
[应用相关]

STM32F4单片机bootloader及在线升级IAP基本原理

[复制链接]
2665|85
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
前言
在线升级是产品开发维护的必要功能之一,对产品的迭代优化、需求定制、稳定性提升以及人力节约上提供了很大帮助。就像我们的手机更新系统一样不断地升级不断地有新的体验。
此部分内容从基于STM32F407进行BootLoader、内存分布、IAP升级原理、升级模式等方面进行介绍,其它类型的单片机可进行参考设置。

二、背景知识补充
先梳理一下STM32启动过程以及变量、代码在内存中分布过程。

2.1 系统启动过程
了解STM32的启动过程可以从启动文件以及上电执行了一些流程开始。

使用特权

评论回复
沙发
发给她更好fh|  楼主 | 2023-9-30 23:52 | 只看该作者
首先是启动文件,启动文件的结构如下图所示:

使用特权

评论回复
板凳
发给她更好fh|  楼主 | 2023-9-30 23:52 | 只看该作者
这里还有一点也要说一下,如果使用了c++的类定义了对象,构造函数会在标准库__main中执行,也就是在执行主函数main前所有的全局变量构造函数均已初始化完成。

使用特权

评论回复
地板
发给她更好fh|  楼主 | 2023-9-30 23:52 | 只看该作者
中断函数的地址是由keil编译器固定好的,更改编程ROM初始地址,中断函数地址会相应的在生成的bin文件中被改掉。

使用特权

评论回复
5
发给她更好fh|  楼主 | 2023-9-30 23:52 | 只看该作者
2.2 内存映射分布
下面说一下内存映射的过程:

使用特权

评论回复
6
发给她更好fh|  楼主 | 2023-9-30 23:53 | 只看该作者

使用特权

评论回复
7
发给她更好fh|  楼主 | 2023-9-30 23:53 | 只看该作者

使用特权

评论回复
8
发给她更好fh|  楼主 | 2023-9-30 23:53 | 只看该作者
单片机有两个引脚会引出来,当外部给不同电平时产生不同的内部地址映射,正常用的就是从主Flash映射,从系统存储器映射常用来ISP串口一键下载,从SRAM映射常用来调试程序,解锁flash等。

使用特权

评论回复
9
发给她更好fh|  楼主 | 2023-9-30 23:53 | 只看该作者

使用特权

评论回复
10
发给她更好fh|  楼主 | 2023-9-30 23:53 | 只看该作者
当从0x00000000映射到FLASH上时,0x00000000-0x000fffff就相当于FLASH0x08000000-0x080fffff的别名,操作谁都一样,就像指向指针的指针。

使用特权

评论回复
11
发给她更好fh|  楼主 | 2023-9-30 23:53 | 只看该作者
接下来就是代码变量堆栈的分布情况了,这里以从flash启动为例。

使用特权

评论回复
12
发给她更好fh|  楼主 | 2023-9-30 23:53 | 只看该作者
正常编写完程序,用keil编译后生成的bin文件或是烧写程序到单片机都是只有FLASH(相当于ROM)里的内容,具体可以通过map文件查看。

使用特权

评论回复
13
发给她更好fh|  楼主 | 2023-9-30 23:53 | 只看该作者
Memory Map of the image

  Image Entry point : 0x08000189

  Load Region LR_IROM1 (Base: 0x08000000, Size: 0x000005a8, Max: 0x00080000, ABSOLUTE)

    Execution Region ER_IROM1 (Exec base: 0x08000000, Load base: 0x08000000, Size: 0x00000590, Max: 0x00080000, ABSOLUTE)

    Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x08000000   0x08000000   0x00000188   Data   RO          232    RESET               startup_stm32f40_41xxx.o
    0x08000188   0x08000188   0x00000008   Code   RO          290  * !!!main             c_w.l(__main.o)
    0x08000190   0x08000190   0x00000034   Code   RO          449    !!!scatter          c_w.l(__scatter.o)
    0x080001c4   0x080001c4   0x0000001a   Code   RO          451    !!handler_copy      c_w.l(__scatter_copy.o)
    0x080001de   0x080001de   0x00000002   PAD
    0x080001e0   0x080001e0   0x0000001c   Code   RO          453    !!handler_zi        c_w.l(__scatter_zi.o)
    0x080001fc   0x080001fc   0x00000002   Code   RO          317    .ARM.Collect$libinit$00000000  c_w.l(libinit.o)
    0x080001fe   0x080001fe   0x00000004   Code   RO          323    .ARM.Collect$libinit$00000001  c_w.l(libinit2.o)
    0x08000202   0x08000202   0x00000000   Code   RO          326   
    0x08000226   0x08000226   0x00000002   PAD
    0x08000228   0x08000228   0x00000010   Code   RO          214    .emb_text           sys.o
    0x08000238   0x08000238   0x0000001c   Code   RO            3    .text               main.o
    0x08000254   0x08000254   0x0000001a   Code   RO          139    .text               stm32f4xx_it.o
    0x0800026e   0x0800026e   0x00000002   PAD
    0x08000270   0x08000270   0x00000210   Code   RO          188    .text               system_stm32f4xx.o
    0x08000480   0x08000480   0x00000040   Code   RO          233    .text               startup_stm32f40_41xxx.o
    0x080004c0   0x080004c0   0x0000002c   Code   RO          259    .text               iap.o
    0x080004ec   0x080004ec   0x00000006   Code   RO          288    .text               c_w.l(heapauxi.o)
    0x080004f2   0x080004f2   0x0000004a   Code   RO          308    .text               c_w.l(sys_stackheap_outer.o)
    0x0800053c   0x0800053c   0x00000012   Code   RO          310    .text               c_w.l(exit.o)
    0x0800054e   0x0800054e   0x00000002   PAD
    0x08000550   0x08000550   0x00000008   Code   RO          318    .text               c_w.l(libspace.o)
    0x08000558   0x08000558   0x0000000c   Code   RO          379    .text               c_w.l(sys_exit.o)
    0x08000564   0x08000564   0x00000002   Code   RO          390    .text               c_w.l(use_no_semi.o)
    0x08000566   0x08000566   0x00000000   Code   RO          392    .text               c_w.l(indicate_semi.o)
    0x08000566   0x08000566   0x0000000a   Code   RO          377    x$fpl$fpinit        fz_wm.l(fpinit.o)
    0x08000570   0x08000570   0x00000020   Data   RO          447    Region$Table       anon$obj.o

    Execution Region RW_IRAM1 (Exec base: 0x20000000, Load base: 0x08000590, Size: 0x00000678, Max: 0x00020000, ABSOLUTE)

    Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x20000000   0x08000590   0x00000014   Data   RW          189    .data               system_stm32f4xx.o
    0x20000014   0x080005a4   0x00000004   Data   RW          260    .data               iap.o
    0x20000018        -       0x00000060   Zero   RW          319    .bss                c_w.l(libspace.o)
    0x20000078        -       0x00000200   Zero   RW          231    HEAP                startup_stm32f40_41xxx.o
    0x20000278        -       0x00000400   Zero   RW          230    STACK               startup_stm32f40_41xxx.o

使用特权

评论回复
14
发给她更好fh|  楼主 | 2023-9-30 23:53 | 只看该作者

使用特权

评论回复
15
发给她更好fh|  楼主 | 2023-9-30 23:53 | 只看该作者
通过编译的信息可以总结出stm32内存分布的情况,编译烧写目标为flash,上电运行到main函数前完成对ram的分配,ram中全局不为零变量从flash中复制,全局为零以及堆栈大小的信息包含在flash中的code中(具体在哪里暂时没找到,不过启动文件中可以设置堆栈大小的就证明了此部分的信息)在c语言库函数__mian()执行,运行过程中对堆栈进行操作。这里有一点药注意,当你操作msp堆栈指针时会清空局部变量的值。所以在BootLoader中尽量使用全局变量。

使用特权

评论回复
16
发给她更好fh|  楼主 | 2023-9-30 23:54 | 只看该作者

使用特权

评论回复
17
发给她更好fh|  楼主 | 2023-9-30 23:54 | 只看该作者
到这里基本启动过程以及内存分布就差不多了,iap操作就是操作这些地址及变量的分布。

使用特权

评论回复
18
发给她更好fh|  楼主 | 2023-9-30 23:54 | 只看该作者
bootloader
BootLoader的意思就是启动引导,跟电脑启动先加载主板BIOS一样,引导程序从哪一部分映射地址启动。
BootLoader在stm32可分成两类:一类是原厂自带的boot,也叫做自举程序,一般用作ISP串口下载程序;另一类属于用户自定义的,用于制作IAP,跳转不同flash区域的代码。
————————————————
版权声明:本文为CSDN博主「蜗牛Jay」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43058521/article/details/125355343

使用特权

评论回复
19
发给她更好fh|  楼主 | 2023-9-30 23:54 | 只看该作者
3.1 原厂BootLoader

使用特权

评论回复
20
发给她更好fh|  楼主 | 2023-9-30 23:54 | 只看该作者

使用特权

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

本版积分规则

37

主题

546

帖子

1

粉丝