相對于MSP430的低功耗,可能stm32F10XXX的低功耗模式可能捉襟見肘,但是要考慮到stm32的主頻還是高于MSP430很多的,是以我們應該理性的去看待問題。
stm32F10XXX有幾種模式:
1.run mode:程式一直運作
2.sleepmode:通過WFI或者WFE指令進入,CPU的時鐘停止,其他運作。通過一些中斷或者是事件喚醒
3.stop mode:所有的時鐘都會停止。
4.standby mode:1.8V的域掉電。
SLEEP MODE
1.進入sleepmode:
WFI:Wait For Interrupt:任意中斷都可喚醒,但是中斷配置時要注冊到NVIC中
WFE:Wait for Event:任意事件可喚醒,其中喚醒可以分為兩種,1.普通事件,例如鬧鐘事件,步驟是使能鬧鐘事件,然後cotex-M3 系統控制寄存器中SEVONPEND使能,當喚醒的時候要清對應的外設中斷挂起位和NVIC對應的中斷的IRQ通道挂起位。2。外部中斷線上的事件:什麼也不需要做。
注意:sleep模式喚醒是沒有延時的。
經驗:之前在ucos系統的項目中,由于ucos的節拍是由systick中斷來産生的,是以幾乎對于配置為sleep模式下系統是不會睡下去的,因為systick會喚醒sleep模式。
sleep模式對功耗的影響并不是很大,是以一般還是選擇其他兩種模式,如果非要進入這種模式的話有幾方面可以注意的:
1:系統配置時,首先關閉所有外設的時鐘,然後再開對應的自己闆級開發對應的時鐘,關閉所有時鐘:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_ALL, DISABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL, DISABLE);
2:設定全部GPIO口的狀态為輸入模式:
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOD and GPIOE clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB
| RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD
| RCC_APB2Periph_GPIOE| RCC_APB2Periph_AFIO, ENABLE);
/* Disable the Serial Wire Jtag Debug Port SWJ-DP */
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
/* PA */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* PB */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* PC */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* PD */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOE, &GPIO_InitStructure);
3:降低主頻:具體的代碼可以到ST官方固件庫3.5中自帶的RCC檔案夾下尋找如何配置主頻,當然配置這些頻率的話要考慮到闆級所使用的外設,比如USB等就需要特殊的頻率。
STOP MODE
1.進入stop模式,外設的時鐘關閉,電壓調節器可以配置為低功耗的模式,具體的控制位在PWR_CR的LPDS位,SRAM和寄存器中的隻保留,這就意味着在喚醒之後系統可以接着之前的狀态運作。注意在進入stop模式之前還要檢查ADC和DAC的ADC_CR2和DAC_CR的ENx位,并關閉,否則ADC和DAC仍然會有電能的消耗。
2如何進入stop的模式:調用stm32f10x_pwr.c中的PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry)函數,第一個參數是調整是否将電壓調節器設定為低功耗模式,第二個參數是使用WFI還是使用WFE進入stop模式。特别注意有時并不能保證進入stop模式,還要清EXTI的pending位,使用函數EXTI_ClearITPendingBit()和RTC Alarm flag,使用函數RTC_ClearFlag(uint16_t RTC_FLAG)。 3.喚醒:WFI:外部中斷線使能,但是中斷必須配置NVIC。WFE:外部中斷線上的事件。啟動後stm32預設采用HSI的時鐘(有延遲),且假如電壓調節器配置為低功耗的模式下會有一定的延遲。 STANDBY模式 1.進入standbymode:standbymode是最低功耗的模式,除了backup domin 和自身的電路之外的所有都會關閉或者是丢失。 2.如何進入standbymode:調用stm32f10x_pwr.c中的PWR_EnterSTANDBYMode(). 3.如何喚醒:wakeup引腳上升沿(假如配置的話),RTC alrm,IWDG,RESET ,喚醒之後,延時包括電壓調節器的啟動和重新複位的延時。而重新開機的狀态幾乎類似于掉電重新開機,仍采樣boot的引腳,PWR_CSR寄存器的SBF标志可以是否是在standby模式。