ZigBee快速入门02

ZigBee无线模块基本工作电路

TI示范CC2530应用电路

zg1

  • DIE ATTACH PAD—接地
  • XOSC_Q1、XOSC_Q2—接晶振,为CPU提供32MHz高频时钟源
  • RF_N、RF_P—无线信号收发
  • C401—去耦电容
  • R301—偏置电阻
  • P2_3、P2_4—可选,提供32.768KHz低频时钟源(主要为睡眠定时器、看门狗使用)

ZigBee无线模块电路

增设复位电路,复位键按下产生超过1us的低电平
zg2
增设JTAG下载电路
zg3

GPIO设置

IO相关寄存器

  • CC2530只具备QFN40封装
  • 工作范围:2~3.6V(推荐选3.3V)
  • 21个通用IO口,其中21个分为3组P0/P1/P2
  • 21个端口都可以作为普通IO或片上外设控制

以配置P1_0为输出为例:

P1SEL &= 0xFE; //让P1_0处于普通IO模式
P1DIR |= 0x01; //让P1_0处于输出状态
P1_0 = 1; //将P1_0电平拉高

IO口配置相关寄存器
PxSELPxDIRPxINP3种寄存器,x=0,1,2,复位默认都是0
PxSEL寄存器作用:有8位,每一位对应一个IO口,0表示普通IO口,1表示片上外设

PxSEL寄存器位,x=0,176543210
Px对应IO口的位Px_7Px_6Px_5Px_4Px_3Px_2Px_1Px_0

P2组只有5个口,P2_1和P2_2用于下载程序用,不需配置

P2SEL寄存器位76543210
P2对应IO口的位P2_4P2_3P2_0

PxDIR寄存器作用:有8位,每一位对应一个IO口,0表示输入,1表示输出

PxDIR寄存器位,x=0,176543210
Px对应IO口的位Px_7Px_6Px_5Px_4Px_3Px_2Px_1Px_0

P2组只有5个口,后面的位不用管

P2DIR寄存器位76543210
P2对应IO口的位P2_4P2_3P2_2P2_1P2_0

PxINP寄存器作用:在输入的时候,有8位,每一位对应一个IO口,决定它是上下拉模式还是三态,0表示上下拉模式,1表示三态

PxINP寄存器位,x=0,176543210
Px对应IO口的位Px_7Px_6Px_5Px_4Px_3Px_2Px_1Px_0

P2组只有5个口,后面的三位决定在配置为上下拉模式时,组为上拉/下拉,0表示上拉,1表示下拉

P2INP寄存器位76543210
P2对应IO口的位P2组P1组P0组P2_4P2_3P2_2P2_1P2_0

三个端口寄存器

BitResetR/W
P07:00xFFR/W
P17:00xFFR/W
P24:00xFFR/W

基础按键实验

按键KEY1(P0_0)控制LED1(P1_0)亮/灭

#include <iocc2530.h>
#define uint unsigned int 

void Delayms(uint xms){
	  uint i,j;
	  for(i=xms;i>0;i--)
	    for(j=587;j>0;j--);
}

int main()
{
	  P1SEL &= 0xFE; //P1_0普通IO 1111 1110
	  P1DIR |= 0x01; //输出 0000 0001
	  P1_0 = 0;
	  
	  P0SEL &= 0xFE; //P0_0 1111 1110
	  P0DIR &= 0xFE; //输入 1111 1110
	  P0INP &= 0xFE; //上下拉模式 1111 1110
	  P2INP &= 0xDF; //P0_0上拉1101 1111
  
	  //按键轮询
	  while(1){
	    if(P0_0 == 0){
	       Delayms(10); //防抖
	       if(P0_0 == 0){
	         while(!P0_0); //松手检测
	         P1_0 = ~P1_0; //电平翻转
	       } 
	    }
	  }
}

外部中断配置

中断总览

zg4

配置流程

  1. 初始化IO工作在普通IO、上拉输入状态
  2. 首先开IO口组中断
  3. 开组内对应的某具体IO口中断
  4. 上升沿还是下降沿触发
  5. 开CPU总中断EA=1

IO中断寄存器

组配置IEN0寄存器相关位:EA

IEN0寄存器76543210
名称EA-STIEENCIEUR1XIEURX0IEADCIERFERRIE

组配置IEN1寄存器相关位:P0IE

IEN1寄存器76543210
名称--P0IET4IET3IET2IET1IEDMAIE

组配置IEN2寄存器相关位:P1IEP2IE(由于寄存器地址不是0/8结尾,这里不能直接操作P1IEP2IE)

IEN2寄存器76543210
名称--WDTIEP1IEUT1XIEUTX0IEP2IERFIE

组内配置寄存器P0IEN

BItNameResetR/W
7:0P0_[7:0]IEN0x00R/W

组内配置寄存器P1IEN

BItNameResetR/W
7:0P1_[7:0]IEN0x00R/W

组内配置寄存器P2IEN

BItNameResetR/W
7:6-00R/W
5DPIEN0R/W
4:0P2_[4:0]IEN00000R/W

组中断控制寄存器PICTL:0代表上升沿触发,1代表下降沿触发

PICTL寄存器76543210
控制端口I/O驱动能力---P2_0~P0_4P1_4~P1_7P1_0~P1_3P0_0~P0_7

中断标志寄存器IRCON相关位:P0IF

IRCON寄存器76543210
名称STIF-P0IFT4IFT3IFT2IFT1IFDMAIF

中断标志寄存器IRCON相关位:P1IFP2IF

IRCON寄存器76543210
名称---WDTIFP1IFUTX1IFUTX0IFP2IF

按键中断处理示例

按键KEY1(P0_0)控制LED1(P1_0)亮/灭

#include <IOCC2530.h>

void delay(){
    int i, j;
    for(i=0;i<1000;i++)
        for(j=0;j<30;j++);
}

int main()
{
    //P0_0配置
    P0SEL &= 0xFE; //1111 1110
    P0DIR &= 0xFE; //1111 1110
    P0INP &= 0xFE; //1111 1110
    P2INP &= 0xDF; //1101 1111 上拉

    //中断寄存器配置
    EA = 1;
    P0IE = 1;
    P0IEN |= 0x01; //0000 0001

    PICTL |= 0x01; //0000 0001 P0组下降沿触发
    
    //P1_0配置
    P1DIR |= 0x01;
    P1_0 = 0;
    while(1);
}

//进入按键中断
#pragma vector=P0INT_VECTOR
__interrupt void P0_ISR(){
    if(P0IFG &= 0x01){ //0000 0001
        //P0组第一位发生外部中断        
        delay();
        if(P0_0 == 0){
             P1_0 ^= 1;
        }
    }
    P0IFG = 0;
    P0IF = 0;
}

中断函数模板

#pragma vector=PxINT_VECTOR
__interrupt void fun(){
	//
	//中断响应,处理事件
	//
    P0IFG = 0;
    P0IF = 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值