📍 本文為嵌入式學習系列第二篇,基于 GitHub 開源項目:0voice/EmbeddedSoftwareLearn
💬 作者:0voice
👀 適合對象:嵌入式初學者、STM32學習者、想搞明白外設驅動開發的C語言學習者
一、驅動是什么?為什么你必須學會寫驅動?
在嵌入式系統中,驅動是連接 MCU 與外部世界的橋梁。
你寫的所有控制代碼(點燈、收發數據、讀取溫度傳感器等),最終都會通過底層驅動轉換為硬件動作。
? 換句話說,驅動 = 讓硬件動起來的 C 語言代碼。
二、常用外設驅動概覽
外設 | 功能 | 常見場景 |
---|---|---|
GPIO | 通用輸入輸出 | 點燈、按鍵、繼電器 |
UART | 串口通信 | 串口調試、模塊通信 |
I2C | 雙線通信 | OLED、EEPROM、MPU6050 |
SPI | 高速通信 | Flash、ADC、屏幕 |
ADC | 模擬轉數字 | 電壓/光強/溫度檢測 |
TIM | 定時/計數/PWM | 電機控制、呼吸燈 |
這些模塊幾乎構成了嵌入式開發的大部分控制面。
三、GPIO 點燈裸機驅動代碼(STM32為例)
下面是一個最經典的 GPIO 控制示例:點亮 LED 燈。
🔧 初始化流程
#define RCC_APB2ENR (*(volatile unsigned int *)0x40021018)
#define GPIOC_CRH (*(volatile unsigned int *)0x40011004)
#define GPIOC_ODR (*(volatile unsigned int *)0x4001100C)void gpio_init() {RCC_APB2ENR |= (1 << 4); // 開啟 GPIOC 時鐘GPIOC_CRH &= ~(0xF << 20); // 配置 PC13 為推挽輸出GPIOC_CRH |= (0x1 << 20);
}
💡 控制 LED 燈亮滅
void led_on() {GPIOC_ODR &= ~(1 << 13); // 輸出低電平
}void led_off() {GPIOC_ODR |= (1 << 13); // 輸出高電平
}
四、UART 串口通信核心代碼
串口通信是調試、通信、日志輸出的核心。
?? 簡化裸機收發過程
void uart_send_char(char data) {while (!(USART1->SR & 0x80)); // 等待發送完成USART1->DR = data;
}char uart_recv_char() {while (!(USART1->SR & 0x20)); // 等待接收完成return USART1->DR;
}
串口需要配置波特率、停止位、奇偶校驗、GPIO復用等。
? 初學建議配合串口助手查看收發數據。
五、I2C 與 SPI:該如何選擇?
比較項 | SPI | I2C |
---|---|---|
通信線數 | 4 | 2 |
通信速度 | 高 | 相對較慢 |
通信方式 | 全雙工 | 半雙工 |
應用場景 | Flash、LCD、音頻 | OLED、溫濕度傳感器 |
💡 I2C 驅動 OLED 屏幕是一個非常好的練手項目!
六、驅動開發常見 Bug 與調試建議
問題 | 原因 | 解決建議 |
---|---|---|
外設無響應 | 沒開時鐘 | 檢查 RCC 設置 |
串口亂碼 | 波特率不匹配 | 確認 MCU 與串口助手波特率一致 |
SPI 全是 0xFF | 主從設置/時序錯誤 | 檢查主設備 CS 管腳、電平時序 |
按鍵無效 | 引腳配置錯誤 | 檢查 GPIO 模式是否為輸入 |
? 調試技巧:善用 printf
+ 示波器 + 邏輯分析儀
七、推薦練習項目(從入門到進階)
項目 | 涉及外設 | 難度 |
---|---|---|
LED 跑馬燈 | GPIO | ? |
串口溫度輸出 | UART + 模擬傳感器 | ?? |
OLED 屏顯示 | I2C + 顯存緩沖 | ??? |
SPI 驅動 Flash | SPI + 讀寫校驗 | ???? |
電壓采集與顯示 | ADC + OLED | ???? |
這些項目可作為你學習每個驅動模塊的實戰切入點。
八、學習建議與驅動能力成長路線
階段 | 技能 |
---|---|
入門 | 點燈、串口收發 |
提升 | 獨立驅動 OLED、EEPROM |
實戰 | 多外設交互 + 數據邏輯 |
系統 | 模塊化驅動架構 + RTOS驅動層封裝 |
📌 建議配合芯片手冊與 CubeMX 使用,逐步掌握寄存器與中間抽象層之間的轉換。
九、結語與項目推薦
驅動開發不僅是連接軟件和硬件的橋梁,也是你從“寫代碼”走向“做系統”的第一步。
💼 本文基于項目:0voice/EmbeddedSoftwareLearn
📂 項目內容涵蓋:C語言基礎、外設驅動、RTOS調度、系統移植等,適合系統性學習
歡迎點贊 👍、收藏 ?、評論區留言 📮 交流,持續更新「嵌入式系列實戰」內容!