CC2530 串口驅(qū)動(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?!=?'