datasheet

STM32单片机

文章数:308 被阅读:951864

账号入驻

教您如何通过DfuSe工具控制程序跳进DFU模式

2019-01-04
    阅读数:

1

前言


我们之前经常有讲到过如何通过USBDFU方式来对固件进行升级,在示例中我们通常是通过一个按键来触发APP跳转到BOOT从而进入到DFU升级模式。但是也有一种情况,客户的环境是没有任何按键或者其它触发条件,只有一个USB口连接运行Windows操作系统的上位机。这不,前不久就碰到这么个客户,下位机MCU端仅仅只有一个USB口连接上位机,且MCU端与上位机之间的USB是常连的,并不能通过USB的拔插操作来触发APP的跳转,在此情况下,我们又该如何来实现客户的需求?



2

分析


Figure1 BOOTAPP在内部FLASH中的关系

如上图所示,在MCU内部FLASH中,BOOTAPP同时存在,BOOTDFU模式,负责对固件进行升级,而APP(Run-time模式)为客户的应用程序。当APP运行时,通过某个事件触发(DFU_DETACH)程序从APP跳转到BOOT中从而进入到DFU模式中。


Figure 2 reconfiguration phase

‍‍这个DFU_DETACH的操作在这里我们可以通过PC端软件DfuSe Demo来触发。


Figure 3 DfuSe Demo

‍‍在进入到DFU模式时,DfuSe Demo软件的运行界面如上所示,上图界面中有一个“Leave DFU Mode”的按键,通过它可以使运行在MCU的程序从DFU模式切换到APP中。同时我们也发现,在按键“Leave DFU Mode”的左边有一个灰色按键“Enter DFU Mode/HID Detach”,从字面就可以知道,它应该是进入到DFU模式的按键,在APP模式下此按键应该是激活的,但是,在进入到APP模式后,此界面就检测不到DFU设备了,此软件将不再可用。那么我们又将如何来激活这个“Enter DFU Mode/HID Detach”按键呢?


从帮助文档可知,在APP模式时,当DfuSe Demo这个软件识别到一个特定的HID设备时,“Enter DFU Mode/HID Detach”按键将激活,通过进一步了解,我们知道此时DfuSe Demo这个软件是需要使能此项功能才可以,所幸地是,我们已经有了此软件,在与此文对应的附件中,可以找到一个名为DfuSeDemo_A.exe的可执行程序,将它拷贝到DfuSeDemo的安装目录下,如下图所示:

Figure 4 DfuSeDemo_A

当运行在APP模式下时如下所示:

Figure5 APP模式

如上图所示,在APP模式下时,当程序检测到有效的HID设备时,DfuSe Demo的”Available DFU Device”下拉框中会显示这个HID设备,并且“Enter DFU Mode/HID Detach”按键激活。当按下此键时,MCU会重启并进入到DFU模式。当然此APP是需要实现一个符合某种要求的HID设备才行。下面我们通过制作这样一个APP来讲解。



3

制作APP


我们基于之前DFU培训时使用的STM32F072-Discovery板来实现此APP。

打开STM32CubeMX软件新建一个基于STM32F072RB的工程,使能USB和RTC外设,RTC我们主要用它的备份域寄存器,用来保存跳进入到DFU模式的标志。

Pinout如下所示:


Figure 6 pinout

使用HSI48作为系统时钟源,同时给USB提供48M时候,这样可以省一个外部晶振,RTC就使用LSI时钟源,我们不要求它的时间精确度,只求备份域寄存器可用。

Figure 7 clock configuration

然后我们将USB类选择 “Custom Human Interface Device(HID)”,USB中断等级设置为1,堆为0x500,栈大小设置为0x2000,然后生成工程。

打开usbd_custom_hid_if.c文件,找到CUSTOM_HID_ReportDesc_FS,修改报告描述符为:

然后找到CUSTOM_HID_OutEvent_FS函数,修改为:

如上代码所示,只有当PC端软件DfuSeDemo检测到具有这个报告描述符的HID设备后才会认可其为满足要求的HID设备,并将其显示在设备列表中,按键“Enter DFU Mode/HID Detach”激活。当用户按下此按键后,DfuSeDemo会向HID设备发送一条SetFeature指令。

 

当MCU收到SetFeature指令后,往备份域寄存器写入0x32F2作为进入DFU模式的标志,然后重启切换到BOOT,接下来在BOOT内如果程序检测到备份域寄存器的标志时则进入到DFU模式。整个过程如图2所示。

 

当然,APP还需要修改FLASH中的偏移位置,通过工具烧录到0x0800 7000的位置,这个在之前DFU培训时已经讲述过如何操作了,这里就不具体再重复了,有兴趣的同学可以查看此文档附件内的APP源码。

 

接下来我们再来看看BOOT程序中检测跳转标志的过程:

如上代码所示,只有当

jump2App ==JUMP_FLAG_APP时程序才会跳转到APP中运行,否则进入到DFU模式。



4

总结


使用此方法毕竟在APP中实现了一套HID,如果不是必要的话,建议还是使用按键的方式来触发从APP跳转到DFU模式,除非遇到像本文中客户的情况,或者APP本身就需要实现某个USB类的功能,此时可以做成USB复合设备,其中一个HID设备就是本文中的HID设备,这样PC端的软件DfuSe Demo也可以识别。

↓↓↓ 更多详情,请点击“阅读全文”

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: TI培训

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved