關注公眾號,回復“入門資料”獲取單片機入門到高級開掛教程
?開發板帶你入門,我們帶你飛
文 | 無際(微信:2777492857)
全文約3959字,閱讀大約需要?10?分鐘
很多單片機開發者,即使有一定經驗,也可能對芯片內部的運作機制不甚了了。
? ? ? ? ?? ?
你寫的代碼,燒錄進去,燈亮了,串口通了,電機轉了,感覺挺神奇,但具體是芯片內部哪個小零件在干活,它們之間又是怎么協同工作、傳遞信息的,是不是有點模糊?
? ? ? ? ?? ?
或者,你想優化程序性能,減少功耗,但因為不清楚硬件的工作機制,不知道從哪里下手,只能憑感覺調整,效果嘛…隨緣?
? ? ? ? ?? ?
遇到奇奇怪怪的 Bug,比如某個外設突然不聽使喚,或者程序莫名其妙跑飛,調試起來像是在猜謎,只能一遍遍試錯,心里默念“玄學,這絕對是玄學”?
? ? ? ? ?? ?
翻開厚厚的數據手冊(Datasheet),看到密密麻麻的寄存器地址、總線架構圖、時鐘樹,是不是感覺像在讀天書,恨不得直接跳到代碼示例那一頁?
? ? ? ? ?? ?
以上,都是我以前學單片機經歷過的問題。
? ? ? ? ?? ?
這種“知其然不知其所以然”的狀態,短期內似乎不影響你完成基本功能開發,但長遠來看,它會成為你技術成長的隱形天花板。
? ? ? ? ?? ?
你會發現,當問題超越了簡單的邏輯錯誤,涉及到硬件時序、資源沖突、中斷優先級等底層問題時,缺乏內部結構知識會讓你束手無策,大大延長調試時間。
? ? ? ? ?? ?
不懂CPU如何取指執行,不了解內存訪問速度差異,不清楚外設與CPU的交互方式(輪詢、中斷、DMA),你就很難寫出真正高效、低耗的代碼。
? ? ? ? ?? ?
無法根據具體應用場景,合理選擇芯片資源,有效規劃內存使用,設計健壯可靠的系統架構。比如,在多任務環境下,不理解中斷和上下文切換,就容易寫出有潛在風險的代碼。
? ? ? ? ?? ?
像實時操作系統(RTOS)的移植與應用、復雜驅動程序的開發、底層協議棧的理解等進階內容,都建立在對單片機硬件結構深刻理解的基礎上。
? ? ? ? ?? ?
放心,我們不搞純理論轟炸。這篇文章會用大白話,為你梳理單片機最核心的三個組成部分:CPU、內存、外設,并講清楚它們之間是如何通過總線系統協同工作的。
? ? ? ? ?? ?
讀完后,你將:
?在腦海中建立一個清晰的單片機內部宏觀模型。
?理解代碼是如何被執行,數據是如何被存儲和訪問的。
?明白外設是如何被控制,以及它們如何與CPU互動的。
?更有信心地閱讀數據手冊,理解那些看似復雜的術語和圖表。
?為后續學習更高級的主題(如中斷、DMA、RTOS)打下堅實的基礎。
? ? ? ? ?? ? ? ? ? ? ? ?
一個單片機(Microcontroller Unit, MCU)就像一個微型的計算機系統,被集成到了一塊芯片上。它雖小,五臟俱全,主要包含以下幾個關鍵部分:
? ? ? ? ?? ?
1. 中央處理器 (CPU):不知疲倦的大腦
CPU是單片機的核心,是真正干活的那個“老大哥”。它的主要職責是:? ??

?取指令:?從存儲器(通常是Flash)中,按照程序計數器(PC)的指示,讀取下一條要執行的指令。
?譯碼:?分析這條指令,搞明白要做什么操作(比如加法、數據搬運、跳轉等)。
?執行:?調用相應的運算單元(如ALU算術邏輯單元)或控制單元,完成指令要求的工作。這可能涉及到讀寫內存數據、操作外設寄存器等。
? ? ? ? ?? ?
市面上常見的單片機CPU核有多種,比如經典的8051,或者現在更主流的ARM Cortex-M系列(M0, M3, M4, M7等)。不同的核,其指令集、運算能力、功耗特性有所不同,但其基本工作原理——取指、譯碼、執行——是相通的。
? ? ? ? ?? ?
簡單來說,CPU就是那個嚴格按照你的代碼(編譯后的機器指令)一步步執行,完成各種計算、判斷和控制任務的“執行者”。它很忙,一直在不停地奔跑。
? ? ? ? ?? ?
2. 內存 (Memory)? ??
程序代碼和運行時產生的數據總得有地方放吧?這就是內存的任務。單片機中的內存主要分為兩大類:
? ? ? ? ?? ?
?程序存儲器 (Program Memory):通常是 Flash Memory
?特點:非易失性(掉電后數據不丟失)。
?用途:存放你編寫、編譯后的程序代碼(機器指令)。CPU就是從這里讀取指令來執行的。通常容量較大(幾十KB到幾MB不等)。它一般是只讀的(在程序運行時),需要特殊的編程操作才能寫入。
? ? ? ? ?? ?
?數據存儲器 (Data Memory):通常是 SRAM (Static RAM)
?特點:易失性(掉電后數據丟失)。讀寫速度非常快。
?用途:存放程序運行時產生的臨時數據、變量、函數調用的棧信息、動態分配的堆空間等。CPU進行計算時,需要頻繁讀寫SRAM。容量相對Flash較小(幾KB到幾百KB不等)。
? ? ? ? ?? ?
內存映射 (Memory Map):
這是一個至關重要的概念!在單片機內部,無論是Flash、SRAM,還是后面要講的外設寄存器,它們都被統一安排在一個地址空間內。就像城市地圖,每個存儲單元或寄存器都有一個唯一的地址編號。CPU想要訪問某個位置(讀數據、寫數據、取指令),就通過這個地址去定位。? ??

? ? ? ? ?? ?
數據手冊里通常會有一張內存映射圖,告訴你哪個地址范圍對應Flash,哪個范圍對應SRAM,哪個范圍又分配給了哪個外設。看懂這張圖,你就知道該如何通過地址去訪問特定的硬件資源了。
? ? ? ? ?? ?
3. 外設 (Peripherals)
要與外部世界互動,就需要各種各樣的外設。外設是單片機感知外部信號、控制外部器件的接口。常見的外設包括:
? ? ? ? ?? ?
?GPIO (General Purpose Input/Output):?通用輸入輸出口。可以配置為輸入(檢測外部高低電平)或輸出(控制LED亮滅、驅動繼電器等)。這是最基本、最常用的外設。? ??
? ? ? ? ?? ?
?UART (Universal Asynchronous Receiver/Transmitter):?異步串口。用于與其他設備(如電腦、傳感器模塊)進行串行通信。
? ? ? ? ?? ?
?SPI (Serial Peripheral Interface) / I2C (Inter-Integrated Circuit):?串行通信接口。常用于連接其他芯片,如傳感器、存儲器、顯示屏等。
? ? ? ? ?? ?
?Timers/Counters:?定時器/計數器。可以用來產生精確的延時、測量時間間隔、生成PWM波(控制電機轉速、呼吸燈效果)等。
? ? ? ? ?? ?
?ADC (Analog-to-Digital Converter):?模數轉換器。將外部的模擬信號(如傳感器電壓)轉換為數字值,供CPU處理。
? ? ? ? ?? ?
?DAC (Digital-to-Analog Converter):?數模轉換器。將CPU處理后的數字值轉換為模擬信號輸出。
? ? ? ? ?? ?
?...還有看門狗(Watchdog)、DMA控制器、USB接口、CAN控制器等等,根據芯片型號不同而異。
? ? ? ? ?? ?
外設是如何被CPU控制的?
答案是:通過寄存器 (Registers)。
? ? ? ? ?? ?
每個外設內部都有一組寄存器,它們就像這個外設的控制面板和狀態顯示屏。這些寄存器也被映射到了內存地址空間中(就是前面說的內存映射)。
? ? ? ? ?? ?
CPU通過向這些特定地址寫入不同的值,來配置外設的工作模式(比如設置GPIO是輸入還是輸出,配置UART的波特率),啟動或停止外設工作,發送數據等。同時,CPU也可以通過讀取這些寄存器,來獲取外設的狀態(比如串口是否接收到數據,ADC轉換是否完成)或接收到的數據。? ??
? ? ? ? ?? ?
所以,我們平時在代碼里包含的那些stm32f10x.h或類似的頭文件,里面定義的大量宏,很多就是這些外設寄存器的地址和位的含義。我們調用庫函數配置外設,其底層本質就是在讀寫這些特定地址的寄存器。
? ? ? ? ?? ?
4. 總線 (Bus)
CPU、內存、外設,這三大塊不是孤立存在的。它們需要一種方式來互相傳遞信息(地址、數據、控制信號)。這個信息通道就是總線。
? ? ? ? ?? ?
你可以把總線想象成單片機內部的高速公路系統:

?地址總線 (Address Bus):?單向,由CPU發出。CPU想訪問某個內存單元或外設寄存器時,就把它的地址放到地址總線上。地址總線的寬度決定了CPU能訪問的最大內存空間(例如32位地址總線可以訪問2^32=4GB地址空間)。
? ? ? ? ?? ?
?數據總線 (Data Bus):?雙向。用于在CPU、內存、外設之間傳輸實際的數據。數據總線的寬度決定了一次能傳輸多少位數據(如8位、16位、32位)。
? ? ? ? ?? ?
?控制總線 (Control Bus):?傳輸控制信號。比如CPU發出的讀信號或寫信號,內存或外設發出的就緒信號、中斷請求信號等。它負責協調整個數據傳輸過程。
? ? ? ? ?? ?
? ? ? ? ?? ?
當CPU要從SRAM讀取一個變量時,大致過程是:
1.CPU將該變量的地址放到地址總線上。
2.CPU在控制總線上發出“讀”信號。
3.SRAM接收到地址和讀信號,找到對應的數據。
4.SRAM將數據放到數據總線上。
5.CPU從數據總線上取走數據。
? ? ? ? ?? ?
當CPU要向GPIO端口寫入數據以點亮LED時,過程類似:
1.CPU將GPIO端口數據寄存器的地址放到地址總線上。
2.CPU將要寫入的數據(比如0xFF)放到數據總線上。
3.CPU在控制總線上發出“寫”信號。
4.GPIO外設接收到地址、數據和寫信號,將數據鎖存到其內部的數據寄存器中,從而改變引腳電平。
? ? ? ? ?? ?
總線架構的學問:
在一些性能較高的單片機(如ARM Cortex-M3/M4/M7)中,通常不止一條總線。
? ? ? ? ?? ?
可能會有高速總線(如AHB, Advanced High-performance Bus)連接CPU、Flash、SRAM等需要快速訪問的部件,以及低速總線(如APB, Advanced Peripheral Bus)連接大部分外設。這樣做是為了平衡性能和功耗,避免慢速外設拖慢高速部件的訪問。? ??

數據手冊中的總線架構圖就是描繪這種連接關系的。
? ? ? ? ?? ?
中斷與DMA
除了CPU主動讀寫,外設也能主動“打擾”CPU。
? ? ? ? ?? ?
當外設完成某個任務(如串口收到數據、ADC轉換完畢、定時器溢出)時,它可以向CPU發送一個?中斷請求?。CPU收到中斷請求后,如果允許該中斷,就會暫停當前正在執行的主程序,轉而去執行一個預先設定好的?中斷服務函數 (Interrupt Service Routine, ISR),處理這個外設事件,處理完畢后再返回主程序斷點處繼續執行。中斷機制極大地提高了CPU效率,避免了CPU需要不斷輪詢檢查外設狀態的低效做法。
? ? ? ? ?? ?
DMA (Direct Memory Access)?則更進一步。對于大量數據的傳輸(比如從ADC連續采集數據存入內存,或者將內存中的圖像數據發送到顯示屏),如果讓CPU一個字節一個字節地搬運,會非常占用CPU資源。
? ? ? ? ?? ?
DMA控制器就像一個“搬運工”,CPU可以配置好DMA,告訴它源地址、目標地址、傳輸數量,然后DMA就可以在不需要CPU干預的情況下,直接在外設和內存之間,或者內存與內存之間高速傳輸數據,傳輸完成后再通過中斷通知CPU。這極大地解放了CPU,讓它可以去做更重要的計算任務。
? ? ? ? ?? ?
理解中斷和DMA的工作原理,同樣離不開對CPU、內存、外設以及它們之間總線連接關系的認識。
? ? ? ? ?? ?
單片機雖小,其內部卻是一個組織嚴密、分工明確、協作高效的微型世界。理解了CPU的統領、內存的支撐、外設的感知與執行,以及總線的連接,你就掌握了解讀數據手冊、高效調試、優化性能、設計穩健系統的“金鑰匙”。不再隔“芯”看物,方能隨“芯”所欲。
?? ??
end

下面是更多無際原創的個人成長經歷、行業經驗、技術干貨。
1.電子工程師是怎樣的成長之路?10年5000字總結
2.如何快速看懂別人的代碼和思維
3.單片機開發項目全局變量太多怎么管理?
4.C語言開發單片機為什么大多數都采用全局變量的形式?
5.單片機怎么實現模塊化編程?實用程度讓人發指!
6.c語言回調函數的使用及實際作用詳解
7.手把手教你c語言隊列實現代碼,通俗易懂超詳細!
8.c語言指針用法詳解,通俗易懂超詳細!