本人正在做基于MSP430的低功耗项目,配合CC1101无线模块。CC1101通过IO口模拟跟CPU连接。为了降低功耗,通过无线模块接收到数据,触发CPU的外部中断来唤醒CPU
现在遇到的问题是,通过IAR调试查看寄存器状态看到 CPUOFF=1,SCG0=1,SCG1=1, OscOFF=0,手册上说前三者为1的时候即使LPM3模式,但是实际测得系统在休眠状态的电流15mA,判断并未真正进入低功耗,反而发现当数据发送完毕刹那检测到系统电流是1mA,不知道问题出在哪里。附上程序:
main()
{
INT8U i, Dataleng = 7; // 8字节
unsigned char chksum; //CRC校验和
WDTCTL = WDTPW + WDTHOLD; //禁止看门狗
InitSys();
halSpiInit();
InitTimeA();
_EINT(); //打开总中断
P3OUT |=(BIT4+BIT5+BIT6+BIT7);
ReadClientAddress(); //确定下位机地址编码
TestBuf[0]=ClientAddress;
RF1100_IO_set(); //CC1101初始化
SysTmie = 0;
while(SysTmie < 10);
POWER_UP_RESET_CC1100();
SysTmie = 0;
while(SysTmie < 50);
halRfWriteRfSettings();
halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8);
setRxMode();
while(1)
{ SysTmie = 0;
switch(DeviceStep)
{
case 0: { //步骤0,数据接收
if(halRfReceivePacket(RxBuf,&Dataleng)) { //判断是否接收到数据
DeviceStep = 1;}
break; }
case 1: { //步骤1,数据校验
if(RxBuf[2]==ClientAddress){ // 判断指令地址和药框号是否匹配
GreenLedTwinkle(2);
DeviceStep = 2; } //指令地址和药框号匹配,顺序进入下个步骤
else {
DeviceStep = 0;}
break; }
case 2: { //步骤2,数据处理,闪灯
for(i=0;i<7;i++) {
TxBuf[i] = RxBuf[i]; } //填充数据
if(RxBuf[5]==0xC0||RxBuf[5]==0xC8)
{ GreenLedTwinkle(16); } //需要保留
if(RxBuf[5]==0x40||RxBuf[5]==0x48)
{
RedLedTwinkle(16); } //需要保留
DeviceStep = 3;
break; }
case 3: { //步骤3,数据回传
Delay_1ms(5);//延迟
halRfSendPacket(TxBuf,7);
DeviceStep = 4;
setRxMode();
CC1101_InitWOR(2200);
break; }
case 4: { //步骤4,进入低功耗模式
P2SEL &=~ BIT5; //选择P2.5口 // GDO2(P2.5) 配置P2.5口接收中断来唤醒MCU
P2DIR &=~ BIT5; //配置P2.5口为输入
P2IES |= BIT5; //下降沿触发
P2IE |= BIT5; //P2.5中断使能
P2IFG &= ~BIT5; //中断标志位清零
GreenLedTwinkle(16); //进入低功耗模式前绿灯闪烁提示
_BIS_SR(LPM3_bits + GIE); //MCU进入LPM3低功耗模式
DeviceStep = 0;
break; }
}
while(SysTmie < 15);
}
}
//===============================GDO0中断唤醒MCU=============================//
#pragma vector = PORT2_VECTOR
__interrupt void GDO_2()
{
if(P2IFG&BIT5) { //如果P2.5口触发中断
_DINT(); // 关闭中断响应
LPM3_EXIT;
DeviceStep = 0;
}
P2IFG &= ~BIT5; //清除P2.5引脚中断标志位
SysTmie = 0;
_EINT();
}
void InitTimeA(void) // Timer_A初始化
{
CCR0 = 500; // 需要延时的时间 CCR0为TACCR0
TACTL |= TASSEL_2 + ID_3 + TAIE; // Timer_A的时钟源为SMCLK,8分频(对于定时器的设置还有待考虑 2015-03-22 21:44)
TACTL |= MC_1; // Timer_A定时模式选择UP,定时器从0递增到TACCR0的值后触发中断,然后重新从0递增
}
#pragma vector=TIMERA1_VECTOR // 定时器A中断处理函数
__interrupt void Intimer_A(void)
{
TACTL &= ~BIT0; // 清除中断标志位
SysTmie++;
}
灰小子:
未使用的io你是如何设置的?
可以参考这个帖子e2echina.ti.com/…/24347
Susan Yang:
建议您将MSP430和CC1101分开来进行测试。单独使用MSP430的时候是否可以正常进入LPM3?