什么是IAP?
IAP(In-Application Programming) 指MCU可以在系統(tǒng)中獲取新代碼并對(duì)自己重新編程,即可用程序來(lái)改變程序。在應(yīng)用編程(IAP)是用戶的應(yīng)用代碼對(duì)片內(nèi)Flash存儲(chǔ)器進(jìn)行擦除/編程的方法。這種方式的典型應(yīng)用就是用一小段代碼來(lái)實(shí)現(xiàn)程序的下載,實(shí)際上單片機(jī)的ISP功能就是通過(guò)IAP技術(shù)來(lái)實(shí)現(xiàn)的,即片子在出廠前就已經(jīng)有一段小的boot程序在里面,片子上電后,開(kāi)始運(yùn)行這段程序,當(dāng)檢測(cè)到上位機(jī)有下載要求時(shí),便和上位機(jī)通信,然后下載數(shù)據(jù)到數(shù)據(jù)存儲(chǔ)區(qū),從而實(shí)現(xiàn)固件升級(jí)。
什么是BootLoader?
百度百科:在嵌入式操作系統(tǒng)中,BootLoader是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行??梢猿跏蓟?a class="article-link" target="_blank" href="/tag/%E7%A1%AC%E4%BB%B6/">硬件設(shè)備、建立內(nèi)存空間映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。在嵌入式系統(tǒng)中,通常并沒(méi)有像BIOS那樣的固件程序(注,有的嵌入式CPU也會(huì)內(nèi)嵌一段短小的啟動(dòng)程序),因此整個(gè)系統(tǒng)的加載啟動(dòng)任務(wù)就完全由BootLoader來(lái)完成。
實(shí)際上,BootLoader不僅僅在操作系統(tǒng)上使用,在一些內(nèi)存小,功能應(yīng)用較為簡(jiǎn)單的單片機(jī)設(shè)備上面也可以通過(guò)BootLoader來(lái)完成固件升級(jí)。
什么是DFU?
DFU全稱為Download Firmware Update,是ST官方推出的一個(gè)通過(guò)USB接口進(jìn)行IAP升級(jí)的方案,同串口ISP一樣,他們都集成在了芯片內(nèi)部的Bootloader區(qū)段,可以通過(guò)配置boot引腳來(lái)啟動(dòng)。
不過(guò)STM32內(nèi)置DFU的型號(hào)都比較新,像STM32F4系列是有的,但是像F0和F1系列則沒(méi)有,不過(guò)沒(méi)有關(guān)系,如果你用的型號(hào)沒(méi)有內(nèi)置DFU程序,也可以通過(guò)CubeMX來(lái)快速生成和移植一個(gè)DFU功能程序到你的Flash中來(lái)使用。
使用DFU的優(yōu)缺點(diǎn)?
使用DFU的好處是不用自己制作Bootloader,因?yàn)檫@部分代碼在STM32出廠之前就已經(jīng)做好并且燒錄進(jìn)去了,而且不占用用戶代碼的Flash,另外,在PC端我們也不需要專門(mén)定制一個(gè)上位機(jī),因?yàn)楣俜骄陀袑iT(mén)的升級(jí)Tool以及USB驅(qū)動(dòng)。
缺點(diǎn)是要改變boot引腳的電平,才能啟動(dòng)Bootloader,這樣的話在應(yīng)用場(chǎng)景上就有比較大的限制了。
所以,要根據(jù)項(xiàng)目的實(shí)際需求去選擇合適的方案。
我之前也有發(fā)過(guò)一些關(guān)于STM32遠(yuǎn)程升級(jí)的文章,實(shí)現(xiàn)的方式有很多種,感興趣的同學(xué)可以去看一下。
STM32 IAP應(yīng)用開(kāi)發(fā)——通過(guò)內(nèi)置DFU實(shí)現(xiàn)USB升級(jí)(方式1)
固件升級(jí)系列合集:https://blog.csdn.net/ShenZhen_zixian/article/details/129074047
1 硬件介紹
我這里測(cè)試用的是STM32F407。
用到的硬件接口如下:
接口 | 引腳 | 作用 |
---|---|---|
USB | PA11 PA12 | (必要)通過(guò)USB連接PC端,用來(lái)傳輸固件以實(shí)現(xiàn)升級(jí) |
BOOT | BOOT0 BOOT1 | (必要)通過(guò)改變boot電平來(lái)切換運(yùn)行模式 |
串口 | PA9 | (非必要)通過(guò)CH340連接到PC端,打印固件版本號(hào),方便查看升級(jí)是否成功 |
LED | PF9 | (非必要)方便查看代碼是否跑起來(lái)了 |
BOOT引腳配置對(duì)應(yīng)如下圖:
1)主Flash
主Flash起始地址為0x08000000
,它指的是STM32內(nèi)置Flash,通常我們燒錄的代碼就是存放在這個(gè)位置。
2)系統(tǒng)存儲(chǔ)器
系統(tǒng)存儲(chǔ)器起始地址為0x1FFF0000
,這種模式啟動(dòng)的程序功能是由芯片廠家設(shè)置的,STM32在出廠時(shí)會(huì)這個(gè)區(qū)域內(nèi)置一段BootLoader, 也就是我們常說(shuō)的ISP程序, 這是一塊ROM,出廠后無(wú)法修改。我們要使用的DFU就是放在這里。
3)嵌入式SRAM
嵌入式SRAM起始地址為0x20000000
,既然是SRAM,自然也就沒(méi)有程序存儲(chǔ)的能力了,這個(gè)模式一般用于程序調(diào)試。假如我只修改了代碼中一個(gè)小小的 地方,然后就需要重新擦除整個(gè)Flash,比較的費(fèi)時(shí),可以考慮從這個(gè)模式啟動(dòng)代碼(也就是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)境搭建好之后需要準(zhǔn)備一個(gè)能夠正常運(yùn)行的代碼,用來(lái)測(cè)試我們后面的固件升級(jí)。
2.2 DfuSeDemo
1、下載DfuSeDemo
DfuSeDemo是用來(lái)升級(jí)固件的,可以在ST的官網(wǎng)下載。
下載地址:https://www.st.com/en/development-tools/stsw-stm32080.html
注:本文測(cè)試的時(shí)候,用的是v3.0.6版本。
2、安裝DfuSeDemo
下載完成后直接安裝即可。
提示:記住安裝的路徑,后面要用。
默認(rèn)安裝路徑:C:Program Files (x86)STMicroelectronicsSoftwareDfuSe v3.0.6Bin
。
安裝好之后打開(kāi)安裝路徑的文件夾,會(huì)看到以下幾個(gè)文件。
3、安裝驅(qū)動(dòng)
根據(jù)自己的操作系統(tǒng)選擇對(duì)應(yīng)的驅(qū)動(dòng)。(Win11的自行查閱資料安裝)
64系統(tǒng)安裝dpinst_amd64.exe
,32位系統(tǒng)安裝dpinst_x86.exe
。
2.3 檢查USB驅(qū)動(dòng)
1、讓STM32進(jìn)入系統(tǒng)存儲(chǔ)器啟動(dòng)模式
也就是配置BOOT0引腳拉高,BOOT1引腳拉低。
提示:BOOT引腳的狀態(tài)要在MCU啟動(dòng)之前配置好才能進(jìn)入對(duì)應(yīng)的模式,可以先配置BOOT引腳再上電,也可以在配置好BOOT引腳之后復(fù)位MCU。
2、把STM32的USB連接到PC端
如果前面的驅(qū)動(dòng)安裝沒(méi)有問(wèn)題,連接上電腦之后可以在設(shè)備管理器看到一個(gè)STM Device in DFU Mode
設(shè)備。
3、打開(kāi)DfuSeDemo
如果驅(qū)動(dòng)和接線都沒(méi)問(wèn)題,那么在DfuSeDemo可以看到已連接的STM32設(shè)備以及DFU的一些信息(VID、PID以及軟件版本)。
提示:如果沒(méi)有找到設(shè)備,請(qǐng)檢查前面的步驟。
至此,環(huán)境就搭建完成了。
3 固件升級(jí)
3.1 打包新版本固件
因?yàn)镈fuSeDemo只能下載dfu文件,所以在進(jìn)行在線升級(jí)之前我們要先將編譯好的hex文件或者bin文件轉(zhuǎn)換成dfu文件。用的工具是DfuFileMgr.exe
,前面其實(shí)也有提到,在DfuSeDemo的安裝目錄里面就有,不需要再額外安裝了。
hex跟bin最終的效果基本是一樣的,根據(jù)自己的需求選其中一種方式即可。
1、打包hex文件
步驟如下:
1)輸入設(shè)備信息
提示:設(shè)備信息在DfuSeDemo中可以看到。
2)打開(kāi)hex文件
3)生成dfu文件
4)保存dfu文件
5)成功生成dfu文件
2、打包bin文件
步驟如下:
1)輸入設(shè)備信息
提示:設(shè)備信息在DfuSeDemo中可以看到。
2)選擇bin文件并輸入Flash起始地址
3)生成dfu文件
4)保存dfu文件
5)成功生成dfu文件
3.2 升級(jí)固件
1、打開(kāi)DfuSeDemo
2、導(dǎo)入打包好的dfu文件
3、升級(jí)固件
4、重啟設(shè)備
升級(jí)完成后可以在DfuSeDemo上面點(diǎn)擊Leave DFU mode退出DFU模式。
也可以配置好新的BOOT模式之后重啟或重新上電。
提示:BOOT模式要改成主Flash模式(BOOT0引腳拉低)才能正常運(yùn)行新版本的代碼。
至此,整個(gè)升級(jí)流程就走完了。
結(jié)束語(yǔ)
好了,關(guān)于如何通過(guò)STM32內(nèi)置DFU實(shí)現(xiàn)USB升級(jí)就講到這里,這種方式雖然限制較多,但在某些應(yīng)用場(chǎng)景是很方便的,比如SB鍵盤(pán),不需要自己編寫(xiě)B(tài)ootloader和上位機(jī)就可以實(shí)現(xiàn)升級(jí),而且官方的升級(jí)渠道還穩(wěn)定。其他應(yīng)用場(chǎng)景就再另說(shuō),合適的才是最好的。
如果你有什么問(wèn)題或者有更好的方法,歡迎在評(píng)論區(qū)留言。