嵌入式開發:GPIO、UART、SPI、I2C 驅動開發詳解與實戰案例

📍 本文為嵌入式學習系列第二篇,基于 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:該如何選擇?

比較項SPII2C
通信線數42
通信速度相對較慢
通信方式全雙工半雙工
應用場景Flash、LCD、音頻OLED、溫濕度傳感器

💡 I2C 驅動 OLED 屏幕是一個非常好的練手項目!


六、驅動開發常見 Bug 與調試建議

問題原因解決建議
外設無響應沒開時鐘檢查 RCC 設置
串口亂碼波特率不匹配確認 MCU 與串口助手波特率一致
SPI 全是 0xFF主從設置/時序錯誤檢查主設備 CS 管腳、電平時序
按鍵無效引腳配置錯誤檢查 GPIO 模式是否為輸入

? 調試技巧:善用 printf + 示波器 + 邏輯分析儀


七、推薦練習項目(從入門到進階)

項目涉及外設難度
LED 跑馬燈GPIO?
串口溫度輸出UART + 模擬傳感器??
OLED 屏顯示I2C + 顯存緩沖???
SPI 驅動 FlashSPI + 讀寫校驗????
電壓采集與顯示ADC + OLED????

這些項目可作為你學習每個驅動模塊的實戰切入點。


八、學習建議與驅動能力成長路線

階段技能
入門點燈、串口收發
提升獨立驅動 OLED、EEPROM
實戰多外設交互 + 數據邏輯
系統模塊化驅動架構 + RTOS驅動層封裝

📌 建議配合芯片手冊與 CubeMX 使用,逐步掌握寄存器與中間抽象層之間的轉換。


九、結語與項目推薦

驅動開發不僅是連接軟件和硬件的橋梁,也是你從“寫代碼”走向“做系統”的第一步。

💼 本文基于項目:0voice/EmbeddedSoftwareLearn
📂 項目內容涵蓋:C語言基礎、外設驅動、RTOS調度、系統移植等,適合系統性學習
在這里插入圖片描述

歡迎點贊 👍、收藏 ?、評論區留言 📮 交流,持續更新「嵌入式系列實戰」內容!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87056.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87056.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87056.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

常用 Linux 命令和 shell 腳本語言整理

目錄 一、Linux 命令大全 1、文件和目錄操作 &#xff08;1&#xff09;ls 列出目錄內容 &#xff08;2&#xff09;pwd 查看當前目錄 &#xff08;3&#xff09;cd 切換目錄 &#xff08;4&#xff09;mkdir 創建目錄 &#xff08;5&#xff09;cp 復制文件或目錄 &…

YOLOv12_ultralytics-8.3.145_2025_5_27部分代碼閱讀筆記-autobackend.py

autobackend.py ultralytics\nn\autobackend.py 目錄 autobackend.py 1.所需的庫和模塊 2.def check_class_names(names: Union[List, Dict]) -> Dict[int, str]: 3.def default_class_names(data: Optional[Union[str, Path]] None) -> Dict[int, str]: 4.cla…

【MySQL基礎】MySQL索引全面解析:從原理到實踐

MySQL學習&#xff1a; https://blog.csdn.net/2301_80220607/category_12971838.html?spm1001.2014.3001.5482 前言&#xff1a; 在前面我們基本上已經把MySQL的基礎知識都進行了學習&#xff0c;但是我們之前處理的數據都是十分少的&#xff0c;但是如果當我們的數據量很大…

第三十五章 I2S——音頻傳輸接口

第三十五章 I2S——音頻傳輸接口 目錄 第三十五章 I2S——音頻傳輸接口 1 I2S概述 1.1 簡介 1.2 功能特點 1.3 工作原理 1.4 利用DMA通信的I2S 1.4.1 I2S配合DMA通信工作原理 1.4.2 配置要點 2 應用場景 2.1 消費類音頻設備 2.2 專業音頻設備 2.3 通信設備 2.4 汽車電子 2.5 嵌…

產品-Figma(英文版),圖像的布爾類型圖例說明

文章目錄 Union SelectionSubtract SelectionIntersect SelectionExclude SelectionFlatten Selection Union Selection 把多個形狀合并成一個新的完整形狀&#xff0c;保留所有外部輪廓&#xff0c;內部不被切割。由于紅色的長方形在外面的一層&#xff0c;所以切割后&#x…

Windows CMD命令分類大全

?? ?一、系統與磁盤管理? ?系統信息? systeminfo&#xff1a;查看詳細硬件及系統配置&#xff08;版本/內存/補丁&#xff09;211 winver&#xff1a;快速檢查Windows版本11 msinfo32&#xff1a;圖形化系統信息面板811?磁盤工具? chkdsk /f&#xff1a;修復磁盤錯誤&…

【Dify系列】【Dify1.4.2 升級到Dify1.5.0】

1. 升級前準備工作 1.1 數據備份&#xff1a; 進入原安裝包 docker 目錄&#xff0c;備份“volumes”文件夾&#xff0c;此文件夾包含了 Dify 數據庫數據&#xff1a; rootjoe:/usr/local/dify/docker/volumes# pwd /usr/local/dify/docker/volumesrootjoe:/usr/local/dify/…

DeepSeek網頁版隨機點名器

用DeepSeek幫我們生成了一個基于html5的隨機點名器&#xff0c;效果非常棒&#xff0c;如果需要加入名字&#xff0c;請在代碼中按照對應的格式添加即可。 提示詞prompt 幫我生成一個隨機點名的HTML5頁面 生成真實一點的名字數據 點擊隨機按鈕開始隨機選擇 要有閃動的效果 &…

前后端分離實戰2----后端

戳我抵達前端 項目描述&#xff1a;用Vscode創建Spring Bootmybatis項目&#xff0c;用maven進行管理。創建一個User表&#xff0c;對其內容進行表的基本操作&#xff08;增刪改查&#xff09;&#xff0c;顯示在前端。 項目地址&#xff1a;戳我一鍵下載項目 運行效果如下&…

深入 ARM-Linux 的系統調用世界

1、引言 本篇文章以 ARM 架構為例&#xff0c;進行講解。需要讀者有一定的 ARM 架構基礎 在操作系統的世界中&#xff0c;系統調用&#xff08;System Call&#xff09;是用戶空間與內核空間溝通的橋梁。用戶態程序如 ls、cp 或你的 C 程序&#xff0c;無權直接操作硬件、訪問文…

LabVIEW鍵盤鼠標監測控制

通過Input Device Control VIs&#xff0c;實現對鍵盤和鼠標活動的監測。通過AcquireInput Data VI 在循環中持續獲取輸入數據&#xff0c;InitializeKeyboard與InitializeMouse VIs 先獲取設備ID 引用&#xff0c;用于循環內監測操作&#xff1b;運行時可輸出按鍵信息&#xf…

Linux 系統管理:自動化運維與容器化部署

在現代 IT 基礎設施中&#xff0c;自動化運維和容器化部署是提高系統管理效率和可維護性的關鍵。Linux 系統因其穩定性和靈活性而被廣泛應用于服務器和數據中心。本文將深入探討 Linux 系統管理中的自動化運維和容器化部署技術&#xff0c;幫助系統管理員實現高效運維和快速部署…

直播 APP 開發需要多少成本

直播行業的火爆催生了大量直播 APP 開發需求&#xff0c;而開發成本是開發者最關注的問題之一。其成本構成復雜&#xff0c;受功能需求、開發方式、技術難度等多種因素影響。? 基礎功能開發是成本的重要組成部分。用戶注冊登錄、直播間創建與管理、視頻播放、聊天互動等功能開…

Reactor操作符的共享與復用

在 Reactor 中&#xff0c;transform 和 transformDeferred 是兩個用于代碼復用和操作符鏈封裝的高級操作符。它們允許你將一組操作符封裝成一個函數&#xff0c;并在適當的時候應用到響應式流中。以下是它們的詳細總結&#xff1a; 1. transform 操作符 作用&#xff1a;tran…

C#中的Converter詳解

Converter是C#中一個非常有用的概念&#xff0c;主要用于類型轉換。它通常以委托或接口的形式出現&#xff0c;允許開發者定義如何將一種類型轉換為另一種類型。下面我將詳細介紹Converter的概念、使用場景&#xff0c;并以布爾型轉換為例展示具體應用。 Converter的基本概念 …

LabVIEW熒光微管圖像模擬

利用LabVIEW平臺&#xff0c;集成 PI 壓電平臺、Nikon 熒光顯微鏡及Andor sCMOS 相機等硬件&#xff0c;構建熒光微管滑行實驗圖像序列模擬系統。通過程序化模擬微管運動軌跡、熒光標記分布及顯微成像過程&#xff0c;為生物醫學領域微管跟蹤算法測試、運動特性分析提供標準化仿…

CentOS下Nginx服務器搭建全攻略

Nginx 安裝與配置完整指南 一、安裝 Nginx 1.1 添加 Nginx 官方倉庫 在 CentOS 系統中&#xff0c;默認倉庫的 Nginx 版本可能較舊&#xff08;通常為 1.12 或更早版本&#xff09;&#xff0c;建議添加官方倉庫來安裝最新穩定版本&#xff08;目前為 1.25.x&#xff09;&am…

網絡拓撲圖繪制全流程:從架構解析到工具實戰

在數據呈現與系統管理中&#xff0c;清晰展示設備間的邏輯關系至關重要。網絡拓撲圖正是這樣一種有效的可視化工具。它通過節點設備和連接線路&#xff0c;直觀呈現網絡結構或項目流程中各元素的布局與交互關系&#xff0c;幫助理解系統運作、診斷問題并確保項目順利進行。 1. …

Git 簡介安裝教程

&#x1f4e2;歡迎點贊&#x1f44d;收藏?留言&#x1f4dd;如有錯誤敬請指正&#xff01; 目錄 一、Git 的安裝1.1 Git 的下載1.2 Git 的安裝1.2.1 使用許可聲明1.2.2 選擇安裝目錄1.2.3 選擇安裝組件1.2.4 選擇開始菜單文件夾1.2.5 選擇 Git 默認編輯器1.2.6 決定初始化新項…

鴻蒙NEXT-鴻蒙三層架構搭建,嵌入HMRouter,實現便捷跳轉,新手攻略。(2/3)

在上一小節我們已經完成了關于三層架構的搭建&#xff0c;接下來我們來實現在三層架構中的導入依賴&#xff0c;將他們相互聯系起來。 第一步&#xff1a;在features產品定制層中&#xff0c;對其中所有的動態共享包導入依賴&#xff0c;示例features>my>oh-package.jso…