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

Posted

技术标签:

【中文标题】在 STM32L0 上进入低功耗模式以使用 USART1【英文标题】:Entering Low Power Mode on STM32L0 to use USART1 【发布时间】:2017-09-22 10:21:59 【问题描述】:

我希望以大约 300 波特的速度读取 USART1 时尽可能少用电量。 40 字节。还有许多其他外围设备,但它们不需要运行——所有需要运行的只是并行的 RTC。外设需要冻结,ram 需要相同。

我看到它的方式低功耗运行模式是最佳模式(如果我在这里错了请纠正我):

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);

现在的时钟配置是

系统时钟源 = PLL (HSI) SYSCLK(Hz) = 32000000 HCLK(Hz) = 32000000 AHB 预分频器 = 1 APB1 预分频器 = 1 APB2 预分频器 = 1 恒指频率(Hz) = 16000000 PLLMUL = 6 PLLDIV = 3 闪存延迟 (WS) = 1 电源稳压器电压 = SCALE 1

如何进入此模式并从中恢复?

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

我的初始化尝试,我在这里缺少什么?

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 = 与时钟配置的初始初始化相同

【问题讨论】:

你在electronics.stackexchange上提问可能会更好。请注意,交叉发帖会导致一些人变得不合理的愤怒,并且您的问题很可能会从两个站点中删除,因此请选择一个。 @BurnsBA 我要在这里碰碰运气。上次成功了。请参阅我的类似问题***.com/questions/34874020/… UART1 不是低功耗的。那就是LPUART1。仅仅因为有人没有注意到站点规则并不会使问题成为主题。我们不是咨询服务。你最好去别的地方试试。 @Olaf 是的,我知道,这个问题是关于 UART1 而不是 LPUART1 根据我的经验,您需要知道正确的“推荐顺序”,它不一定正确,甚至仅在手册中提及。您确实仔细阅读了手册,不是吗?它可能是“隐藏的”。您是否可以获得芯片供应商的支持/指导?当然,这仅适用于您有相应合同或其他重要客户的情况。 【参考方案1】:

USART1 可以在停止模式下接收一个字节,也可以唤醒。

实现低功耗的过程是对 USART1 使用 LSE 并在 RXNE 上从停止模式唤醒。

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

这比带有 DMA 和低功耗睡眠的 BAM 更简单,甚至比它更好。

【讨论】:

以上是关于在 STM32L0 上进入低功耗模式以使用 USART1的主要内容,如果未能解决你的问题,请参考以下文章

mega328p是啥单片机用的啥编程软件

STM32L051低功耗STOP模式串口中断唤醒

Stm32L0串口中断接收使用

STM32L051从进入停止模式,达到最小电流消耗的时间

STM的低功耗系列

stm32l0:执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错