芯片的低功耗模式在实际应用十分重要,这几天刚好也使用了STOP的两个模式,做一个简单的笔记和分享。 使用的芯片型号是APM32F103XB. ①搭建整体框架,用于通过程序可以简单地选择不同的低功耗模式。 int Lowpower_Select(uint32_t Num) { //将IO口设置为模拟输入 GPIO_Lowpower_Init(); //关闭总线时钟 RCM->AHBCLKEN = 0; RCM->APB1CLKEN = 0; RCM->APB2CLKEN = 0; //选择想要进入的低功耗模式 if(Num == 1) { Lowpower_Stop_Regulator_On_lowpower(); } else if(Num == 2) { Lowpower_Stop_Regulator_lowpower(); } else { return 0; } return 0; } ②对GPIO的初始化,就是将所有的IO口设置为模拟输入,因为将其设置为模拟输入时,其输出缓冲器被关闭,施密特触发器输入被禁用,因此I/O引脚的每个模拟值零消耗。施密特触发器的输出被强制为恒定值(0)。上拉和下拉电阻被硬件关闭。 void GPIO_Lowpower_Init(void) { //打开所有GPIO的时钟 RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA|RCM_APB2_PERIPH_GPIOB|RCM_APB2_PERIPH_GPIOC|RCM_APB2_PERIPH_GPIOD|RCM_APB2_PERIPH_GPIOE|RCM_APB2_PERIPH_GPIOF|RCM_APB2_PERIPH_GPIOG); //将所有IO口配置为模拟输入 GPIO_Config_T GPIO_Lowpower_ALL_CHANGE_AIN; GPIO_Lowpower_ALL_CHANGE_AIN.mode = GPIO_MODE_ANALOG; GPIO_Lowpower_ALL_CHANGE_AIN.pin = GPIO_PIN_ALL; GPIO_Lowpower_ALL_CHANGE_AIN.speed = GPIO_SPEED_50MHz; GPIO_Config(GPIOA,&GPIO_Lowpower_ALL_CHANGE_AIN); GPIO_Config(GPIOB,&GPIO_Lowpower_ALL_CHANGE_AIN); GPIO_Config(GPIOC,&GPIO_Lowpower_ALL_CHANGE_AIN); GPIO_Config(GPIOD,&GPIO_Lowpower_ALL_CHANGE_AIN); GPIO_Config(GPIOE,&GPIO_Lowpower_ALL_CHANGE_AIN); GPIO_Config(GPIOF,&GPIO_Lowpower_ALL_CHANGE_AIN); GPIO_Config(GPIOG,&GPIO_Lowpower_ALL_CHANGE_AIN); //关闭所有GPIO的时钟 RCM_DisableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA|RCM_APB2_PERIPH_GPIOB|RCM_APB2_PERIPH_GPIOC|RCM_APB2_PERIPH_GPIOD|RCM_APB2_PERIPH_GPIOE|RCM_APB2_PERIPH_GPIOF|RCM_APB2_PERIPH_GPIOG); } ③配置不同的低功耗模式,以stop为例 void Lowpower_Stop_Regulator_On_lowpower(void) { //关闭内部高速时钟和内部低速时钟 RCM_DisableHSI(); RCM_DisableLSI(); //打开PMU的时钟 RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_PMU); //清除唤醒标志位 PMU_ClearStatusFlag(PMU_FLAG_WUE); //进入停止模式 PMU_EnterSTOPMode(PMU_REGULATOR_ON,PMU_STOP_ENTRY_WFI);//PMU_STOP_ENTRY_WFE 可选择中断或者事件 } void Lowpower_Stop_Regulator_lowpower(void) { //关闭内部高速时钟和内部低速时钟 RCM_DisableHSI(); RCM_DisableLSI(); //打开PMU的时钟 RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_PMU); //清除唤醒标志位 PMU_ClearStatusFlag(PMU_FLAG_WUE); //进入停止模式 PMU_EnterSTOPMode(PMU_REGULATOR_LOWPOWER,PMU_STOP_ENTRY_WFI);//PMU_STOP_ENTRY_WFE 可选择 }
|