您的位置:首页 > 其它

CC2530 输入输出配置、中断配置、时钟、串口配置

2017-03-21 13:12 232 查看
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

   

 

  

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: