一、串口配置步驟
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); //清空接收緩衝區
}
}
}