1、首先回答一個問題,STM32能不能做低功耗?
回答是肯定的,這個是有數據支持的,我測試的STM32101CB,FLASH:128K,RAM:16K并且RTC工作的情況下,測試到的功耗為16uA應該說還是相當不錯的。
2、STM32低功耗有哪些需要注意的地方?
一開始我測試到STM32為16uA的時候,還是非常高興的,以為真的可以做為我的應用,我的應用是讓MCU定時醒來干活,干一會就睡覺,可能干活的時間就幾十個毫秒。可是后來發現有些問題(工作在STOP模式):
1) 時鐘問題:STM32被喚醒以后的時鐘自動切換到內部HIS RC振蕩器,大家都是知道的,RC振蕩器的精度是不高的。而且,睡覺前對于時鐘的設置都是恢復到復位狀態,只是時鐘這個地方復位,其他的沒有。這也會帶來一個問題,可能你睡覺前使用的是內部時鐘,可是睡覺后,時鐘卻變了,帶來的問題就是UART和定時器。或許你想不使用PLL,就是8M,這樣醒來后的時鐘HIS也是8M,這樣雖然在時鐘上沒有差別了,但是時鐘卻不穩定了。UART波特率肯定不能太高,否則通信會有問題。
2) 醒來時間:這個問題也是個非常大的問題,datasheet上給出的醒來時間是7us,這個可能真的不假,但是醒來,不能馬上干_你的活,為什么。初始化IO,你可能問,我不初始化不行嗎,回答應該是否定的。因為,如果你想使用低功耗的話,睡覺前IO口都應該設置為模擬輸入,這樣才能達到datasheet上的14uA,但是這樣也帶來一個問題,那就是初始化IO,醒來必須要初始化IO。如果你還想把時鐘切換到外部時鐘,耗時會更加長,接近200ms,因為STM32會等待外部時鐘穩定后才能工作,然后還要在重新初始化所有IO,這個非常的耗時。可能我只需要醒來10ms,但是這些活干完就需要100ms。
3) RTC喚醒:RTC這個也是個問題,為什么?大家需要注意的是RTC只能使用報警才能喚醒MCU,秒中斷是不可以喚醒的。并且報警中斷必須不停的設置,設置一次只生效一次,中斷完了,還需要設置下次中斷的時間。并且還有個問題,報警中斷必須等待到秒中斷到了之后才能設置,也就是正好秒寄存器更新了一次的時候設置,這就帶來一個問題,等待秒中斷。如果睡前還想再能被報警喚醒的話必須重新設置報警中斷,而且設置報警中斷的時候需要等到秒中斷才能設置新的值。這個等待的時間是不定的。可能會幾百個毫秒。說以要空空的耗費幾百個毫秒等到秒中斷標志來設置報警中斷。可能我的MCU只需要執行10ms就需要睡覺了。還是要空空的耗費掉幾百個毫秒
總結:在使用的過程中發現的問題,我都在上面說明了,我覺得STM32的低功耗太假,雖然在睡眠的時候性能不錯,但是醒來,和進入睡眠的設置太麻煩,耗時太多,這是個弊端,我覺得MSP430估計是做的最好的了,即使是AVR也比他好點,沒有那么麻煩。
拿到STM32L的樣片后,一直糾結于低功耗的測試,因為和STM32F系列的配置不同,所以導致了杯具,通過和ST公司不停的咨詢,終于得到了最終的結果,
經過測試,功耗在STOP模式下為 500nA ,性能還是不錯的,代碼如下:
/**
* @brief Main program.
* @param None
* @retval None
*/
int main(void)
{
/*!< At this stage the microcontroller clock setting is already configured,
this is done through SystemInit() function which is called from startup
file (startup_stm32l1xx_md.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32l1xx.c file
*/
/* Configure all unused GPIO port pins in Analog Input mode (floating input
trigger OFF), this will reduce the power consumption and increase the device
immunity against EMI/EMC *************************************************/
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC
| RCC_AHBPeriph_GPIOD | RCC_AHBPeriph_GPIOE | RCC_AHBPeriph_GPIOH, ENABLE);
/* config all IO to Analog Input to reduce parasite power consumption */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_Init(GPIOH, &GPIO_InitStructure);
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Enable PB7 as external PVD input so as to set it as AIN_IN */
Set_PVD_To_Config_PB7();
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA
| RCC_AHBPeriph_GPIOB
| RCC_AHBPeriph_GPIOC
| RCC_AHBPeriph_GPIOD
| RCC_AHBPeriph_GPIOE
| RCC_AHBPeriph_GPIOH, DISABLE);
PWR_UltraLowPowerCmd(ENABLE);
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
while(1);
}
/**
* @brief Enable PB7 as external PVD input so as to set it as AIN_IN
* @param None
* @retval None
*/
void Set_PVD_To_Config_PB7(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
/* Configure the PVD Level to 3 (2.5V) */
PWR_PVDLevelConfig(PWR_PVDLevel_7);
/* Enable the PVD Output */
PWR_PVDCmd(ENABLE);
}
上一篇:STM32L151C8周期性從待機模式喚醒(RTC Wakeup Timer)
下一篇:stm8L15x EEPORM學習筆記
推薦閱讀
史海拾趣