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文章
7936瀏覽量
264484 -
上位機
+關注
關注
27文章
941瀏覽量
54790
原文標題:教您如何通過DfuSe工具控制程序跳進DFU模式
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論