伴随着固件升级需求的增加,STM32提供了灵活的升级方式。本文一步一步介绍如何利用USBDFU Class以及ST提供的DfuSedemo软件工具实现IAP(InApplication Program)功能,但并不涉及到DFU class移植。 一、 实现环境
开发板:STM32F746G-DISCO
开发库:STM32CubeF7v1.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提供了齐全的USBDFU例程可供参考。
二、 IAP介绍
IAP(In application program)主要为使用者提供了一种更加灵活的固件升级方式,可以根据应用需要定义何时、何种情况发生时进行固件升级。在介绍步骤前,需要对IAP原理有一定认识。结合下图(仅供参考,IAP实际应用方式更加灵活),IAP的应用中,用户程序与IAP驱动程序位于不同的存储区域。在应用过程中,利用IAP驱动程序将用户固件加载到固定位置,完成升级。更多关于IAP应用介绍请参考AN3965。
其中,IAP驱动程序首先烧录固化,并不会随着用户程序的升级而改变。用户固件升级完毕后,在IAP驱动程序引导下,跳转到用户固件对应Flash位置,执行用户程序。
三 、实现步骤
3.1 DFU工具安装
安装DFUdemo工具DfuSe v3.0.5,主要提供了驱动、Dfufile manager 和DfuSeDemo。关于DfuSe的详细内容(安装步骤、使用介绍)请参考UM0412。
3.2 IAP驱动固件生成与装载
利用STM32CubeF7v1.3.0开发库提供的USB DFU例程生成IAP驱动固件(文件夹路径:…\ STM32Cube_FW_F7_V1.3.0\Projects\STM32746G-Discovery\Applications\USB_Device\DFU_Standalone)。
利用烧录工具烧录到开发板中。本例程实现重启后,如果板上User按键按下或者没有有效的用户应用程序,则进入USB DFU模式,等待升级;否则,进入用户应用。
下面是摘取的部分例程。 @usbd_conf.h
/* The first sector(32 KB) is reserved for DFU code */
#defineUSBD_DFU_APP_DEFAULT_ADD 0x08008000 @usbd_dfu.c
USBD_DFU_Init(…)
{
…
hdfu->data_ptr =USBD_DFU_APP_DEFAULT_ADD;
…
} @main.c
/* Test if user code is programmed startingfrom USBD_DFU_APP_DEFAULT_ADD address */
if(((*(__IOuint32_t*)USBD_DFU_APP_DEFAULT_ADD) & 0x2FFE0000 ) == 0x20000000)
{
/* Jump to userapplication */
JumpAddress = *(__IOuint32_t*) (USBD_DFU_APP_DEFAULT_ADD + 4);
JumpToApplication =(pFunction) JumpAddress;
/* Initialize userapplication's Stack Pointer */
__set_MSP(*(__IOuint32_t*) USBD_DFU_APP_DEFAULT_ADD);
JumpToApplication();
}
用户固件对应的首地址被定义在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 用户固件生成
本文采用STM32CubeF7v1.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 用户固件转换与升级
打开Dfufile manager工具,点击OK,进入转换工具主界面。
按照下图步骤,首先载入生成的HEX文件(STM32746G_DISCOVERY.hex);然后在TargetID、Target Name、Device properties中自定义内容,这部分内容在DfuSe Demo工具中选择.dfu文件时会予以显示,并不影响烧录文件内容。最后,点击Generate完成HEX文件àDFU文件转换。 为STM32F746G-DISCO板供电,通过USB线将板上USB_FS接口与电脑相连。由于STDiscovery板已经加载了IAP应用程序,并且没有有效的用户应用程序,因此在IAP应用程序中,直接进入USB DFU模式,以供电脑识别USBDFU器件。正常识别情况如左下图。
右下图情况是由于没有正确装载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模式,等待升级。
四 小结
介绍了利用USBDFU实现IAP过程,以及实现过程中注意事项。在DfuSev3.0.5安装目录中包含了必要的文档,介绍如何使用DfuSe工具,以及如何开发基于STMicroelectronicsDFU方案的上位机应用。
|