FL2440 UART的用法
通用異步收發(fā)器簡稱UART,即“Universal Asynchronous Receiver Transmitter”,它用來傳輸串行數(shù)據(jù):發(fā)送數(shù)據(jù)時,CPU將并行數(shù)據(jù)寫入UART,UART按照一定格式在一根電線上串行發(fā)出;接收數(shù)據(jù)時,UART檢測另一根電線上的信號,將串行數(shù)據(jù)放在緩沖區(qū)中,CPU即可讀取UART獲得的數(shù)據(jù)。UART之間以全雙工方式傳輸數(shù)據(jù),最精簡的連線方式只有三根電線:TxD用于發(fā)送數(shù)據(jù),RxD用于接收數(shù)據(jù),Gnd用于給雙方提供參考電平。連線如下圖所示:
本文引用地址:http://m.butianyuan.cn/article/201611/316626.htm#include "2440addr.h"
void Main(void)
{
char ch;
rGPBCON = 0x155551;
rGPBUP = 0x7ff;
rGPBDAT = 0x560;
rGPHCON = 0x00faaa; /*使用UART0功能 0000 0000 1111 1010 1010 1010 管腳使能*/
rGPHUP = 0x7ff;
rULCON0 = 0x3; /*設置UART0無奇偶校驗,一位停止位,8位數(shù)據(jù) 設定數(shù)據(jù)傳輸格式*/
rUCON0 = 0x245; /*PCLK為時鐘源,接收和發(fā)送數(shù)據(jù)為查詢或中斷方式[4]沒有break信號[7]禁止fifo*/
rUFCON0 = 0;
rUMCON0 = 0;
rUBRDIV0 = 26; /*設置波特率,PCLK為50MHz,波特率為115.2kHz*/
while(!(rUTRSTAT0 & 0x2)); /*等待并判斷發(fā)送緩存是否為空*/
rUTXH0 = 0xaa; /*是空,則發(fā)送0xAA字節(jié)*/
while(1)
{
while(!(rUTRSTAT0 & 0x1)); /*等待并判斷接收緩存是否準備好*/
ch = rURXH0; /*接收一個字節(jié)數(shù)據(jù)*/
while(!(rUTRSTAT0 & 0x2)); /*等待并判斷發(fā)送緩存是否為空*/
rUTXH0 = ch; /*發(fā)送一個字節(jié)數(shù)據(jù)*/
switch(ch) /*根據(jù)所接收數(shù)據(jù)的不同,執(zhí)行不同的程序*/
{
case 0x11: /*滅LED*/
rGPBDAT |= 0x560;
break;
case 0x22: /*亮LED*/
rGPBDAT &= 0x1f;
break;
case 0x33: /*蜂鳴器不響*/
rGPBDAT &= 0x560;
break;
case 0x44: /*蜂鳴器響*/
rGPBDAT |= 0x1;
break;
default: /*LED滅,蜂鳴器不響*/
rGPBDAT = 0x560;
break;
}
}
}
中斷處理方式,UART有子中斷,要注意子中斷屏蔽的打開,由于UART中斷涉及到SUBSRCPND寄存器,因此在中斷處理程序中不僅要清SRCPND寄存器,還要清SUBSRCPND寄存器,它們的順序一定是先清SUBSRCPND寄存器,再清SRCPND寄存器,否則就會引起一個中斷兩次響應的問題。因為是否中斷由SRCPND寄存器決定,而SRCPND寄存器的相關狀態(tài)位由SUBSRCPND寄存器決定,如果先清SRCPND寄存器,而還沒有清SUBSRCPND寄存器的話,SRCPND寄存器的相關位還是會被置1,而一旦被置1,則一定還會引起中斷。
#include "2440addr.h"
#define U32 unsigned int
void __irq uartISP(void)
{
char ch;
rSUBSRCPND |= 0x3;
rSRCPND = 0x1<<28;
rINTPND = 0x1<<28;
if(rUTRSTAT0 & 1) /*接收數(shù)據(jù)處理部分*/
{
ch = rURXH0; /*接收字節(jié)數(shù)據(jù)*/
if(ch==0x55)
rGPBDAT = ~0x60; /*亮兩個LED,蜂鳴器響*/
else
rUTXH0 = ch; /*發(fā)送字節(jié)數(shù)據(jù)*/
}
else /*發(fā)送數(shù)據(jù)處理部分*/
{
rGPBDAT = ~0x561; /*亮4個LED*/
}
}
void Main(void)
{
rGPBCON = 0x155555;
rGPBUP = 0x7ff;
rGPBDAT = 0x560;
rGPHCON = 0x00faaa;
rGPHUP = 0x7ff;
rULCON0 = 0x3;
rUCON0 = 0x5;
rUFCON0 = 0;
rUMCON0 = 0;
rUBRDIV0 = 26;
rSRCPND = 0x1<<28;
rSUBSRCPND = 0x3;
rINTPND = 0x1<<28;
rINTSUBMSK = ~(0x3); /*打開UART0發(fā)送和接收中斷屏蔽*/
rINTMSK = ~(0x1<<28); /*打開UART0中斷屏蔽*/
pISR_UART0 = (U32)uartISP;
while(1)
{
}
}
在"2440addr.h"里面的關于rUTXH0/rURXH0的定義。arm指令默認小端模式初始化,所以地址是這個。
評論