C 在STM32L0上进入低功耗模式以使用USART1
我希望使用尽可能少的电源以300波特(约40字节)读取USART1。有许多其他外设,但它们不需要运行-所有需要运行的是并行的RTC。外围设备需要冻结,ram需要保持不变 在我看来,低功耗运行模式是这方面的最佳模式(如果我错了,请纠正我):C 在STM32L0上进入低功耗模式以使用USART1,c,stm32,usart,C,Stm32,Usart,我希望使用尽可能少的电源以300波特(约40字节)读取USART1。有许多其他外设,但它们不需要运行-所有需要运行的是并行的RTC。外围设备需要冻结,ram需要保持不变 在我看来,低功耗运行模式是这方面的最佳模式(如果我错了,请纠正我): void HAL_PWREx_EnableLowPowerRunMode(void) { /* Enters the Low Power Run mode */ SET_BIT(PWR->CR, PWR_CR_LPSDSR); SET_BIT
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)
- 系统时钟(赫兹)=32000000
- HCLK(赫兹)=32000000
- AHB预分频器=1
- APB1预分频器=1
- APB2预分频器=1
- HSI频率(Hz)=16000000
- PLLMUL=6
- PLLDIV=3
- 闪存延迟(WS)=1
- 功率调节器电压=刻度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=与时钟配置的inital init相同
UART_WakeUpTypeDef wakeup;
wakeup.WakeUpEvent=UART_WAKEUP_ON_READDATA_NONEMPTY;
HAL_UARTEx_StopModeWakeUpSourceConfig(&huart1,wakeup);
HAL_UARTEx_EnableStopMode(&huart1);
这比采用DMA和低功耗睡眠的BAM更简单,即使不比BAM好,也与BAM相同。您可能会更幸运地在electronics.stackexchange上提问。请注意,交叉发帖会导致一些人不合理地生气,您的问题可能会从这两个网站上删除,所以请选择一个。@BurnsBA我要在这里碰碰运气。上次成功了。请看我的类似问题UART1不是低功耗。那就是LPUART1。仅仅因为有人没有注意到网站规则,就不会提出这个问题。我们不是咨询服务。你最好到别处去试试。@Olaf是的,我知道,这个问题是关于UART1而不是LPUART1的。根据我的经验,你需要知道正确的“重新编译序列”,它不一定正确,甚至只在手册中提到过。你把手册读得很透彻,是吗?它可能是“隐藏的”。您是否有机会获得芯片供应商的支持/指导?当然,这仅适用于您有相应合同或是重要客户的情况。