微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > CC2530串口中断唤醒PM2求救

CC2530串口中断唤醒PM2求救

时间:10-02 整理:3721RD 点击:

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中断

数据格式不正确,是指数据的前面几个字节不正确,后面的正确吗?

还是说整串数据内容都错误了。

你好,在Z-Stack中可以通过串口接收数据唤醒节点的睡眠模式吗?该如何设置呢?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top