简体   繁体   English

在STM32L0上进入低功耗模式以使用USART1

[英]Entering Low Power Mode on STM32L0 to use USART1

I want to use as little power as possible reading USART1 at 300 baud approx. 我希望尽可能少地使用300波特率读取USART1。 40 bytes. 40个字节。 There are numerous other peripherals but they don't need to run- all that needs to be running is the RTC in parallel. 有许多其他外围设备,但它们不需要运行 - 所有需要运行的是并行的RTC。 Peripherals need to be frozen, ram needs to be the same. 外围设备需要冷冻,ram需要相同。

The way I see it Low power run mode is the optimal mode (please correct me if I'm wrong here) for this: 我看到它的方式低功耗运行模式是最佳模式(如果我错在这,请纠正我)为此:

void HAL_PWREx_EnableLowPowerRunMode(void)
{
  /* Enters the Low Power Run mode */
  SET_BIT(PWR->CR, PWR_CR_LPSDSR);
  SET_BIT(PWR->CR, PWR_CR_LPRUN);
}

在此输入图像描述

Now the clock configuration at the moment is 现在时钟配置是

  • System Clock source = PLL (HSI) 系统时钟源= PLL(HSI)
  • SYSCLK(Hz) = 32000000 SYSCLK(Hz)= 32000000
  • HCLK(Hz) = 32000000 HCLK(Hz)= 32000000
  • AHB Prescaler = 1 AHB预分频器= 1
  • APB1 Prescaler = 1 APB1预分频器= 1
  • APB2 Prescaler = 1 APB2预分频器= 1
  • HSI Frequency(Hz) = 16000000 HSI频率(Hz)= 16000000
  • PLLMUL = 6 PLLMUL = 6
  • PLLDIV = 3 PLLDIV = 3
  • Flash Latency(WS) = 1 闪存延迟(WS)= 1
  • Power regulator voltage = SCALE 1 功率调节器电压= SCALE 1

How do I go into this mode and recover from it? 如何进入此模式并从中恢复?

// Init?
HAL_PWREx_EnableLowPowerRunMode();
HAL_PWREx_DisableLowPowerRunMode();
// Deinit?

My attempt at init, what am I missing here? 我尝试初始化,我在这里失踪了什么?

void init_clock(){


  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_PeriphCLKInitTypeDef PeriphClkInit;

  /**Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }
    /**Configure the main internal regulator output voltage 
    */
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_MSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_DIV4;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  RCC_OscInitStruct.MSICalibrationValue = 0;
  RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_0;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_SYSCLK;

  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }

}
  • Deinit = Same as inital init of clock config Deinit =与时钟配置的初始init相同

The USART1 can receive a byte in stop mode and is also able to wake up. USART1可以在停止模式下接收一个字节,也可以唤醒。

The procedure to achieve low power is to use LSE for USART1 and wake up from stop mode on RXNE. 实现低功耗的过程是在USART1上使用LSE,在RXNE上从停止模式唤醒。

  UART_WakeUpTypeDef wakeup;
  wakeup.WakeUpEvent=UART_WAKEUP_ON_READDATA_NONEMPTY;
  HAL_UARTEx_StopModeWakeUpSourceConfig(&huart1,wakeup);   
  HAL_UARTEx_EnableStopMode(&huart1);

This is simpler and equal to if not better than BAM with DMA and Low Power Sleep. 这比使用DMA和低功耗睡眠的BAM更简单并且等于更好。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM