一 待機(jī)模式簡(jiǎn)介
在stm32的低功耗模式中,待機(jī)模式可以實(shí)現(xiàn)系統(tǒng)的最低功耗,在這種模式下,只需要2uA左右的電流。
三 待機(jī)喚醒程序分析
實(shí)驗(yàn)現(xiàn)象:
將程序下載到開(kāi)發(fā)板上后,LED燈會(huì)不斷地亮滅,當(dāng)按下KEY2鍵超過(guò)3s時(shí),LED燈滅,標(biāo)志著單片機(jī)進(jìn)入待機(jī)模式,再按下KEY1鍵,這時(shí)喚醒單片機(jī),LED又開(kāi)始不斷地亮滅亮滅。
程序中用到的一些宏定義
#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使能電源管理時(shí)鐘單元前的檢測(cè),待機(jī)喚醒復(fù)位rn”);
}
else
printf(“rn使能電源管理時(shí)鐘單元前的檢測(cè),上電復(fù)位rn”);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
if(PWR_GetFlagStatus(PWR_FLAG_WU)==SET)
{
printf(“rn使能后檢測(cè),待機(jī)喚醒復(fù)位rn”);
}
else
printf(“rn使能后檢測(cè),上電復(fù)位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)中點(diǎn)亮LED燈,唯一不太熟悉的是幾個(gè)printf語(yǔ)句,這里暫時(shí)不管,先看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);//開(kāi)啟GPIO時(shí)鐘和AFIO時(shí)鐘
/*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ā)中斷!!!,也就是當(dāng)單片機(jī)檢測(cè)到按鍵的上升沿時(shí)進(jìn)入中斷程序
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
分析:在EXTI_Pxy_Config()函數(shù)中,先進(jìn)行了KEY2按鍵的初始化,注意KEY2按鍵并不是WKUP按鍵,一定要注意。然后將KEY2按鍵的IO口配置為EXTI中斷模式,上升沿觸發(fā),也就是說(shuō)當(dāng)KEY2按鍵被按下時(shí)就會(huì)觸發(fā)中斷。然后我們?cè)俜治霎?dāng)按鍵KEY2被按下時(shí),執(zhí)行的相應(yīng)中斷函數(shù)。
macEXTI_INT_FUNCTION()函數(shù)
///IO口線(xiàn)中斷,中斷口為PC13
voidmacEXTI_INT_FUNCTION(void)
{
if(EXTI_GetITStatus(macEXTI_LINE)!=RESET)//確保是否產(chǎn)生了EXTILine中斷
{
printf(“rn進(jìn)入EXTILine中斷rn”);
//K2鍵長(zhǎng)按進(jìn)入待機(jī)模式
if(PWR_Check_Standby())//PWR_Check_Standby()函數(shù)是用來(lái)判斷按鍵時(shí)長(zhǎng)的,如果按鍵時(shí)間長(zhǎng)超過(guò)3S就返回1,否則返回0
{
//使能WKUP引腳的喚醒功能
PWR_WakeUpPinCmd(ENABLE);
來(lái)源;21ic
評(píng)論
查看更多