嵌入式驱动开发实战:GPIO、UART、SPI、I2C 全解析(含裸机代码)

491 阅读3分钟

📂 项目参考:0voice/EmbeddedSoftwareLearn
👨‍💻 作者:不午睡的探索者,专注于人工智能、嵌入式软件、大数据
🧠 阅读建议:适合正在学习 STM32/ESP32/单片机开发的同学


📌 为什么你必须掌握驱动开发?

学完 C 语言,“能点灯”才算开始进入嵌入式世界的大门
想真正做出“采集数据+屏幕显示+串口调试”的嵌入式项目?你就必须懂驱动。
驱动让你写的代码变成现实世界的动作,例如:

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 点亮 LED

它的背后,是操作寄存器让 PA5 引脚输出高电平。


外设驱动有哪些?初学者该怎么学?

我们先看下实际开发中最常用的 6 大外设:

外设作用应用
GPIO控制引脚高低电平点灯、按键
UART串口通信打印调试、蓝牙
SPI高速通信Flash、屏幕
I2C简洁通信协议OLED、温湿度
ADC模拟转数字采集电压、电流
TIM定时、中断PWM、定时器

📌 建议学习顺序:

GPIO → UART → I2C/SPI → ADC → TIM

QQ截图20250626140159.png

🚦 GPIO 点灯裸机代码(STM32)

学嵌入式第一课,点灯就是 Hello World。

我们以 STM32 的 PC13 引脚为例,实现裸机点灯逻辑:

#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);      // 清除寄存器位
    GPIOC_CRH |= (0x1 << 20);       // 设置为推挽输出
}

void led_on() {
    GPIOC_ODR &= ~(1 << 13);  // 低电平点亮
}

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

思考题:如果你用的是 STM32F103RB 开发板,LED 是不是接在 PC13 上?能不能修改为 PA5?


📡 UART 串口通信:收发调试都靠它

串口是调试嵌入式的第一利器,所有 printf() 最终都靠它输出。

✍️ 裸机 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;
}

💬 常用波特率:9600 / 115200(记得 MCU 和串口助手一致)

🛠 配合串口调试助手 + Logic Analyzer,可以快速定位数据问题。


SPI vs I2C:实际怎么选?

协议通信速度线数常见应用
SPI快(MHz级)4Flash、LCD、音频
I2C慢(100~400kHz)2OLED、EEPROM

🎯 驱动开发常见 Bug(新手易踩坑)

问题原因
LED 不亮没开 GPIO 时钟、ODR 配错
串口乱码波特率设置不一致
SPI 全 0xFF没拉低 CS、时序错误
按键读不到引脚配置错误 or 没加下拉

✅ 调试思路:

  1. 加串口打印,确认初始化是否成功
  2. 用逻辑分析仪/示波器抓线
  3. 确认 datasheet + 时序图,硬件电平正常

驱动学习建议:从能点灯到能带项目

能力阶段能实现项目
GPIO、UARTLED灯控制、串口调试
I2C、SPI显示屏驱动、Flash 数据存储
ADC、PWM电压采集、呼吸灯、电机驱动

学驱动的精髓不是死记 API,而是搞懂外设控制流程 + 寄存器控制位。


项目推荐(全套开源)

驱动开发是入门嵌入式的关键阶段。学会 GPIO + 串口,基本能搭起开发调试体系;掌握 I2C/SPI + ADC,你就能控制传感器、采集数据、显示输出。
📂 GitHub 项目地址:0voice/EmbeddedSoftwareLearn

包含:

  • C语言基础
  • GPIO、UART、SPI、I2C 驱动开发
  • 中断系统
  • FreeRTOS 多任务调度
  • 项目实战案例(测温仪、OLED 显示屏、电压监控)

QQ20250625-142724.png