微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32三种低功耗模式研究二

STM32三种低功耗模式研究二

时间:11-28 来源:互联网 点击:
停机模式:任一外部中断可以唤醒,系统保存代码运行状态,唤醒前后要分别进行电源管理配置和时钟配置。

如果不配置时钟,它是自动切换到内部时钟的;当然,如果系统重启或重新上电,则系统会从头开 始,当然包括从头配置时钟。

示例:

停机模式进入之前:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

printf("进入停止模式 ");

PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);

停机模式唤醒之后:

void SYSCLKConfig_STOP(void)

{

ErrorStatus HSEStartUpStatus;

RCC_HSEConfig(RCC_HSE_ON);

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS)

{

RCC_PLLCmd(ENABLE);

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

{

}

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

while(RCC_GetSYSCLKSource() != 0x08)

{

}

}

}

为了验证程序唤醒后是不是从进入停机模式那一条语句接着运行,我进行如下编程:

int main(void)

{

LED_GPIO_Config();

EXTI_Key_Config();

SysTick_Init();

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//电源管理

while(1)

{

LED1( ON );

Delay_us(100000); // 10000 * 10us = 100ms

LED1( OFF );

// SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;

PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);

LED2( ON );

Delay_us(100000); // 10000 * 10us = 100ms

LED2( OFF );

LED3( ON );

Delay_us(100000); // 10000 * 10us = 100ms

LED3( OFF );

}

}

发现根本不进入停机模式,文档上写着:为了进入停止模式,所有的外部中断的请求位(挂起寄存器(EXTI_PR))和RTC的闹钟标志都必须被清除,否则停止模式的进入流程将会被跳过,程序继续运行。我看看外部中断的标志也都请了啊,怎么回事?进一步研究发现,SysTick_Init()里面并没有打开systick,而是在Delay_us(100000)里面打开的,那么我在进入停机之前应该关掉,所以把上述程序中的SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk打开就好啦,嘎嘎!


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top