CW32系列芯片支持3種工作模式,運(yùn)行模式、休眠模式以及深度休眠模式,本文以CW32L083為例介紹低功耗模式的特性。MCU上電以后,系統(tǒng)自動(dòng)進(jìn)入運(yùn)行模式,可以通過軟件配置,進(jìn)入休眠或者深度休眠兩種低功耗模式,進(jìn)入低功耗運(yùn)行狀態(tài)后,可以通過外設(shè)中斷觸發(fā)喚醒機(jī)制,使得系統(tǒng)返回到運(yùn)行模式,三種工作模式的轉(zhuǎn)換機(jī)制如下圖所示:
三種模式下CPU、時(shí)鐘及外設(shè)狀態(tài):
運(yùn)行模式下 CPU 正常運(yùn)行,所有模塊用戶均可正常使用。
? 休眠模式(Sleep mode)
休眠模式下,CPU 停止運(yùn)行,所有外設(shè)不受影響,所有I/O引腳保持狀態(tài)不變。
? 深度休眠模式(DeepSleep mode)
深度休眠模式下,CPU停止運(yùn)行,高速時(shí)鐘(HSE、HSIOSC)自動(dòng)關(guān)閉,低速時(shí)鐘(LSE、 LSI、RC10K、RC150K)保持原狀態(tài)不變。深度休眠模式的功耗遠(yuǎn)小于休眠模式。
CW32L083可以使用等待中斷專用指令,WFI(Wait for Interrupt),配合系統(tǒng)控制寄存器(SCR, System Control Register)的SLEEPONEXIT和SLEEPDEEP位域,可實(shí)現(xiàn)立即進(jìn)入或退出(中斷服務(wù)程序)時(shí)進(jìn)入休眠模式或深度休眠模式。
? 立即進(jìn)入
執(zhí)行WFI指令,MCU將立即進(jìn)入休眠模式(SLEEPDEEP為0時(shí))或深度休眠模式(SLEEPDEEP為1時(shí))
? 退出時(shí)進(jìn)入
將SLEEPONEXIT位置1,當(dāng)退出最低優(yōu)先級(jí)的中斷服務(wù)程序后,MCU會(huì)進(jìn)入休眠模式(SLEEPDEEP為0時(shí))或深度休眠模式(SLEEPDEEP為 1時(shí)),而不需執(zhí)行WFI指令 。
注:在深度休眠模式下,系統(tǒng)將自動(dòng)關(guān)閉高速時(shí)鐘,如果需要在深度休眠模式下使部分外設(shè)仍保持運(yùn)行,則需要在進(jìn)入深度休眠模式前,啟動(dòng)相應(yīng)的低速時(shí)鐘并將該外設(shè)時(shí)鐘設(shè)置為此低速時(shí)鐘。
在休眠模式或深度休眠模式下,均可通過中斷來(lái)喚醒CPU,返回到運(yùn)行模式。如果用戶在中斷服務(wù)程序中執(zhí)行WFI命令進(jìn)入休眠(包括深度休眠),則需要比此中斷更高優(yōu)先級(jí)的中斷才能喚醒CPU,因此,強(qiáng)烈建議在準(zhǔn)備進(jìn)入休眠前,應(yīng)先處理完所有中斷服務(wù)程序,并且清除所有中斷請(qǐng)求和中斷標(biāo)志,以下是配置進(jìn)入低功耗模式時(shí)所需注意的事項(xiàng)。
?建議在進(jìn)入低功耗模式前加一段時(shí)間的延遲,以免出現(xiàn)上電就進(jìn)入低功耗模式,無(wú)法燒錄程序。
?系統(tǒng)可以配置從Deepsleep喚醒后,系統(tǒng)時(shí)鐘來(lái)源是HSI還是進(jìn)入休眠前的時(shí)鐘。
?系統(tǒng)進(jìn)入低功耗模式,端口狀態(tài)不會(huì)發(fā)生改變,此時(shí)需要客戶根據(jù)實(shí)際應(yīng)用來(lái)配置端口狀態(tài)來(lái)達(dá)到理想的功耗值,未用端口建議配置為模擬模式。
?其他的RTC等低功耗運(yùn)行模塊因在深度休眠下高速時(shí)鐘停止運(yùn)行,所以如果需要在深度休眠模式下運(yùn)行RTC等模塊,需配置模塊時(shí)鐘源為L(zhǎng)SI或LSE。
根據(jù)上述內(nèi)容,可以配置CW32L083的低功耗應(yīng)用的例程,具體的代碼可以查看CW32L083的固件庫(kù)中PWR_CurrentConsumption這一例程,配置PA04和PA05為引腳輸入,并開啟下降沿中斷,在中斷服務(wù)函數(shù)改變gKeyStatus的值,從而使得MCU在main中進(jìn)入低功耗休眠模式。
volatile uint8_t gKeyStatus;
volatile uint32_t gFlagWakeUpIrq = 0;
int main(void)
{
RCC_HSI_Enable( RCC_HSIOSC_DIV6); //配置系統(tǒng)時(shí)鐘為HSI 8M
InitTick(8000000ul); //初始化SysTick
LED_Init(); //LED初始化
BSP_PB_Init(); //按鍵初始化
while (1)
{
gKeyStatus = 0;//在沒有進(jìn)入低功耗模式前,PC03每間隔1s翻轉(zhuǎn)一次狀態(tài)
do
{
PC03_TOG(); //翻轉(zhuǎn)LED1
SysTickDelay(1000); //延遲1s.
} while (gKeyStatus == 0);
PC03_SETLOW(); //PC03置低
DeepSleepModeTest(); //進(jìn)入深度睡眠模式
}
}
//按鍵初始化,設(shè)置PA05沿下降沿觸發(fā)中斷
void BSP_PB_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
//打開GPIOA時(shí)鐘
REGBITS_SET(CW_SYSCTRL->AHBEN, SYSCTRL_AHBEN_GPIOA_Msk);
GPIO_InitStructure.Pins = GPIO_PIN_5;
GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP;
GPIO_InitStructure.IT = GPIO_IT_FALLING;
GPIO_Init(CW_GPIOA, &GPIO_InitStructure);
GPIO_ConfigFilter(CW_GPIOA, GPIO_PIN_5, GPIO_FLTCLK_RC10K);
//設(shè)置GPIOA的中斷等級(jí)為3
NVIC_SetPriority(GPIOA_IRQn, 0x03);
GPIOA_INTFLAG_CLR(GPIOx_ICR_PIN5_Msk );
NVIC_EnableIRQ(GPIOA_IRQn);
}
//LED I/O初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
//打開GPIO時(shí)鐘
REGBITS_SET(CW_SYSCTRL->AHBEN, SYSCTRL_AHBEN_GPIOC_Msk);
GPIO_InitStructure.Pins = GPIO_PIN_2 | GPIO_PIN_3;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Init(CW_GPIOC, &GPIO_InitStructure);
PC03_SETLOW();
}
void DeepSleepModeTest(void)
{
GPIO_InitTypeDef GPIO_InitStructure = { 0 };
PWR_InitTypeDef PWR_InitStructure = { 0 };
//打開GPIO時(shí)鐘
REGBITS_SET(CW_SYSCTRL->AHBEN,SYSCTRL_AHBEN_GPIOA_Msk|\
SYSCTRL_AHBEN_GPIOB_Msk | \
SYSCTRL_AHBEN_GPIOC_Msk | SYSCTRL_AHBEN_GPIOF_Msk);
GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
GPIO_InitStructure.IT = GPIO_IT_NONE;
GPIO_InitStructure.Pins = GPIO_PIN_All;
GPIO_Init(CW_GPIOA, &GPIO_InitStructure);
GPIO_Init(CW_GPIOB, &GPIO_InitStructure);
GPIO_Init(CW_GPIOC, &GPIO_InitStructure);
GPIO_Init(CW_GPIOF, &GPIO_InitStructure);
//關(guān)閉GPIO時(shí)鐘
REGBITS_CLR(CW_SYSCTRL->AHBEN,SYSCTRL_AHBEN_GPIOA_Msk| \
SYSCTRL_AHBEN_GPIOB_Msk | \
SYSCTRL_AHBEN_GPIOC_Msk | SYSCTRL_AHBEN_GPIOF_Msk);
BSP_PB_Init(); //按鍵初始化
// 喚醒后自動(dòng)使用內(nèi)部高速時(shí)鐘(HSI)
RCC_WAKEUPCLK_Config(RCC_SYSCTRL_WAKEUPCLKEN);
PWR_InitStructure.PWR_Sevonpend = PWR_Sevonpend_Disable;
PWR_InitStructure.PWR_SleepDeep = PWR_SleepDeep_Enable;
PWR_InitStructure.PWR_SleepOnExit = PWR_SleepOnExit_Disable;
PWR_Config(&PWR_InitStructure);
PWR_GotoLpmMode();
SYSCLKConfig_DeepSleep();
LED_Init();
SysTickDelay(200);
PC02_SETHIGH();
}
}
//GPIOA中斷服務(wù)函數(shù)
void GPIOA_IRQHandler(void)
{
if(REGBITS_GET(CW_GPIOA->ISR, GPIOx_ISR_PIN5_Msk) > 0)
{
gKeyStatus = 1;
GPIOA_INTFLAG_CLR(GPIOx_ICR_PIN5_Msk);//清除CW_GPIO中斷標(biāo)志
}
}
上述代碼可以看到在未進(jìn)入低功耗模式之前,LED1每1s翻轉(zhuǎn)一次,通過按鍵KEY2進(jìn)入低功耗模式后,LED1燈滅,當(dāng)再次按下KEY2后,重新回到正常的運(yùn)行模式,LED1每一秒翻轉(zhuǎn)一次。通過測(cè)量可以得到,進(jìn)入到低功耗模式之后,功耗顯著降低。
-
單片機(jī)
+關(guān)注
關(guān)注
6026文章
44455瀏覽量
630947 -
mcu
+關(guān)注
關(guān)注
146文章
16802瀏覽量
349371 -
微控制
+關(guān)注
關(guān)注
1文章
49瀏覽量
14465 -
32位MCU
+關(guān)注
關(guān)注
8文章
193瀏覽量
66620
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論