天天看點

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

在上一篇文章中,我們讨論了STM32 ARM晶片的SWD接口的使用方法。不過,該接口并不是與這款裝置互動的唯一途徑:其引導加載器還提供了一個串行接口,盡管在功能上沒有SWD接口強大,但是仍然可以用來讀寫閃存。

當然,這種用法好像不太自然:首先,因為該裝置很小,周圍又有引腳,是以,通路SWD接口不太可能比通路串行接口更難。此外,SWD和串行引導加載器都可以通過RDP(讀保護)進行“鎖定”。然而,我們已經看到,許多晶片中不同的調試/程式設計接口都具有不同的安全級别。同樣,串行端口通常比JTAG/SWD更顯眼或更易于通路。實際上,本文的主要目的,是為讀者介紹如何關閱讀資料手冊和原理圖,如何将器件切換到另一種引導模式,以及如何選用不同的工具。

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

什麼是引導加載器?

引導加載器通常是在處理器上運作的第一段代碼。它的任務是初始化硬體并執行固件代碼。在複雜系統上,通常會有一個“主”ROM引導加載器永久存儲在裝置中,以調用“輔助”引導加載器。

在非常簡單的ARM微控制器(如我們使用的Cortex-M0)上,則不需要把事情搞得這麼複雜:處理器會查找“向量表”中的第二個條目(複位向量),并執行該位址處的代碼。

然而,STM32提供了一個ROM引導加載器,它被存儲在一個叫做“系統記憶體”的東西中(意法半導體就是這麼命名的,至于為什麼這麼命名咱也不敢問)。此外,我們還可以通過引腳和閃存選項,來選擇不同的引導模式:

· 從閃存運作(正常操作)

· 從系統記憶體運作(我們考察的就是這種模式)

· 從SRAM運作(有時用于程式設計)

此外,STM32F030R8上的系統記憶體允許使用串行接口與裝置進行通信,而其他一些STM32則支援通過I2C或USB接口與裝置進行通信。

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

随處可見的資料手冊

對于STM32系列來說,我們需要關注的文檔有4套:

· 産品規格說明書(通常隻是“資料手冊”)——這主要涉及實體和電氣接口。引腳布局也可以從這套文檔中找到;對于STM32來說,記憶體映射也包括在該文檔中。

· 參考手冊——包含外圍裝置和裝置内部寄存器的詳細說明。

· 程式員手冊——包含了處理器指令集的詳細資訊。

· 應用說明——有關裝置特定功能實作的小型文檔。

對于STM32系列來說,其大部分或全部文檔都是公開的。

在整個半導體行業中,各種檔案中使用的術語和包含的資訊通常是完全不一緻的。

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

引導模式

在産品規格說明書中,我們可以看到“引導模式”一說,但是并沒有提供太多的資訊。

‍ ‍

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

‍ ‍

在參考手冊中,詳細介紹了進入各種啟動模式的方法。假如我們要進入的引導模式為“系統記憶體”模式,則需要為這個函數提供兩個輸入:nBOOT1位和BOOT0引腳。

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

預設情況下,裝置是從閃存啟動的。是以,BOOT0引腳必須接上下拉電阻。

nBOOT1位為“x”,表示“無需關心”。我們需要搞清楚它到底是什麼,以及是否需要改變它。通過在參考手冊中搜尋nBOOT1,我們發現它是選項位元組中的一個二進制位。

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

這裡的預設值是0x00FF55AA——我們需要确定第20位的值是多少。如果您熟悉十六進制的話,那麼這個問題的答案就很明顯了;否則的話,可以使用電腦将其轉換為二進制形式。

為此,我們可以在Windows電腦中輸入上面的十六進制值,并将其轉換為二進制數值。

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

現在,我們就可以直接數出相應的位數了,不過,這樣比較費勁;相反,如果點選相應的點狀按鈕,視窗将給出一些提示,這樣數起來就友善多了:

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

預設情況下,第20位(nBOOT1位)被設定為1。這就是我們要找的結果!

(對于十六進制數值0x00FF55AA,第20位的值明顯為1,因為它所在的位元組為0xFF,也就是所有位皆為1)

現在,我們需要搞清楚如何設定引腳BOOT 0。

為此,我們需要回顧一下産品規格說明書。

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

這是一個具有明确标記的引腳——60引腳。注意,永遠不要假設資料手冊中的圖像會提供可搜尋的文本!相反,我們有時必須一頁一頁地肉眼搜尋。

雖然我們可以用萬用表找到該引腳的去向,但别忘了這是一個開發闆:我們是有原理圖可供資助的。

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

關于原理圖,有幾點值得注意。

兩個黃色的框(U5A和U5B)均表示微控制器U5。它隻是分成不同的部分,以使文檔更易于了解。

針腳編号不是按順序組織的。同樣,它們是按照使文檔更易于了解的順序進行組織的。

黃色菱形框表示一個信号(或一組信号)要跳到另一頁。

在U5B上可以看到引腳BOOT0(60引腳),它引向R33——一個10K電阻。這是一個“下拉”電阻,被設計用于保持邏輯電平為0,除非該引腳直接連接配接到高電平。

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

那麼,BOOT0信号傳到哪裡去了呢?它跳轉到了另一頁。

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

準确來說,是傳到了連接配接器CN7的7号引腳——很好! 我們需要做的就是将其連接配接到高邏輯電平,這樣的話,該裝置就會進入系統記憶體引導模式。友善的是,緊挨着7号引腳的5号引腳就是“VDD”,即處理器的供電電壓。我們可以使用CN11或CN12中的一個備用跳線(它們隻是備用跳線的支架)來橋接兩者。

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

這很容易測試:您的電路闆應該運作令LED閃爍的代碼。之後,請将跳線接上,然後,按黑色的複位按鈕,這時LED應該停止閃爍,因為相關代碼不再運作了。

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

尋找UART

産品規格說明書中提到,可以通過引腳PA14/PA15或PA9/PA10來通路引導加載器。不過,我們想要的是最容易的通路方式。

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

讓我們再次回到原理圖上,我們發現:引腳PA14/15是通過CN7上的引腳15和17引出的,并且它們是彼此相鄰的。

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

與引導加載器進行互動

我們知道,裝置是通過引導加載器進行啟動的,同時,我們還知道要連接配接到哪些引腳。雖然該開發闆提供了内置的USB串行擴充卡,但它是通過PA2/PA3連接配接到USART2的。不過,由于重新配置電路闆并非易事,是以,我們将使用外部USB串行擴充卡。

如果您不熟悉序列槽的使用方法,請回顧一下介紹與序列槽進行互動的那篇文章。有一點請牢記,TX轉RX,RX轉TX。

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

我們将要使用的軟體叫做stm32flash。該軟體可以從SourceForge網站下載下傳的——是的,SourceForge網站仍然還在。我們建議大家下載下傳名為“stm32flash-0.5.tar.gz”的最新版本。

下載下傳到本地後,大家可以通過下面的指令來完成解壓、建構和安裝過程:

tar -zxvf stm32flash-0.5.tar.gz

cd stm32flash

make

sudo make install

在給STM32開發闆上電後,利用跳線拉高BOOT0的電壓,并連接配接我們的串行擴充卡,然後,運作下列指令:

sudo stm32flash /dev/ttyUSB0

上面的指令将查詢裝置以擷取相關的資訊。如果該指令無法運作的話,嘗試翻轉TX和RX。

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

現在,借助于相關指令,我們就可以讀寫閃存了。

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

小結

實際上,我們曾經在LPC5460x系列晶片上用過非常類似的技巧,來禁用SWD/JTAG;同時,您還可以将裝置設定為USB引導模式,以便通過USB讀取固件。當我們遇到問題時,一定要多翻翻相應處理器的資料手冊,說不定就能找到類似這裡介紹的“隐藏”功能。

參考及來源:https://cybergibbons.com/hardware-hacking/reading-and-writing-firmware-on-an-stm32-using-the-serial-bootloader/

pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件
pci串行端口找不到驅動程式_如何通過串行引導加載器讀寫STM32固件

繼續閱讀