自学Zigbee第三天

Zigbee自学

记录学习过程中的一些想法,硬件设备和学习资料均来自安联德(淘宝)



一、串口通讯

CC2530有两个串行通讯接口USART0和USART1,对应的引脚位置分别为:
位置1:RX0----P0_2 TX0----P0_3
位置2:RX0----P1_4 TX0----P1_5

位置1:RX1----P0_5 TX1----P0_4
位置2:RX1----P1_7 TX1----P1_6
通过PERCFG寄存器设置对应引脚的位置。

1.串口输入

串口设置:

void InitUart(void)
{ 
    PERCFG = 0x00;           //外设控制寄存器 USART 0的IO位置:0为P0口位置1 
    P0SEL = 0x0c;            //P0_2,P0_3用作串口(外设功能)
    P2DIR &= ~0XC0;          //P0优先作为UART0
    
    U0CSR |= 0x80;           //设置为UART方式
    U0GCR |= 11;				       
    U0BAUD |= 216;           //波特率设为115200
    UTX0IF = 0;              //UART0 TX中断标志初始置位0
}
  • PERCFG:选择端口及端口的位置
  • P0SEL:根据选择的端口位置设置引脚
  • P2DIR:选择中断优先级
  • U0CSR:串口0控制
  • U0GCR和U0BAUD为波特率控制

在这里插入图片描述

主函数:

void main(void)
{	
    CLKCONCMD &= ~0x40;               //设置位OSC,系统时钟源为32MHZ晶振,
    while(CLKCONSTA & 0x40);          //等待晶振稳定为32M
    CLKCONCMD &= ~0x47;               //设置系统时钟速度,系统主时钟频率为32MHZ   
      
    InitUart();                       //调置串口相关寄存器
    memset(TxData, 0, TX_SIZE);       //数据清0
    memcpy(TxData, TX_STRING, sizeof(TX_STRING)); //复制发送字符串到TxData
        
    while(1)
    {
        UartSendString(TxData, sizeof(TX_STRING)); //串口发送数据
        DelayMS(1000);                 //延时
    }
}

2.收发字符串

串口设置:

void InitUart(void)
{ 
    PERCFG = 0x00;           //外设控制寄存器 USART 0的IO位置:0为P0口位置1 
    P0SEL = 0x0c;            //P0_2,P0_3用作串口(外设功能)
    P2DIR &= ~0xC0;          //P0优先作为UART0
    
    U0CSR |= 0x80;           //设置为UART方式
    U0GCR |= 11;				       
    U0BAUD |= 216;           //波特率设为115200
    UTX0IF = 0;              //UART0 TX中断标志初始置位0
    U0CSR |= 0x40;           //允许接收 
    IEN0 |= 0x84;            //开总中断允许接收中断  
}

增加了串口接受使能U0CSR与中断使能IEN0。

  • 主函数
void main(void)
{	
    CLKCONCMD &= ~0x40;                        //设置系统时钟源为32MHZ晶振
    while(CLKCONSTA & 0x40);                   //等待晶振稳定为32M
    CLKCONCMD &= ~0x47;                        //设置系统主时钟频率为32MHZ   
   
    InitUart();                                //调用串口初始化函数   
    UartState = UART0_RX;                      //串口0默认处于接收模式
    memset(RxData, 0, SIZE);
    
    while(1)
    {
        if(UartState == UART0_RX)              //接收状态 
        { 
            if(RxBuf != 0) 
            {                 
                if((RxBuf != '#')&&(count < 50))//以'#'为结束符,一次最多接收50个字符            
                    RxData[count++] = RxBuf; 
                else
                {
                    if(count >= 50)             //判断数据合法性,防止溢出
                    {
                        count = 0;              //计数清0
                        memset(RxData, 0, SIZE);//清空接收缓冲区
                    }
                    else
                        UartState = UART0_TX;  //进入发送状态 
                }
                RxBuf  = 0;
            }
        }
        
        if(UartState == UART0_TX)              //发送状态 
        {                         
            U0CSR &= ~0x40;                    //禁止接收 
            UartSendString(RxData, count);     //发送已记录的字符串。
            U0CSR |= 0x40;                     //允许接收 
            UartState = UART0_RX;              //恢复到接收状态 
            count = 0;                         //计数清0
            memset(RxData, 0, SIZE);           //清空接收缓冲区
        }    
    }
}
  • char 是有符号的, uchar(unsigned char)是无符号的。
  • memset()函数原型是:extern void *memset(void *buffer, int c, int count)
    buffer:为指针或是数组, c:是赋给buffer的值,count:是赋予值的长度
  • 注意char 0 与 int 0 区别

中断程序:

__interrupt void UART0_ISR(void) 
{ 
    URX0IF = 0;       // 清中断标志 
    RxBuf = U0DBUF;                           
}
  • 将接受到的数据保存到RxBuf中

串口发送程序:

void UartSendString(char *Data, int len)
{
    uint i;
    
    for(i=0; i<len; i++)
    {
        U0DBUF = *Data++;
        while(UTX0IF == 0);
        UTX0IF = 0;
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值