嵌入式开发: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 灯。

🔧 初始化流程

c 复制代码
#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 灯亮灭

c 复制代码
void led_on() {
    GPIOC_ODR &= ~(1 << 13);  // 输出低电平
}

void led_off() {
    GPIOC_ODR |= (1 << 13);   // 输出高电平
}

四、UART 串口通信核心代码

串口通信是调试、通信、日志输出的核心。

✍️ 简化裸机收发过程

c 复制代码
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调度、系统移植等,适合系统性学习

欢迎点赞 👍、收藏 ⭐、评论区留言 📮 交流,持续更新「嵌入式系列实战」内容!

相关推荐
码农不惑1 小时前
2025.06.27-14.44 C语言开发:Onvif(二)
c语言·开发语言
星辰pid1 小时前
STM32控制四自由度机械臂(SG90舵机)(硬件篇)(简单易复刻)
stm32·单片机·嵌入式硬件·机械臂
威桑3 小时前
STM32 专有名词缩写整合
stm32·单片机·嵌入式硬件
油泼辣子多加3 小时前
2025年06月30日Github流行趋势
github
凌肖战3 小时前
力扣网C语言编程题:在数组中查找目标值位置之二分查找法
c语言·算法·leetcode
ai小鬼头3 小时前
AIStarter如何快速部署Stable Diffusion?**新手也能轻松上手的AI绘图
前端·后端·github
9527华安3 小时前
FPGA实现40G网卡NIC,基于PCIE4C+40G/50G Ethernet subsystem架构,提供工程源码和技术支持
fpga开发·架构·网卡·ethernet·nic·40g·pcie4c
BreezeJuvenile3 小时前
数据结构与算法分析课设:一元多项式求值
c语言·课程设计·数据结构与算法分析·一元多项式计算
SKYDROID云卓小助手5 小时前
无人设备遥控器之自动调整编码技术篇
人工智能·嵌入式硬件·算法·自动化·信号处理
所念皆星海9115 小时前
图灵完备之路(数电学习三分钟)----数据选择器与总线
嵌入式硬件·通信·数电