lpc1114深度睡眠模式Deep-sleep

2016-12-09 09:35:01来源: eefocus 关键字:lpc1114  深度睡眠模式

在深度睡眠模式,除了BOD模块和看门狗振荡器的时钟可以继续工作,其它所有的时钟都会停止工作。可以通过PDSLEEPCFG寄存器来配置在深度睡眠模式期间BOD模块和看门狗振荡器是否需要工作。

在深度睡眠模式,消除了flash、所有模拟外设、处理器自身、存储器、相关控制器和内部总线的功耗。处理器的状态和寄存器、外设的寄存器、内部SRAM的数据和单片机引脚的电平保持不变。

在深度睡眠模式,看门狗振荡器是唯一可以工作的时钟源。当需要定时器定时唤醒单片机的时候,可以开启看门狗时钟。其它的时钟,诸如系统振荡器、IRC和PLL都会掉电。如果需要看门狗振荡器工作,它的时钟必须设置到最小值,即把WDTOSCCTRL寄存器中的FREQSEL位设置为0001。

当需要定时器唤醒单片机,可以在SYSAHBCLKCTRL寄存器中开启看门狗振荡器和一个通用定时器。

1. 怎样进入深度睡眠模式

执行以下步骤进入深度睡眠模式

1. 设置PCON寄存器的DPDEN位为0;

2. 配置PDSLEEPCFG寄存器

a) 如果需要定时器唤醒单片机,在PDRUNCFG寄存器中,把看门狗的时钟打开,然后在MAINCLKSEL把主时钟源选择为看门狗振荡器时钟;

b) 如果不需要定时器唤醒单片机,在PDRUNCFG寄存器中,把看门狗的时钟关闭,把IRC的时钟打开,在MAINCLKSEL寄存器中选择IRC时钟为主时钟源;

3. 配置PDAWAKECFG寄存器;

4. 如果使用外部引脚来唤醒单片机,配置STARTAPRP0,STARTERP0,STARTRSRP0CLR寄存器,初始化外部唤醒引脚,并用NVIC开启该引脚的中断。

5. 在SYSAHBCLKCTRL寄存器中,关闭所有的外设模块。如果用到WDT和定时器,则开启这两的时钟。

6. 设置SCR寄存器中的SLEEPDEEP位为1;

7. 执行WFI指令。

2. 进入深度睡眠模式后,如何唤醒单片机

1. 复位

2. 定时器匹配输出引脚唤醒

3. 外部引脚逻辑信号

深度睡眠模式的外部唤醒引脚一共有13个,分别是P0.0~P0.11和P1.0。可以通过配置具体由哪个引脚唤醒,上升沿或下降沿唤醒。可以通过外部信号唤醒,也可以通过单片机自身定时器的匹配输出引脚电平变化功能来实现。当使用定时器匹配引脚时,只能是在P0.1 、P0.8~P0.11引脚上,因为只有这几个引脚有定时器匹配输出功能。

3. 示例程序

为了很容易的看到效果,这里用流水灯的运行和停止运行来观察是否进入睡眠模式。开始流水灯执行,过一会儿,进入睡眠模式后,流水灯停止流水。

新建一个工程,结构如下图所示:

pmu

在main.c函数中,输入以下代码:

#include "lpc11xx.h"
#include "pmu.h"
#define LED1_ON  LPC_GPIO1->DATA &= ~(1<<0)
#define LED1_OFF LPC_GPIO1->DATA |= (1<<0)
#define LED2_ON  LPC_GPIO1->DATA &= ~(1<<1)
#define LED2_OFF LPC_GPIO1->DATA |= (1<<1)
/***********************************/
/* 函数名称:延时函数              */
/***********************************/
void delay()
{
   uint16_t i,j;
   for(i=0;i<5000;i++)
   for(j=0;j<200;j++);
}
/***********************************/
/* 函数名称:LED灯初始化           */
/***********************************/
void led_init()
{
   LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16); // 使能IOCON时钟
   LPC_IOCON->R_PIO1_0 &= ~0x07;   
   LPC_IOCON->R_PIO1_0 |= 0x01; //把P1.0脚设置为GPIO
   LPC_IOCON->R_PIO1_1 &= ~0x07;
   LPC_IOCON->R_PIO1_1 |= 0x01; //把P1.1脚设置为GPIO
   LPC_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设置为高电平
}
/***********************************/
/* 函数名称:主函数                */
/***********************************/
int main()
{
   uint8_t cnt=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函数开始看起。

第37行,定义了一个变量,用来计数。

第38行,初始化led。(关于初始化led的部分,请看第三章内容)

第39行,进入while循环。LED1和LED2将交替闪烁,知道cnt计数到20。

第51行,执行进入深度睡眠模式函数。

在pmu.h文件中,输入以下代码:

#ifndef  __LPC11XX_PMU_H
#define  __LPC11XX_PMU_H
extern void Entry_Deep_Sleep(void);
#endif

在pmu.c文件中,输入以下代码:

#include "lpc11xx.h"
#include "pmu.h"
void Entry_Deep_Sleep(void)
{
   // step1
   LPC_PMU->PCON &= ~(1<<1);      // DPDEN=0; 选择sleep/deep-sleep模式
   // step2
   LPC_SYSCON->MAINCLKSEL    = 0x0;        /* Select IRC  */
   LPC_SYSCON->MAINCLKUEN    = 0x01;      /* Update MCLK Clock Source */
   LPC_SYSCON->MAINCLKUEN    = 0x00;      /* Toggle Update Register   */
   LPC_SYSCON->MAINCLKUEN    = 0x01;
   while (!(LPC_SYSCON->MAINCLKUEN & 0x01));   /* Wait Until Updated  */
   // step3
   LPC_SYSCON->PDAWAKECFG &= ~(1<<5);  // SYSOSC_PD 唤醒后系统振荡器上电
   LPC_SYSCON->PDAWAKECFG &= ~(1<<7);   // SYSPLL_PD 唤醒后PLL上电
   // step4
   LPC_SYSCON->STARTRSRP0CLR |= (1<<7); // RESET P0.7
   LPC_SYSCON->STARTAPRP0 &= ~(1<<7);  // 配置P0.7脚为唤醒引脚
   LPC_SYSCON->STARTERP0 |= (1<<7); // Enable P0.7脚作为唤醒引脚  
   NVIC_EnableIRQ(WAKEUP7_IRQn);
   // step5
   LPC_SYSCON->SYSAHBCLKCTRL = 0x01f; // 关闭所有外设模块
   // step6
   SCB->SCR |= (1<<2);      // SLEEPDEEP=1; 选择deep_sleep模式
   // step7
   __wfi();                                      // 写wfi指令进入低功耗模式
}
void WAKEUP_IRQHandler(void)
{
   // 时钟配置
   LPC_SYSCON->MAINCLKSEL    = 0x3;    /* Select PLL Clock Output  */
   LPC_SYSCON->MAINCLKUEN    = 0x01;  /* Update MCLK Clock Source */
   LPC_SYSCON->MAINCLKUEN    = 0x00;     /* Toggle Update Register   */
   LPC_SYSCON->MAINCLKUEN    = 0x01;
   while (!(LPC_SYSCON->MAINCLKUEN & 0x01)); /* Wait Until Updated       */
   // 清唤醒标志
   LPC_SYSCON->STARTRSRP0CLR |= (1<<7); // RESET P0.7
   LPC_PMU->PCON &= ~(1<<8); // SLEEPFLAG标志位清零    
   LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6); // GPIO上电
}

在pmu.c文件中,定义了两个函数:

Entry_Deep_Sleep()函数的功能是进入深度睡眠模式。

WAKUP_IRQHandler()是唤醒引脚的中断处理函数。

Entry_Deep_Sleep()函数里面的代

[1] [2]

关键字:lpc1114  深度睡眠模式

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/article_2016120932118.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:lpc1114深度掉电模式Deep power-down mode
下一篇:最后一页

论坛活动 E手掌握
微信扫一扫加关注
论坛活动 E手掌握
芯片资讯 锐利解读
微信扫一扫加关注
芯片资讯 锐利解读
推荐阅读
全部
lpc1114
深度睡眠模式

小广播

独家专题更多

迎接创新的黄金时代 无创想,不奇迹
迎接创新的黄金时代 无创想,不奇迹
​TE工程师帮助将不可能变成可能,通过技术突破,使世界更加清洁、安全和美好。
TTI携TE传感器样片与你相见,一起传感未来
TTI携TE传感器样片与你相见,一起传感未来
TTI携TE传感器样片与你相见,一起传感未来
富士通铁电随机存储器FRAM主题展馆
富士通铁电随机存储器FRAM主题展馆
馆内包含了 纵览FRAM、独立FRAM存储器专区、FRAM内置LSI专区三大部分内容。 

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2016 EEWORLD.com.cn, Inc. All rights reserved