Files
stm32-iot-sensor-node/32_MODULES.md
T
2026-10-19 15:47:18 +08:00

12 KiB

模块接口设计文档

1. 模块概览

1.1 模块分类

mylib/
├── 通信模块 (Communication)
│   ├── esp8266.c/.h      # WiFi通信模块
│   ├── usart1.c/.h       # 串口通信模块
│   └── queue.c/.h        # 数据队列管理
├── 传感器模块 (Sensors)
│   ├── dht11.c/.h        # 温湿度传感器
│   └── adc.c/.h          # ADC模数转换
├── 显示模块 (Display)
│   ├── oled.c/.h         # OLED显示屏
│   └── wfont.c/.h        # 中文字库
├── 控制模块 (Control)
│   ├── led.c/.h          # LED控制
│   ├── beep.c/.h         # 蜂鸣器控制
│   └── button.c/.h       # 按键输入
├── 系统模块 (System)
│   ├── systick.c/.h      # 系统定时器
│   ├── delay.c/.h        # 延时函数
│   ├── iwdg.c/.h         # 独立看门狗
│   └── eeprom.c/.h       # EEPROM存储
└── 硬件抽象层 (HAL)
    └── gpio_iic.c/.h     # GPIO模拟I²C

2. 通信模块接口

2.1 ESP8266 WiFi模块 (esp8266.h/.c)

功能描述: ESP8266 WiFi模块驱动,提供AT指令控制和TCP通信功能

硬件连接:

  • PA2: USART2_RX (ESP8266 TX)
  • PA3: USART2_TX (ESP8266 RX)

API接口:

// 模块初始化
void esp8266_init(void);
/*
 * 功能: 初始化ESP8266模块和USART2
 * 参数: 无
 * 返回: 无
 * 说明: 配置USART2波特率115200,初始化接收队列
 */

// WiFi连接
int esp8266_connect_wifi(const char *ssid, const char *passwd);
/*
 * 功能: 连接到指定的WiFi网络
 * 参数: ssid - WiFi名称, passwd - WiFi密码
 * 返回: 1-连接成功, 0-连接失败
 * 说明: 发送AT+CWJAP指令连接WiFi
 */

// TCP连接
int esp8266_tcp_connect(const char *ip, uint16_t port);
/*
 * 功能: 建立TCP客户端连接
 * 参数: ip - 服务器IP地址, port - 端口号
 * 返回: 1-连接成功, 0-连接失败
 * 说明: 使用AT+CIPSTART建立TCP连接
 */

// 数据发送
int esp8266_write(const char *data, uint16_t len);
/*
 * 功能: 通过TCP发送数据
 * 参数: data - 数据缓冲区, len - 数据长度
 * 返回: 实际发送的字节数,0表示失败
 * 说明: 使用AT+CIPSEND发送数据
 */

// 数据接收
uint16_t esp8266_read(char *buf, uint16_t buf_size);
/*
 * 功能: 读取接收到的数据
 * 参数: buf - 接收缓冲区, buf_size - 缓冲区大小
 * 返回: 实际读取的字节数
 * 说明: 从接收队列中读取数据
 */

// 清空缓冲区
void esp8266_clear_read_buf(void);
/*
 * 功能: 清空接收缓冲区
 * 参数: 无
 * 返回: 无
 */

// 关闭连接
void esp8266_tcp_close(void);
/*
 * 功能: 关闭TCP连接
 * 参数: 无
 * 返回: 无
 */

使用示例:

// 初始化并连接WiFi
esp8266_init();
if (esp8266_connect_wifi("my_wifi", "password123")) {
    printf("WiFi连接成功\r\n");

    // 连接服务器
    if (esp8266_tcp_connect("192.168.1.100", 5000)) {
        printf("服务器连接成功\r\n");

        // 发送数据
        char data[] = "Hello Server!";
        int sent = esp8266_write(data, strlen(data));
        printf("发送了%d字节数据\r\n", sent);
    }
}

2.2 USART1串口模块 (usart1.h/.c)

功能描述: USART1串口通信,主要用于调试输出

硬件连接:

  • PA9: USART1_TX
  • PA10: USART1_RX

API接口:

// 串口初始化
void usart1_init(u32 baudrate);
/*
 * 功能: 初始化USART1
 * 参数: baudrate - 波特率 (通常115200)
 * 返回: 无
 */

// 发送字符串
void usart1_send_string(const char *str);
/*
 * 功能: 发送字符串到USART1
 * 参数: str - 字符串指针
 * 返回: 无
 */

// 发送单个字符
void usart1_send_char(char c);
/*
 * 功能: 发送单个字符
 * 参数: c - 字符
 * 返回: 无
 */

// 重定向printf
int fputc(int ch, FILE *f);
/*
 * 功能: printf重定向到USART1
 * 参数: ch - 字符, f - 文件指针
 * 返回: 发送的字符
 */

3. 传感器模块接口

3.1 DHT11温湿度传感器 (dht11.h/.c)

功能描述: DHT11数字温湿度传感器驱动

硬件连接:

  • PC10: DHT11数据线

数据格式:

buf[0]: 湿度整数部分
buf[1]: 湿度小数部分
buf[2]: 温度整数部分
buf[3]: 温度小数部分
buf[4]: 校验和 (前4字节之和的低8位)

API接口:

// 传感器初始化
void dht11_init(void);
/*
 * 功能: 初始化DHT11传感器引脚
 * 参数: 无
 * 返回: 无
 * 说明: 配置PC10为开漏输出模式
 */

// 读取传感器数据
int dht11_get_values(u8 buf[5]);
/*
 * 功能: 读取温湿度数据
 * 参数: buf - 5字节数据缓冲区
 * 返回: 1-读取成功, 0-读取失败
 * 说明: 执行完整的数据读取时序,包含校验
 */

使用示例:

u8 dht11_data[5];
if (dht11_get_values(dht11_data)) {
    // 数据校验成功
    float humidity = dht11_data[0] + dht11_data[1] * 0.1;
    float temperature = dht11_data[2] + dht11_data[3] * 0.1;
    printf("温度: %.1f°C, 湿度: %.1f%%\r\n", temperature, humidity);
} else {
    printf("DHT11读取失败\r\n");
}

3.2 ADC模数转换模块 (adc.h/.c)

功能描述: ADC多通道模拟量采集

硬件连接:

  • PA0-PA7: ADC通道0-7

API接口:

// ADC初始化
void adc1_init(void);
/*
 * 功能: 初始化ADC1
 * 参数: 无
 * 返回: 无
 * 说明: 配置ADC为连续转换模式,启用DMA
 */

// 读取ADC通道值
float adc1_read_channel(u8 channel);
/*
 * 功能: 读取指定ADC通道的电压值
 * 参数: channel - ADC通道号 (0-7)
 * 返回: 电压值 (V)
 * 说明: 返回转换后的实际电压值
 */

4. 显示模块接口

4.1 OLED显示屏模块 (oled.h/.c)

功能描述: 128x64分辨率OLED显示屏驱动

硬件连接:

  • PB6: I²C时钟线 (SCL)
  • PB7: I²C数据线 (SDA)

显示特性:

  • 分辨率: 128x64像素
  • 接口: I²C (0x78)
  • 缓冲区: 128x8字节帧缓冲

API接口:

// OLED初始化
void oled_init(void);
/*
 * 功能: 初始化OLED显示屏
 * 参数: 无
 * 返回: 无
 * 说明: 发送初始化指令序列
 */

// 清空屏幕
void oled_clear(void);
/*
 * 功能: 清空显示内容
 * 参数: 无
 * 返回: 无
 */

// 填充屏幕
void oled_fill(u8 fill_data);
/*
 * 功能: 用指定数据填充屏幕
 * 参数: fill_data - 填充数据 (0x00-0xFF)
 * 返回: 无
 */

// 绘制像素点
void oled_draw_point(u8 x, u8 y, u8 val);
/*
 * 功能: 在指定位置绘制像素点
 * 参数: x - X坐标(0-127), y - Y坐标(0-63), val - 像素值
 * 返回: 无
 */

// 绘制文本
void oled_draw_text8(u8 x, u8 y, const char *text);
/*
 * 功能: 绘制8x16像素文本
 * 参数: x - 起始X坐标, y - 起始Y坐标, text - 文本内容
 * 返回: 无
 */

// 绘制中文文本
void oled_draw_text16(u8 x, u8 y, const char *text);
/*
 * 功能: 绘制16x16像素中文文本
 * 参数: x - 起始X坐标, y - 起始Y坐标, text - 中文文本
 * 返回: 无
 * 说明: 支持GBK编码中文字符
 */

// 刷新显示
void oled_refresh_framebuffer(void);
/*
 * 功能: 将帧缓冲区内容刷新到屏幕
 * 参数: 无
 * 返回: 无
 */

使用示例:

// 初始化OLED
oled_init();
oled_clear();

// 显示文本
oled_draw_text8(0, 0, "Hello");
oled_draw_text16(0, 16, "温度");

// 刷新显示
oled_refresh_framebuffer();

4.2 中文字库模块 (wfont.h/.c)

功能描述: OLED中文显示字库

字库特性:

  • 编码: GBK
  • 字体: 16x16像素
  • 范围: 常用汉字

API接口:

// 获取汉字字模数据
const u8* get_chinese_font(const char *gbk_char);
/*
 * 功能: 获取GBK字符的字模数据
 * 参数: gbk_char - GBK编码字符 (2字节)
 * 返回: 32字节字模数据指针
 */

5. 控制模块接口

5.1 LED控制模块 (led.h/.c)

功能描述: LED状态指示控制

硬件连接:

  • PB0: LED0 (红色)
  • PB1: LED1 (绿色)
  • PB2: LED2 (蓝色)

API接口:

// LED初始化
void led_init(void);
/*
 * 功能: 初始化LED控制引脚
 * 参数: 无
 * 返回: 无
 */

// 设置LED状态
void led_set_status(u8 led_num, u8 status);
/*
 * 功能: 设置指定LED的状态
 * 参数: led_num - LED编号(0-2), status - 状态(0-熄灭, 1-点亮)
 * 返回: 无
 */

// LED闪烁
void led_blink(u8 led_num, u8 times);
/*
 * 功能: LED闪烁指定次数
 * 参数: led_num - LED编号, times - 闪烁次数
 * 返回: 无
 */

5.2 蜂鸣器控制模块 (beep.h/.c)

功能描述: 蜂鸣器报警控制

硬件连接:

  • PB5: 蜂鸣器控制

API接口:

// 蜂鸣器初始化
void beep_init(void);
/*
 * 功能: 初始化蜂鸣器控制引脚
 * 参数: 无
 * 返回: 无
 */

// 开启蜂鸣器
void beep_on(void);
/*
 * 功能: 开启蜂鸣器
 * 参数: 无
 * 返回: 无
 */

// 关闭蜂鸣器
void beep_off(void);
/*
 * 功能: 关闭蜂鸣器
 * 参数: 无
 * 返回: 无
 */

// 蜂鸣器鸣叫
void beep_beep(u16 times, u16 delay_ms);
/*
 * 功能: 蜂鸣器鸣叫指定次数
 * 参数: times - 鸣叫次数, delay_ms - 每次鸣叫持续时间
 * 返回: 无
 */

6. 系统模块接口

6.1 系统定时器模块 (systick.h/.c)

功能描述: SysTick系统定时器,提供精确延时和时间基准

API接口:

// SysTick初始化
void systick_init(void);
/*
 * 功能: 初始化SysTick定时器
 * 参数: 无
 * 返回: 无
 * 说明: 配置1ms中断
 */

// 获取系统时钟计数
uint32_t get_system_tick(void);
/*
 * 功能: 获取系统时钟计数
 * 参数: 无
 * 返回: 系统时钟计数 (毫秒)
 */

// 毫秒延时
void delay_ms(uint32_t ms);
/*
 * 功能: 毫秒级精确延时
 * 参数: ms - 延时时间
 * 返回: 无
 */

6.2 独立看门狗模块 (iwdg.h/.c)

功能描述: 独立看门狗,防止系统死机

API接口:

// 看门狗初始化
void iwdg_init(u8 prer, u16 rlr);
/*
 * 功能: 初始化独立看门狗
 * 参数: prer - 预分频器, rlr - 重载值
 * 返回: 无
 */

// 喂狗操作
void iwdg_feed(void);
/*
 * 功能: 重置看门狗计数器
 * 参数: 无
 * 返回: 无
 */

6.3 EEPROM存储模块 (eeprom.h/.c)

功能描述: EEPROM参数存储,用于保存配置信息

API接口:

// EEPROM初始化
void eeprom_init(void);
/*
 * 功能: 初始化EEPROM
 * 参数: 无
 * 返回: 无
 */

// 写入数据
void eeprom_write(u16 addr, u8 data);
/*
 * 功能: 向指定地址写入数据
 * 参数: addr - 地址, data - 数据
 * 返回: 无
 */

// 读取数据
u8 eeprom_read(u16 addr);
/*
 * 功能: 从指定地址读取数据
 * 参数: addr - 地址
 * 返回: 读取的数据
 */

7. 模块间依赖关系

主程序 (main.c)
    ├── 通信模块
    │   ├── esp8266 → usart1 → systick
    │   └── queue
    ├── 传感器模块
    │   ├── dht11 → systick → gpio_iic
    │   └── adc → systick
    ├── 显示模块
    │   ├── oled → gpio_iic → wfont
    │   └── wfont
    ├── 控制模块
    │   ├── led
    │   ├── beep
    │   └── button → exti_button
    └── 系统模块
        ├── systick
        ├── delay → systick
        ├── iwdg
        └── eeprom

8. 错误处理机制

8.1 返回值约定

  • 函数返回值类型: int 或 uint8_t
  • 成功返回值: 1 或非负数
  • 失败返回值: 0 或负数
  • 错误码定义:
    #define ERR_SUCCESS         0   // 成功
    #define ERR_PARAM_INVALID  -1  // 参数无效
    #define ERR_TIMEOUT        -2  // 超时
    #define ERR_NOT_READY      -3  // 设备未就绪
    #define ERR_CHECKSUM       -4  // 校验错误
    #define ERR_COMM_FAILED    -5  // 通信失败
    

8.2 调试接口

// 调试信息输出
#define DEBUG_PRINT(fmt, ...) \
    do { \
        if (debug_enabled) { \
            printf("[DEBUG] %s:%d: " fmt "\r\n", __FILE__, __LINE__, ##__VA_ARGS__); \
        } \
    } while(0)

// 错误信息输出
#define ERROR_PRINT(fmt, ...) \
    printf("[ERROR] %s:%d: " fmt "\r\n", __FILE__, __LINE__, ##__VA_ARGS__)

文档版本: v1.0 最后更新: 2025-11-16 作者: STM32项目组