STM32 HAL库 CubeMX 低功耗STOP模式,RTC定时5分钟发送一次数据然后进入休眠,实测待机电流5.6uA(一)

STM32 HAL库 低功耗STOP模式,RTC定时5分钟发送一次数据然后进入休眠,实测待机电流5.6uA

主函数:

// An highlighted block
 /* USER CODE BEGIN WHILE */
  while (1)
  {
	  MX_RTC_Init();//每次同步后都初始化,5分钟后可以再次报警
	  ATRecTime = HAL_GetTick();
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	if (SendClockFlag == 1)
	{
		SendClockFlag = 0;
		
		/*读取温度*/
		DHT11_Read_Data(&temperature,&humidity);	//读取温湿度值
		printf ("temperature = %d ,humidity = %d\n",temperature,humidity);
		
		/*发送数据并接收20s*/
		//如要此部分发送数据的代码请留言
		TriggerSendData();//触发发送数据
		while(!((HAL_GetTick()-ATRecTime > 20000) && NBSendAccessFlag))//NBSendAccessFlag = 1表示发送数据成功,并等待接收20s
		{
			NB_Task();//NB任务
		}
		temperature = 0; humidity = 0;//复位温湿度值
		
		/*调试信息i的值*/
		printf("i = %d\n",i);
		i ++;
		
		/*STOP模式:
		*把所有引脚配置为模拟
		*解决串口150uA漏电问题,实测有效:
		*1.先把所以引脚配置为模拟模式
		*2.再把串口1配置为正常模式
		*3.再将STM32设置为STOP模式
		*4.PA0读取温湿度要设置为高速模式
		*/
		
//将引脚配置为模拟模式,防止漏电
		GPIO_InitTypeDef GPIO_InitStruct = {0};
		GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3;
		GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
		GPIO_InitStruct.Pull = GPIO_NOPULL;
		HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
		HAL_Delay (200);
//将串口复原
		GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
		GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
		GPIO_InitStruct.Pull = GPIO_NOPULL;
		GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
		GPIO_InitStruct.Alternate = GPIO_AF1_USART1;
		HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
		/*进入STOP模式*/
		HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
		
		/*唤醒之后分别初始化时钟、GPIO、串口*/
		SystemClock_Config();
		MX_GPIO_Init();
		MX_USART1_UART_Init();
	}
	  
  }
  /* USER CODE END 3 */
}

RTC函数:

// An highlighted block
/**
  ******************************************************************************
  * File Name          : RTC.c
  * Description        : This file provides code for the configuration
  *                      of the RTC instances.
  ******************************************************************************
  * @attention
  *
  * 

© Copyright (c) 2019 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */
/* Includes ------------------------------------------------------------------*/ #include "rtc.h" /* USER CODE BEGIN 0 */ #include "stdio.h" volatile uint8_t SendClockFlag = 1; #define CLOCKHOURS 0 #define CLOCKMINUTES 5 #define CLOCKSECONDS 0 //RTC时钟40KHZ,40 000/127/312 /* USER CODE END 0 */ RTC_HandleTypeDef hrtc; /* RTC init function */ void MX_RTC_Init(void) { RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef sDate = {0}; RTC_AlarmTypeDef sAlarm = {0}; /** Initialize RTC Only RTC时钟进来分频之后为1秒(1Hz),每一次时间更新RTC时钟寄存器(RTC_TR、RTC_DR), 目前使用的RTC时钟是内部40K,40000/128=312,其实这个1秒是差异比较大的 使用32.768K的时钟是比较准的 AsynchPrediv = 127; SynchPrediv = 312; */ hrtc.Instance = RTC; hrtc.Init.HourFormat = RTC_HOURFORMAT_24; hrtc.Init.AsynchPrediv = 127; hrtc.Init.SynchPrediv = 312; hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; if (HAL_RTC_Init(&hrtc) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN Check_RTC_BKUP */ /* USER CODE END Check_RTC_BKUP */ /** Initialize RTC and set the Time and Date */ sTime.Hours = 0x0; sTime.Minutes = 0x0; sTime.Seconds = 0x0; sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sTime.StoreOperation = RTC_STOREOPERATION_RESET; if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK) { Error_Handler(); } sDate.WeekDay = RTC_WEEKDAY_MONDAY; sDate.Month = RTC_MONTH_JANUARY; sDate.Date = 0x1; sDate.Year = 0x0; if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK) { Error_Handler(); } /** Enable the Alarm A */ sAlarm.AlarmTime.Hours = 0x0; sAlarm.AlarmTime.Minutes = CLOCKMINUTES;/*重点在这里,需要修改*/ sAlarm.AlarmTime.Seconds = 0x0; sAlarm.AlarmTime.SubSeconds = 0x0; sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET; sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY; sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL; sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE; sAlarm.AlarmDateWeekDay = 0x1; sAlarm.Alarm = RTC_ALARM_A; if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BCD) != HAL_OK) { Error_Handler(); } } void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle) { if(rtcHandle->Instance==RTC) { /* USER CODE BEGIN RTC_MspInit 0 */ /* USER CODE END RTC_MspInit 0 */ /* RTC clock enable */ __HAL_RCC_RTC_ENABLE(); /* RTC interrupt Init */ HAL_NVIC_SetPriority(RTC_IRQn, 0, 0); HAL_NVIC_EnableIRQ(RTC_IRQn); /* USER CODE BEGIN RTC_MspInit 1 */ /* USER CODE END RTC_MspInit 1 */ } } void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle) { if(rtcHandle->Instance==RTC) { /* USER CODE BEGIN RTC_MspDeInit 0 */ /* USER CODE END RTC_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_RTC_DISABLE(); /* RTC interrupt Deinit */ HAL_NVIC_DisableIRQ(RTC_IRQn); /* USER CODE BEGIN RTC_MspDeInit 1 */ /* USER CODE END RTC_MspDeInit 1 */ } } /* USER CODE BEGIN 1 */ void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) { //置位时钟同步标志 SendClockFlag = 1; //printf("RTC\n"); } /* USER CODE END 1 */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

你可能感兴趣的:(STM32 HAL库 CubeMX 低功耗STOP模式,RTC定时5分钟发送一次数据然后进入休眠,实测待机电流5.6uA(一))