[嵌入式系统与新兴技术(AI与低功耗)] STM32L072 + LoRa模块无线温湿度低功耗设计

[复制链接]
地瓜patch 发表于 2025-8-19 17:34 | 显示全部楼层 |阅读模式

一、概述
本设计基于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级,实现超低功耗运行。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:出一块TI-PLABS-AMP-EVM

1806

主题

14843

帖子

29

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:出一块TI-PLABS-AMP-EVM

1806

主题

14843

帖子

29

粉丝
快速回复 在线客服 返回列表 返回顶部