一、概述
本设计基于STM32L072超低功耗MCU,通过I2C接口连接SHT30温湿度传感器,并使用LoRa模块进行无线通信,重点实现系统低功耗运行。
二、硬件配置
STM32L072 (Cortex-M0+, 超低功耗) + 传感器: SHT30 (I2C接口) + 无线模块: SX1276-LoRa模块
三、功能实现
1. 电源模式选择
// 进入低功耗模式函数
void Enter_LowPower_Mode(void)
{
// 关闭不必要的外设时钟
__HAL_RCC_GPIOA_CLK_DISABLE();
__HAL_RCC_GPIOB_CLK_DISABLE();
// 配置所有未使用的GPIO为模拟输入以降低功耗
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_All;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// 进入STOP模式,保留SRAM内容
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// 唤醒后重新配置系统时钟
SystemClock_Config();
}
2. 工作周期设计
// 主循环工作模式
while(1)
{
// 1. 唤醒传感器和LoRa模块
Power_On_SHT30();
Power_On_LoRa();
// 2. 读取传感器数据
float temp, humidity;
Read_SHT30(&temp, &humidity);
// 3. 发送数据
Send_LoRa_Data(temp, humidity);
// 4. 关闭外设
Power_Off_SHT30();
Power_Off_LoRa();
// 5. 计算下一次唤醒时间
uint32_t sleep_time = Calculate_Sleep_Time();
// 6. 配置RTC唤醒并进入低功耗模式
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, sleep_time, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
Enter_LowPower_Mode();
}
3. I2C通信优化 (SHT30)
// 低功耗I2C通信函数
HAL_StatusTypeDef SHT30_Read_Temp_Humidity(I2C_HandleTypeDef *hi2c, float *temperature, float *humidity)
{
uint8_t cmd[2] = {0x2C, 0x06}; // 高重复性测量命令
uint8_t data[6];
// 唤醒传感器
HAL_Delay(1); // 最小唤醒时间
// 发送测量命令
if(HAL_I2C_Master_Transmit(hi2c, SHT30_I2C_ADDR, cmd, 2, 100) != HAL_OK)
return HAL_ERROR;
// 延时等待测量完成(可优化为使用数据就绪引脚)
HAL_Delay(15); // 最大测量时间
// 读取数据
if(HAL_I2C_Master_Receive(hi2c, SHT30_I2C_ADDR, data, 6, 100) != HAL_OK)
return HAL_ERROR;
// 转换数据
uint16_t temp_raw = (data[0] << 8) | data[1];
uint16_t hum_raw = (data[3] << 8) | data[4];
*temperature = -45 + 175 * (temp_raw / 65535.0f);
*humidity = 100 * (hum_raw / 65535.0f);
return HAL_OK;
}
4. LoRa模块低功耗管理
// LoRa模块低功耗配置
void LoRa_Enter_Sleep_Mode(void)
{
// 发送睡眠命令
uint8_t sleep_cmd[] = {0x80, 0x00}; // 根据实际模块修改
HAL_UART_Transmit(&hlpuart1, sleep_cmd, sizeof(sleep_cmd), 100);
// 关闭LoRa模块电源
HAL_GPIO_WritePin(LORA_PWR_GPIO_Port, LORA_PWR_Pin, GPIO_PIN_RESET);
}
void LoRa_Wakeup(void)
{
// 开启LoRa模块电源
HAL_GPIO_WritePin(LORA_PWR_GPIO_Port, LORA_PWR_Pin, GPIO_PIN_SET);
HAL_Delay(50); // 等待模块启动
// 初始化LoRa模块
LoRa_Init();
}
5. RTC唤醒配置
// RTC唤醒定时器配置
void RTC_Wakeup_Config(uint32_t seconds)
{
// 禁用唤醒定时器
HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
// 计算唤醒计数器值 (根据时钟分频配置)
uint32_t wakeup_counter = seconds * (LSI_VALUE / 16);
// 设置唤醒定时器
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, wakeup_counter, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
}
// RTC唤醒中断处理
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{
// 唤醒后处理
}
6.完整主函数
int main(void)
{
HAL_Init();
SystemClock_Config();
// 初始化外设
MX_GPIO_Init();
MX_I2C1_Init();
MX_USART1_UART_Init();
MX_RTC_Init();
// 启用低功耗模式
HAL_PWREx_EnableUltraLowPower();
HAL_PWREx_EnableFastWakeUp();
// 主循环
while (1)
{
float temp, humidity;
// 1. 唤醒传感器
Power_On_SHT30();
// 2. 读取数据
if(SHT30_Read_Temp_Humidity(&hi2c1, &temp, &humidity) == HAL_OK)
{
// 3. 唤醒LoRa并发送数据
LoRa_Wakeup();
Send_LoRa_Data(temp, humidity);
LoRa_Enter_Sleep_Mode();
}
// 4. 关闭传感器
Power_Off_SHT30();
// 5. 设置30分钟休眠 (可根据需要调整)
RTC_Wakeup_Config(30 * 60);
// 6. 进入低功耗模式
Enter_LowPower_Mode();
}
}
四、功耗优化关注点
1.时钟配置:在满足性能需求下使用最低系统时钟,不使用的外设时钟及时关闭,
2.GPIO配置:所有未使用的引脚配置为模拟输入,使用的引脚在不用时设为低电平,
3.电源管理:为传感器和LoRa模块设计独立电源控制电路,不使用时彻底断电而非仅软件休眠
4.中断唤醒:尽可能使用中断唤醒而非轮询,减少醒来时间,配置多个唤醒源(RTC, EXTI等)
5.通信优化:I2C通信使用最快可用速度减少活动时间,LoRa使用最合适的扩频因子和带宽平衡距离与功耗
通过以上设计,系统大部分时间可保持在μA级电流消耗,仅在数据采集和发送时短暂唤醒工作在mA级,实现超低功耗运行。
|