CC2530串口中断唤醒PM2求救
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中可以通过串口接收数据唤醒节点的睡眠模式吗?该如何设置呢?
