车干的ZigBee学习笔记四——串口通信

一、串口配置步骤

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); //清空接收缓冲区
		} 
	}
}
















发布了13 篇原创文章 · 获赞 3 · 访问量 1859

猜你喜欢

转载自blog.csdn.net/weixin_44127810/article/details/104141886
今日推荐