




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 一起學mini2440裸機開發(六)-UART原理與基礎實驗 我個人感覺UART也不算是很難,學過單片機的相信都用過UART,在這里還是說說它吧,并且在寫基礎實驗并調試的時候,出現了一個問題,就是我們平時使用jlink調試程序都是基于在sdram中運行的,由于ram的掉電易失性,所以咱們的裸機程序根本就不能脫機工作,也即是說復位之后程序就沒有了,當然,我知道可以利用以后學的知識將它下載到NAND Flash中去,這個以后再說。貌似還有一個辦法,就是使用mdk直接Download到flash,不過需要什么算法之類的,這個算法我還不懂,先不管他了,先把UART的原理實驗弄清楚
2、了再說,以后學了nand flash就可以脫機工作了。UART概述 S3C2440通用異步收發器(UART)提供3個獨立的異步串行I/O(UART0、UART1、UART2),每個端口都可以在中斷或DMA模式下。也就是說,在CPU和UART之間傳輸數據時,UART可以產生中斷或DMA請求。 使用UART的最簡單情況是只使用3根線:Tx用于數據發送,Rx用于數據接收,GND是雙方地線,提供通信雙方的參考電平,如圖1所示: 其中電平轉換器的作用是完成通信雙方之間的電平
3、轉換,這又牽扯到RS232電平和CMOS電平,咱可以不管它,可以直接假設PC機的Rx、Tx粉筆用兩根線直接與SC2440的Tx、Rx相連就行了,即,PC機發送端Tx發送一個數據,S3C2440接收端Rx就能接收到該數據,反之亦然。S3C2440處理器UART工作原理: S3C240的3個UART包括可編程的波特率,紅外(IR)發射/接收,一個或兩個停止位,5位、6位、7位或8位的數據寬度,和奇偶校驗位。(不很懂是吧,其實我開始也不懂,這是什么玩意兒) 每個UART包含一個波特率發生器、發送器、接收器
4、和一個控制單元,如圖2所示。波特率發生器的輸入時鐘有3種:PCLK、FCLK/n、UEXTCLK(外部輸入時鐘)。 結合上圖,數據收發原理如下: UART包含兩種工作模式,FIFO模式和非FIFO模式。 FIFO模式數據收發過程 發送數據:在發送數據之前,先將數據寫入到發送FIFO,然后數據從發送FIFO復制到發送移位寄存器,最后將數據從數據引腳(TxDn)移出。 接收數據:數據從RxDn引腳一位一位地
5、接收到接收移位寄存器,然后數據從接收移位寄存器復制到接收FIFO,最后,CPU可通過數據總線從接收FIFO中讀取數據,如圖2中黑色虛線所示。 非FIFO模式數據收發過程 發送數據: 在發送數據之前,先將數據寫入到發送保持寄存器,然后數據從發送保持寄存器復制到發送移位寄存器,最后將數據從數據引腳(TxDn)移出,如圖2中黑色粗實線所示。 接收數據:數據從RxDn引腳一位一位地接收到接收移位寄存器,然后數據從接收移位寄存器復制到接收保持寄存器,最后,CPU可以從接收保持寄存器中
6、讀取數據,如圖2中黑色虛線所示。 注意:從圖2中可以很容易看出發送FIFO和發送保持寄存器、接收FIFO和接收保持寄存器的關系。發送保持寄存器只是發送FIFO中的一個字節,接收保持寄存器只是接收FIFO中的一個字節。其實,非FIFO模式FIFO可以理解為FIFO模式的一個特例,此時,FIFO寄存器只有一個字節,而在FIFO模式時,FIFO寄存器有64個字節。 下面就以非FIFO模式講解,嘿嘿,其實,FIFO模式我不會用,至少是在平時的程序中沒有用到。UART引腳及相關寄存器&
7、#160; S3C2440的引腳是復用的,可以通過編程將同一個引腳設置為不同的功能,UART也不例外。前文講到在最簡單的情況下,UART只需要3根線就可以實現通信功能,出去GND外,只有兩根線:一根數據發送線TXD,一根數據接收線RXD。下圖為S3C2440關于UART的引腳安排圖: 本實驗咱們使用UART0,從上圖可以看出,TXD0與GPH2是復用的,RXD0與GPH3是復用的。 因此,使用UART0,首先應將GPH2設置為TXD0功能,將GPH3設置為RXD0功能:
8、60; GPHCON&=(3<<4)|(3<<6); /GPH2-TXD0;GPH3-RXD0 GPHCON|=(2<<4)|(2<<6); /設置GPH2、GPH3為TXD0、RXD0功能 然后是初始化與UART0相關的寄存
9、器。 S3C2440處理器串口具有很多功能。例如,支持FIFO模式、硬件流控、接收中斷、接收超時、接收錯誤狀態中斷使能等功能。但是,對于我這樣的初學入門者,不需要過多的了解這些功能,入門級的學習只需要實現如下功能:從計算機通過串口發送一個字符給S3C2440,S3C2440收到后通過串口發給計算機。 總體來說,實現上述功能只需要初始化以下6個寄存器:ULCONn、UCONn、UBRDIVn、UTRSTATn、URXHn、UTXHn。那么咱接下來就介紹一下這些寄存器中與UART相關的位。
10、ULCONn(UART LINE CONTROL REGISTER) 主要設置數據的長度、停止位和校驗位信息,這些東西很重要的奧,設置串口調試器的時候就得依據它。 表1 ULCONn寄存器ULCONn位描述初始狀態Reserved7-0紅外模式60:正常模式1:紅外發送/接收模式0校驗位5:30xx:無校驗100:奇校驗101:偶校驗000停止位寬度20:每幀數據有1個停止位1:每幀數據有2個停止位0數據位寬度1:000:5位 01:6位10
11、:7位 11:8位00 UCONn(UART CONTROL REGISTER) 主要用于設置數據發送和接收的模式,中斷方式還是查詢模式。 表2 UCONn寄存器UCONn位描述時鐘選擇11:10x0:PCLK01: UEXTCLK11:FCLK/n接收模式3:200:關閉01:中斷模式或者查詢模式發送模式1:000:關閉01:中斷模式或者查詢模式
12、 從表2和圖2可以看出,UCONn的第1011位用于選擇波特率發生器的輸入時鐘。咱們接下來的實驗選擇的是PCLK。 UBRDIVn(UART BAUD RATE DIVISOR REGISTER) 主要用于設置波特率。 UART模塊有3個UART波特率除數寄存器:UBRDIV0、UBRDIV1和UBRDIV2。根據所需的波特率和選定的時鐘源,波特率
13、除數寄存器(UBRDIVn)的值可以用如下計算得到: UBRDIVn=(int)(UART clock / (baud rate×16)-1 其中,UART clock對應著圖2中波特率發生器的3種輸入時鐘的一個,baud rate是用戶所需要的波特率,最前面用了強制類型,將計算結果轉換為整數存儲在UBRDIVn中。 例如:如果要求串口通信的波特率是115 200,波特率發生器的輸入時鐘選擇PCLK=50MHz,那么
14、160; UBRDIVn=(int)(50 000 000 / (115 200×16)-1
15、60; =(int)(27.1)-1 =27-1
16、 =26 UTRSTATn(UART TX/RX STATUS REGISTER)
17、 該寄存器包含發送和接收是否完成的狀態位。表4 UTRSTATn寄存器UTRSTATn位描述初始狀態發送空2當發送緩沖器無有效數據且最后一字節數據被發送后,該位自動置10:數據發送未完成1:發送空1接收數據就緒0當接收緩沖器中接收到有效數據后,該位自動置10:未接收到有效數據1:接收到有效數據0 咱們接下來的實驗中就用到這兩條語句: while(!(UTRSTAT0&(1<<2); /等待發送完成&
18、#160; while(!(UTRSTAT0&(1<<0); /查詢是否接收到有效數據 URXHn(UART RECEIVE BUFFER REGISTER ) 接收數據緩沖區寄存器,8位數據長度,當接收到數據后,從CPU可以從該寄存器讀取接收到的數據。 例如:使用UART第0通道從RXD接收數據可以使用以下方法:&
19、#160; unsigned char c; while(!(UTRSTAT0&(1<<0); /等待接收完畢 c=URXH0; UTXHn(UART TRANSMIT BUFFER REGISTER) 發送數據緩沖區寄存器,8位數據長度
20、,當發送數據時,將要發送的數據寫入該寄存器,即可自動發送。 例如:使用UART 第0通道發送數據可以使用以下方法: UTXH0=c; while(!(UTRSTAT0&(1<<2); /等待發送完成UART基礎實驗 本實驗要實現的功能:PC通過串口發送一個字符給S3C2440,S3C2440收到后通過串口發給
21、PC。該實驗的文件布局圖如下: main.c文件內容: #include"uart.h"int main() unsigned char a; Uart0_Init(115200); /初始化并設置波特率為115 200 while(1)
22、60;a=getc(); /獲取串口輸入的字符 putc(a);
23、0; /PC機顯示同通過串口接收到的字符 uart.c文件內容:#include<s3c2440.h>#include"uart.h"#define PCLK 50000000#define UART_BRD (int)(PCLK/(baudrate*16)-1)/*函數名稱:void Uart0_Init(unsigned int baudrate)*參數說明:baudr
24、ate:波特率*返 回 值:無*全局變量: 無*功 能:對UART0進行初始化 */void Uart0_Init(unsigned int baudrate) GPHCON&=(3<<4)|(3<<6);&
25、#160; /GPH2-TXD0;GPH3-RXD0 GPHCON|=(2<<4)|(2<<6); /設置GPH2、GPH3為TXD0、RXD0功能 GPHUP=0x00; /上拉電阻使能 ULCON0|=0x03;
26、60; /設置數據發送格式:8個數據位,1個停止位,無校驗位 UCON0=0x05; /發送模式和接收模式都使用查詢模式 UBRDIV0=UART_BRD;
27、160; /設置波特率,其中波特率作為一個參數傳遞到該初始化函數 URXH0=0; /將URXH0清零/*函數名稱:void putc(unsigned char c)*參數說明:c:通過串口接收到的字符,注意這里是8位數據*返 回 值:無*全局變量: 無*功 能:將
28、通過串口接收到的字符發送給PC機并顯示在* 串口調試工具。 */void putc(unsigned char c) UTXH0=c; while(!(UTRSTAT0&(1<<2); &
29、#160; /等待發送完成/*函數名稱:unsigned char getc(void)*參數說明:無*返 回 值:c:通過串口接收到的字符,注意這里是8位數據*全局變量: 無*功 能:接收并保存通過串口輸入的數據 */unsigned ch
30、ar getc(void) unsigned char c; while(!(UTRSTAT0&(1<<0); /查詢是否接收到有效數據 c=URXH0; return c; uart.h文件內容: #ifndef _UART_H_#define _UART_H_/*函數名稱:void Uart0_Init(u
31、nsigned int baudrate)*參數說明:baudrate:波特率*返 回 值:無*全局變量: 無*功 能:對UART0進行初始化 */void Uart0_Init(unsigned int baudrate);/*函數名稱:void putc(unsigned char c)*參數說明:c:通過串口接收到的字符,注意這里是8位數據*返 回 值:無*全局變量: 無*功 &
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2015年全國高中數學聯合競賽一試解答(A卷)
- 品牌家具加盟合同協議
- 悉尼車位出租合同協議
- 售電公司售電合同協議
- 咨詢費置換股權合同協議
- 商務汽車合同協議
- 戀愛同伙協議書范本
- 商品出口購貨協議書范本
- 快銷品銷售合同代理協議
- 微信工作協議解除合同
- 民用爆破器材產品出廠基準價格表
- 最新2013版建設工程量清單計價規范及房建工程量計算規范應用解讀(實例講解350P)
- 情緒管理和壓力疏導講稿課件
- 新版導師制度課件
- 中職STOLL電腦橫機操作
- 耳部疾病 課件
- 紫色卡通萬圣節節日活動策劃PPT模板
- 《跨境電商美工實務》完整版課件全套ppt教學教程-最全電子講義(最新)
- 藍海華騰變頻器說明書
- 空氣質量連續監測系統日常巡檢維護記錄表
- 第二套全國中小學校園集體舞圖解
評論
0/150
提交評論