CC2530红外学习球学码函数(P1.2接红外一体接收头,使用定时器tim1的复用功能2)
2013-09-26 17:33 djky12 阅读(1205) 评论(0) 收藏 举报P1.2GPIO配置:
void cap_gpio_init()
{
P1SEL |= 0x04;
P1DIR &= ~0x04;
PERCFG |= 0x40;
P2SEL |= 0x20;
CLKCONCMD |= 0x28;//设置时钟
asm("NOP");//等待时钟稳定
asm("NOP");
asm("NOP");
}
定时器初始化函数:
void timer1Init(void)
{
T1CCTL0 = 0;
T1CTL &= ~0x0c; //clear register
T1CTL |= 0x00; /* Clock pre-scaled by 8 */
T1CTL &= ~0x03;//clear module bits
T1CTL |= 0x01;//选择定时器1模式,01: 自由运行,从0x0000到0xFFFF反复计数
T1CCTL0 &= ~(0x38);
T1CCTL0 |= 0x03; //r and f all cap,边沿触发方式
T1CCTL0 |= 0x40; //enable cap interrupt
IEN1 |= 0x02; //enable timer1 interrupt
}
void time1Config(void)
{
cap_gpio_init();
timer1Init();
}
void timer1Stop(void)
{
T1CTL &= ~0x03;//选择定时器1模式, 00:暂停运行。
}
void timer1Start(void)
{
T1CTL |= 0x03;//选择定时器1模式,11: 正计数/倒计数,从0x0000到T1CC0反复计数并且从T1CC0倒计数到0x0000。
}
学码中断函数(保存高低电平的时间):
void user_timer1_interrupt(void)
{
unsigned char a,b;
if(T1STAT & 0x01)
{
T1STAT &= ~0x01;
irflag = 1 ;
a = T1CC0H ;
b = T1CC0L ;
rec[signle++] = ((a<<8)|b);
T1CNTH = 0;
T1CNTL = 0;
}
if(T1STAT & 0x20)
{
T1STAT &= ~0x20;
if(irflag == 1)
{
irflag = 0;
rec[signle]=0xffff;
T1CNTH = 0;
T1CNTL = 0;
if(signle >= 20)
flag = 1;
signle = 0;
}
T1STAT &= ~0x01;
}
}
注意事项:1. 在使用学码中断时要打开总中断EA, 2.之前我们把我们timer1Start函数加入到主函数中,那样我们使用的是使用的是正计数/倒计数模式,需要设置T1CC0的值,而且中断学码的数据位数也不对,而自由运行模式来实现学码中断,就能学到正确的数据
浙公网安备 33010602011771号