2017-04-25 299 views
3

我希望使用尽可能小的功率读取约300波特的USART1。 40个字节。还有很多其他外设,但它们不需要运行,所有需要运行的都是RTC并行运行。外围设备需要冷冻,内存需要相同。在STM32L0上进入低功耗模式以使用USART1

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

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
  • Flash延时(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 =同时钟配置
+0

您可能对electronics.stackexchange有更好的运气要求。请注意,交叉发帖会导致一些人变得不合理地生气,并且您的问题很可能会从这两个网站中删除,因此请选择一个。 – BurnsBA

+0

@BurnsBA我要在这里尝试我的运气。上次它解决了。看到我的类似问题http://stackoverflow.com/questions/34874020/auto-baud-rate-detect-for-stm32l0 –

+0

UART1是不低功耗。那将是LPUART1。只是因为有人没有注意到网站规则并没有把问题放在话题上。我们不是咨询服务机构。你最好在别处尝试。 – Olaf

回答

0

的USART1可以接收在停止模式中的一个字节,并且还能够唤醒初始索初始化。

实现低功耗的过程是使用USE1的LSE和从RXNE的停止模式唤醒。

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

这更简单,并且等于如果不比采用DMA和低功耗睡眠的BAM更好。