首页 > 其他分享 >[STM32]STM32L4超低功耗应用

[STM32]STM32L4超低功耗应用

时间:2024-09-18 23:21:48浏览次数:13  
标签:CODE HAL STM32L4 低功耗 STM32 Init USER GPIO

         在完成了上一个低功耗小应用之后,发现有些问题还是需要解决。一是整体功耗不够低,二是用无线功能的话功耗难以做到极低。所以这次打算做一个去除无线功能的超低功耗的温湿度计。

一、硬件选型

1.主控和LDO:对于低功耗最重要的就是主控和LDO,所以主控选择STM32Lxx系列LDO选择HT7533。

2.传感器:选用AHT10采集温湿度和BMP280采集大气压强数据,这两款传感器运行功耗都是ua级别,所以可以直接采用CPU引脚对其进行供电,在低功耗模式下可直接切断引脚对其的供电。

3.充电和充电管理芯片:使用非晶硅太阳能光伏板弱光发电板为其搭载的锂电池充电,这个太阳能板的优点就是即使是在室内光线下也有电流产生,不过很小就是了,大概1-2ua。

使用TP4056充电管理芯片,这款芯片待机电流较高,达到了40ua是这块板子的耗电大户,但其仅会在对其充电的时候才会耗电因此不会消耗电池电量。

4.显示模块:使用COG低功耗液晶显示屏

本来想的是能够在单片机进入低功耗模式下还能以极低功耗显示数据,但是商家这个屏幕不太好用,宣传的是30ua但事实上却达不到,即使是用了商家的低功耗例程也降不下去功耗。

使用我自己设计的板子,HT7533和TP4056被BMP280和AHT10遮住了 

二、软件实现

本文打算使用STOP和STANDBY模式进行低功耗设计,而这两种模式都能被事件唤醒,而RTC闹钟中断就是一个事件,所以整体思路就是:初始化----显示温湿度数据----进入低功耗----RTC中断唤醒-----显示数据.....

cubeMX设置

首先设置时钟,低功耗模式不需要这么高的主频,给个2MHz意思意思。

其次初始化一下各个传感器的引脚

AHT10使用iic

 

BMP280和液晶显示屏使用GPIO模拟通信

 

设置一下RTC 

 最后,将其他空闲IO口设置为模拟输入,这样可以节省电流的消耗

 进入和退出低功耗代码

void enter_stop(){
	MX_GPIO_Init1();
	//sleep_mode_ON();
	__HAL_RCC_PWR_CLK_ENABLE();
	__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
	HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);
	//HAL_PWR_EnterSTANDBYMode();
}
void exit_stop(){
	
	HAL_Init();
	SystemClock_Config();
	MX_GPIO_Init();
	MX_RTC_Init();
	MX_I2C1_Init();
  MX_TIM1_Init();
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(LCD_VCC_GPIO_Port,LCD_VCC_Pin,GPIO_PIN_SET);
	HAL_GPIO_WritePin(BMP_VCC_GPIO_Port,BMP_VCC_Pin,GPIO_PIN_SET);
	HAL_GPIO_WritePin(AHT_VCC_GPIO_Port,AHT_VCC_Pin,GPIO_PIN_SET);
	AHT10_Init();
	bmp280Init();
	LcdInit();
	LcdClearScreen();
	LcdDispBK();
	  HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_3);
	__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_3, 50); 
	//sleep_mode_OFF();
}

main函数

int main(void)
{
  /* USER CODE BEGIN 1 */
  float BP_pressure,BP_temperature,BP_asl;
	float temp = 0,hum = 0;
	char p[32];
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_RTC_Init();
  MX_I2C1_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */
	//HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(LCD_VCC_GPIO_Port,LCD_VCC_Pin,GPIO_PIN_SET);
	HAL_GPIO_WritePin(BMP_VCC_GPIO_Port,BMP_VCC_Pin,GPIO_PIN_SET);
	HAL_GPIO_WritePin(AHT_VCC_GPIO_Port,AHT_VCC_Pin,GPIO_PIN_SET);
	AHT10_Init();
	bmp280Init();
	LcdInit();
	LcdClearScreen();
	LcdDispBK();
	sleep_mode_ON();
  HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_3);
	__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_3, 50); 
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

		bmp280GetData(&BP_pressure,&BP_temperature,&BP_asl);
		sprintf(p,"%.1f",BP_temperature);
		LcdDispStr8x16(1,6,60,(unsigned char *)p);
		if(AHT10_Read_predata(&hum, &temp) == 0){
			sprintf(p,"%.1f",temp);
			lcd_dis_48_48(0,10,p);
			sprintf(p,"%.1f",hum);
			LcdDispStr8x16(1,6,6,(unsigned char *)p);
		}
		enter_stop();
		exit_stop();
  }
  /* USER CODE END 3 */
}

三、功耗测试

低功耗显示数据

电流测试工具用的是合宙的电流表,可以看到功耗高达700ua,这远远高于低功耗的要求,这可能是这款屏幕的原因 ,至于为什么这么说,往下看

这张与上面的区别就是把屏幕显示关掉,而就这一个步骤就将功耗降到了3ua左右

在运行模式4ma,低功耗模式5ua。每休眠60分钟工作1秒钟,使用225mAh的电池供电(不算太阳能电池板的充电)的情况下经CubeMX的功耗计算机计算可以运行2个月20天

 

四、结尾 

最终结果算是差强人意吧,要全部工程的私我 

标签:CODE,HAL,STM32L4,低功耗,STM32,Init,USER,GPIO
From: https://blog.csdn.net/xxxyyyyyx/article/details/142344119

相关文章

  • stm32 Unix时间戳&BKP备份寄存器&RTC实时时钟(读写备份寄存器&实时时钟)
    理论1.Unix时间戳(1)Unix时间戳Unix时间戳(UnixTimestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间 (2)UTC/GMTGM......
  • 基于STM32单片机的OPENMV颜色识别小球追踪系统设计
    基于STM32单片机的OPENMV颜色识别小球追踪系统设计0、毕业设计选题原则说明(重点)1、项目简介1.1、系统功能1.2、演示视频2、部分电路设计2.1、STM32单片机核心板电路设计2.2、openmv使用说明2.3、stm32与openmv通信电路设计2.4、OLED液晶显示电路设计2.5、二维云台控制电......
  • 基于STM32单片机智能家居声音人体防盗GSM短信报警系统设计
    基于STM32单片机智能家居声音人体防盗GSM短信报警系统设计1、系统功能介绍2、资料下载3、系统电路介绍3.1、STM32单片机最小系统设计3.2、声音传感器模块电路设计3.3、LED信号指示灯电路设计3.4、GSM短信SIM800A模块电路设计3.5、蜂鸣器报警电路电路设计4、程序设计4.1......
  • STM32H723+DMA+ADC多通道 问题记录
    出现的问题1:ADC当开启扫描模式、DMA开始连续模式的时候,依然只能读出第一个通道的ADC的值,后面通道的AD值不更新。尝试过将buf固定在RAM_D3中也没有用。实际最后问题在于,用STM32CubeMX配置工具生成代码的时候,ADC初始化的函数放在了DMA初始化的前面导致的问题。出现的问题2:当开......
  • STM32 芯片启动过程
    目录一、前言二、STM32的启动模式三、STM32启动文件分析1、栈Stack2、堆Heap3、中断向量表Vectors3.1中断响应流程4、复位程序Reset_Handler5、中断服务函数6、用户堆栈初始化四、STM32启动流程分析1、初始化SP、PC及中断向量表2、设置系统时钟3、初始化堆栈......
  • SD NAND在STM32平台的存储性能提升
    在当今快速发展的嵌入式系统领域,STM32在嵌入式领域的地位市场非常显著,而MK米客方德的SDNAND闪存技术,以其卓越的耐用性、小巧的体积和高速的数据传输性能,在STM32平台上也展现出良好的适配性。 一、MK米客方德SDNAND技术亮点MK米客方德SDNAND是一种采用NAND闪存技术的贴片式存储......
  • 使用STM32实现按键控制LED
    以下是一个使用STM32实现按键控制LED的代码示例,详细说明了每个步骤和代码的功能。#include"stm32f4xx.h"voidGPIO_Configuration(void);voidEXTI_Configuration(void);voidLED_On(void);voidLED_Off(void);intmain(void){GPIO_Configuration();EXTI_C......
  • STM32智能小车--测距模块(舵机+HC_SR04超声波)
    大家好哇!我是湫湫,一个正在摸索嵌入式的普通大学生。进入正题,最近在做智能小车,想通过文章记录学习过程。本次文章主要使用 stm32F1C8T6实现小车测距。非常感谢大家的阅读,如果有不对的地方欢迎指正。目录一.实物图1.舵机2.HC_SR04:二.基本工作原理1.舵机工作原理2.......
  • STM32F407单片机编程入门(三)ADC详解及实战含源码
    文章目录一.概要二.STM32F407VET6单片机ADC外设特点三.STM32单片机ADC内部结构图1.ADC相关引脚说明2.ADC通道分类3.触发源4.转换周期5.电压转换计算6.更精确电压转换计算四.规则通道ADC采集信号流向1.单次转换模式2.连续转换模式五.CubeMX配置一个ADC采集例程六.CubeMX......
  • 蓝桥杯-STM32G431RBT6(串口)
    前言一、配置二、使用步骤1.串口发送代码逻辑效果展示2.串口接收单个字符代码逻辑中断回调函数3.串口接受字符串代码逻辑字符串函数中断回调函数声明代码开源前言一、配置二、使用步骤1.串口发送代码逻辑sprintf(tx_buf,"jinke\r\n"):这行代码使用......