无论学习哪款MUC串口对于我们进行实验调试都是非常方便实用的,可以把程序中涉及的某些中间量或者其他程序状态信息打印出来显示在电脑上进行调试,许多MUC和PC机通信都是通过串口来进行的。
CC2530有两个USB转串口,分别是USART0和USART1。USART0和USART1是串行通信接口,它们能够分别运行于异步UART模式或者同步SPI模式。两个USART具体同样的功能,可以设置在单独的I/O引脚。查看CC2530 datasheet的I/O外设引脚映射——72页
根据上面的外设I/O引脚映射可知:
UART0对应的外部设置IO引脚关系为:位置1:P0_2----RX P0_3----TX 位置2:P1_4----RX P1_5----TX
UART1对应的外部设置IO引脚关系为:位置1:P0_5----RX P0_4----TX 位置2:P1_7----RX P1_6----TX
USART模式的操作具体下列特点:
1、8位或者9位负载数据
2、奇校验、偶校验或者无奇偶校验
3、配置其实位和停止位电平
4、配置LSB(最低有效位)或MSB(最高有效位)首先传输
5、独立接收中断
6、独立收发DMA触发
注:在本次实验中,使用的是UART0
电路原理图:
CC2530寄存器:
- PERCFG:外设控制寄存器
- P2DIR : 端口2方向和端口0外设优先级控制
- IEN0 :中断使能0寄存器
- IRCON2:中断标志控制寄存器
- UxCSR:USARTx 控制和状态寄存器
- UxUCR:USARTx 串口控制寄存器
- UxGCR:USARTx 通用控制寄存器
- UxBUF: USARTx 接收/发送数据缓冲寄存器
- UxBAUD:USARTx 波特率控制寄存器















CC2530配置串口的一般步骤:
1、配置串口的备用位置,是备用位置1,还是备用位置2。配置寄存器PERCFG外设控制寄存器
2、配置IO,使用外部设备功能。此处配置P0_2和P0_3用作串口UART0
3、配置端口的外设优先级。此处配置P0外设优先作为UART0
4、配置相应串口的控制和状态寄存器。此处配置UART0的工作寄存器
5、配置串口工作的波特率。此处配置为波特率115200
6、将对应的串口接收/发送中断标志位清0,接收/发送一个字节都将产生一个中断,在接收时需要开总中断和使能接收中断,以及运行接收。
程序:
/******************************************
* 基础实验只需要添加以下头文件
******************************************/
#include <ioCC2530.h>
#define uint8 unsigned char //或typedef unsigned char uint;
#define uint16 unsigned int
char Rxdata[50];
uint8 RXTXflag = 1;
char temp;
uint8 datanumber = 0;
/******************************************
* 函数描述:串口0初始化
* 115200,8位数据位,无校验,1位停止位
******************************************/
/******************************************
* CC253O 32M系统时钟波特率参数表 *
*----------------------------------------*
* 波特率 UxBAUD.BAUD_M UxBAUD.BAUD_M *
* 240 59 6 *
* 4800 59 7 *
* 9600 59 8 *
* 14400 216 8 *
* 19200 59 9 *
* 28800 216 9 *
* 38400 59 10 *
* 57600 216 10 *
* 76800 59 11 *
* 115200 216 11 *
* 23040 216 12 *
*****************************************/
void UartInit(void)
{
PERCFG = 0x00; //设置UART0的备用位置为P0口,即UART0的RX-P0_2,TX-P0_3
P0SEL = 0x3c; //设置P0_2,P0_3为外设功能
P2DIR &= ~0xc0; //配置P0端口优先作为UART0
/*设置USART0的方式*/
U0CSR |= 0x80; //SPI同步模式
/*设置USART0的波特率,115200*/
U0GCR |= 11;
U0BAUD |= 216;
/*将UART0中断标志位清0*/
UTX0IF = 0; //清除UART0发送中断标志位
URX0IF = 0; //清除UART0接收中断标志位
/*开总中断,以及使能串口0接收中断*/
IEN0 |= 0x80; //开总中断
IEN0 |= 0x04; //使能串口0接收中断
/*运行串口0接收*/
U0CSR |= 0x40;
}
/******************************************
* 函数描述:串口0发送字符串函数
******************************************/
void UartSendString(char *Data, uint16 len)
{
uint16 j;
for (j = 0; j < len; j++)
{
U0DBUF = *Data++;
for (; 0 == UTX0IF ;);
UTX0IF = 0;
}
}
/******************************************
* 函数描述:32M系统时钟下的毫秒延时函数
******************************************/
void Delay_ms(uint16 ms)
{
uint16 i,j;
for(i = 0; i < ms; i++)
{
for(j = 0;j < 1774; j++);
}
}
/******************************************
* 函数描述:串口0接收中断服务程序
******************************************/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; //清中断标志
temp = U0DBUF; //将串口接收缓冲的数据存放到temp中,temp是char类型,即8位数据位
}
void main()
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHz晶振
for(; CLKCONSTA & 0x40;); //等待晶振稳定
CLKCONCMD &= ~0X47; //设置系统主时钟频率为32MHz
UartInit();
UartSendString("send test.",sizeof("send test."));
for (;;)
{
if (1 == RXTXflag) //串口接收状态
{
if (temp != 0)
{
if ((temp != '#')&&(datanumber<50)) //'#'被定义为结束字符,最多能接收50个字符
Rxdata[datanumber++] = temp; //接收一个字节,产生一次中断,只有接收到'#'或长度大于50
else
{
RXTXflag = 2; //进入发送状态
}
temp = 0;
}
}
if (2 == RXTXflag)
{
U0CSR &= ~0x40; //禁止接收
UartSendString(Rxdata,datanumber);
U0CSR |= 0x40; //允许接收
RXTXflag = 1; //恢复到接收状态
datanumber = 0;
}
}
}