https://blog.csdn.net/weixin_45905650/article/details/107707858?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167098526816800180634199%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=167098526816800180634199&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-107707858-null-null.142v68control,201v4add_ask,213v2t3_control1&utm_term=stm32%20ISP&spm=1018.2226.3001.4187
1 ) 主闪存存储器(Main Flash)启动:从STM32内置的Flash启动(0x0800 0000-0x0807 FFFF),一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。
以0x08000000 对应的内存为例,则该块内存既可以通过0x00000000 操作也可以通过0x08000000 操作,且都是操作的同一块内存。
2 ) 系统存储器(System Memory)启动:系统储存器指的是STM32的内置ROM,选择该启动模式后,内置ROM的起始地址将被重映射到0x00000000地址,代码在此处开始运行。ROM中有一段出厂预置的代码,这段代码起到一个桥的作用,允许外部通过UART/CAN或USB等将代码写入STM32的内置Flash中。这段代码也被称为ISP(In System Programing)代码,这种烧录代码的方式也被称为ISP烧录。
一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的ISP程序中,提供了串口下载程序的固件,可以通过这个ISP程序将用户程序下载到系统的Flash中。
以0x1FFFFFF0对应的内存为例,则该块内存既可以通过0x00000000 操作也可以通过0x1FFFFFF0操作,且都是操作的同一块内存。
3 ) 片上SRAM启动:从内置SRAM启动(0x2000 0000-0x3FFFFFFF),既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。SRAM 只能通过0x20000000进行操作,与上述两者不同。从SRAM 启动时,需要在应用程序初始化代码中重新设置向量表的位置。该方法是在STM32的内置SRAM中启动,选择该启动模式后,内置SRAM的起始地址将被重映射到0x00000000地址,代码在此处开始运行。这种模式由于烧录程序过程中不需要擦写Flash,因此速度较快,适合调试,但是掉电丢失。
原文链接:https://blog.csdn.net/bruceoxl/article/details/128028961
ISP:In System Programing 在系统编程
IAP:In applicating Programing 在应用编程
ICP:In Circuit Programing 在电路编程
什么是DFU—USB接口的ISP
FLASH 的容量越来越大, ISP 的 USART 真的很慢了。Can 的效率也不是很高. USB 是个更好的替代方法。于是有了DFU模式。
DFU全称为Device Firmware update,
是ST官方推出的一个通过USB接口进行IAP升级的方案,同串口ISP一样,他们都集成在了芯片内部的Bootloader区段,可以通过配置boot引脚来启动。(具体可参照ST文档:AN2606)。不过内置DFU的芯片大部分型号都比较新,如果你用的型号没有内置DFU程序,没关系我们也可以通过CubeMX来快速生成和移植一个DFU功能程序到你的Flash中来使用。
以ISP方式下载程序时需要把STM32的BOOT0引脚置1、BOOT1引脚置0,即从系统存储区(System Memory)启动。
**为什么设置从System Memory启动就可以使用串口来下载我们的程序呢?**那是因为在芯片出厂前ST官方已经把一段自举程序(BootLoader程序)固化到这一块存储区。
对于STM32F103ZET6来说,System Memory的起始地址为0x1FFFF000,可在芯片手册的内存映射图里找到:
注意:不同系列不同型号的STM32固化的BootLoader是不同的,即使用的通讯接口是不同的。如STM32F1xxx系列只支持USART1:
STM32F4xxx系列只支持USART1、USART3、CAN2等接口:
IAP与ISP有什么不同?
从基本功能来看,IAP程序与ISP程序所做的事情好像是一样的,都是引导加载程序,所以网上有很多文章把IAP程序与ISP程序都称为BootLoader程序,要注意区分。
但是,ISP与IAP还是有点区别的。
STM32内部Flash分为两部分,System Flash和User Flash。上电之后执行哪个Flash里的程序有boot脚来控制。System Flash内存放的是ST官方编写的自举程序(ISP程序),我们是没有办法改变的。User Flash是我们可以使用的Flash空间,我们编写的代码就是要烧录到User Flash中。我们可以把User Flash分为两部分,前面一部分空间用于烧写我们编写的IAP程序,后面一部分用于烧写我们编写的应用程序。其中,IAP程序用于更新我们的应用程序。
ISP程序用于把我们编写的程序更新到0x08000000地址上,如果我们的产品中的程序有IAP程序+应用程序,则此时0x08000000地址存放的程序就是IAP程序。ISP程序、IAP程序、应用程序的关系示意图如下:
制作stm32 dfu类型的文件升级包
对于stm32来说,有几种烧录程序的方式,分别是isp,iap,sw-jtag。
其中的dfu模式就是属于isp模式的一种。这种模式一般就stm32f4以上或者互联网型的stm32f1支持。需要有usb接口。还需要自己写引导程序以及应用iap的方式去升级(兴趣点所在)。对于大多数可以升级的产品来说,dfu升级是最简单快速的方法之一。
制作dfu文件,第一步就是要自己ide生成hex文件或者bin文件,之后用专用的软件将生成的hex或者bin文件生成dfu文件。这个专用的软件就是Dfu file manager。自己可以去官网下载。或者跳到以下链接,这是我自己上传的安装包 DfuSeDemo&&Dfu_File_Manager.zip
https://download.csdn.net/download/hugetree_bibi/19811715
原文链接:https://blog.csdn.net/hugetree_bibi/article/details/118191273