STM32L431低功耗STOP2模式

实现STM32L431低功耗STOP2模式

1.在CubeMX中配置RTC

如下图,RTC中激活Clock Source,设置格式及分频。

2.Clock配置中配置低频时钟此处使用内部低频时钟LSI

3.

代码中,初始化MX_RTC_Init();

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
    GPIO_InitTypeDef GPIO_InitStructure = {0};
  /* 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_LPUART1_UART_Init();
  MX_USART1_UART_Init();
  MX_SPI2_Init();
//   MX_USART3_UART_Init();
  MX_I2C1_Init();
  MX_RTC_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
//    os_sys_init_user(vTask_HeartBeat_LED, pri_HeartBeat_LED,
//      &stk_HeartBeat_LED,sizeof(stk_HeartBeat_LED));

    // RTC_AlarmConfig();

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
        /* Insert 5 second delay */
    HAL_Delay(5000);

    printf("goto STOP2 MODE\r\n");
    /* Enable GPIOs clock */
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();

    // HAL_RTC_GetTime(&hrtc,&sMyTime,RTC_FORMAT_BIN);
    //     HAL_RTC_GetDate(&hrtc,&sMyDate,RTC_FORMAT_BIN);
    //     printf("%02d:%02d:%02d\r\n",sMyTime.Hours, 
    //     sMyTime.Minutes, sMyTime.Seconds);
    //     printf("%02d/%02d/%02d\r\n",2000 + sMyDate.Year, 
    //     sMyDate.Month, sMyDate.Date);
    //     HAL_Delay(2000);
	// HAL_PWREx_EnterSTOP2Mode()
      /* Configure all GPIO port pins in Analog Input mode (floating input trigger OFF) */
  /* Note: Debug using ST-Link is not possible during the execution of this   */
  /*       example because communication between ST-link and the device       */
  /*       under test is done through UART. All GPIO pins are disabled (set   */
  /*       to analog input mode) including  UART I/O pins.           */
  GPIO_InitStructure.Pin = GPIO_PIN_All;
  GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStructure.Pull = GPIO_NOPULL;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); 
  HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
  HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
  HAL_GPIO_Init(GPIOH, &GPIO_InitStructure);

  /* Disable GPIOs clock */
  __HAL_RCC_GPIOA_CLK_DISABLE();
  __HAL_RCC_GPIOB_CLK_DISABLE();
  __HAL_RCC_GPIOC_CLK_DISABLE();
  __HAL_RCC_GPIOH_CLK_DISABLE();
  
  /* Disable all used wakeup source */
  HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
  
  
  /* Re-enable wakeup source */
  /* ## Setting the Wake up time ############################################*/
  /* RTC Wakeup Interrupt Generation: 
    the wake-up counter is set to its maximum value to yield the longuest
    stop time to let the current reach its lowest operating point.
    The maximum value is 0xFFFF, corresponding to about 33 sec. when 
    RTC_WAKEUPCLOCK_RTCCLK_DIV = RTCCLK_Div16 = 16

    Wakeup Time Base = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSI))
    Wakeup Time = Wakeup Time Base * WakeUpCounter 
      = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSI)) * WakeUpCounter
      ==> WakeUpCounter = Wakeup Time / Wakeup Time Base
  
    To configure the wake up timer to 60s the WakeUpCounter is set to 0xFFFF:
    Wakeup Time Base = 16 /(~32.000KHz) = ~0.5 ms
    Wakeup Time = 0.5 ms  * WakeUpCounter
    Therefore, with wake-up counter =  0xFFFF  = 65,535 
       Wakeup Time =  0,5 ms *  65,535 = 32,7675 s ~ 33 sec. */
    HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0x01FFF, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
  
    /* Enter STOP 2 mode */
    HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);

    /* ... STOP2 mode ... */

    /* Re-configure the system clock to 80 MHz based on MSI, enable and
       select PLL as system clock source (PLL is disabled in STOP mode) */
    SystemClock_Config();
    
    /* Re-configure and turn on LED3  */
    MX_GPIO_Init();
    HAL_GPIO_WritePin(led_GPIO_Port,led_Pin,GPIO_PIN_RESET);
    // MX_USART1_UART_Init();
    HAL_UART_MspInit(&huart1);//不需要初始化UART,只需要重新初始化一下UART的管脚即可。因为前面所有管脚都被设置为输入了
    
    printf("exit STOP2\r\n");
    HAL_Delay(500);
    // HAL_GPIO_WritePin(led_GPIO_Port,led_Pin,GPIO_PIN_SET);

  }
  /* USER CODE END 3 */
}

在RTC退出STOP2模式后,继续使用串口GPIO和串口,需要重新配置GPIO,串口等外设不需要重新配置,只需要重新初始化一下外设的管脚分配就可以了。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值