【ZIGBEE(CC2530)学习】8-CC2530基础实验——UART配置


在这里插入图片描述

一、实验介绍

  UART 模式提供异步串行接口。在UART模式中,接口使用2线或者含有引脚RXD、TXD、可选RTS和CTS的4线。UART模式的操作具有下列特点:

  1. 8位或者9位负载数据;
  2. 奇校验、偶校验或者无奇偶校验;
  3. 配置起始位和停止位电平;
  4. 配置LSB 或者MSB 首先传送;
  5. 独立收发中断;
  6. 独立收发DMA 触发;
  7. 奇偶校验和帧校验出错状态。

二、实验目的

  1. 通过本实验了解CC2530 的串口寄存器的配置;
  2. 通过本实验了解CC2530的串口功能的运用。

三、实验设备

3.1、硬件设备

  1. ZIGBEE开发板
  2. SmartRF04EB仿真器
  3. Micro-USB数据线

3.2、软件环境

  1. IAR Embedded Workbench for 8051集成开发环境
  2. 串口调试助手
  3. CH41SER

四、实验原理

4.1、UART模式

  当UxCSR寄存器的第7位配置为1时,USART设置为UART模式。
  UART 模式提供全双工传送,接收器中的位同步不影响发送功能。传送一个UART 字节包含1 个起始位、8个数据位、1 个作为可选项的第9 位数据或者奇偶校验位再加上1 个或2 个停止位。注意,虽然真实的数据包含8 位或者9 位,但是,数据传送只涉及一个字节。

4.2、UART发送

  USART将要发送的数据写入UxBUF寄存器中。当传送字节时,UxCSR寄存器的第0位为1,当字节传送完毕时写为0。
  当USART 收/发数据缓冲寄存器就绪,准备接收新的发送数据时,就产生了一个中断请求。该中断在传送开始之后立刻发生,因此,当字节正在发送时,新的字节能够装入数据缓冲器。

4.3、UART接收

  当UxCSR寄存器的第6位写入1时接收器使能,此时UART开始接收数据。当接收到数据时,UxCSR寄存器的第0位置1,此时接收到的数据被传入UxBUF寄存器中。

4.4、UART配置

  串口配置步骤如下:
1.指定串口的IO口位置。一共有两个串口,且每个串口都有两个备用位置。通过配置PERCFG寄存器可以指定串口IO口位置。
在这里插入图片描述
2.配置相应的IO口为具有片上外设功能的IO口。学习实验“2-CC2530 通用IO口配置”时可以知道串口属于片上外设,此时我们应该将第1步选定的IO口位置配置为具有片上外设功能的IO口,通过配置PxSEL寄存器可以实现该功能。
3.配置对应串口为UART模式并使能接收器。配置为UART功能的串口具有8个数据位、1个停止位、无流控、无校验确立。通过配置U0CSR的第7和6位可以配置串口0的模式和接收器使能。
4.设置波特率。只有相同波特率才能实现通信。波特率由U0GCR寄存器后4位的BAUD_E和UxBAUD寄存器的BAUD_M共同实现,根据设定的波特率给对应的BAUD_M和BAUD_E赋值。
在这里插入图片描述
5.打开CPU总中断和对应串口接收中断。在实验“4-CC2530 外部中断配置”知道打开CPU总中断只需要将EA置1,串口中断只需将IEN0寄存器的第2位置1,也可以直接将URX0IE置1。

4.5、UART相关寄存器

  PERCFG寄存器的第1和0分别用于串口1、0的备用位置选择。
在这里插入图片描述
  U0CSR寄存器的第7和6位用于配置UASRT的模式和UART接收器使能。
在这里插入图片描述
  U0GCR的后4位用来配置BAUD_E,结合U0BAUD寄存器的BAUD_M来配置波特率。
在这里插入图片描述
在这里插入图片描述

五、实验演示

  将Micro-USB线接入ZIGBEE开发板和电脑,然后打开文件夹工具软件,打开CH341SER,找到SETUP.EXE并以管理员身份运行,然后点击安装即可。
在这里插入图片描述
  安装完打开设备管理器,找到我们的端口线并更新驱动,选择自动搜索即可。如果打开设备管理器时看到我们的端口线有黄色感叹号警告的话不用担心,只需完成同样操作即可。
在这里插入图片描述
  这样我们的驱动就已经下载好了,接下来我们要实现电脑发送一个字节给ZIGBEE开发板,ZIGBEE开发板接到指令后改变LED1的状态并将原来的字节发送给电脑。
  首先是打开IAR建立uart.c和uart.h文件。根据4.4内容对USART进行初始化配置:

#include "headfile.h"
void uart0_init(void)
{
    PERCFG &= ~0x01;   	 //1111 1110 指定串口0在备用位置1,即P0_3和P0_2
    P0SEL |= 0x0C;     	 //0000 1100 配置P0_3和P0_2为具有片上外设功能的IO口
    U0CSR |= 0xC0;     	 //1100 0000 配置串口0为UART功能 使能接收器
    U0GCR = 8;         	 //设置BAUD_E为8
    U0BAUD = 59;      	 //设置BAUD_M为59 结合BAUD_E和BAUD_M设置波特率为9600
    URX0IE = 1;        	 //使能串口0接收
    EA = 1;				 //打开CPU总中断
}

  对应更新uart.h文件:

#ifndef __UART_H__
#define __UART_H__

#include "headfile.h"

void uart0_init(void);

#endif

  接下来我们看一下串口的中断函数格式:

#pragma vector = URX0_VECTOR
__interrupt void 函数名(void)
{
执行内容;
}

  U0DBUF和U0BUF是一样的,但是我们在写程序时就必须写U0DBUF,因为iocc2530.h里命名的是U0DBUF。USART0的发送缓存器和接收缓存器都叫做U0DBUF,当U0DBUF写在等号的右边时表示的是接收缓存器,在左边时表示发送缓存器。

#pragma vector = URX0_VECTOR
__interrupt void uart0_rx(void)
{
    char buf;
    URX0IF = 0;					//清除串口0接收标志位
    buf = U0DBUF;				//从串口0接收器读取数据
    LED1 = !LED1;
    U0DBUF = buf;				//将buf放进串口0发送器内
    while(UTX0IF == 0); 		//等待串口0发送完毕
    UTX0IF = 0; 				//清除串口0发送标志位
}

  通信要在32MHz下才能执行,所以我们要从16MHz转换到32MHz。下面是main.c文件:

#include "iocc2530.h"                     //头文件
#include "headfile.h"

void main(void)
{
    led_init();
    clk32m_init();
    uart0_init();
    while(1);
}

#pragma vector = URX0_VECTOR
__interrupt void uart0_rx(void)
{
    char buf;
    URX0IF = 0;                 //清除串口0接收标志位
    buf = U0DBUF;               //从串口0接收器读取数据
    LED1 = !LED1;
    U0DBUF = buf;               //将buf放进串口0发送器内
    while(UTX0IF == 0);         //等待串口0发送完毕
    UTX0IF = 0;                 //清除串口0发送标志位
}

  接上Micro-USB线,打开工具软件打开串口工具,这里我们选择对应的端口和波特率,其他的不用修改,然后打开串口。
在这里插入图片描述
  在发送区输入任意数字,点击手动发送,可以看到接收区对应接收到我们发送的数据,接着我们可以观察到ZIGBEE开发板上的LED1状态随着我们每次的发送而改变。
  现在我们尝试实现上电后发送字符串“Hello World!”。
  首先我们在headfile.h文件里包含头文件stdio.h和string.h。回到uart.c,我们要写一个可以发送字符串的函数:

void uartsendstring(char *data,uint8_t len)
{
    for(;len>0;len--)
    {
        U0DBUF = *data++;					//将要发送的字符串写入发送数据寄存器
        while(UTX0IF == 0);					//等待发送完毕
        UTX0IF = 0;							//清除发送标志位
    }
}

  相应的在main.c内输入以下:

#include "iocc2530.h"                     //头文件
#include "headfile.h"

char buf[20];

void main(void)
{
    led_init();
    clk32m_init();
    uart0_init();
    memset(buf,0,sizeof(buf));                  //往buf内写入长度为buf长度的0
    sprintf(buf,"Hello World!\n");              //往buf内写入字符串
    uartsendstring(buf,sizeof(buf));            //发送buf
    while(1);
}

#pragma vector = URX0_VECTOR
__interrupt void uart0_rx(void)
{
    URX0IF = 0;                 //清除串口0接收标志位
    while(UTX0IF == 0);         //等待串口0发送完毕
    UTX0IF = 0;                 //清除串口0发送标志位
}

  当我们上电后可以看到串口调试助手的接收区自动收到“Hello World!”。如果没有的话按一下复位键试试。
  有疑问可以加入QQ群交流:324611467

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值