?? serial.c
字號:
/*************************************************************************
* File Name:Serial.c
* Description:串口中斷方式通信--CPU工作頻率為60MHz(開發板外接8MHz),波特率
* 為19200bps,字符長度8位,奇偶校驗位無,停止位1位。允許發送/接
* 收中斷,允許接收超時、錯誤中斷,啟用FIFO,發送FIFO觸發級別為
* 空,接收FIFO觸發級別為12字節。不使用Modem自動流控。采用中斷方
* 式通信。
* Date:2006-07-19
*************************************************************************/
// 中斷控制器寄存器定義
#define INTCON (*(volatile unsigned long *)0x01E00000)
#define INTPND (*(volatile unsigned long *)0x01E00004)
#define INTMOD (*(volatile unsigned long *)0x01E00008)
#define INTMSK (*(volatile unsigned long *)0x01E0000C)
#define I_ISPC (*(volatile unsigned long *)0x01E00024)
// UART寄存器定義
#define ULCON0 (*(volatile unsigned long *)0x01D00000)
#define UCON0 (*(volatile unsigned long *)0x01D00004)
#define UFCON0 (*(volatile unsigned long *)0x01D00008)
#define UMCON0 (*(volatile unsigned long *)0x01D0000C)
#define UTRSTAT0 (*(volatile unsigned long *)0x01D00010)
#define UERSTAT0 (*(volatile unsigned long *)0x01D00014)
#define UFSTAT0 (*(volatile unsigned long *)0x01D00018)
#define UMSTAT0 (*(volatile unsigned long *)0x01D0001C)
#define UTXH0 (*(volatile unsigned long *)0x01D00020)
#define URXH0 (*(volatile unsigned long *)0x01D00024)
#define UBRDIV0 (*(volatile unsigned long *)0x01D00028)
#define MCLK 60000000 /* Master Clock */
#define BR 19200 /* Baud Rate */
#define BRD ((int)(MCLK/16.0/BR+0.5)-1) /* Baud Rate Divisor */
#define BUF_SIZE 17 // 緩沖區大小,不能超過16個+1,FIFO限制
void uart_init(void); // Uart初始化
void isr_init(void); // 中斷控制器初始化
int eventRX = 0; // 接收到新的數據標志
char rxdata[BUF_SIZE];
char txdata[BUF_SIZE] = "Comm Testting!\r\n";
int main()
{
uart_init( ); // Uart初始化
isr_init( ); // 中斷控制器初始化
while(1) // 死循環,等待中斷
{
}
}
// 串口初始化
void uart_init(void)
{
UBRDIV0 = BRD; // 19200bps
ULCON0 = 0x03; // 幀長度8位,停止位1位,無校驗
UFCON0 = 0x21; // 啟用FIFO,發送FIFO觸發級別為空,
// 接收FIFO觸發級別為12字節
UCON0 = 0x0C5; // 接收中斷/查詢允許,發送中斷允許
// 允許接收錯誤中斷,允許接收超時中斷
}
// 中斷控制器初始化
void isr_init(void)
{
INTMSK &= 0x03FFBF77; // Global Interrupt Enable
// UART0/1 Error Interrupt Enable
// UART0 Rx Interrupt Enable
// UART0 Tx Interrupt Enable
INTCON = 0x01; // Disable FIQ, Enable IRQ,
// IRQ Vectored Interrupt Mode
}
// 如果UART0/1接收錯誤,則引起錯誤中斷,就會執行下面
// HandlerUERR01中斷服務子程序,
// 讀錯誤狀態寄存器,如果是溢出錯誤,讀接收緩沖區,以清除錯誤
/* UART0/1 Error Interrupt Handler */
__irq void HandlerUERR01(void)
{
unsigned char errdata, errflag;
I_ISPC = ((unsigned int)0x1<<14);// 清除UERR01 Error Interrupt
errflag = UERSTAT0; // 讀錯誤狀態寄存器
if(errflag&0x01) // 溢出錯誤
errdata = URXH0; // 讀接收緩沖區
// 未進一步處理
}
// 如果UART0接收(超時)中斷,則引起接收中斷,就會執行下面
// HandlerURXD0中斷服務子程序,從UART0接收緩沖區讀走數據
/* UART0 Rx Interrupt Handler (包括超時中斷) */
__irq void HandlerURXD0(void)
{
int rxcount, k;
I_ISPC = ((unsigned int)0x1<<7);// 清除UART0 Rx Interrupt
rxcount = UFSTAT0&0x0f; // 接收FIFO的數據量
for(k=0; k<rxcount; k++)
rxdata[k]=URXH0 ; // 從接收FIFO讀入數據
rxdata[k]='\0' ; // 添加字符串結束符
eventRX = 1; // 新數據標志置位
}
// 如果UART0發送中斷,則引起發送中斷,就會執行下面
// HandlerUTXD0中斷服務子程序,填充UART0發送緩沖區
/* UART0 Tx Interrupt Handler */
__irq void HandlerUTXD0(void)
{
int k;
char *pTx = txdata;
I_ISPC = ((unsigned int)0x1<<3);// 清除UART0 Tx Interrupt
if(eventRX)
{
eventRX = 0; // 新數據標志清零
for(k=0; k<BUF_SIZE; k++)
txdata[k]=rxdata[k]; // 從接收緩沖區拷貝數據到發送緩沖區
}
while(*pTx!='\0')
{
UTXH0 = *pTx; // 寫新的字符進入發送FIFO
pTx++;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -