計(jì)查找指南:官方渠道與開(kāi)源平臺(tái)使用經(jīng)驗(yàn))
做嵌入式這幾年我越來(lái)越覺(jué)得STM32項(xiàng)目最值錢的東西不是代碼而是那套“已經(jīng)有人驗(yàn)證過(guò)的電路和程序”。很多人拿到一個(gè)新需求第一反應(yīng)是打開(kāi)數(shù)據(jù)手冊(cè)從頭啃或者在群里問(wèn)“這個(gè)模塊怎么接”其實(shí)最高效的路徑是先去把參考設(shè)計(jì)翻出來(lái)——?jiǎng)e人已經(jīng)把坑踩平了你照著走就行。這篇就把我這些年攢下來(lái)的STM32參考設(shè)計(jì)查找渠道和使用經(jīng)驗(yàn)整理一下尤其側(cè)重國(guó)內(nèi)能直接訪問(wèn)、能下載、能抄作業(yè)的資源給正在做項(xiàng)目或者準(zhǔn)備畢業(yè)設(shè)計(jì)的兄弟一份實(shí)在的索引。1. 先把參考設(shè)計(jì)這個(gè)東西說(shuō)透它到底幫你省了什么事1.1 參考設(shè)計(jì)不是原理圖那么簡(jiǎn)單很多新手把參考設(shè)計(jì)等同于“一張?jiān)韴D”這是最大的誤解。一份真正有用的參考設(shè)計(jì)應(yīng)該是一個(gè)完整的“解決方案包”原理圖只是最表面的東西底下還壓著PCB版圖、物料清單、固件源碼、調(diào)試說(shuō)明甚至包括設(shè)計(jì)者踩坑后的修改記錄。我見(jiàn)過(guò)很多人興致勃勃下載了一個(gè)開(kāi)源項(xiàng)目結(jié)果發(fā)現(xiàn)只有一張?jiān)韴D截圖引腳定義模糊元器件封裝對(duì)不上最后只能自己重新畫板等于白忙一場(chǎng)。參考設(shè)計(jì)的本質(zhì)是別人替你完成了一次“從需求到驗(yàn)證”的完整閉環(huán)。它告訴你三件事這個(gè)芯片應(yīng)該怎么供電、這些外設(shè)接口應(yīng)該怎么連接、這套代碼跑起來(lái)需要什么初始化順序。比如很多人在網(wǎng)上搜“STM32如何做USB設(shè)備”其實(shí)ST官方和社區(qū)早就把USB虛擬串口、USB HID、USB大容量存儲(chǔ)這些常見(jiàn)設(shè)備的參考實(shí)現(xiàn)做好了你只需要找到對(duì)應(yīng)型號(hào)的例程包把設(shè)備描述符改一改就能跑通比自己從USB協(xié)議棧底層開(kāi)始摳要省出好幾周時(shí)間。1.2 一份靠譜參考設(shè)計(jì)至少要有這五樣?xùn)|西我拿到一份參考設(shè)計(jì)第一件事不是看它用了什么炫酷的芯片而是按下面這個(gè)清單檢查完整性原理圖源文件或高清PDF最好能看清每個(gè)引腳的網(wǎng)絡(luò)標(biāo)號(hào)而不只是一張模糊的截圖。PCB版圖文件至少得有Gerber或者EDA源工程方便自己改板子純粹的3D預(yù)覽圖不算。BOM表要帶封裝、數(shù)值、型號(hào)最好有立創(chuàng)商城或DigiKey的編號(hào)這樣采購(gòu)才能落地。固件源碼注意看用的是標(biāo)準(zhǔn)庫(kù)、HAL庫(kù)還是LL庫(kù)以及對(duì)應(yīng)的CubeMX版本這決定你能不能直接編譯。設(shè)計(jì)說(shuō)明或調(diào)試記錄哪怕只有幾行字寫“這個(gè)板子的ADC參考電壓必須接外部基準(zhǔn)”也值回票價(jià)了。判斷一份參考設(shè)計(jì)能不能“抄”就看這五樣?xùn)|西齊不齊。齊了你復(fù)制的是成功經(jīng)驗(yàn)不齊你復(fù)制的是運(yùn)氣。2. 官方正規(guī)軍ST官網(wǎng)和GitHub上那些藏得比較深的寶藏2.1 ST官網(wǎng)的參考設(shè)計(jì)層級(jí)你得按這個(gè)順序翻ST官網(wǎng)st.com是參考設(shè)計(jì)的第一源頭但很多人上去就懵因?yàn)樾畔⑻芰?。我的?jīng)驗(yàn)是先盯住產(chǎn)品頁(yè)的“Design Resources”分區(qū)再到“Application Notes”里找對(duì)應(yīng)的應(yīng)用筆記。以STM32F103為例產(chǎn)品頁(yè)下面會(huì)掛一堆PDF和壓縮包其中最有價(jià)值的是三類評(píng)估板文檔比如NUCLEO-F103RB的原理圖、PCB源文件、應(yīng)用筆記AN開(kāi)頭的一堆PDF比如AN4879這種講USB的、以及參考設(shè)計(jì)RD開(kāi)頭的完整方案通常含原理圖、PCB和測(cè)試報(bào)告。應(yīng)用筆記里有個(gè)很多人沒(méi)注意的細(xì)節(jié)每一篇AN末尾幾乎都有一節(jié)“Reference Design”或“Related Tools”把官方驗(yàn)證過(guò)的原理圖鏈接、例程下載地址全部列出來(lái)了。也就是說(shuō)你從一篇應(yīng)用筆記就能順藤摸瓜摸到一整套經(jīng)過(guò)官方測(cè)試的電路和代碼。比如做USB相關(guān)設(shè)計(jì)可以在官網(wǎng)搜索框直接輸入“USB reference design STM32”就能翻到官方USB設(shè)備的完整參考設(shè)計(jì)頁(yè)面里面有原理圖PDF、BOM、PCB Gerber和例程工程。還有一類容易被忽略的是Discovery和Nucleo評(píng)估板的資料包。這兩類板子出廠就配了完整的原理圖PDF、PCB源文件、以及一份很詳細(xì)的“Getting Started”文檔。對(duì)做原型驗(yàn)證的人來(lái)說(shuō)評(píng)估板的PCB布局就是一份高質(zhì)量的布線參考比如晶振位置怎么擺、去耦電容怎么放、USB差分對(duì)怎么走——這些都是ST工程師驗(yàn)證過(guò)的比你自己摸索靠譜得多。2.2 GitHub上的STM32Cube固件包才是真正的代碼寶庫(kù)官方固件包在GitHub上的組織方式是STM32CubeF1、STM32CubeF4、STM32CubeL4這種按系列分的倉(cāng)庫(kù)每個(gè)倉(cāng)庫(kù)里都有一個(gè)Projects目錄底下按開(kāi)發(fā)板或者應(yīng)用場(chǎng)景放了大量可直接編譯的示例工程。我舉個(gè)實(shí)際例子你要做STM32的USB轉(zhuǎn)串口直接進(jìn)STM32CubeF4倉(cāng)庫(kù)找到Projects/STM32F4-Discovery/Applications/USB_Device里面就有現(xiàn)成的CDC類虛擬串口工程Device descriptor、配置描述符全寫好你只需要改一下引腳對(duì)應(yīng)的USB D/D-配置就能用。國(guó)內(nèi)訪問(wèn)GitHub有時(shí)候速度不太穩(wěn)定我習(xí)慣先去Gitee搜官方倉(cāng)庫(kù)的鏡像比如搜“STM32CubeF4”就能找到同步倉(cāng)庫(kù)下載速度會(huì)快很多。另外GitHub的搜索功能別浪費(fèi)搜關(guān)鍵詞的時(shí)候加上語(yǔ)言限制和倉(cāng)庫(kù)更新時(shí)間過(guò)濾比如搜“stm32 usb device language:C”或者“stm32 參考設(shè)計(jì) pushed:2023-01-01”能篩掉一大批早就不維護(hù)的老古董項(xiàng)目。官方倉(cāng)庫(kù)里的代碼注釋也比較規(guī)范對(duì)想深入理解協(xié)議棧的人幫助不小。3. 國(guó)內(nèi)開(kāi)源硬件平臺(tái)立創(chuàng)開(kāi)源廣場(chǎng)和硬創(chuàng)社最適合“抄作業(yè)”3.1 立創(chuàng)開(kāi)源硬件平臺(tái)從原理圖到PCB一站式抄完國(guó)內(nèi)做參考設(shè)計(jì)最爽的平臺(tái)我個(gè)人首選立創(chuàng)開(kāi)源硬件平臺(tái)oshwhub.com。這個(gè)平臺(tái)最大的特點(diǎn)是每個(gè)開(kāi)源項(xiàng)目都掛在一個(gè)可以直接編輯的在線EDA工程上你點(diǎn)進(jìn)項(xiàng)目詳情頁(yè)能看到原理圖、PCB、BOM、甚至PCB的3D渲染圖全部在線可看。再點(diǎn)一下“克隆工程”整個(gè)項(xiàng)目就直接復(fù)制到你的立創(chuàng)EDA工作區(qū)了改個(gè)絲印、換個(gè)封裝、刪掉不要的模塊重新導(dǎo)出Gerber下單打樣一個(gè)板子就這么出來(lái)了。這里面大量項(xiàng)目都跟STM32相關(guān)搜索時(shí)直接輸入“STM32”能出來(lái)上千個(gè)項(xiàng)目從最小系統(tǒng)板、四軸飛控、平衡小車、到魚(yú)缸自動(dòng)喂食器都有。比如有人搜“stm32超聲波測(cè)距”就能找到帶HC-SR04接口、OLED顯示、還有鋰電池充電管理TP4056的完整項(xiàng)目原理圖里連電阻阻值都標(biāo)得清清楚楚BOM表也能直接導(dǎo)出去立創(chuàng)商城一鍵下單。對(duì)一個(gè)想三天搭出原型的人來(lái)說(shuō)這種體驗(yàn)比對(duì)著數(shù)據(jù)手冊(cè)畫板不知道高到哪里去了。用立創(chuàng)平臺(tái)的時(shí)候有個(gè)技巧優(yōu)先看“項(xiàng)目被克隆次數(shù)”和評(píng)論區(qū)??寺〈螖?shù)多說(shuō)明這個(gè)項(xiàng)目確實(shí)被很多人驗(yàn)證過(guò)有評(píng)論說(shuō)“打樣成功”“程序燒錄正常”的可信度就更高。另外還要注意項(xiàng)目的更新日期2020年以前的工程用的芯片封裝可能已經(jīng)停產(chǎn)或者換了絲印直接打樣容易踩坑。3.2 硬創(chuàng)社和其他國(guó)內(nèi)方案商的參考設(shè)計(jì)庫(kù)除了立創(chuàng)開(kāi)源平臺(tái)國(guó)內(nèi)還有一類資源是各方案公司和代理商整理的參考設(shè)計(jì)庫(kù)。比如硬創(chuàng)社這類做硬件方案交易的平臺(tái)里面會(huì)有一些企業(yè)放出來(lái)的半公開(kāi)參考設(shè)計(jì)雖然代碼可能不完整但原理圖和選型思路很有參考價(jià)值。尤其是一些細(xì)分領(lǐng)域比如電機(jī)驅(qū)動(dòng)、智能家居網(wǎng)關(guān)、電池管理系統(tǒng)企業(yè)做的方案比個(gè)人開(kāi)源項(xiàng)目更嚴(yán)謹(jǐn)保護(hù)電路和EMC處理會(huì)更到位。另外立創(chuàng)商城自己的“方案中心”和“應(yīng)用方案”板塊也值得挖一挖。它里面很多方案是商城工程師用自家元器件搭的BOM里的每個(gè)料號(hào)都能直接買到對(duì)做原型采購(gòu)來(lái)說(shuō)非常方便。我看到熱詞里有人找“tp4056參考設(shè)計(jì)”這就是典型的模塊級(jí)參考需求——鋰電池充電電路看上去簡(jiǎn)單但散熱焊盤、限流電阻的選型還是有講究的直接從這些平臺(tái)找一個(gè)驗(yàn)證過(guò)的方案比自己從電荷泵芯片手冊(cè)開(kāi)始啃要穩(wěn)得多。4. 開(kāi)發(fā)板廠商和社區(qū)論壇正點(diǎn)原子、野火、電子發(fā)燒友這些富礦怎么挖4.1 開(kāi)發(fā)板廠商的資料體系比你想的要有營(yíng)養(yǎng)得多很多人覺(jué)得正點(diǎn)原子、野火這些開(kāi)發(fā)板廠商的資料只是“賣板子配套的教程”其實(shí)他們的資料中心是整個(gè)國(guó)內(nèi)STM32生態(tài)最系統(tǒng)的存在。正點(diǎn)原子官網(wǎng)的資料下載中心每一款開(kāi)發(fā)板都掛了一套完整的資料包里面包括原理圖PDF和AD源工程、數(shù)百個(gè)例程源碼從GPIO點(diǎn)燈到LWIP網(wǎng)絡(luò)協(xié)議棧全有、配套的視頻教程PDF、以及一些硬件設(shè)計(jì)注意事項(xiàng)文檔。野火的資料體系也類似它的“野火論壇”和文檔下載區(qū)甚至把CMSIS、啟動(dòng)文件、鏈接腳本這些底層知識(shí)整理成了專門的手冊(cè)。對(duì)做項(xiàng)目的來(lái)說(shuō)開(kāi)發(fā)板資料最大的價(jià)值在于“外設(shè)模塊的連接方式”。比如你想做電機(jī)控制硬石電機(jī)的開(kāi)發(fā)板資料里就有完整的閉環(huán)FOC參考設(shè)計(jì)從三相橋驅(qū)動(dòng)電路到編碼器接口再到上位機(jī)調(diào)參代碼全部是驗(yàn)證過(guò)的。再比如你做語(yǔ)音識(shí)別或者攝像頭采集這些廠商的板載外設(shè)原理圖本身就告訴你這類傳感器應(yīng)該怎么跟STM32對(duì)接。下載這些資料通常只需要注冊(cè)個(gè)賬號(hào)成本幾乎為零但信息密度非常高。4.2 社區(qū)論壇和問(wèn)答平臺(tái)CSDN、電子發(fā)燒友、21ic的檢索方法國(guó)內(nèi)技術(shù)社區(qū)的資源分散程度很高CSDN博客、電子發(fā)燒友下載中心、21ic論壇、以及各種公眾號(hào)文章都是參考設(shè)計(jì)的來(lái)源。但用這些平臺(tái)有個(gè)效率問(wèn)題搜索質(zhì)量參差不齊。我的做法是組合關(guān)鍵詞搜索比如搜“stm32 can通信連不上”的時(shí)候先加“參考設(shè)計(jì)”“原理圖”“例程”這類限定詞再看搜索結(jié)果里更新時(shí)間最近的因?yàn)镾TM32的HAL庫(kù)更新很快2019年的文章里的代碼放到現(xiàn)在大概率編譯不過(guò)最后優(yōu)先點(diǎn)那種帶附件下載鏈接的而不是只有貼片代碼的。電子發(fā)燒友的下載中心有個(gè)別的地方比不上的優(yōu)勢(shì)就是很多“參考設(shè)計(jì)合集”會(huì)打包成壓縮文件一口氣給你幾十份電源設(shè)計(jì)、接口設(shè)計(jì)、傳感器模塊的PDF或源工程適合批量掃盲。21ic論壇的高質(zhì)量帖子則藏在“ST MCU”板塊的精華帖里老工程師會(huì)把自己項(xiàng)目中遇到的問(wèn)題和解法寫成幾千字的長(zhǎng)文比如“STM32定時(shí)器捕獲測(cè)頻率的精度分析”這種參考價(jià)值很高是官方手冊(cè)里讀不到的實(shí)戰(zhàn)經(jīng)驗(yàn)。CSDN上用“VIP下載”或者“積分下載”的文檔也不少遇到急用的可以充個(gè)積分但要注意看清文檔描述很多標(biāo)題很漂亮的文檔其實(shí)內(nèi)容殘缺下載前先看預(yù)覽頁(yè)。5. 落地實(shí)操拿到一份參考設(shè)計(jì)之后怎么把它變成自己的項(xiàng)目5.1 五分鐘評(píng)估一份參考設(shè)計(jì)能不能用就看這幾個(gè)點(diǎn)從網(wǎng)上下載了一份STM32參考設(shè)計(jì)先別急著打開(kāi)畫圖花五分鐘做一個(gè)質(zhì)量評(píng)估。第一步是核對(duì)芯片型號(hào)和封裝原理圖用的芯片和你手里的庫(kù)存或采購(gòu)渠道對(duì)不對(duì)得上如果用的是已經(jīng)停產(chǎn)的型號(hào)后續(xù)買不到芯片就很被動(dòng)。第二步是看PCB層數(shù)兩層板的項(xiàng)目手工飛線能搞定四層板就別指望自己焊接調(diào)試了必須走正規(guī)打樣流程。第三步是檢查固件工程的編譯環(huán)境打開(kāi)看一下是用Keil MDK還是IAR還是STM32CubeIDE版本號(hào)是多少HAL庫(kù)版本是多少——很多老工程的工程文件用新版IDE打開(kāi)會(huì)報(bào)一堆錯(cuò)這會(huì)消耗大量時(shí)間。還要特別留意BOM表里的元件封裝。比如電阻電容用的是0402還是06030402封裝雖然板子做出來(lái)小但手工焊接對(duì)新手很不友好調(diào)試的時(shí)候換個(gè)電容都能焊到懷疑人生。我見(jiàn)過(guò)一個(gè)參考設(shè)計(jì)BOM表里的晶振用的是8MHz無(wú)源晶振但代碼里RCC配置卻按HSE 25MHz來(lái)初始化這種“電路和程序不一致”的坑光看原理圖是發(fā)現(xiàn)不了的只有把整個(gè)包完整編譯一遍才能暴出來(lái)。所以我的原則是任何參考設(shè)計(jì)先用它的固件工程在開(kāi)發(fā)板上跑通再?zèng)Q定要不要照它的電路畫板。5.2 三條移植路徑對(duì)應(yīng)三種不同需求路徑一硬件完全復(fù)制。這種情況最適合畢業(yè)設(shè)計(jì)或者產(chǎn)品原型芯片型號(hào)、外部晶振、電源方案都按參考設(shè)計(jì)來(lái)只改自己需要的外設(shè)接口。好處是電路風(fēng)險(xiǎn)幾乎為零壞處是你可能被迫沿用老舊的封裝和器件。路徑二只借模塊電路。比如你從A項(xiàng)目抄USB轉(zhuǎn)串口電路從B項(xiàng)目抄電源部分從C項(xiàng)目抄傳感器接口自己組合成一塊新板子。這種做法的關(guān)鍵是注意各模塊之間的電氣隔離和電平匹配比如電機(jī)驅(qū)動(dòng)模塊的電源地和單片機(jī)的地要處理好否則會(huì)出現(xiàn)參考設(shè)計(jì)單獨(dú)都能跑、組合起來(lái)就罷工的玄學(xué)問(wèn)題。路徑三只借代碼框架。參考設(shè)計(jì)的硬件完全不用只借鑒它的初始化順序、外設(shè)配置、狀態(tài)機(jī)思路。比如你想學(xué)STM32的USB設(shè)備開(kāi)發(fā)可以下載官方例程保留它的USB庫(kù)文件和描述符配置把應(yīng)用層代碼全部替換成自己的邏輯。這個(gè)路徑對(duì)理解整個(gè)系統(tǒng)幫助最大。代碼移植的時(shí)候有四個(gè)地方是必改項(xiàng)時(shí)鐘配置RCC要按你板子上的晶振頻率改引腳初始化要用你實(shí)際接線的引腳宏定義替換外設(shè)復(fù)用功能GPIO_AF要根據(jù)數(shù)據(jù)手冊(cè)核對(duì)調(diào)試串口要確認(rèn)用的是USART幾波特率多少。這四個(gè)地方只要有一個(gè)沒(méi)改對(duì)程序燒進(jìn)去就是白屏或亂碼。6. 常見(jiàn)問(wèn)題與避坑心得6.1 搜不到、下不動(dòng)、編譯不過(guò)的典型場(chǎng)景第一個(gè)常見(jiàn)問(wèn)題就是搜不到合適的參考設(shè)計(jì)。這不是資源不夠是搜索詞不對(duì)。比如你搜“stm32 usb設(shè)備參考設(shè)計(jì)”結(jié)果寥寥但換成“stm32 usb device AN4879”或者“stm32 USB_Device_Examples”就能翻出大量官方資料。英文關(guān)鍵詞的效果通常比中文好得多因?yàn)殚_(kāi)源資料主要用英文維護(hù)。第二個(gè)常見(jiàn)問(wèn)題是下載受限制。很多國(guó)內(nèi)論壇要注冊(cè)、要積分、甚至要關(guān)注公眾號(hào)才能下載附件比較折騰。我的處理方式是優(yōu)先從官方渠道和開(kāi)源平臺(tái)找那些要積分的資料往往在立創(chuàng)開(kāi)源平臺(tái)、GitHub、或者某個(gè)開(kāi)發(fā)板廠商的資料包里也能找到同款。如果確實(shí)需要某個(gè)特定文檔可以利用搜索引擎的“site:”語(yǔ)法限定在某個(gè)論壇站內(nèi)搜索效率會(huì)高很多。第三個(gè)問(wèn)題是老工程在新環(huán)境下編譯不過(guò)。常見(jiàn)報(bào)錯(cuò)包括芯片包沒(méi)裝、HAL庫(kù)版本不對(duì)、啟動(dòng)文件不匹配。解決辦法不是硬改代碼而是先確認(rèn)參考設(shè)計(jì)用的是哪個(gè)固件包版本然后到Keil的包管理器或者STM32CubeMX里把對(duì)應(yīng)版本的芯片支持包裝齊。我看到熱詞里有人問(wèn)“stm32芯片包安裝”和“標(biāo)準(zhǔn)庫(kù)新建工程”建議直接用STM32CubeMX生成初始化工程再把手寫代碼移植進(jìn)去這是目前兼容性最好的做法。6.2 幾個(gè)讓我記憶深刻的大坑第一個(gè)坑是“原理圖芯片型號(hào)和代碼不一致”。有一次下載了一個(gè)溫控器參考設(shè)計(jì)原理圖上寫的是STM32F103RCT6但固件工程的Device設(shè)置里是STM32F103C8T6Flash和RAM大小都不一樣程序燒進(jìn)去跑起來(lái)各種詭異。從那以后我每次拿到工程第一件事就是打開(kāi)工程選項(xiàng)核對(duì)Device里的芯片型號(hào)和原理圖上的絲印。第二個(gè)坑是“參考設(shè)計(jì)的調(diào)試工具不匹配”。有些工程用了SWDIO和SWCLK專用的調(diào)試引腳但如果你參考的是別人的原理圖又沒(méi)注意調(diào)試口連接板子做回來(lái)發(fā)現(xiàn)沒(méi)法下載程序就很被動(dòng)了?,F(xiàn)在很多參考設(shè)計(jì)把NRST、SWDIO、SWCLK三個(gè)引腳單獨(dú)拉出來(lái)做一排排針這種習(xí)慣值得自己復(fù)制。第三個(gè)坑是“抄板子的時(shí)候把復(fù)用功能抄丟了”。STM32引腳功能多很多時(shí)候參考設(shè)計(jì)里串口1的TX/RX和SPI的SCK/MISO用的是同一組引腳。有些人改版圖的時(shí)候?yàn)榱俗呔€方便改了引腳連接但代碼里的引腳初始化還是老樣子結(jié)果通信就是不通。畫完板子一定要拿著代碼里的GPIO配置清單跟原理圖逐個(gè)引腳核對(duì)這條規(guī)矩我踩過(guò)坑后才徹底長(zhǎng)記性。最后再分享一個(gè)實(shí)戰(zhàn)心得我現(xiàn)在拿到任何一份STM32參考設(shè)計(jì)都會(huì)先把它完整跑通一遍再?zèng)Q定改哪里。跑通的意思不是說(shuō)“編譯過(guò)了”而是用它的固件驅(qū)動(dòng)它的硬件實(shí)現(xiàn)它描述里的那個(gè)功能。實(shí)測(cè)過(guò)以后這套設(shè)計(jì)才真正變成你自己的東西。做嵌入式?jīng)]有捷徑但參考設(shè)計(jì)就是讓我們能站在別人驗(yàn)證過(guò)的肩膀上把精力花在真正該花的地方——這是我在實(shí)際項(xiàng)目里反復(fù)驗(yàn)證過(guò)的最有效的成長(zhǎng)方式。