利用USB DFU實現(xiàn)IAP功能之演示講解
前言
伴隨著固件升級需求的增加,STM32提供了靈活的升級方式。本文一步一步介紹如何利用USBDFU Class以及ST提供的DfuSedemo軟件工具實現(xiàn)IAP(InApplication Program)功能,但并不涉及到DFU class移植。
一、 實現(xiàn)環(huán)境
開發(fā)板:STM32F746G-DISCO
開發(fā)庫:STM32CubeF7v1.3.0
集成開發(fā)環(huán)境:IAR v7.70.1.11486
MDK-ARM Plus v5.20.0.0
(只需兩者中一種)
優(yōu)化級別:High (IAR)
Level 3 (-O3) (MDK-ARM)
DFU演示軟件:Dfu file manager v3.0.5
DfuSeDemo v3.0.5
實現(xiàn)過程在STM32F7系列上展開,但USB DFU實現(xiàn)的IAP功能并不只局限于STM32F7系列,可以通過用戶手冊判斷所采用微控制器型號是否支持USB以及IAP功能。STM32Cube開發(fā)庫為各系列STM32提供了齊全的USBDFU例程可供參考。
二、 IAP介紹
IAP(In application program)主要為使用者提供了一種更加靈活的固件升級方式,可以根據(jù)應(yīng)用需要定義何時、何種情況發(fā)生時進行固件升級。在介紹步驟前,需要對IAP原理有一定認識。結(jié)合下圖(僅供參考,IAP實際應(yīng)用方式更加靈活),IAP的應(yīng)用中,用戶程序與IAP驅(qū)動程序位于不同的存儲區(qū)域。在應(yīng)用過程中,利用IAP驅(qū)動程序?qū)⒂脩艄碳虞d到固定位置,完成升級。更多關(guān)于IAP應(yīng)用介紹請參考AN3965。
其中,IAP驅(qū)動程序首先燒錄固化,并不會隨著用戶程序的升級而改變。用戶固件升級完畢后,在IAP驅(qū)動程序引導(dǎo)下,跳轉(zhuǎn)到用戶固件對應(yīng)Flash位置,執(zhí)行用戶程序。
三 、實現(xiàn)步驟
3.1 DFU工具安裝
安裝DFUdemo工具DfuSe v3.0.5,主要提供了驅(qū)動、Dfufile manager 和DfuSeDemo。關(guān)于DfuSe的詳細內(nèi)容(安裝步驟、使用介紹)請參考UM0412。
3.2 IAP驅(qū)動固件生成與裝載
利用STM32CubeF7v1.3.0開發(fā)庫提供的USB DFU例程生成IAP驅(qū)動固件(文件夾路徑:…\ STM32Cube_FW_F7_V1.3.0\Projects\STM32746G-Discovery\Applications\USB_Device\DFU_Standalone)。
利用燒錄工具燒錄到開發(fā)板中。本例程實現(xiàn)重啟后,如果板上User按鍵按下或者沒有有效的用戶應(yīng)用程序,則進入USB DFU模式,等待升級;否則,進入用戶應(yīng)用。
下面是摘取的部分例程。
@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();
}
用戶固件對應(yīng)的首地址被定義在0x08008000。用戶也可以自定義地址,需要注意如下幾點:
1.禁止定義在0x08008000地址前(STM32F7系列,0x0~0x0800FFFF屬于Sector0,已經(jīng)開辟為IAP驅(qū)動程序區(qū)域)。
2.自定義地址所屬Sector在升級時會全部擦除,即使定義地址并不位于對應(yīng)Sector的首地址。
3.自定義地址需要保持512-byte對齊。
4.自定義地址需要與用戶固件對應(yīng)的裝載地址以及用戶中斷向量表地址保持一致。
在實現(xiàn)跳轉(zhuǎn)到用戶程序的代碼中,將用戶中斷向量表中第一個4字節(jié)指向的棧首地址分配給MSP。第二個4字節(jié)為復(fù)位中斷向量,指向執(zhí)行首地址。
在開發(fā)IAP驅(qū)動程序時,需要避免PC指針跳到用戶程序區(qū)域。同時,充分考慮Stack & Heap大小,避免出現(xiàn)USB DFU正常識別,但不能正常工作情況,如下圖所示。
3.3 用戶固件生成
本文采用STM32CubeF7v1.3.0開發(fā)庫中TIM_TimeBase例程作為用戶程序(文件夾路徑:STM32Cube_FW_F7_V1.3.0\Projects\STM32746G-Discovery\Examples\TIM\TIM_TimeBase)。
IAP升級所需用戶固件,主要有兩處需要變動:
1. 在鏈接工具中,程序裝載地址
2. 中斷向量表首地址
上述兩種變動需要保持一致,并且與IAP中定義的用戶區(qū)域首地址保持一致。
本IAP驅(qū)動程序中,用戶固件裝載地址相對于0x08000000偏移地址為0x8000。
在MDK中,改動前后比較如下圖所示。
在IAR中,更改步驟如下所示:
修改完畢后,生成hex文件(STM32746G_DISCOVERY.hex)。
3.4 用戶固件轉(zhuǎn)換與升級
打開Dfufile manager工具,點擊OK,進入轉(zhuǎn)換工具主界面。
按照下圖步驟,首先載入生成的HEX文件(STM32746G_DISCOVERY.hex);然后在TargetID、Target Name、Device properties中自定義內(nèi)容,這部分內(nèi)容在DfuSe Demo工具中選擇.dfu文件時會予以顯示,并不影響燒錄文件內(nèi)容。最后,點擊Generate完成HEX文件àDFU文件轉(zhuǎn)換。
為STM32F746G-DISCO板供電,通過USB線將板上USB_FS接口與電腦相連。由于STDiscovery板已經(jīng)加載了IAP應(yīng)用程序,并且沒有有效的用戶應(yīng)用程序,因此在IAP應(yīng)用程序中,直接進入USB DFU模式,以供電腦識別USBDFU器件。正常識別情況如左下圖。
右下圖情況是由于沒有正確裝載Driver導(dǎo)致,可以通過右擊“DFU in FS Mode”選擇更新驅(qū)動程序軟件\瀏覽計算機以查找驅(qū)動程序軟件(驅(qū)動文件位于DfuSe v3.0.5安裝目錄\DfuSe v3.0.5\Bin\ Driver)。
打開DfuSeDemo,結(jié)合下圖步驟,點擊’Choose’加載之前轉(zhuǎn)換的.dfu文件;選擇配置;點擊’Update’完成擦除與下載;另外,可以通過點擊’Verify’驗證是否下載成功。更多關(guān)于DfuSe內(nèi)容,請參考UM0412。
用戶固件升級完成。重啟后,正常進入用戶應(yīng)用。如果重啟過程中,板上USER鍵按下,進入USB DFU模式,等待升級。
四 小結(jié)
介紹了利用USBDFU實現(xiàn)IAP過程,以及實現(xiàn)過程中注意事項。在DfuSev3.0.5安裝目錄中包含了必要的文檔,介紹如何使用DfuSe工具,以及如何開發(fā)基于STMicroelectronicsDFU方案的上位機應(yīng)用。
更多內(nèi)容請移步:
STM32單片機中文官網(wǎng)
意法半導(dǎo)體/ST/STM
編輯:admin 最后修改時間:2019-01-03