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
深度睡眠模式

小广播

独家专题更多

东芝在线展会——芯科技智社会创未来
东芝在线展会——芯科技智社会创未来
2017东芝PCIM在线展会
2017东芝PCIM在线展会
TI车载信息娱乐系统的音视频解决方案
TI车载信息娱乐系统的音视频解决方案
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源

何立民专栏

单片机及嵌入式宝典

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

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