使用CW32L083的評估板完成簡易低功耗例程實驗。
功能定義如下:在正常運行模式下,LED1每1s翻轉一次。當按下KEY2按鍵時,LED1燈滅,進入低功耗模式。當再次按下KEY2后,重新回到正常的運行模式,LED1每一秒翻轉一次。通過以上方式可以測量,正常運行模式與低功耗模式的功耗。
查看CW32L083評估板的原理圖,KEY2按鍵對應的GPIO口為PA05口,當鍵按下時,PA05讀入為低電平。LED1指示燈對應的GPIO口為PC03,當PC03端口輸出高電平時,指示燈亮。
配置為引腳輸入,并開啟下降沿中斷,在中斷服務函數改變gKeyStatus的值,從而使得MCU在main中進入低功耗休眠模式。
一 主要程序代碼如下
volatile uint8_t gKeyStatus; volatile uint32_t gFlagWakeUpIrq = 0; int main(void) { RCC_HSI_Enable( RCC_HSIOSC_DIV6); //配置系統時鐘為HSI 8M InitTick(8000000ul); //初始化SysTick LED_Init(); //LED初始化 BSP_PB_Init(); //按鍵初始化 while (1) { gKeyStatus = 0;//在沒有進入低功耗模式前,PC03每間隔1s翻轉一次狀態 do { PC03_TOG(); //翻轉LED1 SysTickDelay(1000); //延遲1s. } while (gKeyStatus == 0); PC03_SETLOW(); //PC03置低 DeepSleepModeTest(); //進入深度睡眠模式 } } //按鍵初始化,設置PA05沿下降沿觸發中斷 void BSP_PB_Init(void) { GPIO_InitTypeDef GPIO_InitStructure = {0}; //打開GPIOA時鐘 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); //設置GPIOA的中斷等級為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時鐘 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 }; //打開GPIO時鐘 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); //關閉GPIO時鐘 REGBITS_CLR(CW_SYSCTRL->AHBEN,SYSCTRL_AHBEN_GPIOA_Msk| SYSCTRL_AHBEN_GPIOB_Msk | SYSCTRL_AHBEN_GPIOC_Msk | SYSCTRL_AHBEN_GPIOF_Msk); BSP_PB_Init(); //按鍵初始化 // 喚醒后自動使用內部高速時鐘(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(); //進入休眠 RCC_HSI_Enable( RCC_HSIOSC_DIV6); //配置系統時鐘為HSI 8M InitTick(8000000ul); //初始化SysTick LED_Init(); //LED初始化 } } //GPIOA中斷服務函數 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中斷標志 } }
二 休眠配置寄存器定義如下
上述代碼運行時的效果:在未進入低功耗模式之前,LED1每1s翻轉一次,通過按鍵KEY2進入低功耗模式后,LED1燈滅,當再次按下KEY2后,重新回到正常的運行模式,LED1每一秒翻轉一次。通過測量可以得到,進入到低功耗模式之后,功耗顯著降低。
三 運行結果如下
從外界給L083開發板供3.3V電,使用常見的萬用表測試。
運行模式下LED1指示燈滅時的功耗為2.955MA。
運行模式下LED1指示燈亮時的功耗為3.849MA。
進入超低功耗模式下功耗為0.64uA。
這是本期測試的簡易低功耗功能測試,下期我們就用UART來控制深度休眠模式的實現。
-
led
+關注
關注
242文章
23283瀏覽量
661011 -
低功耗
+關注
關注
10文章
2404瀏覽量
103727 -
uart
+關注
關注
22文章
1237瀏覽量
101419 -
評估板
+關注
關注
1文章
544瀏覽量
29327 -
CW32
+關注
關注
1文章
210瀏覽量
655
原文標題:外部中斷喚醒實驗 ——以CW32L083VXTX評估板為實驗對象,進行低功耗測試系列實驗講解(5)
文章出處:【微信號:CW32生態社區,微信公眾號:CW32生態社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論