Zigbee学习
记录学习过程中的一些想法,硬件设备和学习资料均来自安联德(淘宝)
一、外部中断
1.代码
初始化触发函数,设置第0端口中断使能,设置中断触发类型,允许第0端口中断,初始化中断标志位,打开总中断。
void InitKey()
{
P0IEN |= 0x2; // P0.1 设置为中断方式 1:中断使能
PICTL |= 0x1; //下降沿触发
IEN1 |= 0x20; //允许P0口中断;
P0IFG = 0x00; //初始化中断标志位
EA = 1; //打开总中断
}
2.CC2530中断知识
CC2530 具有18 个中断源,每个中断源都由各自的一系列特殊功能寄存器来进行控制。可以编程设置相关特殊功能寄存器,设置18 个中断源的优先级以及使能中断申请响应等。
18种中断类型及使能:
寄存器
3.中断函数
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
DelayMS(10); //延时去抖
LED1 = ~LED1; //改变LED1状态
P0IFG = 0; //清中断标志
P0IF = 0; //清中断标志
}
- #pragma vector = <中断向量>
- _ _interrupt void 中断函数(void)
中断向量常有两种方式,一种是写中断服务函数入口地址,一种是写CC2530中中断函数的宏定义。
中断函数名任意起,在中断函数中要清空中断标注位,不然中断持续执行
if(P0IFG > 0) //按键中断
{
DelayMS(10); //延时去抖
if(P0IFG > 0) //按键中断
{
KeyValue = 1; //产生中断保存中断状态
}
}
在采用中断的方式,通过按键控制流水灯的实验中,中断函数中使用两个if语句进行延时防抖。
二、定时器
定时器基本原理:对内部时钟信号或外部输入信号进行计数,当计数值达到设定要求时,向CPU提出中断处理请求,从而实现定时或者计数功能的外设。
1.定时器1
定时器1是一个个独立的16 位定时器,支持典型的定时/计数功能,比如输入捕获,输出比较和PWM 功能。定时器有五个独立的捕获/比较通道。每个通道定时器使用一个I/O 引脚。定时器用于范围广泛的控制和测量应用,可用的五个通道的正计数/倒计数模式将允许诸如电机控制应用的实现。
计数器可以作为一个自由运行计数器,一个模计数器或一个正计数/倒计数器运行
- 自由运行模式:在自由运行操作模式下,计数器从0x0000 开始,每个活动时钟边沿增加1。当计数器达到0xFFFF(溢出),计数器载入0x0000,继续递增它的值。当达到最终计数值0xFFFF,设置标志IRCON.T1IF 和T1STAT.OVFIF。如果设置了相应的中断屏蔽位TIMIF.OVFIM 以及IEN1.T1EN,将产生一个中断请求。
- 模模式:当定时器运行在模模式,16 位计数器从0x0000 开始,每个活动时钟边沿增加1。当计数器达到T1CC0(溢出),寄存器T1CC0H:T1CC0L 保存的最终计数值,计数器将复位到0x0000,并继续递增。如果定时器开始于T1CC0 以上的一个值,当达到最终计数值(0xFFFF)时,设置标志IRCON.T1IF 和T1CTL.OVFIF。如果设置了相应的中断屏蔽位TIMIF.OVFIM 以及IEN1.T1EN,将产生一个中断请求。模模式可以用于周期不是0xFFFF的应用程序。
- 正计数/倒计数模式:在正计数/倒计数模式,计数器反复从0x0000 开始,正计数直到达到T1CC0H:T1CC0L 保存的值。然后计数器将倒计数直到0x0000,
- 对应的程序代码
void InitT1()
{
T1CTL = 0x0d; //128分频,自动运行 0x0000-0xFFFF
T1STAT= 0x21; //通道0,中断有效
}
- 代码表
2.定时器3
定时器3只有8位,0xFF,最大计数为255。
- 初始化
void InitT3()
{
T3IE = 1; //开总中断和T3中断
//高4位
T3CTL |= 0xE0; //128分频,128/16000000*N=0.5S,N=62500
T3CTL |= 0x10; //启动
//低4位
T3CTL &= ~0x03; //自动重装 00->0xff 62500/255=245(次)
T3CTL |= 0x08 ; //开溢出中断
EA = 1; //开总中断
}
- 代码表