www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 單片機 > 單片機
[導讀]低功耗模式,專為電池供電而生!LPC1114內(nèi)部有很多的模塊,幾乎每個模塊都可以通過相關寄存器來控制掉電與上電以及時鐘是否開啟??偟膩碚f,上電的模塊越少,就越省電。在實際的產(chǎn)品應用中,我們首先可以根據(jù)需要,把

低功耗模式,專為電池供電而生!

LPC1114內(nèi)部有很多的模塊,幾乎每個模塊都可以通過相關寄存器來控制掉電與上電以及時鐘是否開啟??偟膩碚f,上電的模塊越少,就越省電。在實際的產(chǎn)品應用中,我們首先可以根據(jù)需要,把不用的模塊統(tǒng)統(tǒng)關閉來達到節(jié)省功耗的目的,然后,還可以通過以下的3種低功耗模式來實現(xiàn):睡眠模式、深度睡眠模式、深度掉電模式。

1.睡眠模式(Sleep mode)

進入睡眠模式,LPC1114內(nèi)核Cortex-M0的時鐘停止工作,指令也無法執(zhí)行。復位或者有一個中斷發(fā)生將退出睡眠模式。

進入睡眠模式,正在運行的外設模塊將繼續(xù)運行,正在運行的外設模塊可以產(chǎn)生一個中斷來使得單片機推出睡眠模式。睡眠模式會消除單片機自身、存儲系統(tǒng)和他們相關的控制器以及內(nèi)部總線的動態(tài)功耗。處理器的狀態(tài)和寄存器、外設的寄存器、SRAM中的數(shù)據(jù)以及單片機引腳的電平都會保持不變。

2.怎樣進入睡眠模式

執(zhí)行以下步驟進入睡眠模式:

1. 設置PCON寄存器的DPDEN位為0;

2. 設置SCR寄存器中的SLEEPDEEP位為0;

3. 執(zhí)行WFI指令。

3.進入睡眠模式后,如何喚醒單片機

1. 復位

2. 發(fā)生一個NVIC中斷

4.示例程序

為了很容易的看到效果,這里用流水燈的運行和停止運行來觀察是否進入睡眠模式。開始流水燈執(zhí)行,過一會兒,進入睡眠模式后,流水燈停止流水。

新建一個工程,結構如下圖所示:

在main.c中,輸入以下代碼:

#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腳設置為GPIOLPC_IOCON->R_PIO1_1&=~0x07;LPC_IOCON->R_PIO1_1|=0x01;//把P1.1腳設置為GPIOLPC_SYSCON->SYSAHBCLKCTRL&=~(1<<16);//禁能IOCON時鐘LPC_GPIO1->DIR|=(1<<0);//把P1.0設置為輸出引腳LPC_GPIO1->DATA|=(1<<0);//把P1.0設置為高電平LPC_GPIO1->DIR|=(1<<1);//把P1.1設置為輸出引腳LPC_GPIO1->DATA|=(1<<1);//把P1.1設置為高電平}/***********************************//*函數(shù)名稱:GPIO1中斷函數(shù)*//***********************************/voidPIOINT1_IRQHandler(){LPC_PMU->PCON&=~(1<<8);//SLEEPFLAG標志位清零LPC_GPIO1->IC=0XFFF;//清RIS狀態(tài)位}/***********************************//*函數(shù)名稱:主函數(shù)*//***********************************/intmain(){uint8_tcnt=0;led_init();LPC_GPIO1->IE|=(1<<9);//允許P1.9引腳上的中斷LPC_GPIO1->IE|=(1<<10);//允許P1.10引腳上的中斷NVIC_EnableIRQ(EINT1_IRQn);//打開GPIO1中斷while(1){delay();LED1_ON;LED2_OFF;delay();LED1_OFF;LED2_ON;cnt++;if(cnt>20){cnt=0;Entry_Sleep();}}}

從主函數(shù)main開始看起。

第45行,定義了一個變量cnt,計數(shù)用。

第46行,初始化了led燈。

第47,48行,分別允許了P1.9和P1.10的下降沿中斷。

第49行,打開了GPIO1上的NVIC中斷。

第50行,進入while循環(huán),之后程序將一直在while里面循環(huán)運行,達到流水燈的效果。(關于led和P1.9 P1.10的外部中斷設置部分,在第三章有詳細說明。)

第59行,當cnt大于20,把cnt清0后,執(zhí)行第62行的進入睡眠模式的函數(shù)。

進入睡眠模式后,流水燈停止流水。這時,可以給P1.9或P1.10一個下降沿來喚醒單片機。在RATION V3.0開發(fā)板上,P1.9和P1.10連接KEY1和KEY2,只要按下KEY1或KEY2,就會喚醒單片機,使得流水燈繼續(xù)執(zhí)行。當cnt到達20后,又會進入睡眠模式。

在pmu.h中,輸入以下代碼:

#ifndef__LPC11XX_PMU_H#define__LPC11XX_PMU_HexternvoidEntry_Sleep(void);#endif

在pmu.c中,輸入以下代碼:

#include"lpc11xx.h"#include"pmu.h"voidEntry_Sleep(void){LPC_PMU->PCON&=~(1<<1);//DPDEN=0;選擇sleep/deep-sleep模式SCB->SCR&=~(1<<2);//SLEEPDEEP=0;選擇sleep模式__wfi();//寫wfi指令進入低功耗模式}

Entry_Sleep()函數(shù)用到了兩個寄存器和一個指令。

PCON:功耗控制寄存器

SCR:系統(tǒng)控制寄存器

__wfi:等待中斷指令

PCON是PMU模塊的寄存器,SCR是Crotex-M0內(nèi)核系統(tǒng)控制模塊SCB的寄存器。

PCON:功耗控制寄存器

位符號值描述復位值0––保留位,不能給此位寫10x01DPDEN
深度掉電模式允許位00執(zhí)行WFI進入睡眠或深度睡眠模式1執(zhí)行WFI進入深度掉電模式7:2––保留位,不能給這些位寫10x08SLEEPFLAG
睡眠模式標志00讀:沒有進入低功耗模式寫:不起作用1讀:進入了低功耗模式寫:清此位10:9––保留位,不能給這些位寫10x011DPDFLAG
深度掉電標志0x00讀:沒有進入深度掉電模式寫:不起作用1讀:進入深度掉電模式寫:清除深度掉電模式31:12––保留位,禁止給這些位寫10x0

LPC_PMU->PCON&=~(1<<1);//DPDEN=0;選擇sleep/deep-sleep模式

第5行,給PCON寄存器的bit1寫0,選擇進入睡眠或深度睡眠模式。

SCR:系統(tǒng)控制寄存器

位符號描述復位值0–保留位01SLEEPONEXIT從處理模式到線程模式是否進入退出睡眠模式:0= 在線程模式中不睡眠


1 = 當從ISR返回到線程模式進入睡眠模式或深度睡眠模式

此位置1使能中斷避免應用程序返回空的mian函數(shù)

02SLEEPDEEP在低功耗模式下選擇處理器使用睡眠模式還是深度睡眠模式:0 = 睡眠模式 1 = 深度睡眠模式03–保留04SEVONPEND發(fā)送中斷信號。當有中斷進入等待中斷模式,中斷信號可將CPU從WFE中喚醒。如果CPU沒有等待中斷,但是中斷信號已經(jīng)有效,將會在下一個WFE指令后生效。當然執(zhí)行SEV指令也可將CPU喚醒0 = 只有使能的中斷才可以將CPU喚醒,沒有使能的中斷將被忽略


1 = 所有的中斷,包括使能和沒有使能的中斷都可以將CPU喚醒

031:5–保留位0x00

SCB->SCR&=~(1<<2);//SLEEPDEEP=0;選擇sleep模式

第六行,給SCR寄存器的bit2寫0,即選擇睡眠模式。

__wfi();//寫wfi指令進入低功耗模式

WFI是專門為了節(jié)省功耗設計的指令,執(zhí)行該指令后,單片機將掛起等待一個中斷到來,掛起后,相當于一直執(zhí)行NOP指令。


本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

在物聯(lián)網(wǎng)(M2M)設備規(guī)模突破百億級的今天,低功耗設計已成為決定設備生命周期的核心挑戰(zhàn)。以智能電表為例,其電池壽命需超過10年,而無線通信模塊的功耗占比高達60%以上。非連續(xù)接收(DRX)與擴展空閑模式(eDRX)作為兩...

關鍵字: M2M 睡眠模式

中斷方式串口接收數(shù)據(jù)新建一個工程,結構如下圖所示:在main.c文件中,輸入以下代碼:#include “l(fā)pc11xx.h”#include “uart.h”uint8_t rec_buf;void UART_IRQH...

關鍵字: Cortex lpc1114 mo uart 串口中斷 收發(fā)數(shù)據(jù)

LPC_IOCON->R_PIO1_0 &= ~0x07;LPC_IOCON->R_PIO1_0 |= 0x02;上面是設置P1.0為AD1的語句。P1.0低三位是引腳功能選擇位,所以配置低三位就可以...

關鍵字: lpc1114 引腳功能 設置

LPC1114內(nèi)部一共有4個定時器,2個32位定時器,2個16位定時器,使用方式都一樣,只是要注意使用16位定時器時,寄存器的值不要超出65535。給它們分別取名稱為CT16B0、CT16B1、CT32B0、CT32B1...

關鍵字: lpc1114 通用定時器

你還在為如何給LPC1114主控的電路板留程序下載接口而煩惱嗎?下面瑞生(Ration)以自己曾經(jīng)做過的項目為例給大家分享一下吧!1.LPC1114如何下載程序?這個當然是你必須要知道的問題。LPC1114一共2種下載方...

關鍵字: lpc1114 程序下載接口

#include\"ds18b20.h\"uint8_ttemp_sign;voiddelay_ds(uint16_tzz){uint8_txx;uint16_tyy;for(xx=0;xx

關鍵字: 18b20 lpc1114 測量溫度

某同學:你好,看了基礎篇SysClk、GPIO、UART的例程,在用到IOCON模塊,UART模塊在SYSAHBCLKCTRL寄存器中都需要相應時鐘允許位置1,IOCON使能,在設置完后又禁能,UART使用時只使能,不用...

關鍵字: lpc1114 iocon 模塊時鐘

32位的單片機內(nèi)部各種數(shù)據(jù)寄存器和控制寄存器都是32位的,同理,8位單片機內(nèi)部的數(shù)據(jù)和控制寄存器都是8位的。例如:AT89C51單片機的“中斷控制寄存器”IE定義如下圖所示:bit7bit6bit5bit4bit3bit...

關鍵字: ARM Cortex lpc1114 m0 寄存器配置

新建一個工程,結構如下圖所示:timer.h文件和timer.c文件用上一節(jié)的。在timer.h中增加兩個變量和兩個函數(shù)的聲明,如下所示:#ifndef __NXPLPC11xx_TIME_H__#define __NX...

關鍵字: lpc1114 pwm 通用定時器

LPC1114的中斷,由中斷控制模塊NVIC控制。一共32個中斷,每個中斷的優(yōu)先級可編程為 0~3 四種級別。級別越高對應的優(yōu)先級越低。因此,級別0 是最高的中斷優(yōu)先級。設置中斷優(yōu)先級的函數(shù),CMISIS已經(jīng)寫好,并嵌入...

關鍵字: cortex-m0 lpc1114 中斷優(yōu)先級
關閉