STM32 IAP下载

之前看了一下STM32的IAP下载,但是没有写点什么,现在把之前的一些重点写下来,一起学习。

有关IAP的介绍,这里就不做过多说明了,网上有很多。但是要重点强调一下STM32程序运行流程。

这是Cortex-M3预定义的存储器映(来源于《Cortex-M3权威指南》)。从上图可以看到从0X00000000-0X1FFFFFFF是代码区,从0X20000000-0X3FFFFFFF是SRAM区,0X40000000往后的这里就不做过多介绍。从这张图只能看出个大概,具体其中的细节我们要看一下这张图。


这张图来源于《STM32F103的芯片手册》。有两个需要重点记忆的地址,一个是0X08000000,一个是0X20000000。

0X08000000是STM32内部FLASH起始的地方。置于0X00000000-0X8000000之间的东西,有兴趣的可以自己去查阅相关资料。我们可以看到从0X08000000-0X0807FFFF这512K的区域为芯片的内部Flash区。需要注意的是,不是每款芯片都是512K,这个要根据芯片的型号来定夺,这个可以参考一下图片。

本图片来自于《STM32F1XX参考手册》。另外我们可以看到0X08000000-0X0807FFFF两侧都有预留的空间,这个在以后说不定会有更大FLASH的芯片类型。

除此之外,还有一个需要注意的地址是0X1FFFF000-0X1FFFF7FF,从图中我们可以看出这段地址是STM32的Sys memory区,这个2K大小的区域还包括了STM32的BOOTLOADER,有兴趣的可以详细研究。

上图可以参考,图片来自于《STM32F1XX参考手册》。

这时候可能就有人疑惑了,那为什么STM32的启动是从0X08000000地址开始,这个可以参考STM32F1XX参考手册的第2.4章启动配置。

STM32F10XX内置64K字节的静态SRAM,它可以以字节、半字(16位)或者全字(32位)访问。SRMA的起始地址是0X20000000。

我们的程序是存储在内部FLASH区域中的,所以掉电不会丢失。而内部的SRAM中其存储一些变量,掉电是会丢失的。有兴趣的可以看看我上一篇文章,其中有详细介绍。

接下来是要说的重点,要了解IAP首先要了解STM32的正常程序流程,可以参照下图。

该图片来源于《原子STM32F1开发指南》,从中我们可以看到程序从0X0800000开始执行的内容,那如何实现IAP呢?参照下图

这种图片同样来自于《原子STM32F1开发指南》,我们可以看到程序在运行到IAP后,跳转到0X08000000+N+M的一个偏移地址开始运行,运行结束后再重新跳转会原来的0X08000000开始的地方重新执行。看到这里可能有人还是云里雾里的,我们通过一下这张图片详细说一下。

程序在运行的时候,从哪个地方开始运行主要看芯片的SP指针(堆栈指针),这个有兴趣的可以深入了解一下。这个指针最初指向的地址就是程序开始运行的地址。一开始SP指针都是指向0X08000000地址的,当我们收到了IAP的命令后,程序中修改SP的指针,将其指针指向0X0804B000这个地址(这个地址是我们自己定义的)。这个地址不能随意定义,要根据我们所选用的STM32芯片的内部FLASH大小以及我们程序的大小来确定,例如我们选择的是STM32F103XE系列的,是512K大小的内部FLASH,而我们的IAP程序是200K,那我们定义的IAP的起始偏移地址就不能超过312K,要给IAP程序预留足够的空间。有关查看自身的程序大小,在我上一篇的文章中有详细说明。

在收到IAP命令后,程序修改SP指针指向0X0804B000地址,然后复位程序。重新启动后程序就从0X0804B000地址开始执行。这里我在IAP程序中只做了串口的接受,这个可以根据不同的需求写不同的程序。当从串口收到我们需要的烧写文件,我们就将烧写文件重新写入芯片的内部FLASH(起始地址为0X08000000),然后想SP指针重新修改为0X08000000,复位程序。程序复位后从0X08000000地址开始执行新的程序。至此,一个IAP的串口烧写程序就完成了。

需要主要的是我们在一开始烧写的时候是要烧写两个程序的,一个是我们正常执行的主程序,一个是我们的IAP程序,由于两个程序的起始地址不同,所以这两个程序能同时存在于芯片的内部FLASH中。IAP程序的起始地址是0X0804B000,距0X08000000有300K,只要我们的主程序大小少于300K,都是不会有影响的。如果主程序超过了300K,那么在烧写主程序时会将IAP的程序部分内容给覆盖掉,导致IAP程序运行会出错,这个时候我们就要修改IAP的起始地址,还是那句话,根据主程序大小以及芯片内部FLASH大小来确定IAP的起始地址。

我自己写了一个IAP的程序,有需要的可以下载参考。稍后会在评论中提供下载链接。压缩文件中总共包含了3个文件,一个主程序、一个IAP串口下载程序、一个刷新程序。主程序是正常执行的程序,亮LED,在串口收到指定命令后进入IAP程序,亮另外一个LED,然后通过串口发送刷新程序的烧写文件,同时亮两个LED。在编译IAP程序的时候会提示错误

只需要修改icf文件的路径即可


这个icf文件就在IAP程序文件的下。

替换路径即可。另外我使用的是STM32F103ZET6的开发板,内部FLASH是512K的。所以我的IAP的偏移地址是


300K,大家根据自己开发板的型号选择合适的偏移地址。

以上就是我的一些心得,如果有什么地方写的不对的,也希望大神能指出。


猜你喜欢

转载自blog.csdn.net/qq_26226375/article/details/80158869