工具/软件:Code Composer Studio
尊敬的先生:
我一直在测试使用非易失性存储到FRAM的LPM。 休眠模式可以工作,但调试器无法读回存储的正确FRAM值。 示例的操作已记录在案
在main()之上。 代码如下:
//************************************************************************************************
// MSP430G2xx演示- 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,并且将丢失。
程序
设置为在启动时读取fram loc 1和2。 如果这两个位置分别为1和0,则会打开
绿色LED。 这样,您就不必从调试器开始检查fram位置。
//使用3.2ma和.22ma (睡眠)
//必须卸下所有跳线并测量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 long * frm_arr;
/************************************************************************
* 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开机默认高阻抗模式
frm_arr=(unsigned Long*) 0x4000;
//为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 &=~BIT3;//将目录设置为输入(0)
//P1REN |=(BIT3);//pullup
P1IES &=~BIT3;//上升边缘0->1.
//P1IE |= BIT3 //启用WFP 1.3
//在WFP 5.6 上设置下降边缘中断:(未使用)
/*P5SEL0 &=~BIT6;//为WFP 5.6 选择GPIO
P5SEL1 &=~BIT6;
P5DIR &=~BIT6;//将dir设置为输入
P5REN |=(BIT6);//pullup
P5IES |= BIT6;//下降边缘1->0
//P5IE |= 6 l 3//启用P5,6
*/
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数据:
frm_arr=(unsigned long *) 0x4000;
对于(i=0;i<10;i++)
*(frm_arr++)= i;
_BIS_SR (LPM3_Bits + GIE);//输入带中断的LPM3
//enterLPM35();//输入3.5
}
否则
{
WdtCounter++;
}
}
/*******************************************************************************
端口1中断服务
***************** /
#pragma vector=Port1_vector
__interrupt void Port_1 (void)
{
wdtCounter =0;//重置看门狗计时器计数器
P1OUT |= 0x01;//打开LED
P1IFG = 0x0;
_BIC_SR (LPM3_EXIT);//从低功率模式唤醒
}
/*******************************************************************************
按钮S1的端口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);
//___之二_SR_REGISTER (LPM4_BITS + GIE);
__no_operation();
}
谢谢!
John