打印
[信息]

【实战经验】利用USB DFU实现IAP功能

[复制链接]
2670|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
USB, iap, ST, STM, se
本帖最后由 香水城 于 2017-8-14 13:55 编辑

利用 USB DFU实现 IAP功能

前言
伴随着固件升级需求的增加,STM32提供了灵活的升级方式。本文一步一步介绍如何利用USB DFU Class以及ST提供的DfuSe demo软件工具实现IAP(In Application Program)功能,但并不涉及到DFU class移植。

一 实现环境
开发板:STM32F746G-DISCO
开发库:STM32CubeF7 v1.3.0
集成开发环境:IAR v7.70.1.11486
                     :MDK-ARM Plus v5.20.0.0 (只需两者中一种)
优化级别 : High (IAR)
              Level 3 (-O3) (MDK-ARM)
DFU演示软件: Dfu file manager v3.0.5
                     DfuSeDemo v3.0.5

实现过程在STM32F7系列上展开,但USB DFU实现的IAP功能并不只局限于STM32F7系列,可以通过用户手册判断所采用微控制器型号是否支持USB以及IAP功能。STM32Cube开发库为各系列STM32提供了齐全的USB DFU例程可供参考。

二 IAP介绍
IAP(In application program)主要为使用者提供了一种更加灵活的固件升级方式,可以根据应用需要定义何时、何种情况发生时进行固件升级。在介绍步骤前,需要对IAP原理有一定认识。结合下图(仅供参考,IAP实际应用方式更加灵活),IAP的应用中,用户程序与IAP驱动程序位于不同的存储区域。在应用过程中,利用IAP驱动程序将用户固件加载到固定位置,完成升级。更多关于IAP应用介绍请参考AN3965。
其中,IAP驱动程序首先烧录固化,并不会随着用户程序的升级而改变。用户固件升级完毕后,在IAP驱动程序引导下,跳转到用户固件对应Flash位置,执行用户程序。



三 实现步骤

3.1 DFU工具安装
安装DFU demo工具DfuSe v3.0.5,主要提供了驱动、Dfu file manager 和 DfuSeDemo。关于DfuSe的详细内容(安装步骤、使用介绍)请参考UM0412。

3.2 IAP驱动固件生成与装载
利用STM32CubeF7 v1.3.0开发库提供的USB DFU例程生成IAP驱动固件(文件夹路径: …\ STM32Cube_FW_F7_V1.3.0\Projects\STM32746G-Discovery\Applications\USB_Device\ DFU_Standalone)。
利用烧录工具烧录到开发板中。本例程实现重启后,如果板上User按键按下或者没有有效的用户应用程序,则进入USB DFU模式,等待升级;否则,进入用户应用。
下面是摘取的部分例程。





用户固件对应的首地址被定义在0x08008000。用户也可以自定义地址,需要注意如下几点:
1. 禁止定义在0x08008000地址前(STM32F7系列,0x0~0x0800FFFF属于Sector0,已经开辟为IAP驱动程序区域)
2. 自定义地址所属Sector在升级时会全部擦除,即使定义地址并不位于对应Sector的首地址
3. 自定义地址需要保持512-byte对齐
4. 自定义地址需要与用户固件对应的装载地址以及用户中断向量表地址保持一致
在实现跳转到用户程序的代码中,将用户中断向量表中第一个4字节指向的栈首地址分配给MSP。第二个4字节为复位中断向量,指向执行首地址。
在开发IAP驱动程序时,需要避免PC指针跳到用户程序区域。同时,充分考虑Stack & Heap大小,避免出现USB DFU正常识别,但不能正常工作情况,如下图所示。



3.3 用户固件生成
本文采用STM32CubeF7 v1.3.0开发库中TIM_TimeBase例程作为用户程序(文件夹路径:STM32Cube_FW_F7_V1.3.0\Projects\STM32746G-Discovery\Examples\TIM\TIM_TimeBase)。
IAP升级所需用户固件,主要有两处需要变动:
1. 在链接工具中,程序装载地址
2. 中断向量表首地址
上述两种变动需要保持一致,并且与IAP中定义的用户区域首地址保持一致。
本IAP驱动程序中,用户固件装载地址相对于0x08000000偏移地址为0x8000。在MDK中,改动前后比较如下图所示。


在IAR中,更改步骤如下所示。



修改完毕后,生成hex文件(STM32746G_DISCOVERY.hex)。

3.4 用户固件转换与升级
打开Dfu file manager工具,点击OK,进入转换工具主界面。



按照下图步骤,首先载入生成的HEX文件(STM32746G_DISCOVERY.hex);然后在Target ID、 Target Name、 Device properties中自定义内容,这部分内容在DfuSe Demo工具中选择.dfu文件时会予以显示,并不影响烧录文件内容。最后,点击Generate完成HEX文件DFU文件转换。



为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)。



打开DfuSeDemo,结合下图步骤,点击’Choose’加载之前转换的.dfu文件;选择配置;点击’Update’完成擦除与下载;另外,可以通过点击’Verify’验证是否下载成功。更多关于DfuSe内容,请参考UM0412。



用户固件升级完成。重启后,正常进入用户应用。如果重启过程中,板上USER键按下,进入USB DFU模式,等待升级。

四 小结
介绍了利用USB DFU实现IAP过程,以及实现过程中注意事项。在DfuSe v3.0.5安装目录中包含了必要的文档,介绍如何使用DfuSe工具,以及如何开发基于STMicroelectronics DFU方案的上位机应用。

相关文档
AN4657      STM32 in-application programming (IAP) using the USART
AN3965      使用 USART 实现STM32F40x/STM32F41x 的 IAP
UM0412     Getting started with DfuSe USB device firmware upgrade STMicroelectronics extension

相关工具&链接
DfuSe_Demo http://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-programmers/stsw-stm32080.html?dl=537587854391172693#
STM32CubeF7 http://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32cube-embedded-software/stm32cubef7.html


对应PDF: 利用USB_DFU实现IAP功能
更多实战经验请看: 【ST MCU实战经验汇总贴】

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:STM32技术专家

596

主题

17106

帖子

287

粉丝