UART配置的相關寄存器如下(按s3c2440手冊中的順序列出): 聯系方式:QQ 1765841775電話15089711217 1. ULCONn寄存器:線性控制寄存器 功能:設置奇偶校驗,停止位, 數據位(5-8位) 注意 :一般設置為無校驗,一個停止位,數據位為8位,也就是常說的“8N1”,此時寄存器值為0x3。(bit[6]=0為正常模式,否則為紅外模式);2. UCONn寄存器:通道n控制器 功能:選擇UART時鐘源、設置UART中斷方式 注意:可選擇PCLK、UEXTCLK或FCLK/n。bit[5]=1為回送模式,用于測試;bit[3:2]和bit[1:0]分別控制傳輸和接收模式,初學者常設置為中斷請求或查詢模式,bit[3:2]=bit[1:0]=01。 3. UFCONn寄存器:FIFO控制寄存器 功能:用于設置是否使用FIFO,設置各FIFO的觸發闕值,即發送FIFO中有多少個數據時產生中斷、接收FIFO中有多少個數據時產生中斷。并可以通過設置UFCONn寄存器來復位各個FIFO。讀取UFSTATn寄存器可以知道各個FIFO是否已經滿,其中有多少個數據。 注意:bit[0]=1時,FIFO使能,否則禁止。初學者可不使用FIFO 4. UMCONn寄存器:UART MODEM控制寄存器 注意:bit[4]=0,AFC無效 5.UBRDIVn寄存器:波特率除數寄存器 功能:設置波特率除數 注意:UBRDIVn=(int)(UART時鐘/(波特率*16))-1; UART時鐘:PCLK,FCLK/n或者UEXTCLK,例如,如果波特率為115200bps并且UART時鐘為40MHz,則UBRDIVn為: UBRDIVn=(int)(40000000/(115200*16))-1=(int)(21.7)-1(取最接近的整數)=22-1=21。 5. UTRSTATn寄存器:接收/發送狀態寄存器 功能:顯示接收/發送緩存寄存器狀態 注意:在非FIFO模式時,bit[0]=1表明接收到數據;bit[1]=1表明發送緩存寄存器為空。在FIFO模式時,UFSTAT寄存器的相關位,具體見手冊。 6. UERSTATn寄存器:錯誤狀態寄存器 功能:表示各種錯誤是否發生 注意:初學者可以不關注其狀態,待深入學習時,再查相關資料 7. UFSTATn寄存器:FIFO狀態寄存器 功能:表明FIFO的相關狀態 注意:bit[14]=1,表明發送FIFO已滿,暫時不能再發送數據。Bit[6]=0,表明接收FIFO中有數據(個人理解,不過不太嚴謹)。 8. UMSTATn寄存器:UART MODEM 狀態寄存器 注意:初學者可以不管 9. UTXHn寄存器:發送緩存寄存器 功能:UART即會將它保存到緩沖區中,并自動發送出去 注意:bit[7:0]=發送數據。 10. URXHn寄存器:接收緩存寄存器 功能:當UART接收到數據時,CPU讀取這個寄存器,即可獲得數據。 注意:bit[7:0]=接收數據; 注:URXHn與UTXHn有大、小端之分,定義寄存器時要注意,不過一般都是用小端法。 以串口 0為例:FCLK=400M,FCLK:HCLKCLK=1:4:8;波特率為115200注:特別重要的一點,與串口通訊有關的GPHCON要進行配置;這是初學者容易忽略的,我就忽略過,導致不能實現串口通訊,最后才找到原因。 void Port_Init(void) { GPHCON = 0x00faaa; GPHUP = 0x7ff; } void Uart_Init(void) { //模式一 /******PCLK is used as uart's clock****************/ /***no FIFO---*************************************/ #if 1 ULCON0 = 0x3; //8N1 UCON0 = 0x245; //PCLK作為串口時鐘 UFCON0 = 0x0; //no FIFO UMCON0 = 0x0; // AFC disable UBRDIV0=26; /**************************************************/ #endif //模式二 /**********************loop_uart-pclk—noFIFO*************/ #if 0 ULCON0 = 0x3; //8N1 UCON0 = 0x265; //bit[5] control loop mode: 1 is valid UFCON0 = 0x0; //no FIFO UMCON0 = 0x0; // AFC disable UBRDIV0=26; /**********************loop_uart********************/ #endif //模式三 /**********************uart--FIFO--PCLK*******************/ #if 0 ULCON0 = 0x3; //8N1 UCON0 = 0x245; // PCLK作為串口時鐘 UFCON0 = 0x31; //bit0]=1表示使能FIFO UMCON0 = 0x0; // AFC disable UBRDIV0=26; /******************************************/ #endif } 注:有定義如下 #define WrUTXH0(ch) (*(volatile unsigned char *)0x50000020)=(unsigned char)(ch) #define RdURXH0() (*(volatile unsigned char *)0x50000024) 使用模式一和模式二時,輸入和輸出函數可如下形式 char Uart_Get_Char(void) { while(!(UTRSTAT0 & 0x1)); //Receive data ready return (char)(RdURXH0()); } char Uart_Put_Char(char ch) { while(!(UTRSTAT0 & 0x2)); //Wait until THR is empty. WrUTXH0(ch); return ch; } 使用模式三時,輸入和輸出函數可用形式如下: char Uart_FIFO_Put_Char(char ch) { while((UFSTAT0 & 0x4000)); WrUTXH0(ch); return ch; } char Uart_FIFO_Get_Char(void) { while(!(UFSTAT0 & 0x1f)); eturn (char)(RdURXH0()); } 聯系方式:QQ 1765841775電話15089711217 |