1
前言
我们之前经常有讲到过如何通过USB的DFU方式来对固件进行升级,在示例中我们通常是通过一个按键来触发APP跳转到BOOT从而进入到DFU升级模式。但是也有一种情况,客户的环境是没有任何按键或者其它触发条件,只有一个USB口连接运行Windows操作系统的上位机。这不,前不久就碰到这么个客户,下位机MCU端仅仅只有一个USB口连接上位机,且MCU端与上位机之间的USB是常连的,并不能通过USB的拔插操作来触发APP的跳转,在此情况下,我们又该如何来实现客户的需求?
2
分析
Figure1 BOOT与APP在内部FLASH中的关系
如上图所示,在MCU内部FLASH中,BOOT与APP同时存在,BOOT为DFU模式,负责对固件进行升级,而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也可以识别。
-
usb
+关注
关注
60文章
7941浏览量
264541 -
上位机
+关注
关注
27文章
942浏览量
54795
原文标题:教您如何通过DfuSe工具控制程序跳进DFU模式
文章出处:【微信号:STM32_STM8_MCU,微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论