CC2530中文数据手册
IO口,I就是input,O是output,芯片io口输入是外面信号传输到芯片、输出是芯片内部传输信号到其他器件.
如何配置管脚的输入、输出状态? 参考
以配置LED灯为例,输出怎么配置(三步):
1,需要让P1_0牌普通IO口模式,而不是片上外设的模式 (普通IO口模式,片上外设的模式的区别?)
找到对应的寄存器 P1SEL 的第0位为0
2,让P1_0处于输出状态,非输入状态
找到P1DIR对应的第0位,让它等于1(1为输出,0为输入)
3,P1_0 = 0;//输出低电平,LED点亮
管理所有IO口处于普通IO口,还是算上外设,由P0SEL P1SEL P2SEL来决定
管理所有IO口处于输入状态还是输出状态,由来P0DIR,P1DIR,P2DIR决定
板子上电以后,寄存器的值为0
输入怎么配置?
1,让P0_6处于普通IO口,非片上外设模式
P0_SEL 的第6位为0 ,如:
P0_SEL &= 0xBF //1011 1111
2,让P0_6处于输入状态,非输出状态
P0_DIR &= 0xBF
3,让P0_6处于上拉、下拉或者三态中的一种状态
P0INP、P1INP、P2INP这三个寄存器,分别用于管理三组管脚的上下拉状态
P0INP如果第6位为1,那么P0_6一定是属于三态,如果第6位为1,就是上下模式,具体是上拉还是下拉,由其高三位决定。
P0INP &= 0xBF;//让P0_6处于上下拉模式
P2INP &= 0xDF;//1101 111 让P0处于上拉模式
以上配置完成以后,就可以去读管脚状态:
if(P0_6 = 1)//检测到的高电平
{
}else{//检测到的是低电平
}
外部中断
P0IE、P1IE、P2IE三组寄存器分别用于三组管脚的中断
PICTL寄存器:用于管理上升沿还是下降沿触发
如何所有IO口的中断?
配置流程:
1,初始化IO口工作在普通IO、上拉输入状态
P0SEL &= 0xDF;//PO_5 普通IO
P0DIR &= 0xDF; //PO_5 上拉输入
POINP &= 0xDF;//PO_5 上拉
P2INP &= 0xDF;//上拉
2,首先开IO口组中断
EA = 1;//中断总开关使能 (总开关)
P01E = 1; //第一组中断使能 (组)
P01EN |= 0x20;//把寄存器的第五位设置为1,把组内开关使能 (组内开关)
以上设置3个中断使能,让相应中断开关合上
3,开组内对应的具体某IO口中断
4,上升沿还是下降沿触发
PICTL |= 0x01;//把P0这一组中断配置成下降沿触发
5,开CPU总中断EA=1
中断函数:
#pragma vector = POINT_VECTOR;//这里一定要对,表示P0组的中断一产生,将会进入这个函数
__interrupt void test_fun()//函数名可以随便写
{
//如何判断哪个脚发生了中断?
if(P0IFG &= 0x20) //如果P0IFG中的第五位为1,说明P0组的管脚5(P0_5)发生了中断
{
//延时去抖动
delay();
if(P0IFG &= 0x20){//如果延时了一段时间, 还为低电平,说明确实发生了中断
p1_0 ^=1;//异或操作,如果原先为1,则变为0,如果原先为0,则变为1
}
}
//处理完,一定要清中断 ,清除P0组的中断
P0IFG = 0;
POIF = 0;
}
void delay()
{
int i,j;
for(i = 0;i<1000;i++)
for(j=0;j<30;j++)
}
串口、时钟
1,
CC250正常运行的时候,需要一个高频的时钟信号和一个低频的时钟信号。
高频时钟信号,主要供给CPU,保证程序的运行
低频时钟信号,主要供给看门狗、睡眠定时器等片上外设
2,
高频时钟信号有两个来源:芯片内部的16M RC电路,另外一个是外接一个32M的石英晶振
低频时钟信息也有两个来源:一个是芯片内部的32K RC电路,另外一个是外接的32.768K 的石英晶振
3,
CC2530芯片默认上电的时候,是内部的2个RC电路作为高频和低频的时钟来源。
4,
如果我们在用串口,特别是无线通信的时候,必须要用32M的石英晶振,作为高频时钟来源
在协议栈中,需要从16M切换到32M晶振!!
5,
高频时钟源特点:
2个高频时钟源可以同时起振产生高频时钟信号
而2个低频时钟源,某一时刻只能有一个时钟源起振,并且起振的这个时钟源供给CC2530
系统高频时钟源切换的步骤:
1,让2个高频时钟源起振
2,等待目标时钟源振荡稳定
3,延时一小段时间63us
4,不分频输出
5,选中目标高频时钟源作为系统主时钟
6,确认一下当前工作的系统时钟是不是所选的高频时钟,涉及的寄存器:SLEEPCMD SLEEPSTA CLKCONCMD CLKCONSTA
Chipcon 公司,推出了CC2430/1,TI将其收购,发展出了CC2530
1,让SLEEPCMD的第2位为0
2,SLEPPSIA寄存器的第6位为1表示时钟源稳定
3,超过63us延时
4,不分频输出:把寄存器CLKCONCMD第三位设置成000
5,把寄存器CLKCONCMD的第六位清0,设置32M做为系统的主时钟
6,读寄存器CLKCONSTA的第六位为0,表示当前32M的时钟源已经做为了当前的系统主时钟,程序可以向下运行了
串口:
CC2530有两个串口,且每个串口都可以配置选择控制脚
串口配置步骤:
1,指定串口的IO位置
2,相应IO配置成片上外设功能
3,8个数据位,一个停止位,无流控,无校验确立
4,波特率
5,开CPU中断,对应串口接收中断
//如,串口0的配置
void Uart0Cfg()
{
PERCFG &= ~0x01;//把这个寄存器第0位清0,选择的备用位置1 (即指定IO位置)
POSEL |= 0x0c; //配置P0_2,P0_3为片上外设
U0CSR |= 0xC0;//8个数据位,一个停止位,无流控,无校验确立
//波特率
U0GCR |= 11;
U0BAUD = 216;//波特率 11520,看手册
//开中断
URX01E = 1;//串口接收中断
EA = 1;//CPU总中断
}
//串口的中断处理函数
#pragma vector = URX0_VECTOR //这里不能写错
__interrupt void URX0_ISR(void)
{
char ch;
URX0IF = 0;//一旦有数据寄存器的这个位为1,在程序里要将其变为0
ch = UR0BUF;//读接收寄存器的数据
U0DBUF = ch;//通过U0DBUF寄存器,将接收到数据送出(发出去, U0DBUF为发送寄存器)
while(UTX0IF == 0)//如果UTX0IF=0说明没有发出去,如果为1,说明已经发出去了
UTX0IF = 0;//发起去以后,将UTX0IF位清0
}
注意:晶振一定要32M