使用CW32L083的評(píng)估板完成簡(jiǎn)易低功耗例程實(shí)驗(yàn)。
功能定義如下:在正常運(yùn)行模式下,LED1每1s翻轉(zhuǎn)一次。當(dāng)按下KEY2按鍵時(shí),LED1燈滅,進(jìn)入低功耗模式。當(dāng)再次按下KEY2后,重新回到正常的運(yùn)行模式,LED1每一秒翻轉(zhuǎn)一次。通過(guò)以上方式可以測(cè)量,正常運(yùn)行模式與低功耗模式的功耗。
查看CW32L083評(píng)估板的原理圖,KEY2按鍵對(duì)應(yīng)的GPIO口為PA05口,當(dāng)鍵按下時(shí),PA05讀入為低電平。LED1指示燈對(duì)應(yīng)的GPIO口為PC03,當(dāng)PC03端口輸出高電平時(shí),指示燈亮。
配置為引腳輸入,并開(kāi)啟下降沿中斷,在中斷服務(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;//在沒(méi)有進(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}; //打開(kāi)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}; //打開(kāi)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(); PC02_SETLOW(); } void DeepSleepModeTest(void) { GPIO_InitTypeDef GPIO_InitStructure = { 0 }; PWR_InitTypeDef PWR_InitStructure = { 0 }; //打開(kāi)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(); //進(jìn)入休眠 RCC_HSI_Enable( RCC_HSIOSC_DIV6); //配置系統(tǒng)時(shí)鐘為HSI 8M InitTick(8000000ul); //初始化SysTick LED_Init(); //LED初始化 } } //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)志 } }
二 休眠配置寄存器定義如下
上述代碼運(yùn)行時(shí)的效果:在未進(jìn)入低功耗模式之前,LED1每1s翻轉(zhuǎn)一次,通過(guò)按鍵KEY2進(jìn)入低功耗模式后,LED1燈滅,當(dāng)再次按下KEY2后,重新回到正常的運(yùn)行模式,LED1每一秒翻轉(zhuǎn)一次。通過(guò)測(cè)量可以得到,進(jìn)入到低功耗模式之后,功耗顯著降低。
三 運(yùn)行結(jié)果如下
從外界給L083開(kāi)發(fā)板供3.3V電,使用常見(jiàn)的萬(wàn)用表測(cè)試。
運(yùn)行模式下LED1指示燈滅時(shí)的功耗為2.955MA。
運(yùn)行模式下LED1指示燈亮?xí)r的功耗為3.849MA。
進(jìn)入超低功耗模式下功耗為0.64uA。
這是本期測(cè)試的簡(jiǎn)易低功耗功能測(cè)試,下期我們就用UART來(lái)控制深度休眠模式的實(shí)現(xiàn)。
-
led
+關(guān)注
關(guān)注
242文章
23252瀏覽量
660545 -
低功耗
+關(guān)注
關(guān)注
10文章
2396瀏覽量
103670 -
uart
+關(guān)注
關(guān)注
22文章
1235瀏覽量
101350 -
評(píng)估板
+關(guān)注
關(guān)注
1文章
537瀏覽量
29304 -
CW32
+關(guān)注
關(guān)注
1文章
203瀏覽量
626
原文標(biāo)題:外部中斷喚醒實(shí)驗(yàn) ——以CW32L083VXTX評(píng)估板為實(shí)驗(yàn)對(duì)象,進(jìn)行低功耗測(cè)試系列實(shí)驗(yàn)講解(5)
文章出處:【微信號(hào):CW32生態(tài)社區(qū),微信公眾號(hào):CW32生態(tài)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論