打印
[牛人杂谈]

N79E715的电源管理

[复制链接]
1361|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
作为51能有这种电源管理功能,确实很让人意外。
N79E715有几个功能模块可以帮助用户控制设备的功耗。省电的途径有掉电模式和空闲模式。为了确保
最小功耗,需要特别注意P0管脚。
在系统省电模式下,看门狗定时器需要特别注意。在进入或退出空闲或掉电模式后,硬件会自动清除
WDT计数器,以避免系统复位。

沙发
稳稳の幸福|  楼主 | 2017-2-15 21:50 | 只看该作者

使用特权

评论回复
板凳
稳稳の幸福|  楼主 | 2017-2-15 21:51 | 只看该作者
空闲模式
空闲模式下通过保持程序计数器使CPU挂起。在空闲模式下没有程序代码的取指和运行。这迫使CPU处
于待机状态。程序计数器(PC),堆栈指针 (SP),程序状态字 (PSW),累加器(ACC),和其他寄存器在空
闲模式下保持其值不变。端口引脚保持进入空闲前的逻辑状态。通常空闲模式下的功耗约为工作状态下
的一半。
既然在空闲模式下,外设电路如定时器和串口的时钟依然工作,则可以通过相应使能的中断唤醒CPU。
用户可通过向IDL (PCON.0)写1进入空闲模式。这条指令是系统进入空闲模式前的最后一条指令。
有两种方法可以中止空闲模式,方法一,任何使能的中断可以使系统退出空闲模式。这将自动清零IDL
位,中止空闲模式,且将执行中断服务程序 (ISR)。在使用指令RETI跳出ISR,所执行的将是进入空闲
模式指令后的程序。第二种方法是除软件复位外的所有复位。

使用特权

评论回复
地板
稳稳の幸福|  楼主 | 2017-2-15 21:52 | 只看该作者
掉电模式
掉电模式是N79E715进入的最低功耗状态,保持功耗在“微安uA” 级。此时停止内部RC时钟或外部晶
振。 CPU和外设如定时器或UART都待机,Flash 内存也停止,所有动作完全停止,功耗降至最低。可
以通过向PD (PCON.1)写1进入掉电模式。在掉电模式下,RAM 保存其内容,端口引脚的值也保持不
变。
N79E715有两种方法可以退出掉电模式。 一,除软件复位外的所有复位.。欠压检测复位将把CPU由掉
电模式唤醒,在系统进入掉电模式之前要确保使能欠压检测。除最低功耗外,很少在掉电模式下使能欠
压检测,也不推荐这种用法。当然RST引脚的复位或上电复位也可以唤醒掉电状态。RST引脚复位或上
电复位后,CPU初始化,并开始执行程序。
N79E715可以通过外部中断脚唤醒掉电模式,并有自己的中断向量和终端标志。在中断条件设定的情况
下,外部中断信号会唤醒内部同步时钟从而唤醒系统,设备执行相应的外部中断的中断服务例程
(ISR)。 ISR完成后,如果程序执行掉电指令,系统会再进入掉电模式。.
低电压检测中断BOD,是唤醒掉电模式的另一个来源。如前所述BOD检测电路的功耗较大,用户如果开
启BOD唤醒系统在掉电模式下功耗也会增加,所以这不是一个典型的应用。
芯片可通过BOD、看门狗或KBI中断唤醒掉电模式。但需注意:如采用BOD唤醒模式,打开BOD侦测模
块,会在掉电模式下,使芯片消耗更多的电流。如采用KBI中断模式,若为下降边沿唤醒,则在进入掉
电模式前,端口电位必须为高;若为上升边沿唤醒,在进入掉电模式前,端口电位必须为低。

使用特权

评论回复
5
稳稳の幸福|  楼主 | 2017-2-15 21:53 | 只看该作者
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2015 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Nuvoton Technology Corp.
//  E-mail: MicroC-8bit@nuvoton.com
//***********************************************************************************************************
//  Application: Power Down Wake up
//  External interrupt 0 Wake up  => P1.3 input low(falling edge).
//  External interrupt 1 Wake up  => P1.4 input low(falling edge).
//  Keyboard interrupt   Wake up  => P0 input low(falling edge)
//  Brown out interrupt  Wake up  => Vdd < 3.8V
//  Watch dog interrupt  Wake up  => Watch dog timer time out
//  ADC interrupt        Wake up  => ADC conversion finish
//
//  Output : UART show result on hyper-terminal
//           P1.7 toggle when MCU wake up every once
//           P1.4 flash when power down pass
//           P2.1 flash when power down pass
//***********************************************************************************************************

//------------------------- <<< Use Configuration Wizard in Context Menu >>> --------------------------------
// <h> Power down wake up source
//          <o0.0> External interrupt0
//                  <0=> Disable
//                  <1=> Enable
//          <o1.0> External interrupt1
//                  <0=> Disable
//                  <1=> Enable
//          <o2.0> Key board interrupt
//                  <0=> Disable
//                  <1=> Enable
//          <o3.0> Brown out detect interrupt
//                  <0=> Disable
//                  <1=> Enable
//          <o4.0> Watch dog timer interrupt
//                  <0=> Disable
//                  <1=> Enable
//          <o5.0> ADC interrupt
//                  <0=> Disable
//                  <1=> Enable
// </h>
// <h> KBI  Enable
//          <q6.0> KBI.0
//          <q6.1> KBI.1
//          <q6.2> KBI.2
//          <q6.3> KBI.3
//          <q6.4> KBI.4
//          <q6.5> KBI.5
//          <q6.6> KBI.6
//          <q6.7> KBI.7
// </h>
//<o7.0..2> WDT Prescalar Select
//      <0=> 1/1    <1=> 1/2    <2=> 1/8    <3=> 1/16
//      <4=> 1/32   <5=> 1/64   <6=> 1/128  <7=> 1/256
//
//     <o8.6> UART pin Select
//          <0=> Select P1.0, P1.1 as UART pin(default)
//          <1=> Select P2.6, P2.7 as UART pin(28 pin only)
//-------------------------------- <<< end of configuration section >>> -------------------------------------

#define  EXT_INT0_EN        1
#define  EXT_INT1_EN        1
#define  KBI_INT_EN         1
#define  BOD_INT_EN         1
#define  WDT_INT_EN         1
#define  ADC_INT_EN         1
#define  KBI_Enable         0xFF
#define  WDT_CLK_DIV        0x07
#define  Uart_Port_Sel      0x00

#include <stdio.h>
#include "N79E715.h"
#include "Typedef.h"
#include "Define.h"
#include "Common.h"
#include "Delay.h"
#include "ISR.h"
#include "wdt.h"
#include "Version.h"

UINT16 i;
bit EA_Save_bit;
//-----------------------------------------------------------------------------------------------------------
void main()
{
    AUXR1 |= Uart_Port_Sel;                 // Select P10/P11 as UART pin(default)
    InitialUART0_Timer1(9600);              // 9600 Baud Rate [url=home.php?mod=space&uid=72445]@[/url] 11.0592MHz
    printf ("\n*===================================================================");
    printf ("\n*  Name: N79E715 Series PowerDown Wake-up Sample Code.");
    printf ("\n*===================================================================");
    printf ("\nPower Down Wake up Demo Start.\n");
    P0 = 0x00;
    for(i = 0; i<60000; i++);
    P0 = 0xFF;
    P17 = 0;
    EA = 1;

    //********************** External interrupt0 ************************
    #if EXT_INT0_EN == 1
        printf ("\nDemo INT0 Wake Up Function...");
        clr_IE0;                            // Clear external interrupt0 flag first
        EX0 = 1;                            // Enable External interrupt0
        PCON |= SET_BIT1;                   // Enter power down mode
        printf ("\nMCU Wake Up...");
        P17 = ~P17;
    #endif
    //********************** External interrupt1 ************************
    #if EXT_INT1_EN == 1
        printf ("\nDemo INT1 Wake Up Function...");
        clr_IE1;                            // Clear external interrupt1 first
        EX1 = 1;                            // Enable external interrupt1
        PCON |= SET_BIT1;                   // Enter power down mode
        printf ("\nMCU Wake Up...");
        P17 = ~P17;
    #endif
    //********************** Keyboard interrupt **************************
    #if KBI_INT_EN == 1
        printf ("\nDemo KBI Wake Up Function...");
        clr_KBIF0;                          // Clear keyboard interrupt flag first
        KBIE = KBI_Enable;                  // Enable P1 that cause keyboard
        EKB = 1;                            // Enable key board interrupt
        PCON |= SET_BIT1;                   // Enter power down mode
        printf ("\nMCU Wake Up...");
        P17 = ~P17;
    #endif
    //********************** Brown out detect ***************************
    #if BOD_INT_EN == 1
        printf ("\nDemo Brown-Out Wake Up Function...");
        TA = 0xAA;
        TA = 0x55;
        PMCR = 0xC0;
        EBO = 1;                            // Enable brown out detect
        PCON |= SET_BIT1;
        printf ("\nMCU Wake Up...");
        P17 = ~P17;
    #endif
    //********************** Watch dog timer ****************************
    #if WDT_INT_EN == 1
        printf ("\nDemo Watch Dog Wake Up Function...");
        TA = 0xAA;
        TA = 0x55;
        WDCON0 |= WDT_CLK_DIV;              // Select bit length of WDT counter
        TA = 0xAA;
        TA = 0x55;
        WDCON0 |= SET_BIT4;
        clr_WDTF;                           // Clear WDT flag
        EWDI = 1;                           // Enable WDT interrupt
        set_WDCLR;                          // Clear WDT counter
        set_WDTEN;                          // Enable WDT
        PCON |= SET_BIT1;                   // Enter power down mode
        printf ("\nMCU Wake Up...");
        P17 = ~P17;
    #endif
    //********************** ADC interrupt ******************************
    #if ADC_INT_EN == 1
        printf ("\nDemo ADC Wake Up Function...");
        clr_ADCI;                           // Clear ADC flag first
        ADCCON1 |= 0x82;                    // ADC clock is RC/2 clock and enable ADC
        EADC = 1;                           // Enable ADC interrupt
        ADCS = 1;                           // ADC run
        PCON |= SET_BIT1;                   // Enter power down mode
        printf ("\nMCU Wake Up...");
        P17 = ~P17;
    #endif
    printf ("\nPower Down Wake Up Test OK!");
    P17 = 1;
    while(1)
    {
        P14 = 1;
        P21 = 1;
        Delay1ms(500);
        P14 = 0;
        P21 = 0;
        Delay1ms(500);
    }
}
//-----------------------------------------------------------------------------------------------------------
void INT0_ISR(void) interrupt 0             // Vector @  0x03
{
    clr_IE0;
    EX0 = 0;
}
//-----------------------------------------------------------------------------------------------------------
void INT1_ISR(void) interrupt 2             // Vector @  0x13
{
    clr_IE1;
    EX1 = 0;
}
//-----------------------------------------------------------------------------------------------------------
void KBI_ISR(void)  interrupt 7             // Vector @  0x3B
{
    clr_KBIF0;
    EKB = 0;
}
//-----------------------------------------------------------------------------------------------------------
void BOD_ISR(void)  interrupt 8             // Vector @  0x43
{
    clr_BOF;
    EBO = 0;
}
//-----------------------------------------------------------------------------------------------------------
void WDT_ISR(void)  interrupt 10            // Vector @  0x53
{
    clr_WDTF;
    clr_WDTEN;
    EWDI = 0;
}
//-----------------------------------------------------------------------------------------------------------
void ADC_ISR(void)  interrupt 11            // Vector @  0x5B
{
    clr_ADCI;
    EADC = 0;
}
//-----------------------------------------------------------------------------------------------------------


使用特权

评论回复
6
稳稳の幸福|  楼主 | 2017-2-15 21:55 | 只看该作者
  PCON |= SET_BIT1;                   // Enter power down mode
这个刚好是对应        PD (PCON.1)写1进入掉电模式

使用特权

评论回复
7
xinyipcb| | 2017-2-16 01:32 | 只看该作者
关键是功耗,功耗不下来受限很大。

使用特权

评论回复
8
天灵灵地灵灵| | 2017-2-16 19:18 | 只看该作者
空闲模式下的功耗约为工作状态下的一半。

使用特权

评论回复
9
zhuotuzi| | 2017-2-17 08:38 | 只看该作者
电源管理的终极目的就是省电。空闲模式下的功耗约为工作状态下的一半,另外一种模式几乎跟关机一样。

使用特权

评论回复
10
天灵灵地灵灵| | 2017-2-17 22:28 | 只看该作者
掉电模式是N79E715进入的最低功耗状态,保持功耗在“微安uA” 级。基本上就是关机了。

使用特权

评论回复
11
734774645| | 2017-2-19 18:48 | 只看该作者
这也是新唐的51跟传统51的区别,传统的很简单,新唐的扩充了很多功能。新增了不少外设。

使用特权

评论回复
12
稳稳の幸福|  楼主 | 2017-2-20 00:22 | 只看该作者
对于51单片机有两种节能方式就很不错了。可以实现低功耗的需求。

使用特权

评论回复
13
zhuomuniao110| | 2017-2-20 20:47 | 只看该作者
ISR完成后,如果程序执行掉电指令,系统会再进入掉电模式。.

使用特权

评论回复
14
huangcunxiake| | 2017-2-21 20:05 | 只看该作者
程序计数器(PC),堆栈指针 (SP),程序状态字 (PSW),累加器(ACC),和其他寄存器在空闲模式下保持其值不变。这样恢复后继续可以工作。

使用特权

评论回复
15
wahahaheihei| | 2017-2-21 20:22 | 只看该作者
任何使能的中断可以使系统退出空闲模式。这将自动清零IDL
位,中止空闲模式,且将执行中断服务程序 (ISR)。

使用特权

评论回复
16
dongnanxibei| | 2017-2-22 13:52 | 只看该作者
在进入或退出空闲或掉电模式后,硬件会自动清除WDT计数器,以避免系统复位。

使用特权

评论回复
17
wgc2015| | 2017-3-4 17:03 | 只看该作者
但是唤醒时每次第一次都会LED闪烁一下,是怎么回事?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

181

主题

3246

帖子

8

粉丝