lpc1114深度睡眠模式Deep-sleep
在深度睡眠模式,除了BOD模塊和看門狗振蕩器的時(shí)鐘可以繼續(xù)工作,其它所有的時(shí)鐘都會(huì)停止工作??梢酝ㄟ^(guò)PDSLEEPCFG寄存器來(lái)配置在深度睡眠模式期間BOD模塊和看門狗振蕩器是否需要工作。
在深度睡眠模式,消除了flash、所有模擬外設(shè)、處理器自身、存儲(chǔ)器、相關(guān)控制器和內(nèi)部總線的功耗。處理器的狀態(tài)和寄存器、外設(shè)的寄存器、內(nèi)部SRAM的數(shù)據(jù)和單片機(jī)引腳的電平保持不變。
在深度睡眠模式,看門狗振蕩器是唯一可以工作的時(shí)鐘源。當(dāng)需要定時(shí)器定時(shí)喚醒單片機(jī)的時(shí)候,可以開啟看門狗時(shí)鐘。其它的時(shí)鐘,諸如系統(tǒng)振蕩器、IRC和PLL都會(huì)掉電。如果需要看門狗振蕩器工作,它的時(shí)鐘必須設(shè)置到最小值,即把WDTOSCCTRL寄存器中的FREQSEL位設(shè)置為0001。
當(dāng)需要定時(shí)器喚醒單片機(jī),可以在SYSAHBCLKCTRL寄存器中開啟看門狗振蕩器和一個(gè)通用定時(shí)器。
1.怎樣進(jìn)入深度睡眠模式
執(zhí)行以下步驟進(jìn)入深度睡眠模式
1. 設(shè)置PCON寄存器的DPDEN位為0;
2. 配置PDSLEEPCFG寄存器
a) 如果需要定時(shí)器喚醒單片機(jī),在PDRUNCFG寄存器中,把看門狗的時(shí)鐘打開,然后在MAINCLKSEL把主時(shí)鐘源選擇為看門狗振蕩器時(shí)鐘;
b) 如果不需要定時(shí)器喚醒單片機(jī),在PDRUNCFG寄存器中,把看門狗的時(shí)鐘關(guān)閉,把IRC的時(shí)鐘打開,在MAINCLKSEL寄存器中選擇IRC時(shí)鐘為主時(shí)鐘源;
3. 配置PDAWAKECFG寄存器;
4. 如果使用外部引腳來(lái)喚醒單片機(jī),配置STARTAPRP0,STARTERP0,STARTRSRP0CLR寄存器,初始化外部喚醒引腳,并用NVIC開啟該引腳的中斷。
5. 在SYSAHBCLKCTRL寄存器中,關(guān)閉所有的外設(shè)模塊。如果用到WDT和定時(shí)器,則開啟這兩的時(shí)鐘。
6. 設(shè)置SCR寄存器中的SLEEPDEEP位為1;
7. 執(zhí)行WFI指令。
2.進(jìn)入深度睡眠模式后,如何喚醒單片機(jī)
1. 復(fù)位
2. 定時(shí)器匹配輸出引腳喚醒
3. 外部引腳邏輯信號(hào)
深度睡眠模式的外部喚醒引腳一共有13個(gè),分別是P0.0~P0.11和P1.0??梢酝ㄟ^(guò)配置具體由哪個(gè)引腳喚醒,上升沿或下降沿喚醒??梢酝ㄟ^(guò)外部信號(hào)喚醒,也可以通過(guò)單片機(jī)自身定時(shí)器的匹配輸出引腳電平變化功能來(lái)實(shí)現(xiàn)。當(dāng)使用定時(shí)器匹配引腳時(shí),只能是在P0.1 、P0.8~P0.11引腳上,因?yàn)橹挥羞@幾個(gè)引腳有定時(shí)器匹配輸出功能。
3.示例程序
為了很容易的看到效果,這里用流水燈的運(yùn)行和停止運(yùn)行來(lái)觀察是否進(jìn)入睡眠模式。開始流水燈執(zhí)行,過(guò)一會(huì)兒,進(jìn)入睡眠模式后,流水燈停止流水。
新建一個(gè)工程,結(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í)函數(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時(shí)鐘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時(shí)鐘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_Sleep();}}}
第35行,main函數(shù)開始看起。
第37行,定義了一個(gè)變量,用來(lái)計(jì)數(shù)。
第38行,初始化led。(關(guān)于初始化led的部分,請(qǐng)看第三章內(nèi)容)
第39行,進(jìn)入while循環(huán)。LED1和LED2將交替閃爍,知道cnt計(jì)數(shù)到20。
第51行,執(zhí)行進(jìn)入深度睡眠模式函數(shù)。
在pmu.h文件中,輸入以下代碼:
#ifndef__LPC11XX_PMU_H#define__LPC11XX_PMU_HexternvoidEntry_Deep_Sleep(void);#endif
在pmu.c文件中,輸入以下代碼:
#include"lpc11xx.h"#include"pmu.h"voidEntry_Deep_Sleep(void){//step1LPC_PMU->PCON&=~(1<<1);//DPDEN=0;選擇sleep/deep-sleep模式//step2LPC_SYSCON->MAINCLKSEL=0x0;/*SelectIRC*/LPC_SYSCON->MAINCLKUEN=0x01;/*UpdateMCLKClockSource*/LPC_SYSCON->MAINCLKUEN=0x00;/*ToggleUpdateRegister*/LPC_SYSCON->MAINCLKUEN=0x01;while(!(LPC_SYSCON->MAINCLKUEN&0x01));/*WaitUntilUpdated*///step3LPC_SYSCON->PDAWAKECFG&=~(1<<5);//SYSOSC_PD喚醒后系統(tǒng)振蕩器上電LPC_SYSCON->PDAWAKECFG&=~(1<<7);//SYSPLL_PD喚醒后PLL上電//step4LPC_SYSCON->STARTRSRP0CLR|=(1<<7);//RESETP0.7LPC_SYSCON->STARTAPRP0&=~(1<<7);//配置P0.7腳為喚醒引腳LPC_SYSCON->STARTERP0|=(1<<7);//EnableP0.7腳作為喚醒引腳NVIC_EnableIRQ(WAKEUP7_IRQn);//step5LPC_SYSCON->SYSAHBCLKCTRL=0x01f;//關(guān)閉所有外設(shè)模塊//step6SCB->SCR|=(1<<2);//SLEEPDEEP=1;選擇deep_sleep模式//step7__wfi();//寫wfi指令進(jìn)入低功耗模式}voidWAKEUP_IRQHandler(void){//時(shí)鐘配置LPC_SYSCON->MAINCLKSEL=0x3;/*SelectPLLClockOutput*/LPC_SYSCON->MAINCLKUEN=0x01;/*UpdateMCLKClockSource*/LPC_SYSCON->MAINCLKUEN=0x00;/*ToggleUpdateRegister*/LPC_SYSCON->MAINCLKUEN=0x01;while(!(LPC_SYSCON->MAINCLKUEN&0x01));/*WaitUntilUpdated*///清喚醒標(biāo)志LPC_SYSCON->STARTRSRP0CLR|=(1<<7);//RESETP0.7LPC_PMU->PCON&=~(1<<8);//SLEEPFLAG標(biāo)志位清零LPC_SYSCON->SYSAHBCLKCTRL|=(1<<6);//GPIO上電}
在pmu.c文件中,定義了兩個(gè)函數(shù):
Entry_Deep_Sleep()函數(shù)的功能是進(jìn)入深度睡眠模式。
WAKUP_IRQHandler()是喚醒引腳的中斷處理函數(shù)。
Entry_Deep_Sleep()函數(shù)里面的代