gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:31:02 26 4
gpt4 key购买 nike

我想使用尽可能少的功率以大约 300 波特率读取 USART1。 40 字节。还有许多其他外设,但它们不需要运行 - 需要并行运行的只是 RTC。外设需要卡住,内存需要相同。

我认为低功耗运行模式是最佳模式(如果我错了,请纠正我):

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

enter image description here

现在的时钟配置是

  • 系统时钟源 = PLL (HSI)
  • SYSCLK(赫兹)= 32000000
  • HCLK(赫兹)= 32000000
  • AHB 预分频器 = 1
  • APB1 预分频器 = 1
  • APB2 预分频器 = 1
  • HSI 频率(Hz)= 16000000
  • PLLMUL = 6
  • PLLDIV = 3
  • 闪光延迟 (WS) = 1
  • 电源调节器电压 = SCALE 1

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

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

我尝试 init,我在这里错过了什么?

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

最佳答案

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

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

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

这比具有 DMA 和低功耗 sleep 功能的 BAM 更简单,甚至等同于(甚至更好)。

关于c - 在 STM32L0 上进入低功耗模式以使用 USART1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43610061/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com