利用USB DFU实现IAP功能之演示讲解

标签:USBDFUIAP
分享到:

前言
伴随着固件升级需求的增加,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位置,执行用户程序。

1

 

三 、实现步骤
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正常识别,但不能正常工作情况,如下图所示。

2

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中,改动前后比较如下图所示。

3

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

4

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


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

5

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

6

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

7

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

8

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


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

 

更多内容请移步:

STM32单片机中文官网
意法半导体/ST/STM

继续阅读
意法半导体推出USB-IF认证开发板,将USB-C®和USB快充功能延伸到嵌入式应用

中国,2020年6月30日 – 横跨多重电子应用领域的全球领先的半导体供应商意法半导体发布USB-IF认证开发板,助力设备厂商升级更新电池供电产品,享受最新的USB PD (USB输电)技术带来的好处,包括更快的充电速度和USB-C®充电器及电缆二次使用便利性。

意法半导体USB Type-C端口保护IC全面防护,简化大众市场设备数据线升级过程

中国,2019年11月6日——借助意法半导体的 TCPP01-M12端口保护芯片,设计人员能够将小型电子设备数据线从旧式USB®Micro-A或Micro-B数据线轻松升级到最新的Type-C接口线。TCPP01-M12端口保护芯片符合USB-C™连接技术的所有电气保护要求。

意法半导体发布最新的Multi-OS软件工具,简化STM32代码安装,保护固件知识产权

中国,2019年6月28日——为了让STM32 *微控制器(MCU)和微处理器(MPU)用户的开发工作变得更轻松,进一步加强STM32Cube生态系统,意法半导体发布最新版的STM32Cube ecosystem,将多个代码烧写器集成到一个通用工具中。

iPad Pro未来可支持USB鼠标,便捷性将逐步提升

iOS 13似乎正在对iPad进行比较大程度的优化,提升它的便捷性和使用方便程度,是苹果的推动改进的核心动力。

欧盟“搓搓手”:就决定是你了,苹果!

由于涉嫌非法迫使智能手机制造商安装其应用程序,Google 将面临来自欧盟的 43 亿巨额罚单。然而欧盟才刚「搞」完 Google,现在又准备将矛头转向苹果了。