利用 USB DFU实现 IAP功能的实现环境及IAP简介
2021-06-23 来源:eefocus
前言
伴随着固件升级需求的增加,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.0ProjectsSTM32746G-DiscoveryApplicationsUSB_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正常识别,但不能正常工作情况
上一篇:STM32入门——时钟篇