[導讀]使用IAR驅動CC2530的串口0,串口1,實現(xiàn)數(shù)據(jù)發(fā)送以及printf,中斷接收數(shù)據(jù)uart.c/**************************************************
使用IAR驅動CC2530的串口0,串口1,實現(xiàn)數(shù)據(jù)發(fā)送以及printf,中斷接收數(shù)據(jù)
uart.c
/*************************************************************************************************************
?*?文件名: uart.c
?*?功能: CC2530?串口相關函數(shù)
?*?作者: cp1300@139.com
*?創(chuàng)建時間: 2013-06-07?21:33
?*?最后修改時間:2013-06-07
?*?詳細: 串口相關函數(shù)
串口最大時鐘為系統(tǒng)時鐘的1/16
*************************************************************************************************************/
#include?"system.h"
#include?"uart.h"
//相關UART狀態(tài)結構
typedef?struct
{
u8 BuffFull; //接收Buff滿
u8? *RxBuff; //接收Buff指針
u16 RxBuffSize; //接收緩沖區(qū)大小,一幀數(shù)據(jù)大小
u16? UartRxCnt; //接收數(shù)據(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ù)部分
static?const?u8?BAUD_E[11]?=?{6,?7?,8,?8,?9,?9,?10,?10,?11,?11,?12};????????????????//32MHZ系統(tǒ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
*時間????????: 2013-05-20
*最后修改時間: 2013-06-11
*說明????????: 一個起始位,8個數(shù)據(jù)位,一個停止位,無奇偶校驗
需要開啟全局中斷
*************************************************************************************************************************/
void?UART_Init(UART_CH?ch,?USART_BAUD?Baud,?FunctionalState?RxIntEn)
{
switch(ch)
{
case?UART_CH0:
{
U0CSR?=?BIT7?+?BIT6; //UART模式,使能接收
U0UCR?=?BIT1; //無流控,無奇偶校驗,8bit,1個停止位,停止位高電平,起始低電平
U0GCR?=??BAUD_E[Baud]; //波特率分頻器指數(shù)部分
U0BAUD?=??BAUD_M[Baud]; //波特率分頻器小數(shù)部分
P0SEL?|=?BIT2?+?BIT3;? //P0.3?TXD,P0.2?RXD
IEN2?&=?~(1?<<?3); //關閉發(fā)送中斷
URX0IF?=?0; //清除串口接收中斷標志
UTX0IF?=?0; //清除串口發(fā)送中斷標志
URX0IE?=?(RxIntEn?==?ENABLE)???1?:?0;?? //使能串口接收中斷
}break;
case?UART_CH1:
{
U1CSR?=?BIT7?+?BIT6; //UART模式,使能接收
U1UCR?=?BIT1; //無流控,無奇偶校驗,8bit,1個停止位,停止位高電平,起始低電平
U1GCR?=??BAUD_E[Baud]; //波特率分頻器指數(shù)部分
U1BAUD?=??BAUD_M[Baud]; //波特率分頻器小數(shù)部分
P1SEL?|=?BIT4?+?BIT5;? //P0.5?TXD,P0.4?RXD
URX1IF?=?0; //清除串口接收中斷標志
UTX1IF?=?0; //清除串口發(fā)送中斷標志
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
*時間???????? : 2013-06-11
*最后修改時間 : 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
*時間???????? : 2013-06-11
*最后修改時間 : 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
*?時間 : 2013-06-11
*?最后修改時間? :? 2013-06-11
*?說明 :? 遇到'0'后停止發(fā)送
*************************************************************************************************************************/
void?UART_SendString(UART_CH?ch,?const?char?*pStr)
{
while(*pStr?!=?'
