STM32 低功耗STOP模式,RTC唤醒

芯片:STM32L071CB

开发环境:STM32CubeMX + keil5.33

使用实时时钟RTC的 WakeUpTimer定时器产生的中断将STM32从STOP低功耗模式下唤醒。

STOP模式: STM32低功耗运行模式之一,该模式下CPU会停止工作,但RAM中的数据仍然保留。待中断或事件触发后程序可以继续运行。

note:1、STOP模式退出后,系统时钟会自动配置为MSI或HSI,需要手动重新配置时钟,以及使用时钟的外设。

           2、为了进一步降低STOP模式下的功耗,可以将GPIO设置为ANALOG输入模式,退出stop模式后重新配置GPIO

           3、为了能够在STOP模式下进行调试,在main函数中添加    DBGMCU->CR |= DBGMCU_CR_DBG_STOP;  

 

一、使用STM32CubeMX配置工程

      1、配置STM32系统时钟,选择石英晶振,外部高速时钟HSE经锁相、倍频、分频后得到32M的系统时钟

   2、配置一个用于控制LED灯的GPIO. 推挽输出模式,常拉低

   3、配置RTC,激活时钟源、中断使能

       RTC使用内部晶振LSI 37KHz   因此预分频系数设置为124 和 295 ,使分频后的时间正好是1秒。

      (124+1)*(295+1)  = = 37000

二、keil中添加功能性代码

       实现的功能是LED灯点亮3秒,LED灯熄灭后进入STOP模式,由RTC定时4秒后唤醒。依次循环

  /* USER CODE BEGIN WHILE */
	DBGMCU->CR |= DBGMCU_CR_DBG_STOP; /* 为了能够在停止模式下调试 */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11,GPIO_PIN_SET);
		HAL_Delay(3000);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11,GPIO_PIN_RESET);
		//HAL_Delay(3000);
		
		if (HAL_RTCEx_SetWakeUpTimer(&hrtc, 11560, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK)
		{
			Error_Handler();
		}
		
		__HAL_RCC_PWR_CLK_ENABLE();      //使能电源管理时钟
		HAL_PWREx_EnableUltraLowPower(); //使能超低功耗
		HAL_PWREx_EnableFastWakeUp();   //使能快速唤醒
			
		HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI); //进入低功耗STOP模式
		
		//退出stop模式后执行
		SystemClock_Config();
		MX_GPIO_Init();
  }
  /* USER CODE END 3 */

       RTC的初始化配制函数如下:

static void MX_RTC_Init(void)
{

  /** Initialize RTC Only
  */
  hrtc.Instance = RTC;
  hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  hrtc.Init.AsynchPrediv = 124;
  hrtc.Init.SynchPrediv = 295;
  hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
  hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  if (HAL_RTC_Init(&hrtc) != HAL_OK)
  {
    Error_Handler();
  }
  /** Enable the WakeUp
  */
  if (HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 11560, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK)
  {
    Error_Handler();
  }
	

}

           RTC初始化配置中的HAL_RTCEx_SetWakeUpTimer_IT 需要保留,否则无法产生中断,系统将一直维持STOP

 

        覆写中断回调函数:

void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{
	__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
}

       清除PWR_FLAG_WU标志位是进入STOP模式的必要条件。

三、RTC定时时长的计算

       函数 HAL_RTCEx_SetWakeUpTimer(RTC_HandleTypeDef *hrtc, uint32_t WakeUpCounter, uint32_t WakeUpClock)  中的参数WakeUpCounter 和 WakeUpClock 决定定时的时长:

      wakeup time = WakeUpCounter * (WakeUpClock /LSI)

      本例中:wakeup time  = 11560 *(16/37000) = 4s

四、后记

      1、程序通过STLINK下载后,按键reset 进行复位,程序无法进入STOP模式,必须断电重启才能进入STOP模式。 不知原因,先行记录。

  • 2
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值