
前言 伴随着固件升级需求的增加,STM32 提供了灵活的升级方式。本文一步一步介绍如何利用 USB DFU Class 以及 ST 提供的DfuSe demo 软件工具实现 IAP(In Application Program)功能,但并不涉及到 DFU class 移植。6 H4 q( U- e4 J/ L ; H; u' u) Q* y. c- ~5 w% } 一 实现环境 开发板:STM32F746G-DISCO- i1 s/ u. B/ C8 r 开发库:STM32CubeF7 v1.3.0 集成开发环境:IAR v7.70.1.11486* d: U9 i8 u$ x :MDK-ARM Plus v5.20.0.0 (只需两者中一种)' \/ j8 d- G* y& K- p) H% F6 a 优化级别 : High (IAR) h) p: e1 s: a5 n. T; a Level 3 (-O3) (MDK-ARM)5 y6 |9 d( M" y& L/ ~ DFU 演示软件: Dfu file manager v3.0.5+ |; M7 V% v6 k) V: I DfuSeDemo v3.0.5 实现过程在 STM32F7 系列上展开,但 USB DFU 实现的 IAP 功能并不只局限于 STM32F7 系列,可以通过用户手册判断所采用微控制器型号是否支持 USB 以及 IAP 功能。STM32Cube 开发库为各系列 STM32 提供了齐全的 USB DFU 例程可供参考。$ k. F' [. S. }. R 二 IAP 介绍 IAP(In application program)主要为使用者提供了一种更加灵活的固件升级方式,可以根据应用需要定义何时、何种情况发生时进行固件升级。在介绍步骤前,需要对 IAP 原理有一定认识。结合下图(仅供参考,IAP 实际应用方式更加灵活),IAP 的应用中,用户程序与 IAP 驱动程序位于不同的存储区域。在应用过程中,利用 IAP 驱动程序将用户固件加载到固定位置,完成升级。更多关于 IAP 应用介绍请参考 AN3965。7 I5 k) c) f% P5 M 其中,IAP 驱动程序首先烧录固化,并不会随着用户程序的升级而改变。用户固件升级完毕后,在 IAP 驱动程序引导下,跳转到用户固件对应 Flash 位置,执行用户程序。7 j5 ]& F8 B- O, ]2 C 3 J9 A: {) L7 g; e# G0 b7 C) j& P9 ? ![]() 三 实现步骤- L9 r# B! D" c- C0 t% z 3.1 DFU 工具安装3 z3 N% s* p4 O7 ]8 q( e) J 安装 DFU demo 工具 DfuSe v3.0.5,主要提供了驱动、Dfu file manager 和 DfuSeDemo。关于 DfuSe 的详细内容(安装步骤、使用介绍)请参考 UM0412。 3.2 IAP 驱动固件生成与装载1 E% q% J) f& }% s' k 利用 STM32CubeF7 v1.3.0 开发库提供的 USB DFU 例程生成 IAP 驱动固件(文件夹路径: …STM32Cube_FW_F7_V1.3.0\Projects\STM32746G-Discovery\Applications\USB_Device\ DFU_Standalone)。/ e' i4 k7 b( e0 l% ?+ `3 N) J- j 利用烧录工具烧录到开发板中。本例程实现重启后,如果板上 User 按键按下或者没有有效的用户应用程序,则进入 USB DFU 模式,等待升级;否则,进入用户应用。 X4 B) z# @$ w$ u. Z 下面是摘取的部分例程。
用户固件对应的首地址被定义在 0x08008000。用户也可以自定义地址,需要注意如下几点: 1. 禁止定义在 0x08008000 地址前(STM32F7 系列,0x0~0x0800FFFF 属于 Sector0,已经开辟为 IAP 驱动程序区域) 2. 自定义地址所属 Sector 在升级时会全部擦除,即使定义地址并不位于对应 Sector 的首地址 3. 自定义地址需要保持 512-byte 对齐: q* d$ l. s& R+ x+ o4 b4 n- H6 A( @ 4. 自定义地址需要与用户固件对应的装载地址以及用户中断向量表地址保持一致 在实现跳转到用户程序的代码中,将用户中断向量表中第一个 4 字节指向的栈首地址分配给 MSP。第二个 4 字节为复位中断向量,指向执行首地址。 在开发 IAP 驱动程序时,需要避免 PC 指针跳到用户程序区域。同时,充分考虑 Stack & Heap 大小,避免出现 USBDFU 正常识别,但不能正常工作情况,如下图所示。 t: a/ P' T' T& s ![]() 7 s9 t. E% p3 L0 y5 h! y* ` 3.3 用户固件生成 本文采用 STM32CubeF7 v1.3.0 开发库中 TIM_TimeBase 例程作为用户程序(文件夹路径:STM32Cube_FW_F7_V1.3.0\Projects\STM32746G-Discovery\Examples\TIM\TIM_TimeBase)。 IAP 升级所需用户固件,主要有两处需要变动:# W% R+ Z7 C$ c7 ~ 1. 在链接工具中,程序装载地址 2. 中断向量表首地址$ y; C6 q4 T* ] 上述两种变动需要保持一致,并且与 IAP 中定义的用户区域首地址保持一致。$ j7 P8 X) a$ ~: d# k 本 IAP 驱动程序中,用户固件装载地址相对于 0x08000000 偏移地址为 0x8000。在 MDK 中,改动前后比较如下图所示。8 f, l" r7 T( o% P1 C & M, l! a1 Z# v; k; M, Q; s ![]() - q' ^7 n5 D- @4 d 在 IAR 中,更改步骤如下所示。* d# y* r( v: B5 S7 G ![]() + G7 F. |/ R- {, g4 C; ? 修改完毕后,生成 hex 文件(STM32746G_DISCOVERY.hex)。/ f: @" P6 |3 X' n 3.4 用户固件转换与升级 打开 Dfu file manager 工具,点击 OK,进入转换工具主界面。: m- _% v9 K' d$ n 1 v/ |! r1 x$ _. }/ W/ G ![]() , I* U7 w! t- @3 G! h, D% M 按照下图步骤,首先载入生成的 HEX 文件(STM32746G_DISCOVERY.hex);然后在 Target ID、 Target Name、Device properties 中自定义内容,这部分内容在 DfuSe Demo 工具中选择.dfu 文件时会予以显示,并不影响烧录文件内容。最后,点击 Generate 完成 HEX 文件DFU 文件转换。 5 w# g$ s D' B( X W ![]() % j$ I- }2 T s9 |( L 为 STM32F746G-DISCO 板供电,通过 USB 线将板上 USB_FS 接口与电脑相连。由于 ST Discovery 板已经加载了 IAP应用程序,并且没有有效的用户应用程序,因此在 IAP 应用程序中,直接进入 USB DFU 模式,以供电脑识别 USB DFU 器件。正常识别情况如左下图。 右下图情况是由于没有正确装载 Driver 导致,可以通过右击“DFU in FS Mode”选择更新驱动程序软件\浏览计算机以查找驱动程序软件(驱动文件位于 DfuSe v3.0.5 安装目录\ DfuSe v3.0.5\Bin\ Driver)。, n% ^9 |) e2 O1 [' P, G+ d( ] 打开 DfuSeDemo,结合下图步骤,点击’Choose’加载之前转换的.dfu 文件;选择配置;点击’Update’完成擦除与下载;另外,可以通过点击’Verify’验证是否下载成功。更多关于 DfuSe 内容,请参考 UM0412。: ?) r2 T, k4 E) l. |" P ![]() 用户固件升级完成。重启后,正常进入用户应用。如果重启过程中,板上 USER 键按下,进入 USB DFU 模式,等待升级。2 P F) |. @4 Y4 V3 i4 {9 U. g ) ] t6 y% j5 }4 @' d 四 小结. ?( e1 I* `) o1 ] 介绍了利用 USB DFU 实现 IAP 过程,以及实现过程中注意事项。在 DfuSe v3.0.5 安装目录中包含了必要的文档,介绍如何使用 DfuSe 工具,以及如何开发基于 STMicroelectronics DFU 方案的上位机应用。" d. [% X& s6 |; v% P. e z! y( c # p( ~+ ^1 T. {* u% ~ 9 z4 \) S# g+ K" x+ \3 G |
STM32 ISP IQTune:真正零门槛的免费ISP调整软件
【经验分享】STM32 新建基于STM32F40x 固件库的MDK5 工程
意法半导体MCU双供应链策略,打消中国客户后顾之忧
【经验分享】基于STM32使用HAL库实现USB组合设备CDC+MSC
2024意法半导体工业峰会:赋能智能电源和智能工业,构筑可持续未来
ST推出灵活、面向未来的智能电表通信解决方案,助力能源转型
意法半导体 x Qu-Bit Electronix:推动新一轮的数字声音合成革命
从STM32 MPU产品看嵌入式系统中微处理器的新变化
【Hot!】STM32全系列开发板都支持Arduino开发,你知道吗?
【经验分享】STM32 HAL库移植FreeModbus详细步骤