lpc1114深度掉電模式Deep power-down mode
在深度掉電模式,除了WAKUP引腳(P1.4),整個芯片都停止工作,而且只有4個32位的寄存器可供存儲用戶數(shù)據(jù),內(nèi)部SRAM中的數(shù)據(jù)都會丟失。
1.怎樣進(jìn)入深度掉電模式
執(zhí)行以下步驟進(jìn)入深度掉電模式:
1. 設(shè)置PCON寄存器的DPDEN位為1;
2. 把防止丟失的數(shù)據(jù)存儲到通用寄存器;
3. 設(shè)置SCR寄存器中的SLEEPDEEP位為1;
4. 在進(jìn)入深度掉電模式之前,確保PDRUNCFG寄存器中的IRCOUT_PD位和IRC_PD位為0;
5. 執(zhí)行WFI指令。
2.進(jìn)入深度掉電模式后,如何喚醒單片機(jī)
進(jìn)入深度掉電模式,只有一種途徑可以喚醒單片機(jī),那就是通過WAKUP引腳上的下降沿喚醒。
3示例程序
為了很容易的看到效果,這里用流水燈的運(yùn)行和停止運(yùn)行來觀察是否進(jìn)入睡眠模式。開始流水燈執(zhí)行,過一會兒,進(jìn)入睡眠模式后,流水燈停止流水。
新建一個工程,結(jié)構(gòu)如下圖所示:
在main.c函數(shù)中,輸入以下代碼:
#include"lpc11xx.h"#include"pmu.h"#defineLED1_ONLPC_GPIO1->DATA&=~(1<<0)#defineLED1_OFFLPC_GPIO1->DATA|=(1<<0)#defineLED2_ONLPC_GPIO1->DATA&=~(1<<1)#defineLED2_OFFLPC_GPIO1->DATA|=(1<<1)/***********************************//*函數(shù)名稱:延時函數(shù)*//***********************************/voiddelay(){uint16_ti,j;for(i=0;i<5000;i++)for(j=0;j<200;j++);}/***********************************//*函數(shù)名稱:LED燈初始化*//***********************************/voidled_init(){LPC_SYSCON->SYSAHBCLKCTRL|=(1<<16);//使能IOCON時鐘LPC_IOCON->R_PIO1_0&=~0x07;LPC_IOCON->R_PIO1_0|=0x01;//把P1.0腳設(shè)置為GPIOLPC_IOCON->R_PIO1_1&=~0x07;LPC_IOCON->R_PIO1_1|=0x01;//把P1.1腳設(shè)置為GPIOLPC_SYSCON->SYSAHBCLKCTRL&=~(1<<16);//禁能IOCON時鐘LPC_GPIO1->DIR|=(1<<0);//把P1.0設(shè)置為輸出引腳LPC_GPIO1->DATA|=(1<<0);//把P1.0設(shè)置為高電平LPC_GPIO1->DIR|=(1<<1);//把P1.1設(shè)置為輸出引腳LPC_GPIO1->DATA|=(1<<1);//把P1.1設(shè)置為高電平}/***********************************//*函數(shù)名稱:主函數(shù)*//***********************************/intmain(){uint8_tcnt=0;led_init();while(1){delay();LED1_ON;LED2_OFF;delay();LED1_OFF;LED2_ON;cnt++;if(cnt>20){cnt=0;Entry_Deep_PD();}}}
第35行,main函數(shù)開始看起。
第37行,定義了一個變量,用來計數(shù)。
第38行,初始化led。(關(guān)于初始化led的部分,請看第二章內(nèi)容)
第39行,進(jìn)入while循環(huán)。LED1和LED2將交替閃爍,知道cnt計數(shù)到20。
第51行,執(zhí)行進(jìn)入深度掉電模式函數(shù)。
在pmu.h文件中,輸入以下代碼:
#ifndef__LPC11XX_PMU_H#define__LPC11XX_PMU_HexternvoidEntry_Deep_PD(void);#endif
在pmu.c文件中,輸入以下代碼:
#include"lpc11xx.h"#include"pmu.h"voidEntry_Deep_PD(void){//step1LPC_PMU->PCON|=(1<<1);//DPDEN=1;選擇deep_power_down模式//step2(這一步可以保存需要保存的數(shù)據(jù))//LPC_PMU->GPREG0=;//LPC_PMU->GPREG1=;//LPC_PMU->GPREG2=;//LPC_PMU->GPREG3=;//step3SCB->SCR|=(1<<2);//SLEEPDEEP=1;//step4LPC_SYSCON->PDRUNCFG&=~(0X3);//確保IRCOUT_PD和IRC_PD為0//setp5__wfi();//寫wfi指令進(jìn)入低功耗模式}
Entry_Deep_PD函數(shù),用來進(jìn)入深度掉電模式。
第6行,給PCON寄存器的bit1位寫1,選擇深度掉電模式。
第8~9行,保存需要保存的數(shù)據(jù),我們現(xiàn)在的程序功能只是執(zhí)行流水燈,無需保存數(shù)據(jù),所以這一步省略。
第13行,給SCR寄存器的bit2寫1,選擇深度掉電模式。
第15行,進(jìn)入深度掉電模式后,確保IRCOUT_PD和IRC_PD位為0。
第17行,執(zhí)行WFI指令。WFI是專門為了節(jié)省功耗設(shè)計的指令,執(zhí)行該指令后,單片機(jī)將掛起等待一個中斷到來,掛起后,相當(dāng)于一直執(zhí)行NOP指令。
在RATION V3.0開發(fā)板上,帶有WAKUP按鍵,可以按此鍵喚醒單片機(jī)。進(jìn)入深度掉電模式,復(fù)位按鍵失效,也不能自動ISP下載程序。