(1)3钟模式
①睡眠模式②停止模式③待机模式
1.睡眠模式:Cortex-M3内核(可理解成CPU)停止工作,CPU供电1.8V有,外设任在运行,唤醒后从原来位置执行
2.停机模式:所有时钟都停止,CPU电源1.8V没断,唤醒后从原来位置执行
3.待机模式:时钟全断,CPU电源1.8V也断,唤醒后程序重新执行
可形象参考:
CPU:皇上
CPU电源1.8V:皇后
外设:将军
那么:
1.睡眠模式:只有皇上睡觉
2.停机模式:皇上,将军睡觉
3.待机模式:皇上,皇后,将军全睡觉了
(原则:皇后不睡觉,程序可被保留,唤醒后从原来位置执行)
(二)程序简介(库函数)
1.睡眠模式
while(1)
{
/* wait interrupt */
LED1( ON );
Delay(0xFFFFF);
LED1( OFF );
LED2( ON );
Delay(0xFFFFF);
LED2( OFF );
LED3( ON );
Delay(0xFFFFF);
LED3( OFF );
__WFI();
}
__WFI(); 进入睡眠模式,任意中断唤醒,唤醒后不用再配置时钟
2.停止模式
①/*因为要使用其外设时钟等,故需用到pwr*/
#include "stm32f10x_pwr.h"
②/*使能电源管理单元的时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
③进入停止模式
PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
④唤醒:外部中断
因为将军睡了,(及外设时钟关了,因此需要重新配置)唤醒后需要重新启动HSE
SYSCLKConfig_STOP();
void SYSCLKConfig_STOP(void)
{
ErrorStatus HSEStartUpStatus;
/* 使能 HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* 等待HSE准备就绪*/
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
/* 使能 PLL */
RCC_PLLCmd(ENABLE);
/* 等待 PLL 准备就绪 */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/* 选择PLL作为系统时钟源*/
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/*等待PLL被选择为系统时钟源 */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
}
3.待机模式
①/*因为要使用其外设时钟等,故需用到pwr*/
#include "stm32f10x_pwr.h"
②/*使能电源管理单元的时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
③进入待机模式
/*使能WKUP引脚的唤醒功能,WKUP是第二功能,不用配置它的输出模式(不是太懂)*/
PWR_WakeUpPinCmd (ENABLE);
/*进入待机模式*/
PWR_EnterSTANDBYMode();
④唤醒,复位唤醒,PA0上升沿唤醒
⑤检测是复位唤醒还是PA0上升沿唤醒
if(PWR_GetFlagStatus(PWR_FLAG_WU) == SET)
{
printf("
PA0上升沿唤醒
");
}
else
printf("
其他
");
因为待机唤醒程序从头执行,故不用多加配置时钟的函数了
瘋子随记