什么是IAP?
IAP(In-Application Programming) 指MCU可以在系統(tǒng)中獲取新代碼并對自己重新編程,即可用程序來改變程序。在應(yīng)用編程(IAP)是用戶的應(yīng)用代碼對片內(nèi)Flash存儲器進行擦除/編程的方法。這種方式的典型應(yīng)用就是用一小段代碼來實現(xiàn)程序的下載,實際上單片機的ISP功能就是通過IAP技術(shù)來實現(xiàn)的,即片子在出廠前就已經(jīng)有一段小的boot程序在里面,片子上電后,開始運行這段程序,當檢測到上位機有下載要求時,便和上位機通信,然后下載數(shù)據(jù)到數(shù)據(jù)存儲區(qū),從而實現(xiàn)固件升級。
什么是BootLoader?
百度百科:在嵌入式操作系統(tǒng)中,BootLoader是在操作系統(tǒng)內(nèi)核運行之前運行??梢猿跏蓟?a class="article-link" target="_blank" href="/tag/%E7%A1%AC%E4%BB%B6/">硬件設(shè)備、建立內(nèi)存空間映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準備好正確的環(huán)境。在嵌入式系統(tǒng)中,通常并沒有像BIOS那樣的固件程序(注,有的嵌入式CPU也會內(nèi)嵌一段短小的啟動程序),因此整個系統(tǒng)的加載啟動任務(wù)就完全由BootLoader來完成。
實際上,BootLoader不僅僅在操作系統(tǒng)上使用,在一些內(nèi)存小,功能應(yīng)用較為簡單的單片機設(shè)備上面也可以通過BootLoader來完成固件升級。
什么是DFU?
DFU全稱為Download Firmware Update,是ST官方推出的一個通過USB接口進行IAP升級的方案,同串口ISP一樣,他們都集成在了芯片內(nèi)部的Bootloader區(qū)段,可以通過配置boot引腳來啟動。
不過STM32內(nèi)置DFU的型號都比較新,像STM32F4系列是有的,但是像F0和F1系列則沒有,不過沒有關(guān)系,如果你用的型號沒有內(nèi)置DFU程序,也可以通過CubeMX來快速生成和移植一個DFU功能程序到你的Flash中來使用。
使用DFU的優(yōu)缺點?
使用DFU的好處是不用自己制作Bootloader,因為這部分代碼在STM32出廠之前就已經(jīng)做好并且燒錄進去了,而且不占用用戶代碼的Flash,另外,在PC端我們也不需要專門定制一個上位機,因為官方就有專門的升級Tool以及USB驅(qū)動。
缺點是要改變boot引腳的電平,才能啟動Bootloader,這樣的話在應(yīng)用場景上就有比較大的限制了。
所以,要根據(jù)項目的實際需求去選擇合適的方案。
我之前也有發(fā)過一些關(guān)于STM32遠程升級的文章,實現(xiàn)的方式有很多種,感興趣的同學(xué)可以去看一下。
STM32固件升級系列合集:https://blog.csdn.net/ShenZhen_zixian/article/details/129074047
1 硬件介紹
我這里測試用的是STM32F407。
注意:F0和F1系列是沒有內(nèi)置DFU的。
用到的硬件接口如下:
接口 | 引腳 | 作用 |
---|---|---|
USB | PA11 PA12 | (必要)通過USB連接PC端,用來傳輸固件以實現(xiàn)在線升級 |
BOOT | BOOT0 BOOT1 | (必要)通過改變boot電平來切換運行模式 |
串口 | PA9 | (非必要)通過CH340連接到PC端,打印固件版本號,方便查看升級是否成功 |
LED | PF9 | (非必要)方便查看代碼是否跑起來了 |
BOOT引腳配置對應(yīng)如下圖:
1)主Flash
主Flash起始地址為0x08000000
,它指的是STM32內(nèi)置的Flash,通常我們燒錄的代碼就是存放在這個位置。
2)系統(tǒng)存儲器
系統(tǒng)存儲器起始地址為0x1FFF0000
,這種模式啟動的程序功能是由芯片廠家設(shè)置的,STM32在出廠時會這個區(qū)域內(nèi)置一段BootLoader, 也就是我們常說的ISP程序, 這是一塊ROM,出廠后無法修改。我們要使用的DFU就是放在這里。
3)嵌入式SRAM
嵌入式SRAM起始地址為0x20000000
,既然是SRAM,自然也就沒有程序存儲的能力了,這個模式一般用于程序調(diào)試。假如我只修改了代碼中一個小小的 地方,然后就需要重新擦除整個Flash,比較的費時,可以考慮從這個模式啟動代碼(也就是STM32的內(nèi)存中),用于快速的程序調(diào)試,等程序調(diào)試完成后,在將程序下載到SRAM中。
2 環(huán)境搭建
2.1 Keil uVsion
關(guān)于STM32以及Keil的環(huán)境這里就不具體介紹了,網(wǎng)上教程也很多,不懂的同學(xué)自行查閱資料。環(huán)境搭建好之后需要準備一個能夠正常運行的代碼,用來測試我們后面的固件升級。
2.2 STM32CubeProgrammer
這個工具是用來燒錄代碼的,可以通過ST-Link、UART和USB下載。其中USB下載就是我們今天要講的DFU模式。
STM32CubeProgrammer官方下載地址:https://www.st.com/en/development-tools/stm32cubeprog.html
根據(jù)自己的操作系統(tǒng)下載對應(yīng)的安裝包,然后直接安裝即可。
提示:默認地址C:Program FilesSTM32CubeSTM32CubeProgrammerbin,如果安裝完找不到應(yīng)用程序的話可以在這個路徑找到。
2.3 zadig
zadig是用來安裝一個USB驅(qū)動的,只有安裝好這個驅(qū)動,后面的升級流程才能正常進行,不然識別不到STM32的USB DFU模式。
這里先下載好軟件,后面我們用到再安裝。
下載地址請自行查閱,或者在我上傳的鏈接下載也行。
zadig:https://download.csdn.net/download/ShenZhen_zixian/87570348
注:本文測試的時候,用的是v2.7.7版本。
2.4 檢查USB驅(qū)動
1、讓STM32進入系統(tǒng)存儲器啟動模式
也就是配置BOOT0引腳拉高,BOOT1引腳拉低。
提示:BOOT引腳的狀態(tài)要在MCU啟動之前配置好才能進入對應(yīng)的模式,可以先配置BOOT引腳再上電,也可以在配置好BOOT引腳之后復(fù)位MCU。
2、檢查和安裝USB驅(qū)動
把STM32的USB連接到PC端,然后打開設(shè)備管理器,查看USB設(shè)備的情況??赡軙霈F(xiàn)以下幾種情況。
1)能看到下圖這個STM32 BOOTLOADER
設(shè)備,并且沒有黃嘆號,說明驅(qū)動已經(jīng)是安裝好了的,可以直接跳到后面第3點了。
提示:因為前面安裝STM32CubeProgrammer時會提示安裝驅(qū)動,如果安裝了,這時USB驅(qū)動可能就已經(jīng)裝好了。
2)能看到下圖這個STM32 BOOTLOADER
設(shè)備,但是有黃嘆號,說明驅(qū)動異常,需要用zadig
重新安裝。
打開前面下載好的zadig
,點擊Install WCID Driver
安裝即可。
等待安裝完成。
安裝完成后可以在zadig
上看到設(shè)備,打開設(shè)備管理器,也能看到一個沒有黃嘆號的STM32 BOOTLOADER
設(shè)備。
3)能看到下圖這個STM Device in DFU Mode
設(shè)備,但沒有STM32 BOOTLOADER
設(shè)備,需要用zadig
重新安裝。
先卸載掉STM Device in DFU Mode
設(shè)備。然后重新插拔USB線,之后會看到一個帶黃色感嘆號的STM32 BOOTLOADER
設(shè)備。此時再按照前面的第2步操作即可。
不管是哪種情況,如果前面的驅(qū)動安裝沒有問題,連接上電腦之后可以在設(shè)備管理器也能看到一個STM BOOTLOADER
設(shè)備,而且是沒有黃色感嘆號的。這樣驅(qū)動就是OK的了。
3、打開STM32CubeProgrammer
如果驅(qū)動和接線都沒問題,那么在STM32CubeProgrammer可以看到檢測到STM32設(shè)備。
提示:如果沒有找到設(shè)備,請檢查前面的步驟。
至此,環(huán)境部分就搭建完成了。
3 固件升級
1、連接USB
把STM32的USB接入到PC端。
在STM32CubeProgrammer上連接設(shè)備。此時能讀取到芯片的Flash。
注意讀取的地址和長度,STM32的地址都是以0x08000000開始的,讀取的長度就無所謂了,看你自己的需要。
2、導(dǎo)入hex或bin文件
打開要升級的固件(hex或bin都可以)。
打開后能看到固件存儲的數(shù)據(jù)。
3、下載固件
點擊“Download”,下載固件到STM32.
4、重啟設(shè)備
升級完成后將BOOT模式要改成主Flash模式(BOOT0引腳拉低),然后重新上電或復(fù)位,即可運行新版本的代碼。
至此,整個升級流程就走完了。
結(jié)束語
好了,關(guān)于如何通過STM32內(nèi)置DFU實現(xiàn)USB升級就講到這里,這種方式雖然限制較多,但在某些應(yīng)用場景是很方便的,比如SB鍵盤,不需要自己編寫B(tài)ootloader和上位機就可以實現(xiàn)固件升級,而且官方的升級渠道還穩(wěn)定。其他應(yīng)用場景就再另說,合適的才是最好的。
如果你有什么問題或者有更好的方法,歡迎在評論區(qū)留言。