【CSDN 編者按】在大模型、AI 芯片和多核服務器不斷“卷”硬件性能的時代,是否還有人愿意回到極簡主義的硬件設計,去探索最小系統(tǒng)的可能性?本篇文章講述了一位開發(fā)者如何用僅僅三個 8 引腳芯片,打造出一臺可運行 Linux 的迷你電腦,他不僅開源了所有硬件原理圖和固件代碼,還詳細介紹了從燒錄、啟動到擴展使用的全過程。
原文鏈接:https://dmitry.gr/?r=05.Projects&proj=36.%208pinLinux
作者 | Dmitry.GR 翻譯 | 鄭麗媛
出品 | CSDN(ID:CSDNnews)
長期以來,我一直在嘗試用最少的組件構建一臺能運行 Linux 的微型計算機。我也嘗試過極限簡化和各種有趣的形態(tài)設計,而這次我想做一次新的嘗試:用最簡單的方式,即只用三個 8 引腳芯片,來組裝出一臺可運行 Linux 的迷你電腦套件。

設計一臺“最小化”的極簡電腦
(1)初步構思
曾幾何時,人們可以買到 DIY 套件,然后自己在家中親手組裝出一臺能與市售計算機媲美的設備——可如今,這樣的時代早已一去不返。
現(xiàn)在的計算機由成百上千顆復雜的大型芯片構成,這些芯片不僅沒有公開的數(shù)據(jù)手冊,還通過復雜的電源傳輸拓撲結構供給數(shù)百瓦的電力。而現(xiàn)代操作系統(tǒng)對硬件的要求也愈發(fā)苛刻:GB 級別的 RAM、TB 級別的存儲空間、始終在線的網(wǎng)絡連接……簡直像是為了“更好地監(jiān)控你”而生。
那么問題來了:如果想在家就能動手組裝一臺現(xiàn)代計算機,可能嗎?我認為,只要能運行 Debian Linux、能用 vi 編輯器、能用 gcc 編譯器并能執(zhí)行 make 命令,就已經(jīng)夠“現(xiàn)代”了——于是這成為了我的目標。
基于我之前的探索,我知道這其實并不需要太高的配置:8MB 內存 + 1 MIPS(百萬條指令每秒)的處理能力就足夠了。存儲方面更簡單,SD 卡早就能輕松滿足容量需求。雖然現(xiàn)在的電腦大多沒有串口了,但對于嵌入式系統(tǒng)來說,串口仍是最簡單的接口方式,用 USB 轉串口即可代替?zhèn)鹘y(tǒng)串口。
因此,最終我設定的目標如下:至少 8MB 的 RAM、至少 1 MIPS 的處理能力、SD 卡存儲、USB 接口(用于串口通信)。
在硬件設計方面,我希望能設計出一種在家也能輕松焊接組裝的計算機,讓焊接經(jīng)驗幾乎為零、僅擁有一把 RadioShack 45W 電烙鐵的人也能做到。整機要小巧、可愛且低成本。為了降低焊接難度,我決定只使用 8 引腳芯片,這本身也是一次趣味挑戰(zhàn)。由于每顆芯片至少要保留電源和地線引腳,剩下最多只能用 6 個引腳來實現(xiàn)功能。這一限制對整個電路設計影響非常大,也造成了很多局限。
在外形上,我決定將其設計為一個小巧的圓形電路板,在頂部邊緣設置一個 USB-C 接口,如下圖所示。這就是最終能正常工作的版本,也確實是我親手用 RadioShack 45W 電烙鐵焊接完成的!

(2)零件選擇
事實上,能支持 USB 通信的 8 引腳芯片幾乎沒有,不過勉強說的話,應該有“一種半”。
第一種是真正可用的解決方案:PL2303GL。這是一款非常小巧、實用的 USB 轉串口橋接芯片,無需任何外部元器件,還能額外輸出 100mA 的 3.3V 穩(wěn)壓電壓,非常方便!它的表現(xiàn)完全符合預期,我個人非常喜歡。Prolific 官方也為幾乎所有主流和小眾操作系統(tǒng)都提供了驅動支持。唯一稍微麻煩一點的是,在 macOS 上,這些驅動程序需要從 App Store 安裝,但整個過程也還算簡單。需要一提的是,它的前代型號 PL2303SA 其實也可以用,但由于它已經(jīng)停止生產(EOL),因此我并不推薦。
那所謂的“半個芯片”又是什么意思呢?這就要提到 V-USB 項目了——它讓 ATTINYx5 系列芯片也可以實現(xiàn) USB 通信功能。雖然只能支持低速(Low-Speed) USB ,并且會占用大量 CPU 資源,但它的確可以工作。問題在于:現(xiàn)有的 USB 轉串口協(xié)議基本都要用 BULK 傳輸端點,而 USB 規(guī)范中明令禁止在低速設備中使用 BULK 端點。如果我們要完全遵守 USB 標準,那就得用中斷端點(Interrupt Endpoint)自己設計一個通信協(xié)議,并為所有主流操作系統(tǒng)編寫驅動程序——這個工作量實在太大,我也沒什么興趣。所幸,所有主流操作系統(tǒng)實際上并未嚴格執(zhí)行這一規(guī)則,即便是低速 USB 設備用上了 BULK 端點,也依然能正常識別和通信。所以,我們可以直接用 V-USB 模擬串口設備(ACM 接口),基本上都能用。
至于 RAM 的選擇,其實沒什么好猶豫的,SOIC-8 封裝的 PSRAM 就是最合適的解決方案。目前常見的供應商包括 ISSI、APMEMORY 和 Vilsion,他們已經(jīng)吹了一年多說自己要出 16MB 的 PSRAM 芯片了,但到現(xiàn)在都沒實現(xiàn)承諾,所以很可能是在畫餅。好在 8MB 的芯片貨源充足、價格便宜,在各大電商平臺花幾美元就能買到。因此,我最終決定直接用 8MB 的 RAM 來構建這臺 Linux 小電腦。
最后一個問題是:該選用哪款微控制器?通過參數(shù)篩選功能,我最終把目光放到了 STM32G0 系列。按理說,STM 芯片應該作為最后的選擇,因為它們從不認真發(fā)布完整準確的勘誤手冊。STM32G030 第一個被淘汰,因為其中一個引腳被硬設為 RESET,只剩 5 個 I/O 太局限了。STM32G031J4M6 看起來還行,這是一款比較新的芯片,也許 STM 這次有點靠譜,把以往的各種坑都填了?再說了,這個項目計劃中也不會用到太多片上外設,也許會沒問題?32KB 閃存、8KB RAM——這兩個數(shù)字秒殺所有其他選項!Cortex-M0+ 核心也讓它成為性能方面最強的候選之一。官方數(shù)據(jù)顯示,這款芯片主頻為 64MHz,稍加努力能達到 80MHz,再下點狠手,甚至能跑到 150MHz。假設我能避開勘誤表中各種已知/未知的 bug,這毫無疑問是最強選擇——雖然我不太喜歡 STM,但也只能這樣了。

硬件設計
(1)控制臺
UART 的引腳幾乎無法與其他功能復用。試圖將 UART 的 RX 引腳復用會帶來數(shù)據(jù)丟失的風險——當“其他功能”正在運行時,如果此時正好有串口數(shù)據(jù)到來,就會被錯過。而將 UART 的 TX 引腳復用也同樣不靠譜:無論“其他功能”切換得有多快,只要產生低電平脈沖,PC 就可能誤判這是一位串口字符。如果是短暫的低電平,PC 通常會將其識別為 0xFF。
理論上來說,可以通過啟用奇偶校驗來掩蓋這些干擾,但這并不是可靠方案。更何況,2025 年了誰還會用奇偶校驗呢?說到底,UART 引腳由于缺乏更高層的協(xié)議、片選信號或獨立時鐘,基本不適合與其他功能復用。
所以,這 6 個引腳中,已經(jīng)被占用掉 2 個了。我也只能無奈接受這個現(xiàn)實……
(2)RAM
所有的 SPI PSRAM 芯片都支持 QSPI 模式,以提高傳輸速度。但遺憾的是,QSPI 需要 6 個引腳,而現(xiàn)在只剩下 4 個了。好在多數(shù) PSRAM 也支持雙線 SPI 模式,這種模式下 MOSI 和 MISO 會同時傳輸,一次時鐘周期內傳送 2 位數(shù)據(jù),是普通 SPI 速率的兩倍。更棒的是,它不需要比普通 SPI 多占任何引腳,并且可以與其他設備共享 SPI 總線——因為在未被選中(deselected)時,這些設備不會驅動 MISO,也不會嘗試讀取 MOSI。
不過,STM32G031 并不原生支持 dual-SPI。如果想用,只能通過軟件模擬實現(xiàn)。但問題來了:軟件實現(xiàn) dual-SPI 的速度是否能趕上硬件 SPI 模塊?硬件 SPI 模塊可以以 CPU 時鐘一半的速率運行,并能連接 DMA 單元實現(xiàn)持續(xù)的數(shù)據(jù)傳輸。
要想用純 CPU 模擬實現(xiàn)同樣的吞吐,需要保證每次傳輸周期只消耗 4 個指令周期,這幾乎是 CPU 的極限操作,再快就不可能了。既然最快也只是“勉強追平”硬件 SPI,那又何必折騰?結論:RAM 還是用普通 SPI 訪問就好。不過,這下就直接用掉了最后剩下的 4 個引腳了。唉……
(3)SD 卡
所以,情況變得棘手了:沒有引腳剩余,但還要連一個 SD 卡。
SD 卡可以使用 SPI 通信,只需再提供一個引腳用于片選信號即可,但已經(jīng)沒有多余的引腳了。我考慮了幾種方案,最簡單的做法是,在 RAM 的 nCS 上接一個反相器(inverter),并將其輸出作為 SD 卡的 nCS 信號。我把這個思路被做了原型測試,發(fā)現(xiàn)效果還不錯。但有兩個問題:首先,有些 SD 卡不能接受那種“被選中但沒有數(shù)據(jù)發(fā)送”的情況。如果兩次 RAM 訪問之間沒有寫入數(shù)據(jù),對 SD 卡來說就像是這種異常操作,存在兼容性隱患。其次是反相器需要一個額外的 IC 或至少一個三極管,這會增加 BOM 復雜度。對于想 DIY 這塊板子的初學者來說,板子上的組件越多,組裝就越困難。因此這個方案被貼上了“最壞方案”標簽,暫時擱置,還得繼續(xù)尋找更好的解決方法。
由于這個設備的數(shù)據(jù)產出速率不高,UART 的波特率其實可以設得很低。于是可以考慮:是否能把 UART 的 TX 引腳加個低通濾波器,然后同時用作 SD 卡的 nCS?只要 SD 命令足夠短、時鐘頻率足夠高,選通信號的時間窗口就可以被濾波器“放過去”。這個方法在理論上可行,但實際上非常脆弱。我進一步計算發(fā)現(xiàn),如果想符合 SD 協(xié)議初始化要求,UART 的波特率必須低至 300bps 或更低,而即便如此,一旦 SD 卡響應速度稍慢,系統(tǒng)就容易崩潰,因為 SD 協(xié)議中明確禁止在讀取響應過程中取消片選信號。所以,這個方案甚至比第一個還差。
正當我準備回到最初那個“最壞方案”時,又突然冒出一個更瘋狂的想法:RAM 是否介意被選中后又立即取消,而不執(zhí)行任何命令或數(shù)據(jù)傳輸?實驗表明:不介意,這項測試在所有 SPI RAM 芯片上都通過了!
為啥?因為 SD 卡除了支持 SPI,還支持 SDIO 協(xié)議。SDIO 不用 4 根單向線,而是用 1 根時鐘線(CLK)和 2 根雙向線(CMD 和 DAT)。如果是 4-bit 模式,會額外加 3 根 DAT,但本項目中只用 1-bit 模式即可。盡管 SDIO 協(xié)議在公開 SD 規(guī)范中并沒有詳細說明,但可以通過觀察推理出來——這個方案雖然在引腳上節(jié)省不了多少,但帶來了新的可能性組合。
于是問題變成:是否能把 SDIO 的 3 根信號線與 RAM 的引腳復用?經(jīng)過反復推演,終于找到“可行映射”:RAM 的 nCS → SD 的 CLK;RAM 的 CLK → SD 的 CMD;RAM 的 MOSI → SD 的 DAT。分析各自訪問行為后發(fā)現(xiàn):當訪問 RAM 時,SD 卡看到的是 CLK 拉低,而當 RAM 被取消片選,CLK 就拉高。RAM 的 SPI 設置為 Mode 3,CLK 空閑態(tài)為高電平,所以每次訪問 RAM,對 SD 來說都像是 CMD 線上發(fā)送了一個“1”位。這正好對應 SDIO 協(xié)議中命令間隙的空閑狀態(tài),是安全的。
同樣,SD 卡在命令之間不會讀或寫 DAT 線,所以 RAM 的 MOSI 信號不會被誤判。反過來看,當訪問 SD 卡時,需要切換 CLK 和寫入 CMD、DAT,對 RAM 來說就是快速選中再取消——RAM 也能接受這個行為。完美!
需要注意的是,這個方案的前提是 SD 卡事務必須“一次性完成”,過程中不能訪問 RAM。這就意味著不能用多塊讀寫(multi-block),考慮到目前這種引腳緊張的現(xiàn)狀,這是可以接受的。
好了,這就是一個潛在可行的解決方案!接下來是實驗驗證,結果是——成功!當然了,由于 STM32G031 沒有對應的硬件模塊,因此 SDIO 的訪問是完全手工 bit-bang 實現(xiàn)的。最終我寫的匯編代碼達到了每位 14 個 CPU 周期的傳輸效率,總的來說表現(xiàn)還不錯。
(4)再回到控制臺
現(xiàn)在所有的 I/O 接口理論上都能塞進 6 個引腳里了,是時候正式分配每個引腳的功能了。
部分引腳的功能已經(jīng)確定:RAM 要用標準 SPI,對應的那幾根線就直接保留給它。SD 卡與 RAM 共享這些線,也無需額外分配。還剩下引腳 7 和引腳 8,這兩個引腳正好是 SWD 調試接口,在開發(fā)早期用于調試非常方便。另外通過排除法,它們也也需要作為串行端口。引腳 8 作為 A14 可以充當 USART2.TX,通過啟用 USART 的“引腳交換”功能,可以將其轉換為 USART2.RX。因為如果沒有硬件協(xié)助的話,UART 接收是很麻煩的,所以引腳 7 就留給 TX。這個引腳并不支持 USART 的任何替代功能,但沒關系,我們可以用 bit-bang 的方式手工實現(xiàn) UART 發(fā)送。
有趣的是,之前在考慮共享引腳方案時,我還想著讓 UART 盡可能慢;而現(xiàn)在,為了手動實現(xiàn) UART,波特率又得盡可能快——因為發(fā)送期間 CPU 必須專注“盯著發(fā)”,不能被打斷。每發(fā)送一個字符(以 115200bps 計算)大約只需 87 微秒。理論上我們也可以通過定時中斷逐位發(fā)送每個字符,但中斷帶來的時間抖動可能造成串口誤碼。幸好,大多數(shù)情況下設備并不會頻繁輸出,所以現(xiàn)在這個方案已經(jīng)很好了。UART 發(fā)送 bit-bang 實現(xiàn)效果良好,引腳分配也已完成,接下來就可以進入軟件開發(fā)階段了。
但你可能會問,初次燒錄怎么辦?在這種“非常規(guī)引腳布局”下,STM32 官方的引導加載程序(bootloader)怎么可能支持?確實不支持,所以我在板子上設計了 4 個可焊接跳線橋(solder bridge),通過跳線配置可以切換串口的連接方式:在“開發(fā)模式”下,bootloader 可用,但 RAM 和 SD 卡都無法工作;在“正式模式”下,ROM bootloader 失效,但項目可以正常啟動。幸好,本項目帶有自定義 bootloader,所以在初次燒錄之后,以后就無需依賴 ROM bootloader 了。


關于軟件的故事
(1)模擬器
早在項目開始前,我就已經(jīng)寫好了一個可以啟動 Linux 的 MIPS 模擬器,整個代碼用 ARMv6M 匯編語言編寫,要在新項目中復用這部分代碼并不難。
為了進一步提升性能,我還寫了一個 MIPS 到 ARMv6M 的 JIT(即時編譯器),運行效果也不錯。但不幸的是,這個 JIT 編譯器的體積太大,編譯后的代碼有 46KB,而我在這個項目中可用的翻譯緩存只有 6KB,因此性能提升效果并不明顯。最終,我選擇將這個 JIT 暫時擱置,留待日后再用。
在這次項目中,STM32G031 芯片的 32KB 閃存被劃分為兩個區(qū)域:8KB 分配給引導程序(bootloader),24KB 用于主程序(main application)。除了一些必要的優(yōu)化和適配,主模擬器代碼基本保留了原樣。
(2)引導加載程序(bootloader)
那么,為什么需要一個引導程序呢?原因其實很簡單:板子上已經(jīng)沒有多余的引腳用于調試;項目還處于開發(fā)階段,需要一種方式來升級固件、修復 bug 或添加新功能。最直接有效的方案就是設計一個支持 SD 卡、能夠識別 FAT 文件系統(tǒng)、并在檢測到新版本時自動升級固件的 bootloader。
之所以 bootloader 的大小會達到 8KB(實際上是 6.5KB,但由于閃存塊大小為 2KB,所以向上取整到了 8KB),是因為它必須包含完整的 SDIO 驅動、FAT 文件系統(tǒng)驅動、閃存寫入代碼以及大量的日志記錄以排查更新時的各種問題。當然,它還內嵌了一個基于 bit-bang 實現(xiàn)的 UART 發(fā)送模塊。bootloader 會檢查主程序鏡像中偏移地址 16 處的數(shù)值,這是主程序的版本號。只有當更新文件中的版本號高于當前主程序,并且通過了一些基本校驗,才會執(zhí)行更新。至于 bootloader 自身的版本號,則被記錄在偏移地址 8 處,僅用于顯示啟動信息。符合條件的固件更新文件名為 FIRMWARE.BIN,一旦通過校驗,就會被應用。
bootloader 本身在芯片復位后運行,其默認頻率為 16MHz。而主程序運行時的頻率是可調的,方便用戶嘗試超頻。但頻繁地手動修改代碼、重新編譯并燒錄固件,太費勁了。這個問題可以通過一個小技巧輕松解決:既然 bootloader 已經(jīng)掛載了 FAT 文件系統(tǒng)用于檢查更新,那么順便也可以掃描是否存在以 CLOCK 開頭命名的文件或文件夾。如果有,它后面的數(shù)字就會被解析為主程序的運行頻率(單位 MHz)。如果這個值不在合理范圍(32–200MHz)內,或者找不到相關文件,則默認設為 132MHz。
(3)SD 卡分區(qū)與啟動過程
和我之前幾個基于 MIPS 模擬器的項目一樣,本項目的啟動流程也借鑒了 PC 啟動過程的設計。系統(tǒng)首先讀取 SD 卡的第一個扇區(qū)(sector),將其加載到內存前幾個字節(jié)中,然后跳轉執(zhí)行;這個一級引導代碼會繼續(xù)尋找一個分區(qū)類型為 0xBB 的分區(qū),并將其完整加載至內存地址 0x80001000,然后再次跳轉;此時,二級引導程序開始運行,它具備日志和串口輸出功能;它會掃描所有分區(qū),找到被標記為“active”的那個,嘗試將其掛載為 FAT16 文件系統(tǒng);如果該分區(qū)中存在名為 VMLINUX 的文件,它會將其作為 ELF 文件加載,并跳轉至其入口地址;如果該文件是一個有效的 Linux 內核,就會進入 Linux 系統(tǒng)啟動流程。
傳遞給內核的啟動參數(shù)(command line)被硬編碼在 bootloader 中,不支持動態(tài)修改。它指定內核將 /dev/pvd3 作為根文件系統(tǒng),并以 /sbin/uMIPSinit 作為 init 程序,同時它還會嘗試將 /dev/pvd1 掛載為 /boot 目錄。
仔細閱讀上文可以發(fā)現(xiàn),雖然系統(tǒng)要求根文件系統(tǒng)必須在第 3 個分區(qū)(pvd3),但其它分區(qū)順序其實并沒有強制要求——這是刻意為之的設計。對于這個項目,F(xiàn)AT 分區(qū)是第一個,bootloader 分區(qū)是第二個,Linux 根文件系統(tǒng)是第三個。為什么呢?當插入具有多個分區(qū)的 SD 卡時,Windows 和 macOS 會掛載第一個分區(qū), 而Linux 會掛載所有分區(qū),這意味著:
FAT 分區(qū)既可以被 PC 端輕松訪問,也能被啟動后的 Linux 系統(tǒng)掛載到 /boot,用于文件傳輸和更新;
無論從 PC 還是從 Linux 內部,都可以通過修改 CLOCK 文件來調整 CPU 頻率,極大提升了靈活性。
bootloader 在開始執(zhí)行任何操作之前,首先會靜靜地等待 6 秒鐘。這段延遲是在重新配置引腳前進行的,目的是為用戶留出一段時間連接調試器(SWD),因為開發(fā)板上預留了一個 4 針的調試接口。超過 6 秒后,bootloader 會重新配置引腳,此時 SWD 功能不再可用,調試器無法再連接。此外,作為一種后備機制,bootloader 還會通過設置 option bytes 選項字節(jié),實現(xiàn)如下行為:如果將 BOOT0 引腳(第 8 引腳)拉高,芯片將從 ROM 啟動;
禁用芯片的 RESET 引腳(在本項目中作為普通 GPIO 使用)和 BOR(低電壓復位,在本項目中沒有用)。一切就緒后,bootloader 會嘗試初始化與 SD 卡的通信,檢查更新文件,最后正式啟動系統(tǒng)。

性能如何?
STM32G031 官方標稱的最高運行頻率是 64MHz,那為什么這里還要討論讓它跑到 150MHz 呢?原因是:只要適當應用一些“黑科技”,STM32G031 實際上超頻能力非常強。STM32G031 的 CPU 核心電壓由內部穩(wěn)壓器供電,而這個電壓可以通過 PWR->CR1 寄存器進行調整。ST 官方文檔中提到了兩種電壓設置:VOS2(對應 1.0V 的 Vcore),在這種設置下芯片只能跑到 16MHz;VOS1(對應于 1.2V 的 Vcore),這種情況下芯片只能跑到 64MHz。
實際測試表明,在 VOS1 模式下,STM32G031 可以穩(wěn)定運行在 75MHz 左右,這已經(jīng)算是一次不錯的超頻了,但還不算驚艷。然而,早期文檔(以及同系列芯片的資料)中還提到了 VOS0 模式,對應 1.35V 的 Vcore。如果我們強行嘗試開啟這個電壓模式,會怎樣?結果讓人驚喜——真的能用,而且超頻潛力大幅提高:大多數(shù)芯片在 136MHz 時仍能穩(wěn)定運行,個別體質優(yōu)良的芯片甚至能沖上 180MHz!當然,F(xiàn)lash 的訪問速度并不會隨著頻率提升而同步加快,因此必須正確設置 Flash 的等待周期(wait state),雖然這會影響一些速度提升,但綜合來看還是值得的。
在主頻達到 148MHz 時,這顆 STM32 模擬運行的 MIPS CPU,大致等效于 1.65MHz 的 MIPS R3000(禁用 FPU)。它算不上性能怪獸,但能在大約一分鐘內啟動,并且 vi、make、objdump 和 gcc 等工具都能正常工作——這是一個完整的 Debian 系統(tǒng),你甚至可以通過 /boot 目錄導入 .deb 包并安裝,一切都能跑起來。

最后組裝!
(1)獲取零件
你可以選擇自己購買零件,并把 PCB 板送到自己喜歡的打板廠打樣焊接。另外,我們也正在尋找合作廠商來打包成套件發(fā)售,如果你有相關線索可以聯(lián)系我——這可能是極佳的 DIY 禮物!

(2)初步焊接
接下來是你們最關心的部分:如何自己動手焊出這塊板子。你手上這塊板子,其實我已經(jīng)盡量把它設計成容易組裝的。我們推薦的焊接順序如下:
先焊 SD 卡座,對準位置后,一次焊一根引腳,然后焊四個固定角腳(焊的時候耐心一點);
焊接所有電容器,總共 4 個而且數(shù)值一樣,很好認,分別裝到 C1~C4 位置;
焊接所有電阻器,也是相同阻值,依次裝到 R2 ~ R7 位置(注意:沒有 R4),暫時不要焊 R101、R102、R201、R202,這幾個后面還有其他用途;
焊接主控芯片 STM32G031J6,放在標記為 U1 的位置,且方向很重要(第一個引腳上有一個小小的 ST Logo 標記,對應 PCB 板上那個小圓點);
焊接 USB 轉串口芯片(PL2303GL),放在標記為 U3 的位置。在這個芯片上,引腳 1 通常用芯片頂部的一個小凹坑標識,對齊板子上的標記后焊接即可。
(3)二次焊接
這個階段要給 STM32 刷入 bootloader。為此,可以下載 STM 提供的燒錄工具(Windows 用戶可使用官方 flasher,其他系統(tǒng)可以用開源的 stm32flash 工具)。準備一根 USB-C 線,用兩根細導線橋接電路板上標記為 R101 和 R201 的位置,此時確保 SD 卡未插入且尚未焊接 RAM 芯片。然后,將板子通過 USB-C 接入電腦,系統(tǒng)應識別到一個虛擬串口,使用燒錄工具寫入 BOOTLOADER.BIN 文件(路徑和串口名稱視系統(tǒng)而定)。
燒錄完成后,移除用于橋接 R101 和 R201 的焊接導線,改為連接 R102 和 R202,這也是串口引腳的最終正確配置。最后,焊接 RAM 芯片(APS6408 或 VTI7064,位置為 U2),此芯片的引腳 1 也有一個小凹坑標識,將其對齊 PCB 上的小圓點并焊接即可。至此,硬件部分組裝完成!

燒錄主固件并完成首次啟動
我們需要使用磁盤鏡像寫入工具,將提供的系統(tǒng)鏡像寫入一張容量不小于 1GB 的 SD 卡中,具體如下:
(1)Windows:使用 [Win32 Disk Imager];
(2)macOS:使用系統(tǒng)自帶的“磁盤工具”(Disk Utility);
(3)Linux:使用 dd 命令。
這個系統(tǒng)鏡像里已經(jīng)包含了完整的啟動流程:包括第一階段的 MIPS 啟動程序、第二階段的 MIPS 啟動程序、包含 Linux 內核與固件的分區(qū),以及一個 Debian 根文件系統(tǒng)(rootfs)。
鏡像寫入完成后,彈出并重新插入 SD 卡,電腦會識別并掛載 FAT 文件系統(tǒng)分區(qū)。此時,請將下載包中的主固件 FIRMWARE.BIN 拷貝進 SD 卡的 FAT 分區(qū)中。這個步驟的作用是讓啟動引導程序在第一次啟動時自動識別并燒錄該固件。如果你沒有重新編譯固件,其實這個步驟可以跳過,因為鏡像本身已經(jīng)包含了這個文件。不過即便重復操作也不會有任何副作用,可以放心執(zhí)行——如此,一切便準備就緒!
插入 SD 卡,再次將 USB-C 數(shù)據(jù)線連接至電腦,打開你喜歡的串口終端軟件,并將其配置為 115,200 bps,8N1 格式。幾秒鐘后,你將看到串口終端開始打印啟動信息,這是多個啟動階段依次執(zhí)行的過程。第一次啟動時,STM32 的熔絲(fuse)將被寫入配置,此時可能需要你在串口信息停止時重新插拔一次 USB-C 接口。由于熔絲是非易失性的,因此只需執(zhí)行一次即可。大約 20 秒后,你將看到 Linux 內核啟動的打印信息,整個啟動過程大約需要 1 分鐘,最終你將看到一 shell 提示符??紤]到系統(tǒng)僅有 8MB 的內存,因此建議你在登錄后先執(zhí)行 swapon /swapfile 命令啟用交換空間,啟用過程大約需要幾十秒,完成后你就可以運行更多命令和程序了!
最后,感興趣的開發(fā)者可以自行下載這個壓縮包:https://dmitry.gr/images/uMIPS.8PL.zip,里面包含了該項目所需的全部內容,期待各位的 DIY 之旅!
熱門跟貼