當(dāng)前位置:首頁 > 芯聞號 > 充電吧
[導(dǎo)讀]使用IAR驅(qū)動(dòng)CC2530的串口0,串口1,實(shí)現(xiàn)數(shù)據(jù)發(fā)送以及printf,中斷接收數(shù)據(jù)uart.c/**************************************************

使用IAR驅(qū)動(dòng)CC2530的串口0,串口1,實(shí)現(xiàn)數(shù)據(jù)發(fā)送以及printf,中斷接收數(shù)據(jù)



uart.c


/*************************************************************************************************************
?*?文件名:	uart.c
?*?功能:	CC2530?串口相關(guān)函數(shù)
?*?作者:	cp1300@139.com
*?創(chuàng)建時(shí)間:	2013-06-07?21:33
?*?最后修改時(shí)間:2013-06-07
?*?詳細(xì):	串口相關(guān)函數(shù)
			串口最大時(shí)鐘為系統(tǒng)時(shí)鐘的1/16
*************************************************************************************************************/
#include?"system.h"
#include?"uart.h"



//相關(guān)UART狀態(tài)結(jié)構(gòu)
typedef?struct
{
	u8			BuffFull;	//接收Buff滿
	u8?			*RxBuff;	//接收Buff指針
	u16			RxBuffSize;	//接收緩沖區(qū)大小,一幀數(shù)據(jù)大小
	u16?		UartRxCnt;	//接收數(shù)據(jù)計(jì)數(shù)器
}?UartRx_TypeDef;

static?UartRx_TypeDef	UART_RX[2];




static?const?u8?BAUD_M[11]?=?{59,?59,?59,?216,?59,?216,?59,?216,?59,?216,?216};		//32MHZ系統(tǒng)時(shí)鐘對應(yīng)的分頻器小數(shù)部分
static?const?u8?BAUD_E[11]?=?{6,?7?,8,?8,?9,?9,?10,?10,?11,?11,?12};????????????????//32MHZ系統(tǒng)時(shí)鐘對應(yīng)的分頻器指數(shù)部分


/*************************************************************************************************************************
*函數(shù)????????:????	void?UART_Init(UART_CH?ch,?USART_BAUD?Baud,?FunctionalState?RxIntEn)
*功能????????:		串口初始化
*參數(shù)????????:????	ch:通道選擇,UART_CH0,UART_CH1
					Baud:波特率控制,見USART_BAUD
					RxIntEn:ENABLE:使能串口接收中斷
*返回????????:	???無
*依賴????????:		底層宏定義
*作者????????:		cp1300@139.com
*時(shí)間????????:		2013-05-20
*最后修改時(shí)間:		2013-06-11
*說明????????:		一個(gè)起始位,8個(gè)數(shù)據(jù)位,一個(gè)停止位,無奇偶校驗(yàn)
					需要開啟全局中斷
*************************************************************************************************************************/
void?UART_Init(UART_CH?ch,?USART_BAUD?Baud,?FunctionalState?RxIntEn)
{
	switch(ch)
	{
		case?UART_CH0:
		{
			U0CSR?=?BIT7?+?BIT6;	//UART模式,使能接收	
			U0UCR?=?BIT1;			//無流控,無奇偶校驗(yàn),8bit,1個(gè)停止位,停止位高電平,起始低電平
			U0GCR?=??BAUD_E[Baud];	//波特率分頻器指數(shù)部分
			U0BAUD?=??BAUD_M[Baud];	//波特率分頻器小數(shù)部分
			P0SEL?|=?BIT2?+?BIT3;?	//P0.3?TXD,P0.2?RXD
			IEN2?&=?~(1?<<?3);		//關(guān)閉發(fā)送中斷
			URX0IF?=?0;				//清除串口接收中斷標(biāo)志
			UTX0IF?=?0;				//清除串口發(fā)送中斷標(biāo)志
			URX0IE?=?(RxIntEn?==?ENABLE)???1?:?0;??			//使能串口接收中斷
		}break;
		case?UART_CH1:
		{
			U1CSR?=?BIT7?+?BIT6;	//UART模式,使能接收	
			U1UCR?=?BIT1;			//無流控,無奇偶校驗(yàn),8bit,1個(gè)停止位,停止位高電平,起始低電平
			U1GCR?=??BAUD_E[Baud];	//波特率分頻器指數(shù)部分
			U1BAUD?=??BAUD_M[Baud];	//波特率分頻器小數(shù)部分
			P1SEL?|=?BIT4?+?BIT5;?	//P0.5?TXD,P0.4?RXD
			URX1IF?=?0;				//清除串口接收中斷標(biāo)志
			UTX1IF?=?0;				//清除串口發(fā)送中斷標(biāo)志
			URX1IE?=?(RxIntEn?==?ENABLE)???1?:?0;??			//使能串口接收中斷
		}break;
		default?:?return;
	}
	UART_SetRxBuff(ch,?NULL,?0);	//初始化串口緩沖區(qū)無效
}



/*************************************************************************************************************************
*函數(shù)????????	:	void?UART_SendByte(UART_CH?ch,?u8?data)
*功能????????	:	UART字節(jié)發(fā)送函數(shù)
*參數(shù)????????	:	ch:通道選擇,UART_CH0,UART_CH1
					data:需要發(fā)送的數(shù)據(jù)
*返回????????	:	無
*依賴????????	:	底層宏定義
*作者????????	:	cp1300@139.com
*時(shí)間????????	:	2013-06-11
*最后修改時(shí)間	:	2013-06-11
*說明????????	:	無
*************************************************************************************************************************/
void?UART_SendByte(UART_CH?ch,?u8?data)
{
	switch(ch)
	{
		case?UART_CH0:
		{
			U0DBUF?=?data;????????			//發(fā)送字節(jié)數(shù)據(jù)
			while(!(U0CSR?&?BIT1));			//等待發(fā)送數(shù)據(jù)寄存器為空				
			U0CSR?&=?~BIT1;
		}break;
		case?UART_CH1:
		{
			U1DBUF?=?data;????????			//發(fā)送字節(jié)數(shù)據(jù)
			while(!(U1CSR?&?BIT1));			//等待發(fā)送數(shù)據(jù)寄存器為空				
			U1CSR?&=?~BIT1;
		}break;
		default?:?break;
	}
}




/*************************************************************************************************************************
*函數(shù)????????	:	void?UART2_SendData(u8?*pbuff,?u16?len)
*功能????????	:	串口發(fā)送任意長度數(shù)據(jù)
*參數(shù)????????	:	ch:通道選擇,UART_CH0,UART_CH1
					pbuff:數(shù)據(jù)緩沖區(qū)指針,len:數(shù)據(jù)長度
*返回????????	:	無
*依賴????????	:	底層宏定義
*作者????????	:	cp1300@139.com
*時(shí)間????????	:	2013-06-11
*最后修改時(shí)間	:	2013-06-11
*說明????????	:	無
*************************************************************************************************************************/
void?UART_SendData(UART_CH?ch,?u8?*pbuff,?u16?len)
{
	u16?i;
	
	switch(ch)
	{
		case?UART_CH0:
		{
			for(i?=?0;i?<?len;i?++)
			{
				U0DBUF?=?pbuff[i];????????			//發(fā)送字節(jié)數(shù)據(jù)
				while(!(U0CSR?&?BIT1));			//等待發(fā)送數(shù)據(jù)寄存器為空				
				U0CSR?&=?~BIT1;
			}
		}break;
		case?UART_CH1:
		{
			for(i?=?0;i?<?len;i?++)
			{
				U1DBUF?=?pbuff[i];????????			//發(fā)送字節(jié)數(shù)據(jù)
				while(!(U1CSR?&?BIT1));			//等待發(fā)送數(shù)據(jù)寄存器為空				
				U1CSR?&=?~BIT1;
			}
		}break;
		default?:?break;
	}
}



/*************************************************************************************************************************
*?函數(shù)			:	void?UART2_SendString(UART_CH?ch,?const?char?*pStr)
*?功能			:	UART發(fā)送字符串
*?參數(shù)			:	ch:通道選擇,UART_CH0,UART_CH1
					pStr:字符串指針
*?返回			:	無
*?依賴			:	底層宏定義
*?作者			:	cp1300@139.com
*?時(shí)間			:	2013-06-11
*?最后修改時(shí)間?	:?	2013-06-11
*?說明			:?	遇到'0'后停止發(fā)送
*************************************************************************************************************************/
void?UART_SendString(UART_CH?ch,?const?char?*pStr)
{
	while(*pStr?!=?'