This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC2530串口中断唤醒PM2求救

Other Parts Discussed in Thread: Z-STACK

RFID 进入PM2模式前将RX设置成GPIO ,休眠唤醒后继续设置成RX可以唤醒但是数据格式不正确 ,求教

#include <hal_board.h>
#include <hal_int.h>
#include "hal_rf.h"
#include "basic_rf.h"
#include "ioCC2530.h"
#include "stdlib.h"   //该文件声明了随机数函数rand(),随机数种子初始化函数srand() 
//#include "adxl345.h"
#include "clock.h"    //随眠定时器使用到
#include "timer.h"
#include "button.h"
#include "adc.h"
#include "random.h"
#include "crc.h"
//#include "ADXL362.h"
#include <string.h>
#include <stdio.h>

#define RF_CHANNEL              20    // 2.4 GHz RF channel  //信道选择

// BasicRF address definitions
#define PAN_ID                0x2007
#define SWITCH_ADDR           0x2520
#define LIGHT_ADDR            0xBEEF
#define APP_PAYLOAD_LENGTH        15  //数据长度
#define SEND_LENGTH               15
#define AlarmF                    0x04
#define tamperF                   0x02
#define VDD_MIN_VALUE             0x5E  //最小电源电压2.55v
/***************************用户可修改数据*************************************/

#define ACT_RANGE                 0x50  //加速度计中断阀值设置(0x00~0x1FF),范围:16g
#define SleepTime                1    //2530睡眠时间
#define PROPERTY                  0x01   //标签性质 
/******************************************************************************/
typedef unsigned char uchar;
typedef unsigned int  uint;
typedef unsigned long  ulong;
#define temper_flag  P1_6  
#define SIZE       10
uchar Alarm_num=0;
static basicRfCfg_t basicRfConfig;
static void appSwitch();  //函数引用的不同形式 static函数为静态 不为外部所使用
                         //extern 与static恰恰相反
/*****************************定位使用数据*************************************/
uchar pTxData[APP_PAYLOAD_LENGTH];        //定位数组

//uchar Data_TEMP[6];
uint  AXES_X,AXES_Y,AXES_Z;
static uint16 Vcc_Value = 0x00;
uint8 temperCounts = 0;


char ACC_xyz_pre[3] = {0};  //上次加速度绝对值
char ACC_xyz_1[3] = {0};
char ACC_xyz[3] = {0}; //本次加速度绝对值
char ACC_xyz_char[3] = {0};
char XYZ=2;//加速度测震动阀值


char RxBuf0[SIZE];
char RxBufCount0=0;
char RxBuf1[SIZE];
char RxBufCount1=0;
unsigned int  TIME3Count=0;
unsigned int  TIME4Count=0;
uchar RxComplete=0;
uchar LoclCommand=0; 
char *ptr=NULL;
char LocalPtr[30];
uchar SleepCount=0;
uchar volatile MySleepFlag =1;
uchar Time4Flag =0;
#define KEY1 P1_4
#define KEY2 P1_5
int PORT=1111;
int ip[4]={123,57,41,13};
char * CONNETCMD =NULL;

uchar GU906_Flag =1;//  0为要开机 1为已经开机 2为要关机 3 已经关机
/******************************************************************************/
#define ID                       0x6666//标签ID号

void DelayMS(uint msec)
    uint i,j;
    
    for (i=0; i<msec; i++)    
        for (j=0; j<1070; j++);
}  
void InitUart1(void)
    PERCFG |= 0x02;           //外设控制寄存器 USART 0 的IO位置:0为P0口位置1 
    P1SEL |= (1<<6);            
    P1SEL |= (1<<7);            //P1_6,P1_7用作串口(外设功能)
    P2SEL |=0X20;
   // P2DIR &= ~0xC0;          //P0优先作为UART0
    
    U1CSR |= 0x80;           //设置为UART方式
    U1GCR |= 11;       
    U1BAUD |= 216;           //波特率设为115200
    UTX1IF = 0;              //UART0 TX中断标志初始置位0
    U1CSR |= 0x40;           //允许接收  
       
}
void hal_sleep(unsigned int sleep_timer)
{
  halIntState_t intState, ien0,ien1,ien2;
  HAL_ENTER_CRITICAL_SECTION(intState);
  RFST =0xEF;
  clockSetMainSrc(CLOCK_SRC_HFRC);
  addToSleepTimer(sleep_timer);
  HAL_SLEEP_TIMER_CLEAR_INT();
  HAL_SLEEP_TIMER_ENABLE_INT();
  HAL_SLEEP_IE_BACKUP_AND_DISABLE(ien0, ien1, ien2);
  HAL_EXIT_CRITICAL_SECTION(intState);
  HAL_ENABLE_INTERRUPTS();
  //休眠前设置成普通IO
  P1SEL &= ~(1<<7);     //设置P1.7为普通IO口  
  P1DIR &= ~(1<<7);     //p1_7设置为输入
  P1IEN |= (1<<7); //开P1_7的IO中断使能
  IEN2 |= (1<<4);    //P1中断
  PICTL |= (1<<2);
  halMcuSetLowPowerMode(2);
  HAL_ENTER_CRITICAL_SECTION(intState);
  HAL_SLEEP_IE_RESTORE(ien0, ien1, ien2);
  HAL_SLEEP_TIMER_DISABLE_INT();
  clockSetMainSrc(CLOCK_SRC_XOSC);
  HAL_EXIT_CRITICAL_SECTION(intState);
}

unsigned char scaleValue(void)//检测供电电压
{
  unsigned char value;
  unsigned int adc_value=0;
  for(unsigned char i=4; i>0; i--)
  {
    ADCCON1 &= ~0x80;
    //使用1.25V内部电压 ADC_REF_1_25_V,7位分辨率 ADC_7_BIT,外部通道为:电源电量 ADC_VDD_3
    ADC_SINGLE_CONVERSION(ADC_REF_1_25_V | ADC_7_BIT | ADC_VDD_3);
    ADC_SAMPLE_SINGLE();
    while(!(ADCCON1 & 0x80));    
    value = ADCH;
    adc_value += value;
  }
  value = adc_value >>2 ;
  return (uint8)value;
  
}

void delay_ms(unsigned int t)
{
  unsigned char i;
  while(t--)
  {
    for(i=0;i<255;i++);
  }
}
void InitUart0(void)
    PERCFG = 0x00;           //外设控制寄存器 USART 0的IO位置:0为P0口位置1 
    P0SEL = 0x0c;            //P0_2,P0_3用作串口(外设功能)
    P2DIR &= ~0xC0;          //P0优先作为UART0
    
    U0CSR |= 0x80;           //设置为UART方式
    U0GCR |= 11;       
    U0BAUD |= 216;           //波特率设为115200
    UTX0IF = 0;              //UART0 TX中断标志初始置位0
    U0CSR |= 0x40;           //允许接收 
    IEN0 |=(1<<2);            //UART0允许接收中断 
    IEN0 |=(1<<3);            //UART1允许接收中断 
}
/****************************************************************************
* 名    称: InitUart1()
* 功    能: 串口1初始化函数
* 入口参数: 无
* 出口参数: 无
****************************************************************************/


/****************************************************************************
* 名    称: Uart0SendString()
* 功    能: 串口发送函数
* 入口参数: Data:发送缓冲区   len:发送长度
* 出口参数: 无
****************************************************************************/
void Uart0SendString(char *Data, int len)
{
    uint i;
    
    for(i=0; i<len; i++)
    {
        U0DBUF = *Data++;
        while(UTX0IF == 0);
        UTX0IF = 0;
    }
}

void Uart0Data(uchar data)
{
U0DBUF=data;
while(UTX0IF == 0);//等待发送完成信号(TI=1)出现
UTX0IF = 0;
}


/****************************************************************************
* 名    称: Uart0SendString()
* 功    能: 串口发送函数
* 入口参数: Data:发送缓冲区   len:发送长度
* 出口参数: 无
****************************************************************************/
void Uart1SendString(char *Data, int len)
{
    uint i;
    
    for(i=0; i<len; i++)
    {
        U1DBUF = *Data++;
        while(UTX1IF == 0);
        UTX1IF = 0;
    }
}


    
void temperTest(void)
{
  P2INP &= ~0x40;//设置为上拉 
  halMcuWaitUs(10);
  if(temper_flag)//防拆报警
  {
    if(!(pTxData[6] & 0x02))
    {
      temperCounts++;
      pTxData[8] = temperCounts;
    }
    pTxData[6] |= 0x02;  
    P1IEN |= 0x40;   //回路闭合关闭闭合中断
  }
  else
  {
    pTxData[6] &= ~0x02;
    P2INP |= 0x40;//设置为下拉 
  }
}
static void appSwitch()
{
  unsigned int CRC;
 // static uint8 Random_num = (uint8)ID;
  basicRfConfig.myAddr = SWITCH_ADDR;
  basicRfInit(&basicRfConfig);
  basicRfReceiveOff();
 
  halIntOn();
  halIntSleep();
 
  pTxData[0]   = 0xFF;
  pTxData[1]   = SEND_LENGTH;
  pTxData[2]   = PROPERTY;    //标签性质 01
  pTxData[3]   = (ID >> 8);
  pTxData[4]   = (uint8)ID;
  pTxData[5]   = SleepTime;
  pTxData[6]   = 0x00;//报警   正常为00 
  pTxData[7]   = 0x00;//电压   正常为00
  pTxData[8]   = temperCounts;//破拆次数
  pTxData[9]  = 0x00;
  pTxData[10] = 0x00;
  pTxData[11] = 0x00;
  pTxData[12]   = 0x00;//CRC1
  pTxData[13]  = 0x00;//CRC0
  pTxData[14]  = 0xEE;
  
  
  while (1)
  {
   
      if((Vcc_Value == 0x00) || (Vcc_Value == 1800)) //每隔1800s采集一次电压
      {
        Vcc_Value =scaleValue();
        pTxData[7] = Vcc_Value;
        if(Vcc_Value>=VDD_MIN_VALUE)
          pTxData[6] &= ~0x01;
        else 
          pTxData[6] |= 0x01;
        Vcc_Value = 0;
      }
      Vcc_Value++;
    
      CRC = crc16(&pTxData[1],pTxData[1]-4);
      pTxData[12] = (uint8)CRC;
      pTxData[13] = (uint8)(CRC>>8);
     
      basicRfSendPacket(LIGHT_ADDR, pTxData,SEND_LENGTH);//射频发送数据
      hal_sleep(1);
      Uart1SendString(RxBuf1,sizeof(RxBuf1));
      //FeetDog();   
     //Random_num = RandomByte();
     //halMcuWaitUs(Random_num);         //随机数延迟
    
  }        
}

void main(void)
{
    
   EA = 0;
   //halMcuReset();
  basicRfConfig.panId = PAN_ID;
  basicRfConfig.channel = RF_CHANNEL;
  basicRfConfig.ackRequest = FALSE;
  
#ifdef SECURITY_CCM
  basicRfConfig.securityKey = key;
#endif
  
  halBoardInit();
  halRfInit();
  InitRandom();
  InitUart0();
  InitUart1(); 
  Uart1SendString("uart1 ok\r\n",sizeof("uart1 ok\r\n"));
  RxBufCount0=0;
  appSwitch();
}


/****************************************************************************/
#pragma vector = URX1_VECTOR 
__interrupt void UART1_ISR(void) 
    URX1IF = 0;       // 清中断标志 
    RxBuf1[RxBufCount1++] = U1DBUF;                           
}
/****************************************************************************
* 名    称: UART0_ISR(void) 串口中断处理函数 
* 描    述: 当串口0产生接收中断,将收到的数据保存在RxBuf中
****************************************************************************/
#pragma vector = URX0_VECTOR 
__interrupt void UART0_ISR(void) 
    URX0IF = 0;       // 清串口中断标志 
    RxBuf0[RxBufCount0++] = U0DBUF;   
}

#pragma vector = ST_VECTOR 
__interrupt void ST_ISR(void) 
    STIF = 0;          //清标志位
       
#pragma vector = P1INT_VECTOR    
__interrupt void P1_ISR(void) 
    
     P1IFG=0;
     P1IF = 0;
     PERCFG |= 0x02;                   
     P1SEL |= (1<<7);           
     P2SEL |=0X20;
     P1IEN &= ~(1<<7); //关闭P1_7的IO中断使能
     IEN2 &= ~(1<<4);    //P1中断