學習uboot的前奏篇終于要完結了,在這篇UART後,我們将正式開始Uboot的學習,那麼現在開始今天的話題。
UART稱為通用異步收發器,即Universal Asynchronous Receiver Transmitter。發送資料的時候,CPU将資料輸入UART,UART按照一定的格式在一根電線上串行發出,接收資料時,UART檢查另一根電線上的信号,将串行收集放在緩沖區中,CPU可讀取UART的資料。UART之間以全雙工方式傳輸資料。

從上圖可以看出UART最簡單的連線,隻需要三根TxD,RxD,Gnd用于給雙方提供參考電平。
TxD、RxD資料線以“位”為最小的傳輸機關。幀有具有完整意義的,不可分割的若幹位組成,包含開始位、資料位、校驗位和停止位。發送資料之前,UART雙方需要約定資料的傳輸速率、資料的傳輸格式。
下面說資料傳輸的流程。
- 平時資料線處于“空閑”狀态(1狀态)
- 當要發送資料時,UART改變TxD資料線的狀态(變為0狀态)并維持一位的時間 ,這樣接收方檢測到開始位後,再等待1.5位的時間就開始一位一位地檢測資料線的狀态得到傳輸的資料。
- UART一幀中可以有5、6、7、8位的資料,發送方一位改變資料線的狀态,将他們發送出去,首先發送的是最低位。
- 如果使用校驗功能,UART在發送完資料位後,還要發送一個校驗位。校驗有奇偶之分—資料線連同校驗位中的1資料等于奇數或者偶數。
- 最後,發送停止位,資料線恢複到“空閉”狀态。停止位有三種:1位,1.5位,2位。
對于S3C2440來說,有三個獨立的通道,每個通道可以工作在中斷或者DMA模式。S3C2440 UART收發都最大有64位元組的FIFO,發送資料時,CPU先将資料寫入到FIFO到,然後UART自動将FIFO中的資料複制到“發送移位器”中,發送移位器将資料一位一位地發送到Tx資料線上,接收資料時,“接收移位器”将Rx資料線上的資料一位一位接收進來然後複制到接收FIFO中,CPU即可從中讀取資料。
下面将結合前面說到中斷和本章的UART
第一步初始化序列槽
void uart0_init(void)
{
GPHCON |= ; // GPH2,GPH3用作TXD0,RXD0
GPHUP = ; // GPH2,GPH3内部上拉
ULCON0 |= ; // 8N1(8個資料位,無較驗,1個停止位)
UCON0 = ; // 中斷或者查詢方式,UART時鐘源為PCLK
UMCON0 = ; // 不使用流控
UBRDIV0 = UART_BRD; // 波特率為115200
URXH0 =;
}
第二步打開序列槽中斷
void init_irq( )
{
/*打開UART0 RX中斷,TX不打開中斷*/
INTSUBMSK &=(~(<<)) ;
/*打開UART0中斷*/
INTMSK &= (~(<<));
}
第三步定義中斷處理程式
void INT_Handle()
{
unsigned long oft = INTOFFSET;
unsigned char c;
if(SUBSRCPND & (<<)) //接收中斷
{
c = getc();
if((<<)==(GPFDAT &((<<))))
{
GPFDAT &= ~(<<);
}else if(==(GPFDAT &((<<))))
{
GPFDAT |= (<<);
}
SUBSRCPND |= (<<);
if (isDigit(c) || isLetter(c))
putc(c+);
}
SRCPND = <<oft;
INTPND = <<oft;
}
上面的程式的主要功能:中斷方式接收UART發過來的資料,中斷處理程式中将接收的資料加1,再發送出去,同時每進入一次中斷LED的電平就取反一次,經測試本程式工作正常。
至此學習uboot的所有準備工作已經完成,接下來将正式開始uboot的學習。