使用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来控制深度休眠模式的实现。
全部0条评论
快来发表一下你的评论吧 !