1. 程式人生 > >無線路燈專案——STM32L低功耗相關

無線路燈專案——STM32L低功耗相關

1.STM32L主要特性
  影響功耗的兩大要素,一個是電壓,一個是頻率
  
2.高效的處理
  如果僅考慮處理功耗的話,用mA/DMIPS來表達,M3的核會比其他16位架構的MCU要好(這裡感覺指的主要就是其競爭對手的MSP430)
  NOTE中提到一種典型的應用:行動式健康醫療裝置,裝置可執行在4MHZ的時鐘下,這時的核電壓只需最低的1.2V,外部電壓最低可至1.65V
這裡寫圖片描述

3.多種低功耗模式
這裡寫圖片描述
相對於STM32F系列,L系列多了low power run和low power sleep兩種模式
為了降低功耗,可以使用最低的主時鐘,MSI

4.低功耗外設
  其中有一些外設是為低功耗定製的,比如STM32L1xx中有一個12bit,1MSps的ADC,如果這個ADC一直工作的話,會嚴重降低裝置的續航,這個ADC典型的電流是1.45mA。ADC的啟動時間是3.5us,轉換一次的時間是1us,那麼一次開機且轉換6次的時間不超過10us,ADC的關閉是立即的。像這樣一次開機轉換6次的動作,我們執行的頻率是1KHZ,那麼平均下來,ADC的電流功耗是10.5uA(以上的ADC引數僅是大概地舉個例子,具體的還是要看晶片的Datasheet)
  在高速時鐘的系統中,外設的開啟和關閉的時間是可以忽略的,但是在低速的低功耗系統中,這個時間是不能忽略的。例如在一個1MHZ的系統中,一個指令的執行時間就相當於1MSps ADC的取樣時間了。如果ADC在這種低速的情況下工作,要達到高取樣速率,是達不到的,對後續的DSP造成影響。為此,ST對ADC設計成這樣:不管Core的頻率是多少,ADC的時鐘都是內部16MHZ的時鐘,是它最高的時鐘。即使在一個32KHZ的系統中,一個指令的長度是30us,那麼ADC在30us內也可以完成多次轉換,得到多個取樣值,後續可完成DSP,若只需取樣一次的話,只需花費30us內的4.5us。
  以下三個外設在STOP模式依然可以工作:
  1.兩個比較器,可以組成一個視窗電壓比較,3uA
  2.RTC,可以做成鬧鐘,1uA
  3.LCD控制器,5uA(不包括LCD功耗)

5.時鐘系統
STM32L1提供了5種時鐘。
兩個外部時鐘(高精度,高功耗,額外成本):
●HSE(high-speed external crystal),4-24MHZ
●LSE(low-speed external crystal),32.768KHZ
三個內部時鐘(低精度,低功耗,不需額外成本):
●HSI(high-speed internal RC oscillator),16MHZ
●MSI(high-speed external RC oscillator),64KHZ-4MHZ
●LSI(high-speed external RC),37KHZ

下表是5種時鐘的特性總結:
這裡寫圖片描述


其中MSI可由LSE來校正精度,最終可至0.5%
主時鐘可由HSE、HSI、MSI這三種時鐘提供

下面以進入Low power sleep mode為例子

    // RCC 時鐘系統重啟
    RCC_DeInit();

    /* Flash 0 wait state */
    FLASH_SetLatency(FLASH_Latency_0);

    /* Disable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(DISABLE);    

    /* Disable 64-bit access */
    FLASH_ReadAccess64Cmd(DISABLE);

    /* Enable the PWR APB1 Clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Select the Voltage Range 2 (1.5V) */ PWR_VoltageScalingConfig(PWR_VoltageScaling_Range2); /* Wait Until the Voltage Regulator is ready */ while(PWR_GetFlagStatus(PWR_FLAG_VOS) != RESET) {} /* HCLK = SYSCLK = 262.144KHz */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* PCLK2 = HCLK */ RCC_PCLK2Config(RCC_HCLK_Div1); /* PCLK1 = HCLK */ RCC_PCLK1Config(RCC_HCLK_Div1); /* Set MSI clock range to 262.144KHz */ RCC_MSIRangeConfig(RCC_MSIRange_2); /* Select MSI as system clock source */ RCC_SYSCLKConfig(RCC_SYSCLKSource_MSI); /* Wait till PLL is used as system clock source */ while (RCC_GetSYSCLKSource() != 0x00) {} /* Enable The ultra Low Power Mode */ PWR_UltraLowPowerCmd(ENABLE); /* Enable the power down mode during Sleep mode */ FLASH_SLEEPPowerDownCmd(ENABLE); /* Request to enter SLEEP mode with regulator in low power mode */ PWR_EnterSleepMode(PWR_Regulator_LowPower, PWR_SLEEPEntry_WFI);