打印
[应用相关]

[分享] STM32在线升级(IAP)超详细图解 及 需要注意的问题

[复制链接]
1007|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
TM32在线升级(IAP)超详细图解 及 需要注意的问题解决
IAP 是啥
  IAP( In Application Programming)即在应用编程,也就是用户可以使用自己的程序对MCU的中的运行程序进行更新,而无需借助于外部烧写器。其实ST官网也给出了IAP的示例程序,感兴趣的可以直接去官网搜索。

使用特权

评论回复
沙发
一点点0321|  楼主 | 2020-11-29 19:56 | 只看该作者
这里有一点需要特殊注意,就是在MCU中,有一个特殊区域被称为 System memory。在这块区域中存放了ST公司自己的 bootloader 程序,它是在MCU出厂时,有ST固化到芯片中的,后续不能再更改。

使用特权

评论回复
板凳
一点点0321|  楼主 | 2020-11-29 19:57 | 只看该作者
其中的 bootloader 程序也可以对MCU进行升级(DFU对芯片的编程应该就是用的这个Bootloader)。
而且,芯片不同,BootLoader的功能也是有区别的。
ST官网对于这些也是有详细文档的,后续再写篇**介绍这一块。
下图为部分芯片BootLoader版本及功能

使用特权

评论回复
地板
一点点0321|  楼主 | 2020-11-29 19:59 | 只看该作者

使用特权

评论回复
5
一点点0321|  楼主 | 2020-11-29 19:59 | 只看该作者
STM32 MCU启动配置
  要实现IAP,首先要了解一下MCU是如何启动的。这一点在芯片的参考手册中都有详细的说明,不同的芯片手册所在位置可能不同,但是一般在第二章会有单独一节叫Boot configuration。如下图:
BootConfig

使用特权

评论回复
6
一点点0321|  楼主 | 2020-11-29 20:00 | 只看该作者
主要就是说,启动是通过管脚BOOT0和BOOT1的连接方式来控制的。这个是在硬件设计阶段设计好的。不同的配置决定了,MCU将何处映射到0x00000000。从这里又可以看到一点,MCU眼里只有0x00000000。至于为啥可以从Flash(0x08000000)启动,就是因为MCU内部做了映射。从其他位置启动时同理。

使用特权

评论回复
7
一点点0321|  楼主 | 2020-11-29 20:01 | 只看该作者

使用特权

评论回复
8
一点点0321|  楼主 | 2020-11-29 20:02 | 只看该作者
IAP 实现
  要实现IAP,则整个程序实现分为大程序(APP)和小程序(IAP)两部分。其中,APP主要接收升级数据并存储,IAP处理擦除APP,并重新写入升级数据。此外,IAP还应该可以独立接收升级数据的情况。但是,由于Cortex-M0核是没有中断向量表偏移寄存器的,这就导致了在Cortex-M0核的MCU上实现在线升级比较麻烦。在实际产品中,整个程序的基本组成结构:

使用特权

评论回复
9
一点点0321|  楼主 | 2020-11-29 20:02 | 只看该作者

使用特权

评论回复
10
一点点0321|  楼主 | 2020-11-29 20:04 | 只看该作者
实际的IAP流程如下:

使用特权

评论回复
11
一点点0321|  楼主 | 2020-11-29 20:05 | 只看该作者

使用特权

评论回复
12
一点点0321|  楼主 | 2020-11-29 20:07 | 只看该作者
就是这么简单!

使用特权

评论回复
13
一点点0321|  楼主 | 2020-11-29 20:10 | 只看该作者
注意:
(1)与 Cortex-M3 和 Cortex-M4 不同,Cortex-M0 没有中断向量表偏移寄存器(VTOR寄存器)

410575fc38fb37c8eb.png (68.32 KB )

410575fc38fb37c8eb.png

使用特权

评论回复
14
一点点0321|  楼主 | 2020-11-29 20:11 | 只看该作者
(2)Cortex-M3 r2p0 及其之前版本,中断向量表只能位于SRAM或者CODE区域,但是Cortex-M3 r2p1及之后,Cortex-M4 没有该限制!

使用特权

评论回复
15
一点点0321|  楼主 | 2020-11-29 20:11 | 只看该作者
(3)MCU根据Boot引脚配置将指定地址映射为0x地址!

使用特权

评论回复
16
一点点0321|  楼主 | 2020-11-29 20:12 | 只看该作者

使用特权

评论回复
17
一点点0321|  楼主 | 2020-11-29 20:13 | 只看该作者
IAP 启动
  启动网上有很多**介绍,但是或多或少不是很完善,我只做了一张相对来说比较详细的图,如下:
Startup

使用特权

评论回复
18
一点点0321|  楼主 | 2020-11-29 20:13 | 只看该作者
Cortex-M内核规定,中断向量表开始的4个字节存放的是堆栈栈顶的地址,其后是中断向量表各中断服务程序的地址。当发生中断后程序通过查找该表得到相应的中断服务程序入口地址,然后再跳到相应的中断服务程序中执行,中断服务程序中最终调用用户实现的各函数。例如:main函数就是复位中断服务函数中调用的!

使用特权

评论回复
19
一点点0321|  楼主 | 2020-11-29 20:14 | 只看该作者
在没有IAP时,上电后从0x08000004处取出复位中断向量的地址,然后跳转到复位中断程序的入口(标号①所示),执行结束后跳转到main函数中(标号②所示)。通常main函数是个死循环,不会退出。在执行main函数的过程中发生中断,则STM32强制将PC指针指回中断向量表处(标号④所示),从中断向量表中找到相应的中断函数入口地址,跳转到相应的中断服务函数(标号⑤所示),执行完中断函数后再返回到main函数中来(标号⑥所示)。

使用特权

评论回复
20
一点点0321|  楼主 | 2020-11-29 20:15 | 只看该作者
在添加IAP后,上电后仍然从0x08000004处取出复位中断向量的地址,然后跳转到复位中断程序的入口(标号①所示),执行结束后跳转到小程序的main函数中(标号②所示)。在执行小程序main函数的过程中发生中断,则STM32强制将PC指针指回中断向量表处(标号④所示),从中断向量表中找到相应的中断函数入口地址,跳转到相应的中断服务函数(标号⑤所示),执行完中断函数后再返回到main函数中来(标号⑥所示)。而想要大程序执行,则必须在小程序中显示强制跳转(标号⑦)。

使用特权

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

本版积分规则

35

主题

347

帖子

0

粉丝