進(jìn)階指南:補(bǔ)足底層原理與調(diào)試能力,告別例程依賴)
很多人學(xué)32單片機(jī)學(xué)到一半會(huì)覺得后勁不足例程能跑點(diǎn)燈會(huì)點(diǎn)串口能打印但一讓做完整的小項(xiàng)目就卡住。這個(gè)問題不是32位單片機(jī)不行也不是你的板子太便宜而是學(xué)習(xí)方式停留在“抄例程改引腳”的階段沒有給后續(xù)進(jìn)階加夠燃料。32單片機(jī)的優(yōu)勢和難點(diǎn)都不在“能跑”而在“能穩(wěn)定、靈活、成體系地跑”所以真正的燃料不是多刷幾個(gè)例程而是補(bǔ)上芯片原理、調(diào)試方法、外設(shè)機(jī)制和系統(tǒng)設(shè)計(jì)這幾塊內(nèi)容。這篇文章想解決的就是“為什么會(huì)卡住以及卡住之后往哪使勁”。適合正在學(xué)STM32或類似32位MCU的人看也適合剛學(xué)完單片機(jī)基礎(chǔ)、準(zhǔn)備做畢業(yè)設(shè)計(jì)或項(xiàng)目開發(fā)的人參考。我會(huì)按實(shí)際學(xué)習(xí)順序把需要補(bǔ)強(qiáng)的部分拆開講清楚。1. 后勁不足的真正原因不是芯片到了天花板是學(xué)習(xí)路徑停在了抄例程層先說結(jié)論你感覺加不上油通常是因?yàn)橐恢痹凇罢粘纠こ獭?。抄例程本身不是壞事壞的是只改引腳、只換變量名卻不理解這個(gè)例程為什么這樣初始化、為什么用這個(gè)中斷、為什么是這個(gè)時(shí)鐘頻率。1.1 把學(xué)習(xí)路徑分成四層先看自己停在哪一層我接觸過不少初學(xué)32單片機(jī)的朋友大家的學(xué)習(xí)過程高度相似??梢杂盟膶觼韯澐值谝粚幽芟螺d例程能點(diǎn)燈能按下按鍵控制LED。第二層能自己配置GPIO、串口、定時(shí)器、ADC等外設(shè)不看例程也能寫出初始化代碼。第三層能處理多個(gè)外設(shè)同時(shí)工作理解中斷優(yōu)先級(jí)、DMA、時(shí)鐘總線關(guān)系能解決“單跑沒問題加在一起就崩潰”的情況。第四層能獨(dú)立完成一個(gè)帶交互、帶數(shù)據(jù)采集、帶通信、能連續(xù)穩(wěn)定運(yùn)行的小項(xiàng)目。很多人的“后勁不足”不是停在第一層而是卡在第二層和第三層之間。外設(shè)單個(gè)都會(huì)組合起來就亂。這個(gè)階段最典型的表現(xiàn)是一個(gè)定時(shí)器配合串口沒問題加上ADC和OLED之后顯示偶爾卡頓數(shù)據(jù)偶爾丟開始懷疑是硬件問題最后發(fā)現(xiàn)是中斷優(yōu)先級(jí)、總線等待或DMA配置的問題。1.2 大多數(shù)人的問題不是“不會(huì)”而是“沒練透”我見過一個(gè)學(xué)弟照著教程把STM32的串口收發(fā)、定時(shí)器中斷、PWM輸出都跑通了數(shù)據(jù)手冊(cè)也翻了但讓他做一個(gè)小型溫控系統(tǒng)時(shí)還是卡了兩天。原因不是他不會(huì)這些外設(shè)而是他不知道怎么把這些外設(shè)組織成一個(gè)“系統(tǒng)”。啟動(dòng)時(shí)先初始化什么、數(shù)據(jù)用全局變量還是隊(duì)列傳遞、按鍵掃描放主循環(huán)還是定時(shí)器中斷、故障時(shí)怎么復(fù)位這些東西例程里不會(huì)教。這個(gè)階段需要的不是更多例程而是建立三層意識(shí)每個(gè)外設(shè)不是獨(dú)立存在的它掛在哪個(gè)時(shí)鐘總線上就用哪個(gè)總線的時(shí)鐘使能。外設(shè)之間傳遞數(shù)據(jù)時(shí)要明確誰產(chǎn)生數(shù)據(jù)、誰消費(fèi)數(shù)據(jù)、數(shù)據(jù)會(huì)不會(huì)被覆蓋。系統(tǒng)出問題時(shí)先定位邊界不要整塊代碼反復(fù)讀。2. 第一桶燃料建立“寄存器—總線—外設(shè)”的解釋框架32單片機(jī)最值得花時(shí)間學(xué)的不是某個(gè)具體型號(hào)而是一套通用的底層解釋框架。只要這套框架建立起來換任何一家廠商的32位MCU你都能更快上手。2.1 把32位單片機(jī)當(dāng)成一臺(tái)小電腦來理解很多教程會(huì)告訴你GPIO要開時(shí)鐘、串口要配置波特率、定時(shí)器要寫預(yù)分頻和重載值。但如果不理解為什么就只能記步驟遇到問題不會(huì)推導(dǎo)。更高效的理解方式是32單片機(jī)內(nèi)部也是一臺(tái)小電腦有內(nèi)核、有總線、有外設(shè)、有內(nèi)存。CPU通過總線訪問各個(gè)外設(shè)寄存器外設(shè)寄存器控制硬件行為。時(shí)鐘決定了CPU和外設(shè)的工作節(jié)拍節(jié)拍不對(duì)外設(shè)行為就不對(duì)。舉例來說當(dāng)你說“使能GPIOA的時(shí)鐘”時(shí)并不是在做一個(gè)魔法操作而是告訴電源管理單元這個(gè)外設(shè)要被使用請(qǐng)把它的時(shí)鐘打開。如果你把外設(shè)掛在了APB1總線上但又去查APB2總線上外設(shè)的時(shí)鐘位代碼自然不會(huì)有反應(yīng)。這套框架能讓你遇到“怎么看都是對(duì)的就是不工作”的問題時(shí)不再盲目問人而是自己按“時(shí)鐘開沒開、引腳復(fù)用對(duì)不對(duì)、中斷開沒開、中斷標(biāo)志清沒清”的順序排查。2.2 時(shí)鐘樹、總線、DMA、中斷優(yōu)先級(jí)為什么這些最值得學(xué)一個(gè)實(shí)用建議學(xué)32單片機(jī)優(yōu)先把以下四個(gè)機(jī)制吃透它們幾乎貫穿所有項(xiàng)目時(shí)鐘樹理解SYSCLK、AHB、APB1、APB2之間的分頻關(guān)系。很多外設(shè)超頻、串口波特率不對(duì)、定時(shí)器時(shí)間不準(zhǔn)都是分頻算錯(cuò)了??偩€映射知道哪個(gè)外設(shè)在哪個(gè)總線上查手冊(cè)時(shí)才有方向。比如STM32F1系列中USART1掛在APB2USART2和USART3掛在APB1這個(gè)不同型號(hào)有差異。DMA當(dāng)數(shù)據(jù)量比較大、CPU又忙時(shí)DMA能直接在外設(shè)和內(nèi)存之間搬運(yùn)數(shù)據(jù)。理解DMA方向、緩沖大小、傳輸完成中斷比反復(fù)手動(dòng)讀寫寄存器更接近實(shí)際項(xiàng)目的用法。中斷優(yōu)先級(jí)NVIC分組和搶占優(yōu)先級(jí)、子優(yōu)先級(jí)的關(guān)系直接影響任務(wù)實(shí)時(shí)性。初學(xué)者最容易遇到的問題就是“兩個(gè)中斷同時(shí)來程序亂了”。建議用表格記一下不同外設(shè)所在的總線和時(shí)鐘來源不要死記每次碰到具體型號(hào)查數(shù)據(jù)手冊(cè)反復(fù)幾次自然記住常用部分。2.3 寄存器、HAL庫、LL庫不同階段怎么選初學(xué)者經(jīng)常糾結(jié)一個(gè)問題用寄存器還是用HAL庫我的建議是分階段入門階段用標(biāo)準(zhǔn)庫或HAL庫都行重點(diǎn)是快速跑通外設(shè)功能理解代碼結(jié)構(gòu)。進(jìn)階階段遇到問題時(shí)要能對(duì)照寄存器手冊(cè)把庫函數(shù)調(diào)用展開成寄存器操作來看理解底層發(fā)生了什么。項(xiàng)目階段以HAL庫或LL庫為主體按需加入寄存器操作比如時(shí)序敏感的關(guān)鍵初始化、低功耗切換等。不要被“用庫就不高級(jí)”的說法綁架。32單片機(jī)開發(fā)的效率和質(zhì)量取決于需求理解、系統(tǒng)設(shè)計(jì)和調(diào)試能力而不是用沒用寄存器。庫只是工具底層框架才是真正要掌握的。3. 第二桶燃料把調(diào)試能力練成肌肉記憶很多時(shí)候“后勁不足”不是不會(huì)寫功能代碼而是不會(huì)查問題。查問題靠的是調(diào)試能力和固定的排查順序而不是一遍遍重新編譯下載。3.1 學(xué)會(huì)使用調(diào)試器別只靠串口打印如果你一直通過串口打印變量來定位問題那不是不行只是效率偏低。建議盡早熟悉調(diào)試器的基本操作單步執(zhí)行看程序?qū)嶋H走到了哪里。打斷點(diǎn)在關(guān)鍵邏輯前后暫停查看變量值和寄存器值。查看調(diào)用堆棧確認(rèn)當(dāng)前是從哪個(gè)函數(shù)進(jìn)來的。查看外設(shè)寄存器確認(rèn)串口、定時(shí)器、ADC等外設(shè)狀態(tài)是否符合預(yù)期。這幾點(diǎn)不需要一次全會(huì)先學(xué)會(huì)打斷點(diǎn)和查看變量就夠了。它帶來的最大好處是你能看到程序“腦子里在想什么”而不是靠猜。3.2 串口日志仍然是排查問題最便宜的武器雖然調(diào)試器很好用但串口日志在生產(chǎn)環(huán)境和板子不方便接調(diào)試器時(shí)仍然是性價(jià)比最高的手段。關(guān)鍵是日志要規(guī)范不要只在出問題時(shí)隨手加一行。我在實(shí)際開發(fā)中常用的方案是統(tǒng)一封裝一個(gè)日志輸出函數(shù)帶等級(jí)和模塊名。關(guān)鍵狀態(tài)切換、錯(cuò)誤碼、外設(shè)初始化結(jié)果都打印出來。發(fā)布前把日志級(jí)別調(diào)高需要排查時(shí)再打開詳細(xì)日志。這樣好處很明顯程序在客戶那邊或長時(shí)間運(yùn)行時(shí)出了偶發(fā)問題通過日志能反推現(xiàn)場狀態(tài)而不是只能干瞪眼。3.3 現(xiàn)象不對(duì)時(shí)的固定排查順序我總結(jié)過一套排查順序每次出問題時(shí)按這個(gè)思路走能少走很多彎路看電源板子供電電壓對(duì)不對(duì)工作電流是否異常??磿r(shí)鐘系統(tǒng)時(shí)鐘是否起來是否進(jìn)入異常復(fù)位??匆_引腳配置是否與電路圖一致復(fù)用功能是否開對(duì)??粗袛嘀袛嗍欠耖_啟中斷標(biāo)志是否及時(shí)清除優(yōu)先級(jí)是否合理??磾?shù)據(jù)數(shù)據(jù)來源是否可靠緩存是否溢出通信數(shù)據(jù)格式是否一致??磿r(shí)序傳感器、通信芯片的時(shí)序是否滿足數(shù)據(jù)手冊(cè)要求。這一套順序看起來很基礎(chǔ)但絕大多數(shù)“程序跑飛”“顯示亂碼”“數(shù)據(jù)偶爾丟”的問題最后都能落到上面某一條。尤其是“顯示亂碼”很多時(shí)候不是OLED代碼的問題而是I2C時(shí)序太快或供電不足。4. 第三桶燃料外設(shè)和通信協(xié)議按主線學(xué)不貪多32單片機(jī)外設(shè)非常多但不是每個(gè)都要在入門階段學(xué)完。如果什么都想碰很容易每個(gè)都只停留在跑通例程哪個(gè)都不深。4.1 主線外設(shè)清單我建議把以下外設(shè)作為主線學(xué)透之后再擴(kuò)展外設(shè)主要用途入門階段必須掌握的點(diǎn)GPIO輸入輸出控制模式配置、上下拉、速度、復(fù)用定時(shí)器延時(shí)、計(jì)數(shù)、PWM、捕獲預(yù)分頻、自動(dòng)重載、更新中斷UART串口通信、調(diào)試波特率、收發(fā)中斷、DMA收發(fā)ADC模擬量采集分辨率、采樣時(shí)間、多通道I2C傳感器、EEPROM地址、時(shí)序、上拉電阻SPI屏幕、Flash、傳感器極性、相位、速率每個(gè)外設(shè)都要做到“不看例程能寫出初始化函數(shù)”。如果你發(fā)現(xiàn)自己每次都要翻例程才能配好一個(gè)UART那就說明這一塊還沒有消化成自己的東西。4.2 定時(shí)器要會(huì)算不能只會(huì)填參數(shù)定時(shí)器是很多初學(xué)者的分水嶺。比如要用定時(shí)器產(chǎn)生一個(gè)1kHz的PWM你需要知道定時(shí)器時(shí)鐘是多少來自哪個(gè)總線。預(yù)分頻器PSC怎么設(shè)置才能得到合適的計(jì)數(shù)頻率。自動(dòng)重載寄存器ARR設(shè)多少才能得到目標(biāo)頻率。占空比由比較寄存器CCR決定調(diào)整CCR就能改變占空比。不要覺得這塊很枯燥。電機(jī)調(diào)速、舵機(jī)控制、LED調(diào)光、蜂鳴器發(fā)聲、超聲波測距全都依賴這個(gè)數(shù)學(xué)關(guān)系。能自己算一遍以后換個(gè)芯片型號(hào)也能快速遷移。4.3 通信協(xié)議要先看波形再寫代碼學(xué)I2C、SPI、UART的時(shí)候建議不要只看接口函數(shù)至少要看懂時(shí)序圖。最簡單的辦法是用邏輯分析儀或示波器抓一遍波形觀察起始條件、數(shù)據(jù)位、應(yīng)答位、時(shí)鐘極性。很多人寫傳感器驅(qū)動(dòng)時(shí)反復(fù)失敗原因就是沒確認(rèn)時(shí)序。比如I2C設(shè)備地址是7位還是8位、寄存器地址長度是一個(gè)字節(jié)還是兩個(gè)字節(jié)、數(shù)據(jù)是大端還是小端這些細(xì)節(jié)在代碼里都是致命差異。我對(duì)新手的建議是每學(xué)一個(gè)通信協(xié)議就配合一個(gè)具體器件去寫驅(qū)動(dòng)。I2C就寫一個(gè)溫度傳感器SPI就寫一個(gè)Flash或屏幕UART就寫一個(gè)GPS或藍(lán)牙模塊的數(shù)據(jù)解析。這樣協(xié)議不再是抽象概念而是能真正調(diào)試的東西。5. 第四桶燃料從例程到小項(xiàng)目讓知識(shí)形成閉環(huán)外設(shè)都學(xué)過之后一定要做一兩個(gè)完整小項(xiàng)目。項(xiàng)目的好處是逼你把零散知識(shí)串成一個(gè)系統(tǒng)同時(shí)暴露大量隱藏問題。5.1 單個(gè)外設(shè)會(huì)了不等于會(huì)做項(xiàng)目只學(xué)外設(shè)時(shí)你的思維是“我要用UART發(fā)數(shù)據(jù)”。做項(xiàng)目時(shí)思維變成了“這個(gè)系統(tǒng)需要采集數(shù)據(jù)數(shù)據(jù)從哪里來格式是什么是否要緩存如何展示異常怎么辦”。這兩者差別非常大。項(xiàng)目里你會(huì)遇到一個(gè)傳感器初始化失敗后面的邏輯還要不要繼續(xù)。按鍵掃描放在主循環(huán)里長按時(shí)會(huì)不會(huì)影響數(shù)據(jù)采集。顯示內(nèi)容和采集數(shù)據(jù)同時(shí)更新需不需要互斥保護(hù)。連續(xù)運(yùn)行幾天后內(nèi)存碎片或緩沖區(qū)溢出怎么定位。這些問題不是外設(shè)教程能覆蓋的只能在項(xiàng)目中積累。5.2 一個(gè)低成本小項(xiàng)目模板如果不知道做什么項(xiàng)目我推薦一個(gè)低成本、能覆蓋大部分核心能力的模板主控STM32F103C8T6或類似型號(hào)最小系統(tǒng)板。輸入一個(gè)按鍵、一個(gè)溫濕度傳感器I2C接口。輸出一個(gè)OLED顯示屏、一個(gè)蜂鳴器。功能邏輯定期采集溫濕度按鍵控制顯示頁面切換超過閾值時(shí)蜂鳴器報(bào)警。附加要求加入看門狗模擬傳感器異常時(shí)系統(tǒng)能自動(dòng)恢復(fù)。這個(gè)項(xiàng)目不大但覆蓋了GPIO、定時(shí)器、I2C、中斷、狀態(tài)機(jī)、看門狗和低功耗設(shè)計(jì)思路。能獨(dú)立做完并連續(xù)運(yùn)行24小時(shí)不崩潰說明你已經(jīng)越過“后勁不足”的臺(tái)階。5.3 項(xiàng)目驗(yàn)收標(biāo)準(zhǔn)不只要跑通判斷項(xiàng)目是否真的完成不能只看“能點(diǎn)亮”。建議按這套標(biāo)準(zhǔn)檢查功能完整性所有輸入都有響應(yīng)所有輸出都正常。異常處理傳感器斷線、串口數(shù)據(jù)亂碼、按鍵抖動(dòng)時(shí)程序不會(huì)卡死。長時(shí)間運(yùn)行連續(xù)運(yùn)行24小時(shí)以上無重啟、無邏輯錯(cuò)亂。代碼可讀性模塊劃分清楚函數(shù)命名規(guī)范關(guān)鍵邏輯有注釋??删S護(hù)性換一個(gè)引腳或換一個(gè)傳感器型號(hào)時(shí)改動(dòng)成本是否可控。很多“后勁不足”的人其實(shí)卡在功能完整到異常處理這一段。功能能跑但拔掉傳感器就死機(jī)加個(gè)干擾就復(fù)位這種情況必須補(bǔ)上異常處理這層燃料。6. 進(jìn)階方向怎么選RTOS、物聯(lián)網(wǎng)、控制系統(tǒng)按需求來等你能獨(dú)立完成一個(gè)小項(xiàng)目后下一步的燃料就不是外設(shè)了而是方向選擇。32單片機(jī)可以延伸的方向很多沒必要全都學(xué)但至少要清楚自己選的方向需要什么前置技能。6.1 RTOS是不是必學(xué)什么時(shí)候?qū)W經(jīng)常有人問要不要學(xué)RTOS不學(xué)會(huì)不會(huì)被淘汰。我的回答是看需求。如果你做的是狀態(tài)機(jī)就能解決的小系統(tǒng)裸機(jī)完全夠用硬上RTOS反而增加復(fù)雜度。如果任務(wù)超過三四個(gè)實(shí)時(shí)性要求高或者有周期性任務(wù)、通信任務(wù)、UI任務(wù)、傳感器任務(wù)并發(fā)RTOS能幫你分配CPU時(shí)間。推薦的學(xué)習(xí)路徑是先確保裸機(jī)能穩(wěn)定做好一個(gè)小項(xiàng)目再學(xué)FreeRTOS。學(xué)習(xí)FreeRTOS時(shí)不要只看任務(wù)創(chuàng)建要重點(diǎn)理解任務(wù)調(diào)度、信號(hào)量、消息隊(duì)列、中斷與任務(wù)之間的數(shù)據(jù)傳遞。這些都是實(shí)際項(xiàng)目中通信和資源保護(hù)的基礎(chǔ)。6.2 方向選擇建議智能家居/物聯(lián)網(wǎng)需要熟悉WIFI、藍(lán)牙、MQTT、JSON、低功耗設(shè)計(jì)。工業(yè)控制/數(shù)據(jù)采集需要熟悉Modbus、CAN、傳感器接口、可靠性設(shè)計(jì)。電機(jī)控制/機(jī)器人需要熟悉PWM、編碼器反饋、PID控制、FOC算法基礎(chǔ)。汽車電子重視CAN、AUTOSAR、功能安全對(duì)規(guī)范要求很高。嵌入式Linux方向32位MCU是基礎(chǔ)還要補(bǔ)Linux系統(tǒng)、驅(qū)動(dòng)開發(fā)。選方向不用太急可以先在現(xiàn)有項(xiàng)目里多嘗試比如給溫濕度計(jì)加一個(gè)藍(lán)牙模塊給電機(jī)板加一個(gè)遙控功能。小步擴(kuò)展比一開始就選一個(gè)宏大方向更穩(wěn)。6.3 學(xué)習(xí)資料怎么挑避免越學(xué)越亂資料方面常見的是各種32單片機(jī)學(xué)習(xí)筆記和視頻教程比如有人會(huì)提到“江科大32單片機(jī)筆記”這類流傳較廣的資料。這類資料用來做第一輪入門認(rèn)知是OK的思路清晰很適合快速了解某個(gè)外設(shè)怎么配置。但要注意一點(diǎn)視頻筆記和教程是“帶路者”不是“安全區(qū)”。只看筆記很難形成獨(dú)立解決問題的能力。更完整的信息來源是芯片數(shù)據(jù)手冊(cè)Datasheet查引腳、電氣特性、封裝。參考手冊(cè)Reference Manual查寄存器、外設(shè)詳細(xì)描述。官方例程和HAL庫代碼看官方對(duì)某個(gè)外設(shè)的標(biāo)準(zhǔn)用法。原理圖和PCB看板子實(shí)際連接排查硬件問題??闭`表查芯片已知問題有些偶發(fā)現(xiàn)象其實(shí)是芯片本身限制。建議的順序是先用教程筆記快速入門再結(jié)合參考手冊(cè)加深理解最后遇到具體問題時(shí)回?cái)?shù)據(jù)手冊(cè)確認(rèn)。資料是疊著用的不是只看其中一樣。7. 把“后勁”變成持續(xù)動(dòng)力最后聊點(diǎn)實(shí)際經(jīng)驗(yàn)。很多人不是沒有能力而是學(xué)習(xí)節(jié)奏出了問題導(dǎo)致反復(fù)放棄。把“后勁”維持住不靠一時(shí)熱情靠的是練習(xí)節(jié)奏和反饋機(jī)制。7.1 常見“燃料不足”的幾種情況我總結(jié)了幾類典型情況你可以對(duì)照看自己是否命中只學(xué)不練視頻看了一個(gè)又一個(gè)代碼一行沒寫一動(dòng)手就慌。只練不想例程跑通了就繼續(xù)下一個(gè)從不問為什么這個(gè)配置要這樣寫。只做加法不做減法學(xué)了很多外設(shè)但沒有一個(gè)達(dá)到“不看手冊(cè)能寫出來”的程度。只求跑通不求穩(wěn)定點(diǎn)燈成功就算完成不測試異常情況、不長時(shí)間運(yùn)行。只查答案不查原理報(bào)錯(cuò)后只會(huì)復(fù)制錯(cuò)誤信息問人不自己看文檔和調(diào)試。如果你中了三條以上說明問題不是學(xué)習(xí)資料不夠而是練習(xí)方式需要調(diào)整。7.2 我建議的練習(xí)節(jié)奏如果現(xiàn)在處于“能跑例程但不會(huì)寫項(xiàng)目”的階段可以按下面節(jié)奏來每周選擇一個(gè)外設(shè)不看例程只查數(shù)據(jù)手冊(cè)和參考手冊(cè)寫初始化代碼。每周解決一個(gè)問題不限定類型可能是編譯錯(cuò)誤、硬件異常、邏輯混亂解決后記錄排查過程。每兩周做一個(gè)小功能比如通過手機(jī)藍(lán)牙控制LED、把傳感器數(shù)據(jù)上傳到上位機(jī)。每個(gè)月匯總一次寫一份簡單的問題清單和知識(shí)點(diǎn)清單重點(diǎn)是記錄“我當(dāng)時(shí)是怎么查出來的”。這個(gè)節(jié)奏不需要每天花很多時(shí)間貴在連續(xù)。32單片機(jī)的學(xué)習(xí)是線性積累斷一周再撿起來成本比連續(xù)練一周高得多。7.3 最后的幾條經(jīng)驗(yàn)不要追求把所有外設(shè)都學(xué)完追求把常用的幾個(gè)用到很熟。遇到問題先自己查半小時(shí)再問人問的時(shí)候帶上你已經(jīng)排查過的信息。不要只依賴開發(fā)板例程試著在面包板上搭自己的電路從最小系統(tǒng)開始。學(xué)新的芯片或平臺(tái)時(shí)把已經(jīng)學(xué)會(huì)的外設(shè)框架遷移過去會(huì)發(fā)現(xiàn)大部分知識(shí)是相通的。32位單片機(jī)真正有后勁的階段是在你完成第一個(gè)完整項(xiàng)目之后。那時(shí)候你會(huì)覺得芯片不是瓶頸你自己的系統(tǒng)設(shè)計(jì)能力才是。每一次解決“組合起來就不工作”的問題都是在給后面的開發(fā)加燃料。把基本功補(bǔ)上來后勁自然會(huì)跟上。