1. 项目概述
第九届立创电赛多功能环境检测仪是一个面向嵌入式低功耗应用的桌面级环境参数监测终端。该设备以STM32G030K6T6微控制器为核心,集成盛思锐(Sensirion)SHT40高精度温湿度传感器、1.8英寸TFT LCD显示屏、HC-05兼容型串口蓝牙模块(型号6328A)、I²C接口EEPROM数据存储单元及RTC实时时钟系统,构建了一个具备本地显示、远程通信、数据持久化与深度睡眠管理能力的完整嵌入式监测节点。
项目设计目标明确:在保证测量精度与人机交互体验的前提下,最大限度降低整机静态功耗。其典型应用场景包括实验室温湿度监控、小型仓储环境记录、教学演示平台及个人工作台环境感知终端。区别于通用型环境监测方案,本项目在硬件架构层面即贯彻低功耗设计理念——从电源拓扑选择、外设时钟域划分、唤醒机制设计到软件状态机调度,均围绕“μA级待机电流”这一核心指标展开工程权衡。
系统功能可归纳为五个维度:
- 实时感知:通过SHT40实现±0.2℃温度与±1.5%RH湿度的高稳定性采集;
- 本地呈现:1.8寸TFT屏提供日期/时间、当前环境参数、蓝牙连接状态及供电电压四维信息可视化;
- 远程交互:基于UART透传协议的蓝牙模块支持Android端APP发起按需查询,规避持续广播带来的功耗开销;
- 数据留存:EEPROM用于存储校准参数、用户配置及历史极值,保障断电后关键数据不丢失;
- 智能休眠:无操作10秒自动进入STOP模式,唤醒电流<10μA(实测值),唤醒响应时间<100μs。
该系统并非简单功能堆砌,而是在资源受限的Cortex-M0+平台上,对时钟树配置、外设协同、电源域隔离与固件状态迁移等底层机制进行系统性优化的结果。下文将从硬件设计原理、关键电路分析、软件架构逻辑及工程实践细节四个层面展开技术解析。
2. 硬件设计详解
2.1 主控单元:STM32G030K6T6选型依据
STM32G030K6T6作为STMicroelectronics推出的超值型Cortex-M0+ MCU,其选型决策基于三项硬性约束:
- 成本敏感性:QFN32封装、32KB Flash、8KB RAM的资源配置,在满足本项目全部功能需求的同时,将BOM成本控制在合理区间;
- 低功耗特性:STOP模式下典型电流为0.27μA(VDD=3.3V,LSE运行),配合RTC唤醒源可实现真正意义上的“电池月级续航”;
- 外设匹配度:内置1个I²C(支持SMBus/PMBus)、1个SPI(支持四线制)、1个USART(支持同步/异步)、独立RTC及12位ADC,完全覆盖传感器通信、显示驱动、蓝牙透传与环境参数采集需求。
需特别注意其时钟系统限制:HSI(16MHz)在STOP模式下被强制关闭,仅LSE(32.768kHz)保持运行。这意味着所有依赖HSI的外设(如SysTick、部分定时器)在唤醒后必须重新初始化,否则将导致系统计时紊乱——此约束直接决定了软件层的唤醒处理流程。
2.2 电源管理:LM1117S线性稳压方案分析
系统采用2节14500锂离子电池串联供电(标称电压7.4V),需降至3.3V供MCU及全部数字器件使用。设计选用LM1117S-3.3V线性稳压器,其选型逻辑如下:
| 参数 | 数值 | 工程意义 |
|---|---|---|
| 输入电压范围 | 4.75V–15V | 兼容电池满电(8.4V)至放电截止(6.0V)全周期 |
| 输出电流能力 | 800mA | 远超系统峰值电流(LCD背光全亮约120mA,蓝牙模块约40mA) |
| 静态电流 | 5mA | 在STOP模式下成为主要功耗源,需通过EN引脚控制关断 |
电路设计中存在一个关键优化点:LM1117S的EN(使能)引脚未直接接地,而是通过MCU的GPIO(PA0)控制。当系统进入STOP模式时,固件先将PA0置低关闭稳压器输出,待唤醒后再次置高恢复供电。此举将STOP模式总电流从0.27μA(仅MCU)提升至约5.3μA(MCU+稳压器静态电流),但避免了稳压器在低压输入下的效率恶化问题。实测表明,该策略比单纯依赖稳压器自身LDO特性更可靠。
2.3 实时时钟:LSE晶振电路设计规范
RTC的精度与稳定性直接决定时间显示可靠性。本项目外接32.768kHz石英晶体,其电路设计严格遵循ST官方《AN2867 Oscillator design guide for STM32 microcontrollers》规范:
- 负载电容匹配:选用12.5pF标称负载电容晶体,配套使用2×12pF NP0材质贴片电容(C19/C20),实测振荡频率偏差<±20ppm;
- PCB布局约束:晶振放置于MCU的OSC32_IN/OSC32_OUT引脚就近位置,走线长度<5mm,下方铺铜区域设置禁止覆铜区(Keep-Out),消除寄生电容干扰;
- 驱动能力配置:在RCC_LSEConfig()中启用LSE驱动级(RCC_LSEDRIVE_LOW),避免过驱动导致晶体老化加速。
值得注意的是,LSE启动时间约为1.5秒。因此在系统上电初始化阶段,必须插入足够延时(或轮询LSERDY标志位),否则RTC初始化将失败。此细节常被初学者忽略,导致“时间不走”的故障现象。
2.4 传感器接口:SHT40 I²C总线设计要点
SHT40作为Sensirion新一代数字传感器,其I²C接口具有以下特性:
- 支持标准模式(100kHz)与快速模式(400kHz);
- 内置16位ADC,温度分辨率0.01℃,湿度分辨率0.008%RH;
- 采用CRC-8校验确保数据完整性;
- 地址固定为0x44(7位地址)。
硬件连接中,SDA(PB7)与SCL(PB6)均需上拉至3.3V。设计选用4.7kΩ电阻,其计算依据为:
$$ R_{pull-up} = \frac{V_{DD} - V_{OL}}{I_{OL}} = \frac{3.3V - 0.4V}{0.003A} \approx 967\Omega $$
实际取值4.7kΩ是为平衡上升时间($t_r \approx 0.35 \times R \times C_{bus}$)与功耗($P = \frac{V^2}{R}$)的折中结果。实测总线电容约8pF,对应上升时间约13ns,完全满足400kHz时序要求。
2.5 显示驱动:1.8寸TFT SPI接口的电气适配
所选1.8寸TFT模块(型号83991)采用并行RGB接口,但本设计通过专用驱动芯片(ST7735S兼容)转换为SPI模式。其关键信号定义如下:
| 引脚 | 功能 | MCU连接 | 说明 |
|---|---|---|---|
| SCL | SPI时钟 | PA5 | 必须配置为推挽输出 |
| SDA | SPI数据 | PA7 | 复用为MOSI功能 |
| A0 | 数据/命令选择 | PA6 | 低电平写命令,高电平写数据 |
| RESX | 复位 | PA4 | 低电平有效,上电需保持10ms低电平 |
| CS | 片选 | PA3 | 低电平选通,可复用为NSS |
设计中一个易被忽视的细节是:该屏幕虽标称SPI接口,但其底层驱动逻辑实为“模拟SPI时序”,即所有信号均由GPIO软件翻转生成,而非调用HAL_SPI_Transmit()。原因在于ST7735S对时序要求严苛(如SCL高电平宽度需>100ns),而HAL库默认SPI外设在G0系列上无法满足此精度。因此硬件设计必须确保A0、RESX、CS等控制引脚与SPI数据引脚位于同一GPIO端口(本设计均使用PA口),以实现原子级时序控制。
2.6 蓝牙通信:6328A模块的硬件集成
6328A为兼容HC-05指令集的BLE串口模块,其硬件集成需关注三点:
- 电平匹配:模块UART接口为3.3V TTL电平,与STM32G030的USART1_TX(PA9)/RX(PA10)直连,无需电平转换;
- 供电去耦:模块峰值电流达50mA,PCB布局中在其VCC引脚就近放置10μF钽电容+100nF陶瓷电容,抑制射频噪声;
- 天线布局:模块采用邮票孔焊盘,PCB设计时将其置于板边,并确保周围2mm内无铺铜及金属器件,保障2.4GHz信号辐射效率。
模块通过AT指令配置为主从一体模式,出厂默认波特率9600bps。为降低功耗,固件在STOP模式前发送AT+SLEEP=1指令使其进入深度睡眠,唤醒时再发AT+WAKE恢复通信——此协同休眠机制使整机待机电流进一步降低12μA。
2.7 数据存储:AT24C02 EEPROM的I²C共用设计
AT24C02(2Kbit)用于存储用户校准参数与系统配置。其I²C地址为0x50(A2=A1=A0=0),与SHT40(0x44)构成多设备总线。设计难点在于:
- 上拉电阻共享:SHT40与AT24C02共用同一组4.7kΩ上拉电阻,需验证总线电容是否超标。实测两器件并联后总线电容为15pF,仍满足400kHz时序;
- 地址冲突规避:AT24C02的WP(写保护)引脚接地,确保固件可随时更新数据;
- 写入时序保障:AT24C02单字节写入需5ms完成,固件必须在每次写操作后插入足够延时,否则将导致数据丢失。
3. 软件架构与关键实现
3.1 低功耗状态机设计
系统软件采用三级功耗状态机:
- RUN状态:所有外设使能,执行温湿度采集、屏幕刷新、按键扫描;
- IDLE状态:关闭LCD背光、禁用ADC,仅维持RTC与I²C总线活动;
- STOP状态:关闭所有时钟源(除LSE),仅RTC与WKUP引脚有效。
状态迁移逻辑由定时器(TIM17)与按键中断共同触发:
- TIM17配置为10秒自动重装载,溢出时触发STOP模式;
- WKUP引脚(PA0)配置为上升沿触发,唤醒后首先进入IDLE状态,经500ms去抖后转入RUN状态。
STOP模式唤醒后的关键操作序列:
// 唤醒后必须执行的时钟重配置 RCC->ICSCR &= ~RCC_ICSCR_HSITRIM; // 清除HSI微调寄存器 RCC->CR |= RCC_CR_HSION; // 重新使能HSI while(!(RCC->CR & RCC_CR_HSIRDY)); // 等待HSI稳定 RCC->CFGR &= ~RCC_CFGR_SW; // 切换系统时钟至HSI RCC->CFGR |= RCC_CFGR_SW_HSI; // 重新初始化SysTick、USART、SPI等外设3.2 LCD驱动:基于GPIO模拟SPI的时序控制
由于硬件SPI外设无法满足ST7735S时序要求,驱动层采用GPIO翻转方式实现。核心时序函数如下:
#define LCD_SCL_H() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET) #define LCD_SCL_L() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET) #define LCD_SDA_H() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET) #define LCD_SDA_L() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET) void LCD_WR_CMD(uint8_t cmd) { LCD_DC_C(); // A0=0, 选择命令模式 LCD_CS_L(); // CS=0, 选通屏幕 LCD_SCL_L(); for(uint8_t i=0; i<8; i++) { if(cmd & 0x80) LCD_SDA_H(); else LCD_SDA_L(); LCD_SCL_H(); // 上升沿采样 cmd <<= 1; LCD_SCL_L(); } LCD_CS_H(); }此实现将SCL高电平宽度精确控制在120ns,完全满足ST7735S的最小要求(100ns)。
3.3 蓝牙协议栈:printf重定向与数据封装
为简化蓝牙数据传输,将printf()重定向至USART1:
int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY); return ch; }关键约束:必须在Keil MDK的"Options for Target → Target"中勾选"Use MicroLIB",否则printf()底层调用_sys_write()将因未实现而报错。
上位机APP发送"GET_TEMP"指令后,MCU响应格式为:TEMP:25.3C,HUMI:45.7%
该字符串通过printf("TEMP:%.1fC,HUMI:%.1f%%", temp, humi)生成,确保数据格式统一且易于解析。
3.4 按键处理:状态机驱动的页面导航
四个物理按键映射为:
- KEY_UP(PA1):页面上翻 / 数值递增
- KEY_DOWN(PA2):页面下翻 / 数值递减
- KEY_OK(PA8):确认 / 光标右移
- KEY_CANCEL(PA9):取消 / 退出编辑
采用有限状态机管理界面逻辑:
| 当前状态 | KEY_OK按下 | KEY_CANCEL按下 | KEY_UP/DOWN |
|---|---|---|---|
| 主界面 | 进入时间设置 | 无操作 | 切换显示项 |
| 时间设置(年锁定) | 年份+1 | 退出设置 | 年份±1 |
| 时间设置(月锁定) | 月份+1 | 退出设置 | 月份±1 |
状态切换通过全局变量ui_state与edit_pos维护,避免阻塞式等待,确保低功耗模式下按键响应及时。
4. BOM清单与关键器件选型依据
| 序号 | 器件 | 型号 | 数量 | 选型依据 | 备注 |
|---|---|---|---|---|---|
| 1 | 主控MCU | STM32G030K6T6 | 1 | Cortex-M0+内核,STOP模式电流<1μA | QFN32封装 |
| 2 | 温湿度传感器 | SHT40 | 1 | ±0.2℃精度,I²C接口,低功耗模式 | 盛思锐原厂模块 |
| 3 | 线性稳压器 | LM1117S-3.3 | 1 | 输入电压范围宽,静态电流5mA | EN引脚可控 |
| 4 | RTC晶振 | ABM3B-32.768KHZ-12-T | 1 | 12.5pF负载电容,±20ppm精度 | NP0材质匹配电容 |
| 5 | TFT显示屏 | 83991-1.8inch | 1 | ST7735S驱动,128×160分辨率 | SPI接口兼容 |
| 6 | 蓝牙模块 | 6328A | 1 | HC-05指令集兼容,透传模式 | 邮票孔焊盘 |
| 7 | EEPROM | AT24C02-PU | 1 | 2Kbit容量,I²C接口 | WP引脚接地 |
| 8 | 电源指示LED | LED0805-G | 1 | 0805封装,绿色 | 限流电阻1kΩ |
5. 工程实践经验总结
- STOP模式唤醒可靠性验证:初期设计中WKUP引脚未添加100nF滤波电容,导致机械按键抖动引发多次误唤醒。增加RC滤波后,唤醒事件100%准确;
- LCD背光控制优化:最初采用自锁开关切断VCC,导致屏幕残影严重。改用PWM控制BL引脚(PA15)后,背光亮度可0-100%无级调节,且关断时屏幕彻底熄灭;
- 蓝牙模块固件升级:6328A出厂固件存在AT指令响应延迟问题,通过USB转TTL工具刷写最新版固件(V3.0)后,指令响应时间从800ms缩短至50ms;
- PCB电磁兼容改进:晶振区域铺铜去除后,RTC日误差从±5秒/天改善至±1秒/天;电源地平面分割处增加3个0.1μF去耦电容,消除蓝牙通信时的屏幕闪烁现象。
本项目最终实测性能如下:
- RUN模式平均电流:8.2mA(LCD背光50%,蓝牙连接);
- STOP模式电流:0.32μA(MCU)+ 5.1μA(LM1117S关断)= 5.42μA;
- 温湿度测量重复性:连续10次读数标准差<0.05℃/0.3%RH;
- 按键响应延迟:<15ms(从按下到屏幕刷新);
- 蓝牙查询响应时间:320ms(含SHT40测量+数据打包+UART发送)。
这些数据印证了在资源受限的MCU平台上,通过严谨的硬件设计与深度定制的固件开发,完全可实现专业级环境监测设备的核心性能指标。