在剛工作前兩年,我也試過,盯著簡歷上的技能一欄,猶豫了半天,最后寫下精通使用STM32。
心里清楚,這不是謙虛,是心虛。
結果面試官問一句:"你說精通STM32,那跟我說說,STM32的時鐘樹是怎么工作的?"
瞬間啞口無言。
我工作的時候,也看過很多簡歷。
寫"精通C語言"的,但連指針和內存分配都講不清楚。
寫"精通STM32"的,但連HAL庫和標準庫的區別都不知道。
這種"精通",在面試官眼里,就是給自己貼了個"我是新手"的標簽。
真正的高手,只用項目里優雅的代碼,騷操作說話。
那到底怎樣才算精通STM32?
今天我把這個標準掰開揉碎了講清楚。
能點亮LED燈,會配置GPIO,會用串口發數據。
這不叫精通,這叫"入門"。
根據數據,初級STM32工程師的技能要求是:
熟練使用Keil/IAR等開發工具
掌握GPIO、定時器、串口等基礎外設
能看懂原理圖,進行基本的硬件調試
具備中斷處理的基本概念
這些都是及格線,不是精通。
很多剛畢業的同學,跟著教程做了一些項目,簡歷上就敢寫"精通"。
面試的時候,被問到"你項目里最大的難點是什么",憋了半天只能說"調試過程比較復雜"。
蒼白無力。
知道怎么用HAL庫配置外設,但不知道底層發生了什么。
這也不叫精通。
真正的熟練,是你理解寄存器層面的操作。
比如,你配置GPIO輸出高電平。
用HAL庫,一行代碼:HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET)。
但你知道這行代碼背后,操作了哪些寄存器嗎?
ODR(輸出數據寄存器),BSRR(置位/復位寄存器),BRR(復位寄存器)。
這些寄存器的地址是什么?每一位的含義是什么?為什么要用BSRR而不是直接操作ODR?
如果你能回答這些問題,才算踏入了"熟練"的門檻。
但這些不用背,起碼知道是這個原理,原理上任何單片機都是相同的。
我當年在第一家公司工作,每天看別人的代碼,注釋又少,那段時間確實每天掉頭發很厲害。
那會用的NXP的ARM7單片機,還需要配置寄存器去使用的。
這段經歷,逼著我去看Datasheet,理解底層原理,看寄存器每個位的定義。
后來才明白,不管是標準庫,還是現在的HAL庫,都只是個包裝,本質還是操作寄存器。
不懂寄存器,你就永遠停留在"會用"的層面,出問題就不知道該往哪查。
熟練外設的使用,理解底層原理,這還不夠。
真正的精通,是能在資源受限、周期緊迫、功能復雜的情況下,寫出穩定運行的代碼。
舉個例子。
項目要求:用STM32采集8路傳感器數據,每路1kHz采樣率,通過CAN總線實時發送出去。
初學者的思路:開8個定時器,每個中斷里采集一路數據。
結果呢?中斷頻繁觸發,CPU根本忙不過來,數據丟失嚴重。
高級工程師的思路:用DMA+ADC+定時器觸發,自動采集數據放到內存,CPU只需要定期讀取并通過CAN發送。
CPU占用率從80%降到5%。
這就是精通。
不是你會用多少外設,而是你能在資源緊張的情況下,選擇最合適的方案。
企業對高級STM32工程師的潛在要求是:
精通C語言高級特性(位域、函數指針、結構體強制轉換)
強大的系統設計能力和跨領域知識整合能力
在資源緊張情況下優化代碼性能
能夠解決復雜的系統級問題
這些,才是"精通"的真正含義。
你做過幾個項目,每個項目都能獨立完成。
但面試官問你:"你的程序架構是怎樣的?你怎么保證代碼的可擴展性和可維護性?"
你答不上來。
因為你的代碼,就是一堆函數和變量堆在一起,能跑就行,沒有架構可言。
這不是精通,這是"熟練的搬磚"。
真正的精通,是你有一套自己的程序架構。
比如時間片輪詢、狀態機、任務管理、隊列算法、回調機制。
這些不是RTOS的專利,裸機開發同樣可以有良好的架構。
我之前做物聯網網關項目,STM32單片機,編譯完也不大,才117K代碼,不算Bootloader。
剛開始信心滿滿,覺得每個模塊都知道怎么實現,越做到后面越吃力,功能之間出現互斥,改好這里,別的地方又出問題。
其實就是沒有好的程序架構導致的。
那時候我花了一年時間,結合了很多高手的代碼,改編優化出一個時間片輪詢的小系統。
有任務管理、隊列算法、回調函數、定時器矩陣等功能。
從此以后,做項目再也沒出現過"改一個bug,冒出三個新bug"的情況。
而且這些代碼,也經過產品至少10K以上量產驗證了,穩得一批。
這些核心的經驗,都在我們教大家的項目里了,一個項目頂你工作兩年也不夸張。
這個能力也特別重要,比如從進口單片機,遷移到國產單片機。
我見過很多工程師,換一個沒用過的MCU平臺,就懵了。
這不叫精通,這叫"被庫綁架了"。
真正的精通,是你理解了ARM Cortex-M內核的通用原理。
不管換什么MCU,看一眼數據手冊,就知道怎么配置。
NVIC中斷控制器是怎么工作的
SysTick定時器怎么實現精準延時
MPU內存保護單元怎么配置
DMA傳輸的底層機制是什么
這些不是STM32特有的,是ARM內核的通用知識。
你掌握了這些,換什么平臺都能快速上手。
還有就是業務邏輯功能的遷移,這個最考驗你的架構設計水平,設計好了,應用層代碼幾乎不用改,只要改底層硬件驅動,把接口對上就好了。
現在嵌入式市場,單一技能的工程師越來越難混。
企業需要的是"懂架構、會優化、能跨平臺"的復合型人才。
你只會STM32,天花板就在那里。
你懂了ARM內核,懂了系統架構,懂了資源優化,你的路才能越走越寬。
看看下面這些問題,你能回答幾個?
STM32的時鐘樹是怎么工作的?為什么時鐘配置那么重要?
HAL庫的回調函數是怎么實現的?為什么說它是"偽多線程"?
DMA傳輸時,CPU可以休眠嗎?為什么?
中斷優先級是怎么配置的?什么是中斷嵌套?什么是搶占優先級和響應優先級?
你的項目里,代碼是怎么組織的?模塊之間怎么通信?怎么保證數據一致性?
如果讓你把STM32換成NXP或者GD的芯片,你需要改動哪些地方?
這些問題,如果你能答出4個以上,恭喜你,你已經進入"高級"層次了。
如果只能答出1-2個,那還在"熟練"和"會用"之間徘徊。
如果你一個都答不上來,別在簡歷上寫"精通"了,寫"熟悉"或者"了解"更誠實。
第一,別在簡歷上瞎寫"精通"。
面試官看到"精通",就會往深了問。
你答不上來,不是說你不誠實,而是說你對技術的認知有問題。
你以為的"精通",和面試官眼中的"精通",不是一個東西。
第二,從底層原理學起。
HAL庫、標準庫、LL庫,這些都只是工具。
真正重要的是,理解寄存器、理解時鐘、理解中斷、理解DMA。
這些底層原理,是你解決復雜問題的基礎。
第三,做項目要有架構思維。
不要堆代碼,要設計代碼。
模塊怎么劃分?接口怎么定義?數據怎么流轉?
這些問題想清楚了,你的代碼才能長期維護。
第四,跨平臺練習。
你學STM32,也去了解一下NXP、GD、ESP32。
你會發現,底層原理都是通的。
這才是真正的精通。
STM32的精通,不是你會用多少外設,不是你記住了多少API。
而是你理解了底層原理,掌握了系統架構,能解決復雜問題,能跨平臺遷移。
從入門到精通,平臺的話,至少需要3-5年的時間沉淀。
如果你覺得這篇文章幫你理清了思路,點個贊,收藏起來,下次寫簡歷的時候拿出來對照一下。