1. 项目代码框架 (Project Structure)
该项目采用了典型的嵌入式 CMake 工程结构,基于 PY32F0xx SDK 开发。
- 根目录:
CMakeLists.txt: CMake 构建脚本,用于定义编译源文件、头文件路径及链接库。README.md: 项目说明文档。
- Src (Source Code): 存放核心业务代码和驱动实现。
main.c: 主程序入口。包含系统初始化、外设初始化、主循环 (While Loop)。py32f0xx_it.c: 中断服务函数。处理 SysTick、UART 等硬件中断。py32f0xx_hal_msp.c: 板级支持包 (MSP)。负责初始化具体引脚 (GPIO)、时钟 (RCC) 等硬件底层。system_py32f0xx.c: 系统时钟配置。ina219.c: INA219 驱动。负责通过 I2C 读取电流、电压、功率寄存器。ssd1306.c: OLED 屏幕驱动。负责 I2C 发送显存数据、画点、画字等。i2c.c(通常存在): I2C 通信的底层实现(可能是软件模拟 I2C 或硬件 I2C HAL 库封装)。
- Inc (Headers): 存放对应的头文件 (
.h),声明函数接口和宏定义。 - Libs: 包含 PY32F0 系列的芯片固件库 (
Drivers和Middlewares)。
2. 核心代码逻辑分析
2.1 主循环逻辑 (main.c)
系统的“心脏”,采用 轮询模式。
- 初始化阶段:
- 配置系统时钟 (System Clock)。
- 初始化 GPIO、I2C 接口。
- 初始化 OLED 屏幕 (清屏、点亮)。
- 初始化 INA219 (写入校准寄存器)。
- 主循环 (While 1):
- 读取数据: 每隔一定时间(如 100ms-500ms),调用 INA219 驱动读取
Bus Voltage(总线电压) 和Shunt Voltage(分流电阻压降 -> 计算电流)。 - 数据处理: 计算功率 (),并进行格式化字符串 (sprintf)。
- 显示更新: 将格式化后的电压、电流、功率字符串写入 OLED 显存缓冲,并调用
OLED_Refresh()刷新屏幕。 - 串口输出 (可选): 如果开启了 UART debug,将数据通过串口打印到电脑。
- 读取数据: 每隔一定时间(如 100ms-500ms),调用 INA219 驱动读取
2.2 INA219 驱动模块 (ina219.c)
核心是 I2C 寄存器操作。
- 配置: 写入
Configuration Register(0x00),设置增益 (Gain) 和 ADC 精度 (如 12-bit)。 - 校准: 这里的关键是
Calibration Register(0x05)。代码中会根据采样电阻(2mΩ)计算一个校准值写入该寄存器,使得芯片能直接返回正确的电流值,或者读取原始电压值在 MCU 内部计算。- Wiki 提示: 项目文档提到需要修改
main.c中的CURRENT_CALIBRATION宏,这通常是用于微调最终的电流读数系数。
- Wiki 提示: 项目文档提到需要修改
2.3 OLED 显示模块 (ssd1306.c)
典型的 FrameBuffer (显存缓冲) 机制。
- MCU 内存中开辟一个
128 * 32 / 8字节的数组作为显存 (GRAM)。 - 绘图函数:
OLED_ShowString(),OLED_ShowNum()等函数只修改这个数组。 - 刷新函数:
OLED_UpdateScreen()或OLED_Refresh()通过 I2C DMA 或阻塞方式,将整个数组一次性发送给 SSD1306 屏幕驱动芯片。