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



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






   




 
  
  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值