📂 项目参考: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
🚦 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级) | 4 | Flash、LCD、音频 |
| I2C | 慢(100~400kHz) | 2 | OLED、EEPROM |
🎯 驱动开发常见 Bug(新手易踩坑)
| 问题 | 原因 |
|---|---|
| LED 不亮 | 没开 GPIO 时钟、ODR 配错 |
| 串口乱码 | 波特率设置不一致 |
| SPI 全 0xFF | 没拉低 CS、时序错误 |
| 按键读不到 | 引脚配置错误 or 没加下拉 |
✅ 调试思路:
- 加串口打印,确认初始化是否成功
- 用逻辑分析仪/示波器抓线
- 确认 datasheet + 时序图,硬件电平正常
驱动学习建议:从能点灯到能带项目
| 能力阶段 | 能实现项目 |
|---|---|
| GPIO、UART | LED灯控制、串口调试 |
| I2C、SPI | 显示屏驱动、Flash 数据存储 |
| ADC、PWM | 电压采集、呼吸灯、电机驱动 |
学驱动的精髓不是死记 API,而是搞懂外设控制流程 + 寄存器控制位。
项目推荐(全套开源)
驱动开发是入门嵌入式的关键阶段。学会 GPIO + 串口,基本能搭起开发调试体系;掌握 I2C/SPI + ADC,你就能控制传感器、采集数据、显示输出。
📂 GitHub 项目地址:0voice/EmbeddedSoftwareLearn
包含:
- C语言基础
- GPIO、UART、SPI、I2C 驱动开发
- 中断系统
- FreeRTOS 多任务调度
- 项目实战案例(测温仪、OLED 显示屏、电压监控)