尊敬的先生:
我之前进行过低功耗测试,认为3.0 中的功耗低于10 UA。 但现在我回到这个问题时,消耗量大约是0.18马,是可以接受的10倍!
也许我之前读错了,或者其他什么。 它在两个不同的MSP430FR5994 LaunchPad开发套件上是相同的。 (该芯片实际上是MSP430FR5.9941万,但这似乎对这一点无关紧要。)
无论如何,您是否可以检查以下示例代码以了解问题所在? 非常感谢
谢谢!
John Moore
//************************************************************************************************
// MSP430FRxx演示- WDT,低功耗模式,间隔溢出ISR,DCO SMCLK
//
//说明:使用WDT ISR定时的软件进入LowPowerMode。 LED
//休眠时将关闭,端口1中断将唤醒MCU并打开
// LED。 根据默认值,MCU将在大约250 * 32ms的时间休眠
//本示例中用于WDT的DCO/SMCLK时钟源。
// ACLK = N/A,MCLK = SMCLK =默认值
// 6秒后,WDT中断设置为低功耗模式。
// 通过使用WFP 1.3 上的低到高输入进行唤醒,它会使端口1中断
// 返回到正常模式。 因为这是一个上升的边缘,所以需要在中下拉
// 示波器探测器的形式等
// 在进入睡眠模式之前,它将0到10的10个值写入到0x4000的帧内存中。
// 使用向导和“持久性”关键字。
//
// 如果调试器启动程序,它会将FRAM数据重新设置为0,并且将丢失(在“持续”模式下)。
// 但在"noinit"模式下不会丢失。 在"noinit"模式中,调试器可以读取非易失性fram数据。
// 程序
// 设置为在启动时读取fram loc 1和2。 如果这两个位置分别为1和0,则会打开
// 绿色LED。 这样,您就不必从调试器开始检查fram位置。
//
//
// 使用3.2ma和.165ma (睡眠LPM 3.0)
// 必须卸下所有跳线并测量3.3V跳线的电流
// MSP430G2xxx
//-----------
///|\\| Xin|-
//||||
//--|RST XOUT|-
//||
//| WFP 1.0 |-->LED
//
// Aldo Briano
//德州仪器(TI)
// 2010年7月
//************************************************************************************************
#include <MSP4S.h>
//#include "driverlib.h"
静态int wdtCounter =0;
//#pragma persistent(FRAM_ARr)// 此操作有效
//unsigned int frm_arr[10]={0};
#pragma NOINIT(FRAM_ARr) //这也有效
unsigned int frm_arr[10];
/************************************************************************
* Pre_init()
***************** /
int _system_pre_init(void)
{
//停止监视计时器
WDT_A_HOLD (__MSP430_BASEADDRESS_WDT_A_); //停止WDT
// gPIO_setOutputHighOnPin (gPIO_PORT_P4,gPIO_PIN0);
// gPIO_setAsOutputPin (gPIO_PORT_P4,gPIO_PIN0);
/*=========================================== */
/*如果段初始化,请选择*/
/*是否应执行。 */
/* return: 0忽略初始化*/
/* 1运行初始化*/
/*=========================================== */
返回1;
}
********************
主
*
******************* /
Void主(void)
{
INT A;
PM5CTL0 &=~LCKLPM5; //禁用GPIO开机默认高阻抗模式
//初始化时钟和I/O:
//启动时钟系统,最大DCO设置为~8MHz
CSCTL0_H = CSBey >> 8; // CSBKey=A500。 解锁时钟寄存器
CSCTL1 = DCOFSEL_3 | DCORSEL; //将DCO设置为8MHz。 6|40
CSCTL2 =拉美_ VLOCLK | SESS__DCOCLK | SELM__DCOCLK;
CSCTL3 = DIVA__1 | DIVs__1 | DIVM__1; //设置所有分隔线
CSCTL0_H = 0; //锁定CS寄存器
//将未使用的端口设置为下拉:
P2SEL0 &=~BIT0; //为WFP 1.0 选择GPIO
P2SEL1 &=~BIT0;
P2DIR =0;//将P2设置为输入方向
P2REN = 0; //下拉(几乎没有区别)
//P2DIR =0xff;//将P2设置为输出方向(几乎不会产生差异)
P3SEL0 &=~BIT0; //为WFP 1.0 选择GPIO
P3SEL1 &=~BIT0;
P3DIR =0;//将P2设置为输入方向
P3REN = 0; //下拉
P5SEL0 &=~BIT0; //这有按钮
P5SEL1 &=~BIT0;
P5DIR =0;//将P2设置为输入方向
P5REN = 0; //下拉
//为1.0 LED1开发的WFP:
P1SEL0 &=~BIT0; //为WFP 1.0 选择GPIO
P1SEL1 &=~BIT0;
P1DIR || BIT0;//将WFP 1.0 设置为输出方向
P1OUT || BIT0;//在1.0 处打开红色LED1
//为1.1 LED2开发的WFP:
P1SEL0 &=~BIT0; //为WFP 1.0 选择GPIO
P1SEL1 &=~BIT0;
P1DIR || BIT1;//将WFP 1.0 设置为输出方向
P1OUT |= BIT1; //打开grn LED
IF ((FRAM_ARr[1]== 1)&&(FRAM_ARr[2]== 2))
P1OUT || BIT1;//打开1.1 处的绿色LED指示灯
否则
P1OUT &=~BIT1;//关闭1.1 处的绿色LED
//在WFP 1.3 上设置上升边缘中断:
P1SEL0 &=~BIT3; //为WFP 1.3 选择GPIO
P1SEL1 &=~BIT3; //select1
//P1DIR =0; //全部设置为输入
P1DIR &=~BIT3; //将目录设置为输入(0)
P1REN |=(BIT3); //pullup
P1IES &=~BIT3; //上升边缘0->1.
P1IE |= BIT3; //启用WFP 1.3
P4SEL0 &=~BIT4; //为P4选择GPIO
P4SEL1 &=~BIT4;
P4DIR =0;//将P2设置为输入方向
P4REN = 0; //下拉
//在WFP 5.5 上设置下降边缘中断(按钮2):
P5SEL0 &=~BIT5; //为P5选择GPIO
P5SEL1 &=~BIT5;
P5DIR &=~BIT5; //将dir设置为输入
P5REN |=(BIT5); //pullup仅限位5
P5IES |= BIT5; //下降边缘1->0
P5IE |= BIT5; //启用P5,5
WDTCTL = WDT_MDLY_32;//将看门狗计时器时间间隔设置为~32ms
SFRIE1 || WTIE;//启用WDT中断
P1IE |= BIT3;//启用WFP 1.3 中断
__enable_interrupit();
对于(;;)
{
A=A+1;
}
}
/***************************************************************************
看门狗计时器中断服务例程
***************** /
#pragma vector=WDT_vector
__interrupt void watchdog计时器(void)
{
int i;
IF (wdtCounter == 200) //现在为6秒而不是8秒
{
P1OUT = 0x00;// WFP 1.0 关闭
WdtCounter =0;
//存储FRAM数据:
对于(i=0;i<10;i++)
frm_arr[i]=i;
_BIS_SR (LPM3_Bits + GIE);//输入带中断的LPM3
//enterLPM35();//enter 3.5 L40.w/interrupt
}
否则
{
WdtCounter++;
}
}
/*******************************************************************************
端口1中断服务
***************** /
#pragma vector=Port1_vector
__interrupt void Port_1 (void)
{
wdtCounter =0;//重置看门狗计时器计数器
P1OUT |= 0x01;//打开LED
P1IFG = 0x0;
_BIC_SR (LPM3_EXIT);//从低功率模式唤醒
}
/*******************************************************************************
按钮S2的端口5中断服务例程?
***************** /
#pragma vector=PORT5_vector
__interrupt void Port_5 (void)
{
wdtCounter =0;//重置看门狗计时器计数器
P1OUT |= 0x01;//打开LED
P5IFG = 0x0;
_BIC_SR (LPM3_EXIT);//从低功率模式唤醒
}
/*******************************************************************************
*进入低功率模式3.5
***************** /
Void enterLPM35()
{
//配置按钮S2 (WFP 5.5)中断
// gPIO_selectInterruptEdge (gPIO_PORT_P5,gPIO_PIN5,gPIO_HIGH TO LOW _Transition);
// gPIO_setAsInputPinWithPullUp阻 抗器(GPIO_PORT_P5, gPIO_PIN5);
// gPIO_clearInterrupt (gPIO_PORT_P5,gPIO_PIN5);
// gPIO_enableInterrupt (gPIO_PORT_P5,gPIO_PIN5);
//设备进入时,请求禁用内核电压调节器
// LPM3 (或LPM4),这样我们就可以有效地进入3.5 (或4.5)。
//PMM_turnOffRegulator();
PMMCTL0 &=~BIT4; //关闭电脑控制器
//在启用中断的情况下进入LPM3模式
__bis_sr_register (LPM3_bits + GIE);
//__bis_sr_register (LPM4_bits + GIE);
__no_operation();
}