1 前言
DFU用来做IAP是很方便的,可以直接通过USB来对APP进行升级,因此,掌握DFU的制作还是挺有好处,特别是使用CubeMx工具可以快速制作,本文将基于STM3240G-EVL评估板来一步一步实现一个DFU的IAP工程。
2 制作CubeMx工程
新建一个STM32F407IGHx工程:
Pinout:
Peripherals:
RCC->High Speed Clock(HSE):Crystal/Ceramic Resonator
SYS->Debug:Serial Wire
USB_OTG_FS->Mode:Device_OnlyMiddleWares
USB_DEVICE->Class For FS IP:Download Firmware Update Class(DFU)
再配置PG15脚为GPIO_Input模式。
Clock Configuration:
如上图,STM3240G-EVAL评估板使用的是25M HSE。
Configuration:
NVIC中将USB中断优先级调为5,PG15的标签设置为USER_BTN,此外还需要设置中间件USB DFU参数,如下图:
如上图,红色框内为需要修改的代码,0x0800C000为需要为用户程序APP烧录的起始地址,字符串“@Internal Flash /0x08000000/03*016Ka,01*016Kg,01*064Kg,07*128Kg”实际为USB DFU类的interface字符串描述符,在USB DFU标准文件中有提到可选接口可以使用一个对应的接口字符串来表示此可选接口对应的目标设备的存储块信息,但如何具体规定的,DFU标准(DFU_1.1)并没有要求,是开放的,如下:
由此可见,接口字符串定义是可以自由定义的,那么在这里,由于使用到ST工具软件DfuSe Demo(v3.0.5),那么这个工具与USB DFU设备就有一个自定义的接口字符串定义,用来表示当前MCU内部的FLASH组织结构。
接下来我们来看看MCU内部FLASH的组织,由于这里的MCU是STM32F407IGHx,找到其参考文档,并查看其内部FLASH组织结构:
如上图,STM32F407内部FLASH包含4个16K扇区+1个64K扇区+7个128K扇区,并且起始地址为0x0800 0000,所以它对应的接口字符串表示为: “@Internal Flash /0x08000000/03*016Ka,01*016Kg,01*064Kg,07*128Kg”, Internal Flash为在工具软件显示的名称,0x08000000为起始地址,03*016Ka表示3个16K大小只读的扇区,01*064Kg表示1个64K大小的可读写扇区,07*128Kg表示7个128K大小的可读写扇区,后缀a表示只读,后缀g表示可读写。这个就是工具软件DfuSe Demo(v3.0.5)与DFU设备之间的约定。如下:
知道了这些信息后,我们再回过头来看APP的起始地址0x0800C000,那么APP的起始地址该如何得来的?有什么要求?与这个接口字符串之间是否有关系?
到目前为止,我们可以确定地是,APP_DEFAULT_ADD的地址必须是位于接口字符串表示的可读写的地址范围内,也就是第4个扇区起(前3个扇区都是只读的),不然是烧录不进去的。其他问题我们先暂且放一放