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