一 待機模式簡介
在stm32的低功耗模式中,待機模式可以實現(xiàn)系統(tǒng)的最低功耗,在這種模式下,只需要2uA左右的電流。
三 待機喚醒程序分析
實驗現(xiàn)象:
將程序下載到開發(fā)板上后,LED燈會不斷地亮滅,當按下KEY2鍵超過3s時,LED燈滅,標志著單片機進入待機模式,再按下KEY1鍵,這時喚醒單片機,LED又開始不斷地亮滅亮滅。
程序中用到的一些宏定義
#definemacEXTI_GPIO_CLK(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO)
#definemacEXTI_GPIO_PORTGPIOC
#definemacEXTI_GPIO_PINGPIO_Pin_13
#definemacEXTI_SOURCE_PORTGPIO_PortSourceGPIOC
#definemacEXTI_SOURCE_PINGPIO_PinSource13
#definemacEXTI_LINEEXTI_Line13
#definemacEXTI_IRQEXTI15_10_IRQn
#definemacEXTI_INT_FUNCTIONEXTI15_10_IRQHandler
主函數(shù):
intmain(void)
{
/*configtheled*/
LED_GPIO_Config();
/*extilineconfig*/
EXTI_Pxy_Config();//初始化中斷函數(shù)
USARTx_Config();
if(PWR_GetFlagStatus(PWR_FLAG_WU)==SET)
{
printf("rn使能電源管理時鐘單元前的檢測,待機喚醒復位rn");
}
else
printf("rn使能電源管理時鐘單元前的檢測,上電復位rn");
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
if(PWR_GetFlagStatus(PWR_FLAG_WU)==SET)
{
printf("rn使能后檢測,待機喚醒復位rn");
}
else
printf("rn使能后檢測,上電復位rn");
while(1)
{
LED1(ON);
Delay(0xFFFFF);
LED1(OFF);
LED2(ON);
Delay(0xFFFFF);
LED2(OFF);
LED3(ON);
Delay(0xFFFFF);
LED3(OFF);
}
}
分析:在主函數(shù)中,除了用到一些必要的初始化之外,就是while循環(huán),在while循環(huán)中點亮LED燈,唯一不太熟悉的是幾個printf語句,這里暫時不管,先看EXTI_Pxy_Config()函數(shù)。
EXTI_Pxy_Config()函數(shù)
voidEXTI_Pxy_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
EXTI_InitTypeDefEXTI_InitStructure;
/*configtheextilineclockandAFIOclock*/
RCC_APB2PeriphClockCmd(macEXTI_GPIO_CLK,ENABLE);//開啟GPIO時鐘和AFIO時鐘
/*configtheNVIC*/
NVIC_Configuration();
/*EXTIlinegpioconfig*/
GPIO_InitStructure.GPIO_Pin=macEXTI_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//配置為上拉輸入
GPIO_Init(macEXTI_GPIO_PORT,&GPIO_InitStructure);
/*EXTIlinemodeconfig*/
GPIO_EXTILineConfig(macEXTI_SOURCE_PORT,macEXTI_SOURCE_PIN);
EXTI_InitStructure.EXTI_Line=macEXTI_LINE;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;//設(shè)置為上升沿觸發(fā)中斷!??!,也就是當單片機檢測到按鍵的上升沿時進入中斷程序
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
分析:在EXTI_Pxy_Config()函數(shù)中,先進行了KEY2按鍵的初始化,注意KEY2按鍵并不是WKUP按鍵,一定要注意。然后將KEY2按鍵的IO口配置為EXTI中斷模式,上升沿觸發(fā),也就是說當KEY2按鍵被按下時就會觸發(fā)中斷。然后我們再分析當按鍵KEY2被按下時,執(zhí)行的相應中斷函數(shù)。
macEXTI_INT_FUNCTION()函數(shù)
///IO口線中斷,中斷口為PC13
voidmacEXTI_INT_FUNCTION(void)
{
if(EXTI_GetITStatus(macEXTI_LINE)!=RESET)//確保是否產(chǎn)生了EXTILine中斷
{
printf("rn進入EXTILine中斷rn");
//K2鍵長按進入待機模式
if(PWR_Check_Standby())//PWR_Check_Standby()函數(shù)是用來判斷按鍵時長的,如果按鍵時間長超過3S就返回1,否則返回0
{
//使能WKUP引腳的喚醒功能
PWR_WakeUpPinCmd(ENABLE);