一、串口配置步骤
1、相应IO配置成片上外设功能
2、配置相应串口的控制和状态寄存器
3、波特率
二、串口发送字符串
1、相关原理图
P0_2、P0_3配置为外设功能时,P0_2为RX,P0_3为TX
USART0和USART1是串行通信接口,能够分别运行于异步UART模式或者同步SPI模式
2、相关寄存器 UXCSR UXGCR UXBUF UXBAUD CLKCONCMD CLKCONSTA
(1)UXCSR USART 0/1 控制和状态
(2)UXGCR USART 0/1 通用控制
(3)UXBUF USART 0/1 接收/传送数据缓存
(4)UXBAUD USART 0/1 波特率控制
(5)CLKCONCMD 时钟控制命令
(6)CLKCONSTA 时钟控制状态
3、波特率计算
由寄存器UxBAUD.BAUD_M[7:0]和UxGCR.BAUD_E[4:0]定义波特率。该波特率用于UART 传送,也用于SPI 传送的串行时钟速率。波特率由下式给出:F 是系统时钟频率,等于16 MHz RCOSC 或者32 MHz XOSC。
4、例程
#include<iocc2530.h>
#include<string.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define TX_SIZE 20
#define TX_STRING "Xuaner Zigbee"
char TXDATA[TX_SIZE]; //存储发送字符串
/*********毫秒延时******/
void delayms(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<1070;j++);
}
/*********串口初始化函数**********/
void inituart(void)
{
//IO配置
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
}
/**********串口发送函数******/
void UARTsendstring(char *data, int chang) //chang 发送长度
{
uint i;
for(i=0;i<chang;i++)
{
U0BUF = *data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
void main(void)
{
CLKCONCMD &= ~0X40; //设置系统时钟为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); //延时 1 秒
}
}
三、串口收发字符串
原理图、寄存器、波特率同串口发送字符串
例程:
#include <ioCC2530.h>
#include <string.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define UART0_RX 1
#define UART0_TX 2
#define SIZE 51
char RxBuf;
char UartState;
uchar count;
char RxData[SIZE]; //存储发送字符串
/***********延时函数**********/
void delayms(uint ms)
{
uint i,j;
for (i=0; i<ms; i++)
for (j=0; j<1070; j++);
}
/********串口初始化函数*********/
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; //开总中断允许接收中断
}
/*********串口发送函数*****/
void UARTsendstring(char *data, int chang)
{
uint i;
for(i=0; i<chang; i++)
{
U0DBUF = *data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
/*******串口中断处理函数*******/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; // 清中断标志
RxBuf = U0DBUF;
}
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)
{
//以'#'为结束符,一次最多接收 50 个字符
if((RxBuf != '#')&&(count < 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); //清空接收缓冲区
}
}
}