-
该项目实现通过PC的串口对STM32系列MCU进行IAP。
-
该项目包含三个部分(三套代码):
- 运行在STM32平台的Boot;
- 运行在STM32平台的App(我做了两个,一个是支持usmart的重量版,一个是很简洁的轻量版);
- 运行在Windows平台的上位机操作工具。
-
本篇是属于运行在STM32平台的Boot部分,另外两篇介绍请参阅:
-
该部分作为Boot可运行在多个STM32F10x系列:
CL系列、XL系列、HD系列、HD_VL系列、MD系列、MD_VL系列、LD系列、LD_VL系列。
-
这套代码几乎不用移植就可以用在你的项目上。只需要简单的根据你的项目配置工程。
在开始使用之前请详细阅读下面关于STM32系列分类的介绍。
- cl:互联型产品,stm32f105xx/107xx系列
- vl:超值型产品,stm32f100系列
- ld:低密度产品,FLASH = 16K/32K/没做
- md:中等密度产品,FLASH = 64K/128k
- hd:高密度产品,FLASH = 256K/384K/512K
- xl:超高密度产品,FLASH = 768K/1024K(stm32f101/103)
- startup_stm32f10x_cl.s:互联型的STM32F105xx,STM32F107xx
- startup_stm32f10x_ld.s:小容量的STM32F101xx,STM32F102xx,STM32F103xx
- startup_stm32f10x_ld_vl.s:小容量的STM32F100xx
- startup_stm32f10x_md.s:中容量的STM32F101xx,STM32F102xx,STM32F103xx
- startup_stm32f10x_md_vl.s:中容量的STM32F100xx
- startup_stm32f10x_hd.s:大容量的STM32F101xx,STM32F102xx,STM32F103xx
- startup_stm32f10x_hd_vl.s:大容量的STM32F100xx
- startup_stm32f10x_xl.s:超大容量FLASH在512K到1024K字节的STM32F101xx,STM32F102xx,STM32F103xx
- 8: 64K
- B: 128K
- C: 256K
- D: 384K
- E: 512K
- F: 768K
- G: 1024K
-
"Binary": 包含将hex文件转换成bin文件的工具,你也可以不用这个工具,直接用Keil安装目录中的hex转bin工具。我在这里用了这个工具是因为每个人的安装目录不同,不可能做到一致,直接将转换工具放在项目中可以保证每个人都会有一致的效果。(这里我已经设置好了,使用者不必关心)
-
"CORE": STM32的启动文件和内核文件
-
"IAP": 实现IAP功能的主要函数都在这里
inc/common.h 与硬件相关的配置及一些基础功能函数的头文件
inc/iap.h 实现iap功能函数的头文件
inc/iap_config.h IAP的配置文件(用户可以根据需求更改的文件)
inc/stmflash.h 内部flash操作的函数的头文件
inc/ymodem.h 实现Ymodem协议的函数的头文件
- "IAP\src": 包含IAP固件的源文件
src/common.c 与硬件相关的一些基础功能函数
src/iap.c 实现iap各种功能的函数
src/stmflash.c 内部flash操作的函数
src/ymodem.c 实现Ymodem协议的函数
-
"MDK-ARM": KEIL的工程文件及user文件
-
"STM32F10X-FWLib": ST官方库文件
-
"keilkill": 用来清除中间文件的bat脚本,双击运行即可
-
"README": 自述文件
-
打开MDK-ARM文件夹下的IAP.uvproj工程
-
在工具栏(Select Target)中选择与你的硬件对应的型号:
- STM32-IAP_MD_VL: 对应MD_VL设备
- STM32-IAP_HD_VL: 对应HD_VL设备
- STM32-IAP_CL: 对应CL设备
- STM32-IAP_MD: 对应MD设备
- STM32-IAP_HD: 对应HD设备
- STM32-IAP_XL: 对应XL设备
-
在iap_config.h文件中设置你的用户应用程序(app)的起始地址ApplicationAddress(我这里是0x8003000) 。设置用来存储标志信息的flash地址IAP_FLASH_FLAG_ADDR(我这里的是0x8002800,即0X8003000-2KByte)
-
在option->target->1ROM中设置boot的起始地址是0x8000000,设置你为boot分配的flash空间大小(我这里是0x3000)。通过第三项和第四项的设置你会知道,我把flash在逻辑上分为3个部分:
- 第一部分分了10KByte,用来存储boot的代码;
- 第二部分分了2KByte,用来存储一些用于状态标志的数据(用户也可以把一些数据信息保留在这里,只要不放在该区域的前两个字节即可)
- 剩余的部分都是用来存储用户应用程序的。也就是说你还有(flash总大小 - 12KByte)的空间可以使用。
-
编译工程,会在MDK-ARM -> OUTPUT 文件夹下生成与你的硬件平台相对应的文件夹,在这里面就会有hex文件和bin文件。
-
通过JLINK或者STlINK或者uart下载目标文件到你的硬件平台。
-
使mcu运行起来。
-
打开上位机工具,通过串口和MCU进行连接。
-
选择需要烧入用户应用程序(应用程序app的设置请点击此处 )。
-
根据你的需求选择更新app、读出app、擦除app、app进入iap模式、复位运行app等操作。
注:boot部分只需要烧录一次即可,之后所有操作都通过上位机工具完成。
+ 数据位长度 = 8 Bits
+ 1位停止位
+ 无校验位
+ 波特率 = 115200 baud(根据你的项目需求选择合适的波特率)
+ 硬件流控: None
+ “包长度”指的是数据传输过程中每一包的长度。可根据你的需要选择合适的包长度。
-
level00: 官方版本首次跑通。
-
level01: 抽象硬件平台,
- 修改输出文件
- 根据MCU的类别(暂实现6种)选择工程的配置,而不是根据开发版选择硬件平台
- 使boot和app识别相同的指令。
-
level02:处理不同情况下各功能之间跳转。
-
level03:
- 完成update和erase部分。
- first completed except upload
-
level04:
- 裁剪工程大小
- 重新构建工程结构
- 添加.bat文件
-
用户使用master版本即可。
代码时隔一年多再次更新,增加了通过后备寄存器来存储各种状态标志,使用方法见下:
选择iap_config.h文件中的define USE_BKP_SAVE_FLAG 1 //1:使用后备寄存器存储flag标志,0:使用flash存储flag标志(之前的版本就是这样)
注意app部分的USE_BKP_SAVE_FLAG值要和boot保持一致