串口通信程序編寫步驟UART通信程序可以采用查詢、中斷和DMA模式。我們通過使用較多的中斷方式來介UART通信程序的編寫。簡單做法是,UART通信程序的編寫參照例子程序。
本文引用地址:http://m.butianyuan.cn/article/201611/322168.htm選通道,通過函數(shù)Uart_Select();選UART0~UART2;
選波特率和波特率發(fā)生器時鐘,選波特率通過函數(shù)Uart_Pclk_En(int ch, int baud)或Uart_Pclk_En(int ch, int baud)來進行。時鐘選UCLK ,rUCON0|=0x400;時鐘選PCLK ,rUCON0&=0x3ff。
通信協(xié)議(rULCON0)設定,如果正常通信,一位停止位,8位數(shù)據(jù)位,無奇偶效驗: rULCON0=(0<<6)|(0<<3)|(0<<2)|(3);
通信控制字(rUCON0)設定,如時鐘選ULK做波特率發(fā)生器;Tx中斷脈沖觸發(fā),Rx中斷脈沖觸發(fā);接收超時中斷允許;產(chǎn)生接收錯誤中斷;正常模式發(fā)送:
rUCON0|=(TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1);
I/O口初始化,因為UART通信使用H口的第二功能,所以H口要上拉禁止:rGPHUP|=0x1ff。H口控制寄存器nRTS1,nCTS1功能使能,rGPHCON&=0x3c0000,rGPHCON|=0x2faaa;
設中斷服務函數(shù)入口地址,把中斷服務函數(shù)入口地址賦函數(shù)指針PISR_UARTn, 注意,接收中斷服務函數(shù)入口地址和發(fā)送中斷服務函數(shù)入口地址是一個,在中斷服務函數(shù)中根據(jù)
UTRSTATn [1]和UTRSTATn [0]狀態(tài)決定是發(fā)送中斷還是接收中斷。
打開總中斷屏蔽和子中斷屏蔽等待中斷:
rINTMSK=~(BIT_UART0);
rINTSUBMSK=~(BIT_SUB_TXD0);
進入中斷后,先屏蔽發(fā)送和接收中斷,防止新來中斷干擾我們的正常發(fā)送和接收,正常發(fā)送和接收結束后,清中斷掛起和中斷源掛起寄存器:ClearPending(BIT_UART0),rSUBSRCPND=(BIT_SUB_TXD0(發(fā)送),rSUBSRCPND=(BIT_SUB_RXD0|BIT_SUB_ERR0)(接收);
取消中斷屏蔽,等下一次中斷。
下面是利用查詢方式的串口通信程序(FL2440開發(fā)板)
#include"2440addr.h"http://該程序是PC機通過串口工具向開發(fā)板發(fā)送1234這四個數(shù)字來控制四個LED的亮滅
int TSmain()
{
char buf,i;
rULCON0 &=0XFFFFFF00;
rULCON0 |=0X03;//1位起始位,8位數(shù)據(jù)位
rUCON0=0x05;//0X0805;//串口時鐘PCLK,查詢方式 東:PCLK為50M
rUBRDIV0 =325;//0X1A;//波特率115200****325時設置為9600
rGPBCON = 0x1dd7fc;//GPB5,6,8,10設置為輸出
rGPBDAT|=0x560;//4個LED全滅
while(1)
{
if(rUTRSTAT0 & 0X01)//接收是否完畢 =1結束
{
buf=rURXH0;//讀取數(shù)據(jù)
while(!(rUTRSTAT0 & 0X04));//是否允許發(fā)送 =1允許
rUTXH0=buf;
if(buf==1)//判斷接收到的是哪一個數(shù)字
i=1;
else if(buf==2)
i=2;
else if(buf==3)
i=3;
else if(buf==4)
i=4;
switch(i){//使相應的LED亮滅
case 1:
rGPBDAT^=(1<<5);
i=0;//將i清零防止下次收到其他數(shù)據(jù)時干擾
break;
case 2:
rGPBDAT^=(1<<6);
i=0;
break;
case 3:
rGPBDAT^=(1<<8);
i=0;
break;
case 4:
rGPBDAT^=(1<<10);
i=0;
break;
default:break;
}
}
}
return 0;
}
評論