本文是《STM32 模块化开发实战指南》的第 2 篇,聚焦于“串口驱动模块的设计与封装”。我们将从一个最基础的裸机 UART 初始化开始,逐步实现:中断支持、环形缓冲收发、模块接口抽象与测试策略,构建一个可移植、可扩展、可复用的 UART 驱动模块。
一、模块化 UART 的设计目标
我们开发 UART 模块,不只是“能收发数据”那么简单,更希望实现以下目标:
-
✅ 代码结构清晰、功能解耦、职责分明
-
✅ 支持中断或 DMA,提高效率
-
✅ 配合 RingBuffer 实现非阻塞收发
-
✅ 封装接口,隐藏底层硬件差异
-
✅ 可被其他项目直接复用,无需改动
二、模块目录结构与文件命名
推荐将 UART 模块单独划分为 src/drivers/uart.c
和 inc/uart.h
,并通过 RingBuffer 模块(middleware/ring_buffer.c
)协作完成非阻塞收发:
project_root/
├── inc/
│ └── uart.h
├── src/
│ └── drivers/
│ └── uart.c
├── middleware/
│ └── ring_buffer.c/.h
三、uart.h:UART 模块接口定义
#ifndef UART_H
#define UART_H#include <stdint.h>
#include <stddef.h>void uart_init(void);
void uart_send_blocking(uint8_t byte);
int uart_read_byte(uint8_t *data); // 非阻塞读
void uart_irq_handler(void); // 中断入口#endif
-
uart_init()
:初始化串口 -
uart_send_blocking()
:阻塞发送一个字节