加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 1 硬件介紹
    • 2 環(huán)境搭建
    • 3 固件升級
    • 結(jié)束語
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

STM32 IAP應(yīng)用開發(fā)——通過內(nèi)置DFU實現(xiàn)USB升級(方式1)

04/11 16:33
9373
閱讀需 12 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

什么是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)如下圖:

請?zhí)砑訄D片描述

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

請?zhí)砑訄D片描述

根據(jù)自己的操作系統(tǒng)下載對應(yīng)的安裝包,然后直接安裝即可。

請?zhí)砑訄D片描述

提示:默認地址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。

請?zhí)砑訄D片描述

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)裝好了。

請?zhí)砑訄D片描述

2)能看到下圖這個STM32 BOOTLOADER設(shè)備,但是有黃嘆號,說明驅(qū)動異常,需要用zadig重新安裝。

在這里插入圖片描述
打開前面下載好的zadig,點擊Install WCID Driver安裝即可。

請?zhí)砑訄D片描述

等待安裝完成。

請?zhí)砑訄D片描述

安裝完成后可以在zadig上看到設(shè)備,打開設(shè)備管理器,也能看到一個沒有黃嘆號的STM32 BOOTLOADER設(shè)備。

請?zhí)砑訄D片描述

請?zhí)砑訄D片描述

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的了。

請?zhí)砑訄D片描述

3、打開STM32CubeProgrammer

如果驅(qū)動和接線都沒問題,那么在STM32CubeProgrammer可以看到檢測到STM32設(shè)備。

提示:如果沒有找到設(shè)備,請檢查前面的步驟。

請?zhí)砑訄D片描述

至此,環(huán)境部分就搭建完成了。

3 固件升級

1、連接USB

把STM32的USB接入到PC端。

在這里插入圖片描述

在STM32CubeProgrammer上連接設(shè)備。此時能讀取到芯片的Flash。

注意讀取的地址和長度,STM32的地址都是以0x08000000開始的,讀取的長度就無所謂了,看你自己的需要。

請?zhí)砑訄D片描述

2、導(dǎo)入hex或bin文件

打開要升級的固件(hex或bin都可以)。

請?zhí)砑訄D片描述

請?zhí)砑訄D片描述

打開后能看到固件存儲的數(shù)據(jù)。

請?zhí)砑訄D片描述

3、下載固件

點擊“Download”,下載固件到STM32.

請?zhí)砑訄D片描述

4、重啟設(shè)備

升級完成后將BOOT模式要改成主Flash模式(BOOT0引腳拉低),然后重新上電或復(fù)位,即可運行新版本的代碼。

請?zhí)砑訄D片描述

至此,整個升級流程就走完了。

結(jié)束語

好了,關(guān)于如何通過STM32內(nèi)置DFU實現(xiàn)USB升級就講到這里,這種方式雖然限制較多,但在某些應(yīng)用場景是很方便的,比如SB鍵盤,不需要自己編寫B(tài)ootloader和上位機就可以實現(xiàn)固件升級,而且官方的升級渠道還穩(wěn)定。其他應(yīng)用場景就再另說,合適的才是最好的。

如果你有什么問題或者有更好的方法,歡迎在評論區(qū)留言。

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
SN74ALVC164245DLR 1 Texas Instruments 16-Bit 2.5-V to 3.3-V/3.3-V To 5-V Level Shifting Transceiver With 3-State Outputs 48-SSOP -40 to 85

ECAD模型

下載ECAD模型
$2.95 查看
FC5BQCCMM20.0-T1 1 Fox Electronics Parallel - Fundamental Quartz Crystal, 20MHz Nom, SMD, 4 PIN
$0.99 查看
CSTNE8M00G520000R0 1 Murata Manufacturing Co Ltd Ceramic Resonator,

ECAD模型

下載ECAD模型
$0.65 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜