当前位置:文档之家› CC2530学习笔记

CC2530学习笔记

// 延时

void delay(uint t)
{
uint i;
for(i=t;i>0;i--);
for(i=t;i>0;i--);
for(i=t;i>0;i--);
for(i=t;i>0;i--);
for(i=t;i>0;i--);
}





// 配置IO口 LED

void init_LED(void)
{
P1DIR |= 0x03;//配置P1.0 P1.1 输入模式
LED1 = 1;
LED2 = 2;
}






// 配置按键中断
void init_interrupt(void)
{
P0INP |= 0x02; //输入模式
P0IEN |= 0x02; //打开P2中断
PICTL |= 0x01; //下降沿触发;
IEN1 = 0x20; //端口0使能
EA = 1; //打开总中断
P0IFG = 0x00; //清除P2中断标志位

}





// 中断程序

#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
if(P0IFG > 0) // 触发中断
{
P0IFG = 0;
delay(50000); //注意这个延时很重要 如果时间短了 会出现按一次中断程序执行了好几次的情况
if(P0IFG == 0) // 按键中断标志
{
delay(50000); //同上
keyboard++;
}
}
P0IF = 0; //清除中断标志
}





// P2口的中断配置


//配置中断
void init_interrupt(void) // 2.0中断有问题
{
IEN2 = 0x02; //P2中断使能
P2IEN |= 0x01; //打开P2中断
PICTL |= 0x08; //下降沿触发;
P2IFG = 0; //清除P2中断标志位
EA = 1; //打开总中断
}





// 中断程序改进 解决按一次时间过长 中断重复多次的情况


#pragma vector = P2INT_VECTOR
__interrupt void P2_ISR(void)
{
EA = 0; //关中断
while( !KEY ); //按键松手
P2IFG = 0 ;
delay(10000);
keyboard++;
P2IF = 0; //清除中断标志
EA = 1;
}




https://www.doczj.com/doc/e414894866.html,/j_evil/blog/static/163211317201161211362979/



https://www.doczj.com/doc/e414894866.html,/link?url=rHnsMru2J4IXSkguiL1_Qc8laPKcemZimeLMHZB8N6XYlYceu3QFLxX8OvJ8zfP7Wla2lA-PdT_bSYftHq1AfRxI0F7UFgT3mZk0NitjF1m



CC2530 常用寄存器





// 配置IO口函数 LED

void init_IO(void)
{
P1DIR = 0x03;
P1_0 = 1;
P1_1 = 1;
}



// 配置定时器 查询IRCON方式

void init_time1(void)
{
T1CTL = 0x0d ; //128分频 0X0000-0XFFFF计数
T1STAT = 0x21 ; //通道0 中断使能
}


//中断格式 定时器中断
#pragma vector = T1_VECTOR
__interrupt void T1(void)



//配置定时器中断程序方式

void init_time1(void)
{
T1CTL = 0x0d ; //128分频 0X0000-0XFFFF计数
T1STAT = 0x21 ; //通道0 中断使能
IEN1 = 0x02; // T1定时器中断使能
EA = 1;
}



// 配置定时器3

// 配置定时器

void init_t3 (void)
{
EA = 1;
IEN1 = 0x08;
TIMIF = 0x01;
T3CTL = 0xf8; // 128分频 自动重装 开中断 开定时器
}



// T3CTL = 0xe0 ; 128分频128/16000000*N=0.5S,N=62500
// T3CTL = 0x08 ; 允许中断
// T3CTL &= ~0x04; 自动重装00->0xff 62500/255=245(次) +启动定时器




for(i=0;i<30;i++)Txdata[i]=' ';
strcpy(Txdata,"HELLO! zigbee!\r\n");
字符串装载函数


// 字符串长度 strl

en ()函数 在头文件string.h下






UART 0 配置函数




/配置系统时钟


void init_CLK(void)
{
CLKCONCMD &= ~0X40; //系统时钟源是32MHZ 10111111
while(CLKCONSTA & 0x40); //等待时钟稳定
CLKCONCMD &= ~0x47; //时钟速度 32M
}


//配置 IO口
void init_io(void)
{
P1DIR = 0x01 ; // P1.0输出
LED1 = 1;
// 配置外设 IO
P0SEL = 0x0c; // P0.2 0.3设置为外设
P2DIR &= ~0xc0; // UART 0优先
}

// 配置波特率

void init_baud(void)
{
U0CSR = 0x80; // 选择URAT模式
U0GCR = 8; //波特率9600
U0BAUD = 59;
UTX0IF = 0; //清除中断标志
}

// 串口发送
void uart_txd(char *p,uchar len)
{
uchar i;
for(i=0;i{
U0DBUF = *p++;
while(UTX0IF == 0); //这里出现过错误 发送结束UTX0IF 会变成1
UTX0IF = 0;
}
}




// 串口接收

U0CSR |= 0x40; //允许接收
IEN0 |= 0x84; //开总中断允许接收中断


收发程序中 发送时候不允许接收

U0CSR &= ~0x40; //关接收
U0CSR |= 0x40; //开接收





//配置睡眠定时器
void init_sleep(void)
{
ST0 = 0x00; //睡眠定时器初始值
ST1 = 0x0f;
ST2 = 0x0f;

STIE = 1; //睡眠定时器中断使能
STIF = 0; //清除中断标志位

EA = 1;
}




//配置电源模式
void sleep_mode(uchar mode)
{
if( (mode == 0x01) |(mode == 0x10) | (mode == 0x11) )
{
SLEEPCMD = mode; //三种供电模式
PCON = 0x01; //进入睡眠定时器
}
else
{
SLEEPCMD &= ~0x01; //返回正常模式
}
}





//配置睡眠定时器ST0 ST1 ST2 睡眠时间
void sleep_time(uint32 miao)
{
uint32 sleep = 0; // 装定值
//先读出来初值
sleep |= ST0; //24位高八位
sleep |= (uint32)ST1 << 8; //24位数据 中八位
sleep |= (uint32)ST2 << 16; //24位低八位
sleep += ( (uint32) miao * (uint32)32768 ); //32K振荡器下 S= *32768

ST2 = (uint8)(sleep >> 16); //24位数据低8位装初值
ST1 = (uint8)(sleep >> 8); //中八位
ST0 = (uint8)sleep; //高八位
}




#pragma vector = ST_VECTOR
__interrupt void ST_IS(void)
{
STIF = 0;
sleep_mode(0x00); //回到正常模式
}








//配置看门狗
void init_god(void)
{
WDCTL = 0x08; //打开看门狗
}


//喂狗
void WD_god(void)
{
WDCTL |=0xa0;
WDCTL |=0x50;
}






相关主题
文本预览
相关文档 最新文档