基于DfuSe工具从APP跳转到DFU模式

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也可以识别。

可燃气体传感器的原理是什么?有哪些应用领域?
XTR50010和XTR54170半导体系列产品的区别
电感的选择在DC-DC转换器中实现了性能权衡
如何选择一台符合需求的信号转换器
谷歌Pixel 3新机曝光,搭载超级自拍功能
基于DfuSe工具从APP跳转到DFU模式
世界上第一块商用的微型处理器4004
魅族将于10月25日在北京召开魅族Note 8新品发布会
柔性灵活可穿戴监测仪监测人的生命体征
为什么说边缘计算潜力巨大
8航空插头6p连接器3芯4P5孔接头
电磁流量计选型时需要考虑哪些要素
意法半导体(ST)针对智能工业和高端消费电子推出兼具高性能和简易性的智能电机控制器
ARM体系结构文章合集
java程序必须以什么为文件扩展名
厂家定制的电子哨兵、防疫数字哨兵如何实现疫情防控信息查验?
智能制造代表工业机器人占据上风
中电数通深耕智慧城市建设 把安全带给千家万户
列车上PCB电路板如何用来抵抗干扰
AMD助力国宝、文物古迹数字化