?? uart.c
字號:
/****************************************Copyright (c)**************************************************
** 廣州周立功單片機發展有限公司
** 研 究 所
** 產品一部
**
** http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名:
**創 建 人:
**最后修改日期:
**描 述:
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創建人:
** 版 本:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版 本:
** 日 期:
** 描 述:
**
**--------------當前版本修訂------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
#define TXD0 1 //TXD0是引腳P0.0的第2功能
#define RXD0 (1<<2) //RXD0是引腳P0.1的第2功能
#define TXD1 (1<<16) //TXD1是引腳P0.8的第2功能
#define RXD1 (1<<18) //RXD1是引腳P0.9的第2功能
/*********************************************************************************************************
** 函數名稱: uint8 UARTn_Init(uint8 n,uint32 baud,uint8 datab,uint8 stopb,uint8 parity,uint8 INT_En)
** 功能描述: 對UARTn進行初始化
** 輸 入: n 0-UART0 1-UART1
** baud 串口通信波特率
** datab 數據位個數,有效值為:5,6,7,8
** stopb 停止位個數,有效值為:1,2
** parity 奇偶校驗位,0-無校驗,1-奇校驗,2-偶校驗,3-強制為1,4-強制為0
** INT_En 中斷控制字節,按位操作
** bit0 1--RBR中斷使能,0--RBR中斷禁止
** bit1 1--THRE中斷使能,0--THRE中斷禁止
** bit3 1--RX線狀態中斷使能,0--RX線狀態中斷禁止
** 輸 出: 0 :初始化失敗
** 1 :初始化成功
** 全局變量:
** 調用模塊:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 UARTn_Init(uint8 n,uint32 baud,uint8 datab,uint8 stopb,uint8 parity,uint8 INT_En)
{
uint32 bak;
/*檢查參數的合理性*/
if((n != 0)&&(n != 1)) return(0); //只有兩個串口
if((baud==0)||(baud>115200)) return(0); //波特率:1~115200,否則出錯
if((datab<5)||(datab>8)) return(0); //數據位數:1~8,否則出錯
if((stopb==0)||(stopb>2)) return(0); //停止位:1、2,否則出錯
if(parity>4) return(0); //奇偶校驗位有錯
//設置UART引腳,且不影響其它引腳
if(n == 0) PINSEL0 = (PINSEL0 & (~0x0f)) | TXD0 | RXD0; //設置UART0
else PINSEL0 = (PINSEL0 & (~(0x0f<<16))) | TXD1 | RXD1; //設置UART1
/*設置串口波特率*/
*(volatile uint8 *)((&U0LCR) + n * 0x4000) = 0x80; //DLAB=1
*(volatile uint8 *)((&U0DLM) + n * 0x4000) = ((Fpclk/16)/baud)/256;
*(volatile uint8 *)((&U0DLL) + n * 0x4000) = ((Fpclk/16)/baud)%256;
/*設置串口模式*/
bak = datab - 5; //設置字長
if(stopb==2)
bak |= 0x04; //判斷是否為2位停止位
if(parity != 0)
{
parity -= 1;
bak |= 0x08;
}
bak |= parity<<4; //設置奇偶校驗位
*(volatile uint8 *)((&U0LCR) + n * 0x4000) = bak;
*(volatile uint8 *)((&U0IER) + n * 0x4000) = INT_En & 0x07; //設置中斷使能寄存器
return(1);
}
/*********************************************************************************************************
** 函數名稱: void Set_FIFO(uint8 n,uint8 data)
** 功能描述: 設置FIFO
** 輸 入: n :0-UART0 1-UART1
** data:FIFO緩沖區的大小,只能為1,2,8、14個字節
** 輸 出: 0 :初始化失敗
** 1 :初始化成功
********************************************************************************************************/
uint8 Set_FIFO(uint8 n,uint8 data)
{
if(n == 0) //UART0
{
switch(data)
{
case 1:
U0FCR = 0x01; //緩沖區為1個字節
return(1);
case 4:
U0FCR = 0x41; //緩沖區為4個字節
return(1);
case 8:
U0FCR = 0x81; //緩沖區為8個字節
return(1);
case 14:
U0FCR = 0xc1; //緩沖區為14個字節
return(1);
default:
return(0);
}
}
if(n == 1) //UART1
{
switch(data)
{
case 1:
U1FCR = 0x01; //緩沖區為1個字節
return(1);
case 4:
U1FCR = 0x41; //緩沖區為4個字節
return(1);
case 8:
U1FCR = 0x81; //緩沖區為8個字節
return(1);
case 14:
U1FCR = 0xc1; //緩沖區為14個字節
return(1);
default:
return(0);
}
}
return(0);
}
/*********************************************************************************************************
** 函數名稱: void UARTn_SendData(uint8 n,uint8 *data_buf,uint8 count)
** 功能描述: 從串口發送數據
** 輸 入: n :0-UART0 1-UART1
** data_buf:發送數據緩沖區首地址
** count :發送字節數
** 輸 出: 無
** 全局變量:
** 調用模塊: 程序采用查詢方式,并且沒有使用FIFO
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void UARTn_SendData(uint8 n,uint8 *data_buf,uint8 count)
{
uint8 i;
for(i=0;i<count;i++)
{
*(volatile uint8 *)((&U0THR) + n * 0x4000) = data_buf[i]; //發送數據
//等待數據發送完畢
while(((*(volatile uint8 *)((&U0LSR) + n * 0x4000)) & 0x20)==0);
}
}
/*********************************************************************************************************
** 函數名稱: void UARTn_SendByte(uint8 n,uint8 data)
** 功能描述: 從串口發送數據
** 輸 入: n :0-UART0 1-UART1
** data:發送的數據
** 輸 出: 無
** 全局變量:
** 調用模塊: 程序采用查詢方式,并且沒有使用FIFO
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void UARTn_SendByte(uint8 n,uint8 data)
{
*(volatile uint8 *)((&U0THR) + n * 0x4000) = data; //發送數據
while(((*(volatile uint8 *)((&U0LSR) + n * 0x4000)) & 0x20)==0); //等待數據發送完畢
}
/*********************************************************************************************************
** 函數名稱: void UARTn_RcvData(uint8 n,uint8 *data_buf,uint8 count)
** 功能描述: 從串口接收數據
** 輸 入: n :0-UART0 1-UART1
** data_buf:接收數據緩沖區首地址
** count :接收字節數
** 輸 出: 無
** 全局變量:
** 調用模塊: 程序采用查詢方式,存在死等待,沒有使用FIFO
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void UARTn_RcvData(uint8 n,uint8 *data_buf,uint8 count)
{
uint8 i;
for(i=0;i<count;i++)
{
while(((*(volatile uint8 *)((&U0LSR) + n * 0x4000)) & 0x01) == 0); //等待接收標志置位
data_buf[i] = (*(volatile uint8 *)((&U0RBR) + n * 0x4000)); //保存接收到的數據
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -