一、关于STM32的启动方式
ISP:In System Programing,在系统中编程。
在STM32F10xxx里有三种启动方式:
以ISP方式下载程序时需要把STM32的BOOT0
引脚置1、BOOT1
引脚置0,即从系统存储区(System Memory)启动。
为什么设置从System Memory启动就可以使用串口来下载我们的程序呢?那是因为在芯片出厂前ST官方已经把一段自举程序(BootLoader程序),也就是下面要说的ISP程序,固化到System Memory这一块存储区。对于STM32F103ZET6来说,System Memory的起始地址为0x1FFFF000,可在芯片手册的内存映射图里找到:
这一段程序的作用是引导加载,有了这段ISP程序,就能够通过串口来接受数据并烧写到 用户闪存存储器
的起始地址(0X08000000)。智能烧写到这个地址,若keil里设置的地址不是这个地址,则编译出来的文件将烧录不成功。
- 用户闪存:即User Flash,同时也成为Main Flash
这一段 Bootloader
程序源码是没有开源出来的,用户是不可修改的。IAP程序通过 FlyMCU
软件进行烧录,烧录的地址是 0X08000000
。
注意:不同系列不同型号的STM32固化的BootLoader是不同的,即使用的通讯接口是不同的。如STM32F1xxx系列只支持USART1:
STM32F4xxx系列只支持USART1、USART3、CAN2等接口:
其他型号的 BootLoader
支持的接口可查看 AN2606
文档,链接:AN2606文档
二、IAP程序与ISP程序的不同
- STM32内部Flash分为两部分,
System Flash
和User Flash
。上电之后执行哪个Flash里的程序由boot脚来控制。 System Flash
内存放的是ST官方编写的自举程序(ISP程序),我们用户是没有办法改变的。- User Flash是我们可以使用的Flash空间,我们编写的代码就是要烧录到User Flash中。我们可以把UserFlash分为两部分,前面一部分空间用于烧写我们编写的IAP程序,后面一部分用于烧写我们编写的应用程序。其中,IAP程序用于更新我们的应用程序。
ISP程序用于把我们编写的程序更新到0x08000000地址上,如果我们的产品中的程序有IAP程序+应用程序,则此时0x08000000地址存放的程序就是IAP程序,此时如果用户需要修改应用程序,可以通过IAP程序进行程序加载新的应用程序进来。ISP程序、IAP程序、应用程序的关系示意图如下:
如果我们的产品中的程序只有应用程序
,则此时0x08000000地址存放的程序就是应用程序,此时就是不含有IAP程序的,也就是说如果这个程序代码已经固化在芯片里做成产品给了其他用户,因为没有IAP程序,所以用户不能自己修改产品里已经烧写的应用程序了。ISP程序、应用程序的关系示意图如下:
三、IAP程序
- IAP是
In Application Programming
的首字母缩写,IAP是用户自己的程序在运行过程中对User
Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。
通常在用户需要实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信管道(如USB、USART)接收程序或数据(也就是引导加载),执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在User Flash中,当芯片上电后,首先是第一个项目代码开始运行,它作如下操作:
1)检查是否需要对第二部分代码进行更新
2)如果不需要更新则转到4)
3)执行更新操作
4)跳转到第二部分代码执行
第一部分代码必须通过其它手段,如JTAG或ISP烧入;第二部分代码可以使用第一部分代码IAP功能烧入,也可以和第一部分代码一道烧入,以后需要程序更新是再通过第一部分IAP代码更新。
对于STM32来说,因为它的中断向量表位于程序存储器的最低地址区,为了使第一部分代码能够正确地响应中断,通常会安排第一部分代码处于Flash的开始区域,而第二部分代码紧随其后。
在第二部分代码开始执行时,首先需要把CPU的中断向量表映像到自己的向量表,然后再执行其他的操作。
如果IAP程序被破坏,产品必须返厂才能重新烧写程序,这是很麻烦并且非常耗费时间和金钱的。针对这样的需求,STM32在对Flash区域实行读保护的同时,自动地对用户Flash区的开始4页设置为写保护,这样可以有效地保证IAP程序(第一部分代码)区域不会被意外地破坏。