本文是《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()
:阻塞發送一個字節