2017-04-25 5 views
3

私はできるだけ少ない電力でUSART1を300ボー程度で使用したいと思います。 40バイト。他にも数多くの周辺機器がありますが、実行する必要はありません。実行する必要があるのは、RTCだけです。周辺機器は凍結する必要があり、ラムは同じである必要があります。USART1を使用するためにSTM32L0に低電力モードに入る

私はこのために(私はここで間違っているなら、私を修正してください)低消費電力実行モードが最適なモードでそれを見る方法:現時点では今

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? 

ここで私の試行は何ですか?

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

} 
  • USART1がストップモードでバイトを受信して​​も、目を覚ますすることができますすることができます
+0

あなたはエレクトロニクスに問い合わせる方が良いかもしれません。スタックエクスチェンジ。クロス投稿をすると、一部の人が不当に怒ってしまい、あなたの質問が両方のサイトから削除される可能性があるので、1つを選択してください。 – BurnsBA

+0

@BurnsBA私はここで私の運を試してみるつもりです。それがうまくいった最後の時間。私の同様の質問を参照してください。http://stackoverflow.com/questions/34874020/auto-baud-rate-detect-for-stm32l0 –

+0

UART1は低電力ではありません。それはLPUART1でしょう。誰かがサイトルールに気付かなかったからといって、話題に疑問を投げかけていないからです。私たちはコンサルティングサービスではありません。あなたは他の場所でもっとうまくやってみてください。 – Olaf

答えて

0

クロック設定のinitalのinitと同じDeinit =。

低消費電力を達成する手順は、USART1にLSEを使用し、RXNEでストップモードからウェイクアップすることです。

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

これは、DMAと低消費電力スリープのBAMよりも優れていない場合は、これより簡単で同等です。

関連する問題