新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > S3C2440 UART串口驅動

        S3C2440 UART串口驅動

        作者: 時間:2016-11-20 來源:網絡 收藏

        1.1UART串口

        通用異步接收器和發送器(Universal Asynchronous Receiver and Transmitter)簡稱UART。通常是嵌入式設備中默認都會配置的通信接口。這是因為,很多嵌入式設備沒有顯示屏,無法獲得嵌入式設備實時數據信息,通過UART串口和超級終端相連,打印嵌入式設備輸出信息。并且在對嵌入式系統進行跟蹤和調試時,UART串口了是必要的通信手段。比如:網絡路由器,交換機等都要通過串口來進行配置。UART串口還是許多硬件數據輸出的主要接口,如GPS接收器就是通過UART串口輸出GPS接收數據的。

        1.1.1異步通信和同步通信


        圖2-56同步信號與異步信號
        同步通信技術
        在發送數據信號的時候,會同時送出一根同步時鐘信號,用來同步發送方和接收方的數據采樣頻率。如圖2-56所示,同步通信時,信號線1是一根同步時鐘信號線,以固定的頻率進行電平的切換,其頻率周期為t,在每個電平的上升沿之后進行對同步送出的數據信號線2進行采樣(高電平代表1,低電平代表0),根據采樣數據電平高低取得輸出數據信息。如果雙方沒有同步時鐘的話,那么接收方就不知道采樣周期,也就不能正常的取得數據信息。
        異步通信技術
        在異步通信技術中,數據發送方和數據接收方沒有同步時鐘,只有數據信號線,只不過發送端和接收端會按照協商好的協議(固定頻率)來進行數據采樣。數據發送方以每秒鐘57600bits的速度發送數據,接收方也以57600bits的速度去接收數據,這樣就可以保證數據的有效和正確。通常異步通信中使用波特率(Baud-Rate)來規定雙方傳輸速度,其單位為bps(bits per second每秒傳輸位數)。

        1.1.2數據的串行和并行通信方式

        串行通信好比是一列縱隊,每個數據元素依次縱向排列。如圖2-57所示,傳輸時一個比特一個比特的串行傳輸,每個時鐘周期傳輸一個比特,這種傳輸方式相對比較簡單,速度較慢,但是使用總線數較少,通常一根接收線,一根發送線即可實現串行通信。它的缺點是要增加額外的數據來控制一個數據幀的開始和結束。
        并行通信好比一排橫隊,齊頭并進同時傳輸。這種通信方式每個時鐘周期傳輸的數據量和其總線寬度成正比,但是實現較為復雜。UART通信采用的是串行方式進行通信的。


        圖2-57串行數據通信與并行數據通信

        1.1.3數據通信傳輸模式

        在數據通信過程中,發送方和接收方為了實現數據的正確發送和接收,通常會有一個狀態寄存器來描述當前數據接收和發送狀態,當發送方有數據發送時,會查看發送狀態寄存器,看是否允許發送數據(如果上一次數據還沒有發送完畢,不允許繼續數據發送),在發送允許情況下再送出新數據。同樣,接收端通過查看接收狀態寄存器,確定是否有新數據到達,如果有數據到達,將去接收數據緩沖區讀取數據。
        (1)輪詢模式
        通過程序執行流,不停的檢測狀態寄存器的結果,如果當前可發送或接收,則發送或接收數據。其過程可以用下面偽代碼來表示。
        ;輪詢方式實現數據發送偽代碼
        Send(){
        While(1){
        if(發送狀態==可發送)
        執行數據發送操作;
        }
        }

        ;輪詢方式實現數據接收偽代碼
        Receive(){
        While(1){
        if(接收狀態==有數據到達)
        執行數據接收操作;
        }
        }
        由程序可知,這種方式實現簡單,但在進行數據接收和發送時都要進入循環檢查狀態寄存器的值,當沒有數據到達或數據不可發送時,CPU會一直空轉,其它程序又得不到CPU的執行權,很影響系統的效率。
        (2)中斷模式
        中斷方式是指,當數據到達或數據可發送時,產生中斷,通知CPU去發送或接收數據,這種方式將通信硬件和CPU獨立出來,通信硬件只有在發送或接收條件準備好之后中,才通知CPU去處理數據,在通信條件沒有準備好的時候,CPU去處理其它程序,顯然這種方式更合理,這種方式要求通信硬件要求比較高,需要支持產生中斷信號。
        (3)DMA模式
        通常實現數據的轉移或拷貝時,CPU將從源地址處復制數據到寄存器,然后將寄存器數據再寫入目的地址處,該復制過程需要CPU來執行。S3C2440支持DMA傳輸模式,DMA傳輸是指在CPU不干涉的情況下,DMA硬件自動實現數據的轉移和復制,在DMA傳輸過程中,CPU幾乎不用干涉,這樣可以讓CPU安心的去做自己的事情。雖然如此,但是DMA在傳輸數據過程中要占用總線,在大批數據傳輸時,系統總線會被DMA通道占用,也會影響系統的效率。S3C2440 UART控制器支持DMA方式傳輸串口通信數據。

        1.1.4S3C2440 UART控制器

        S3C2440 UART控制器,提供了三個獨立的異步串行I/O端口,每個端口都可以在中斷模式或DMA模式下工作,換而言之,UART可以生成中斷或DMA請求用于CPU和UART之間的數據傳輸。UART串口掛接在APB總線上,APB總線最高可以達到50MHz工作頻率,在使用APB時鐘頻率時可以達到最高115.2Kbps波特率的通信速度。如果UART串口接收外部設備提供UEXTCLK(外部時鐘),UART可以在更高的速度下工作。每個UART串口在接收裝置和發送裝置里分別包含一個64Byte的FIFO緩沖區,用于緩存發送數據和接收數據。
        由于UART是串行異步通信方式,因此在UART通信過程中每次只能傳輸1位(bit),若干位組成一個數據幀(frame),幀是UART通信中最基本單元,它主要包含:開始位,數據位,校驗位(如果開啟了數據校驗,要包含校驗位),和停止位,幀結構如圖2-58所示。


        圖2-58 UART數據幀結構
        UART在通信之前要在發送端和接收端約定好幀結構,也就是約定好傳輸數據幀格式。
        l開始位:必須包含在數據幀中,表示一個幀的開始。
        l數據位:可選5,6,7,8位,該位長度可由編程人員指定。
        l校驗位:如果在開啟了數據校驗時,該位必須指定。
        l停止位:可選1,2位,該位長度可由編程人員指定。
        通信雙方約定好幀格式后,指定同一波特率,以保證雙方數據傳輸的同步。

        1.1.5S3C2440 UART串口工作原理

        每個UART包含一個波特率產生器,發送器,接收器和一個控制單元,如下圖所示:


        圖2-59 UART硬件結構
        UART是以異步方式實現通信的,其采樣速度由波特率決定,波特率產生器的工作頻率可以由PCLK(外圍設備頻率),FCLK/n(CPU工作頻率的分頻),UEXTCLK(外部輸入時鐘)三個時鐘作為輸入頻率,波特率設置寄存器是可編程的,用戶可以設置其波特率決定發送和接收的頻率。發送器和接收器包含了64Byte的FIFO和數據移位器。UART通信是面向字節流的,待發送數據寫到FIFO之后,被拷貝到數據移位器(1字節大小)里,數據通過發送數據管腳TXDn發出。同樣道理,接收數據通過RXDn管腳來接收數據(1字節大小)到接收移位器,然后將其拷貝到FIFO接收緩沖區里。
        (1)數據發送
        發送的數據幀可編程的,它的一個幀長度是用戶指定的,它包括一個開始位,5~8個數據位,一個可選的奇偶校驗位和1~2個停止位,數據幀格式可以通過設置ULCONn寄存器來設置。發送器也可以產生一個終止信號,它是由一個全部為0的數據幀組成。在當前發送數據被完全傳輸完以后,該模塊發送一個終止信號。在終止信號發送后,它可以繼續通過FIFO(FIFO)或發送保持寄存器(NON-FIFO)發送數據。
        (2)數據接收
        同樣接收端的數據也是可編程的,接收器可以偵測到溢出錯誤奇偶校驗錯誤,幀錯誤和終止條件,每個錯誤都可以設置一個錯誤標志。
        l溢出錯誤是指在舊數據被讀取到之前,新數據覆蓋了舊數據
        l奇偶校驗錯誤是指接收器偵測到了接收數據校驗結果失敗,接收數據無效
        l幀錯誤是指接收到的數據沒有一個有效的停止位,無法判定數據幀結束
        l終止條件是指RxDn接收到保持邏輯0狀態持續長于一個數據幀的傳輸時間
        (3)自動流控AFC(Auto Float Control)
        UART0和UART1支持有nRTS和nCTS的自動流控,UART2不支持流控。在AFC情況下,通信雙方nRTS和nCTS管腳分別連接對方的nCTS和nRTS管腳。通過軟件控制數據幀的發送和接收。
        在開啟AFC時,發送端接收發送前要判斷nCTS信號狀態,當接收到nCTS激活信號時,發送數據幀。該nCTS管腳連接對方nRTS管腳。接收端在準備接收數據幀前,其接收器FIFO有大于32個字節的空閑空間,nRTS管腳會發送激活信號,當其接收FIFO小于32個字節的空閑空間,nRTS必須置非激活狀態。如圖2-60所示。


        圖2-60自動流控數據傳輸
        (4)波特率
        在UART中波特率發生器為發送器和接收器提供工作時鐘。波特率發生器的時鐘源可以選擇S3C2440A的內部系統時鐘(PCLK,FCLK/n)或UEXTCLK(外部時鐘源),可以通過設置UCONn寄存器來設置波特率發生器的輸入時鐘源。通常我們選擇使用PCLK作為UART工作時鐘。
        UART控制器中沒有對波特率進行設置的寄存器,而是通過設置一個除數因子,來決定其波特率。其計算公式如下:
        UART除數(UBRDIVn)= (int)(CLK/(buad rate * 16 )) - 1
        其中:UBRDIVn的取值范圍應該為1~2^16-1。例如:波特率為115200bps,PCLK時鐘為其工作頻率,采用50MHz,UBRDIVn為:
        UBRDIVn = (int)(50M / (115200 x 16)) - 1 = 26
        在系統時鐘未初始化時,PCLK = 12MHz,如果波特率采用57600bps,那么UBRDIVn為:
        UBRDIVn = (int)(12M / (57600 x 16)) - 1 = 12
        當使用外部時鐘源時,如果外部時鐘小于PCLK時鐘,則UEXTCLK應該設置為0。
        (5)波特率的錯誤容忍率(Baud-Rate Error Torlerance)
        數據信號在傳輸過程中由于外界電磁干擾,信號減弱等原因,當時鐘頻率較低,傳輸速率較高時會產生誤差,當誤差達到一定值時,會出現數據信號不能正常識別,造成通信異常。好比如,在普通列車軌道上試圖行駛高速列車一樣,由于高速列車對軌道要求很高,當速度達到一定程度,很可能造成事故。業界的波特率的錯誤容忍率為1.86%(3 / 160),如果大于該值則應該選擇較低的波特率或提高輸入時鐘頻率。
        錯誤容忍率計算公式為:
        UART Error = (tUPCLK - tUEXACT)/ tUEXACT * 100%
        注:tUPCLK為UART的真實工作時鐘頻率:tUPCLK = (UBRDIVn + 1) * 16 * 1Frame / PCLK
        tUEXACT為UART理想工作時鐘頻率:tUEXACT = 1Frame / baud-rate
        其中:1Frame為數據幀的長度=開始位+數據位+可選校驗位+停止位
        假如,波特率采用115200bps,PCLK時鐘為50MHz,波特率除數因子UBRDIVn為26(通過前面UBRDIVn計算公式算出),采用1個停止位,8個數據位,無校驗的8N1方式通信時,其錯誤容忍率為:
        tUPCLK = 27 * 16 * 10 / 50M = 0.0000864
        tUEXACT = 10 / 115200 = 0.0000868
        UART Error= | 0.0000864 - 0.0000868 | / 0.0000868 = 0.46%
        在開發板沒有初始化系統時鐘前,開發板工作在12MHz下,假如我們將波特率設置為115200bps,采用PCLK為系統默認時鐘12MHz,8N1數據幀格式通信,那么:
        UBRDIVn = (int)(12M / (115200 * 16)) - 1 = 6
        其錯誤容忍率:
        tUPCLK = 7 * 16 * 10 / 12M = 0.0000933
        tUEXACT = 10 / 115200 = 0.0000868
        UART Error = | 0.0000933 - 0.0000868 | / 0.0000868 = 7.5%
        其錯誤容忍率大于1.86%,因此在12MHz頻率下,波特率不能設置為115200,現在將波特率設置為56700bps,采用8N1數據幀格式通信,那么:
        UBRDIVn = (int)(12M / (57600 * 16)) - 1 = 12
        tUPCLK = 13 * 16 * 10 / 12M = 0.000173
        tUEXACT = 10 / 57600 = 0.0001736
        UART Error = | 0. 000173 - 0. 0001736 | / 0. 0001736 = 0.345%
        采用波特率為56700bps,8N1數據幀格式通信時,其錯誤容忍率小于標準的1.86%,因此可以正常工作。

        圖2-61 MINI2440開發板串口硬件圖
        UART的接口
        圖2-61為MINI2440開發板引出UART串口接線圖,它采用DB9接口公頭(有接線柱的端口,只有接線孔的為母頭),其有9根信號線,UART通信過程中用到了信號線2 RSTXD0(數據發送管腳)它和串口線母頭TXDx信號線相接(x代表0號,1號,2號串口),信號3 RSRXD0(數據接收管腳)和串口線母頭RXDx相接(x代表0號,1號,2號串口),信號線5(接地管腳),信號線7 RSCTS0(數據發送流控制管腳)和串口線母頭nCTSx相接,信號線8 RSRTS0(數據接收流控制管腳)和串口線母頭nRTSx相接。如果UART中沒有開啟AFC流控的話,只要用到信號線2,信號線3和信號線5。


        圖2-62 MINI2440串口管腳接線
        通過MINI2440硬件CPU管腳圖可以看出,RSTXD0和RSRXD0連接到CPU的GPH2和GPH3管腳上的,而GPH2和GPH3是CPU復用管腳,因此我們要對GPH2和GPH3對應寄存器進行設置,其對應寄存器為GPHCON。
        表2-23 GPIO端口H設置寄存器(GPHCON)
        寄存器名地址是否讀寫描述復位默認值
        GPHCON0x56000070R/WGPIO端口H配置寄存器0x0
        GPHDAT0x56000074R/WGPIO端口H數據寄存器未定義
        GPHUP0x56000078R/WGPIO端口H上拉無效寄存器0x000

        GPHCON描述初始值
        GPH3[7:6]設置當前管腳功能:
        00 =輸入端口01 =輸出端口
        10 = RXD[0]配置為串口0的接收數據管腳
        11 =保留
        0
        GPH2[5:4]設置當前管腳功能:
        00 =輸入端口01 =輸出端口
        10 = RXD[0]配置為串口0的接收數據管腳
        11 =保留
        0
        GPHCON[7:6]和GPHCON[5:4]為RSTXD0和RSRXD0管腳設置位,將其功能設置為了UART專用通信管腳,因此應該設置其為0b10,分別用于UART數據的接收和發送。
        GPHCON | = 0xa0;
        表2-24 GPIO端口H上拉電阻設置寄存器(GPHUP)
        GPHUP描述初始值
        GPH[10:0][10:0]設置對應管腳GPHn的是否啟用上拉功能
        0 =啟用上拉功能
        1 =禁用上拉功能
        0
        GPHUP上拉電阻設置寄存器:上拉電阻用來穩定電平信號,保障傳輸數據的正確,GPHUP里設置其內部上拉。
        GPHUP = 0x0;
        表2-25 UART0串行控制寄存器(ULCON0)
        寄存器名地址是否讀寫描述復位默認值
        ULCON00x50000000R/W串口0串行控制寄存器0x00

        ULCON0描述初始值
        保留[7]0
        紅外模式[6]選擇串口0是否使用紅外模式:
        0 =正常通信模式
        1 =紅外通信模式
        0
        校驗模式[5:3]設置串口0在數據接收和發送時采用的校驗方式:
        0xx =無校驗
        100 =奇校驗
        101 =偶校驗
        110 =強制校驗/檢測是否為1
        111 =強制校驗/檢測是否為0
        000
        停止位[2]設置串口0停止位數:
        0 =每個數據幀一個停止位
        1 =每個數據幀二個停止位
        0
        數據位[1:0]設置串口0數據位數:
        00 = 5個數據位01 = 6個數據位
        10 = 7個數據位11 = 8個數據位
        00
        通過設置ULCON0來設置UART0通信方式,ULCON0[6]選擇通信方式為一般通信模式或紅外通信模式,ULCON0[5:3]設置串口0校驗方式,ULCON0[2]設置串口0停止位數,ULCON0[1:0]設置串口0的數據位數。
        我們選擇一般通信模式,無校驗位,1個停止位,8個數據位的數據通信方式。因此:
        ULCON0 = 0x03;
        表2-26 UART0串口控制寄存器(UCON0)
        寄存器名地址是否讀寫描述復位默認值
        UCON00x50000004R/W串口0控制寄存器0x00

        UCON0描述初始值
        FCLK分頻因子[15:12]當UART0選擇FCLK作為時鐘源時,設置其FCLK的分頻因子
        UART0工作時鐘頻率= FCLK/ FCLK分頻因子+ 6
        0000
        UART時鐘源選擇[11:10]選擇UART0的工作時鐘PCLK,UEXTCLK,FCLK/n:
        00,10 = PCLK
        01 = UEXTCLK
        11 = FCLK/n
        當選擇FCLK/n作為UART0工作時鐘時還要做其它設置,具體請讀者自行查看硬件手冊
        00
        發送數據中斷
        產生類型
        [9]設置UART0中斷請求類型,在非FIFO傳輸模式下,一旦發送數據緩沖區為空,立即產生中斷信號,在FIFO傳輸模式下達到發送數據觸發條件時立即產生中斷信號:
        0 =脈沖觸發
        1 =電平觸發
        0
        接收數據中斷
        產生類型
        [8]設置UART0中斷請求類型,在非FIFO傳輸模式下,一旦接收到數據,立即產生中斷信號,在FIFO傳輸模式下達到接收數據觸發條件時立即產生中斷信號:
        0 =脈沖觸發
        1 =電平觸發
        0
        接收數據超時[7]設置當接收數據時,如果數據超時,是否產生接收中斷:
        0 =不開啟超時中斷1 =開啟超時中斷
        10 = 7個數據位11 = 8個數據位
        0
        接收數據錯誤中斷[6]設置當接收數據時,如果產生異常,如傳輸中止,幀錯誤,校驗錯誤時,是否產生接收狀態中斷信號:
        0 =不產生錯誤狀態中斷1 =產生錯誤狀態中斷
        0
        回送模式[5]設置該位時UART會進入回送模式,該模式僅用于測試
        0 =正常模式1 =回送模式
        0
        發送終止信號[4]設置該位時,UART會發送一個幀長度的終止信號,發送完畢后,該位自動恢復為0
        0 =正常傳輸1 =發送終止信號
        0
        發送模式[3:2]設置采用哪個方式執行數據寫入發送緩沖區
        00 =無效
        01 =中斷請求或查詢模式
        10 = DMA0請求
        00
        接收模式[1:0]設置采用哪個方式執行數據寫入接收緩沖區
        00 =無效
        01 =中斷請求或查詢模式
        10 = DMA0請求
        00
        通常UART串口采用PCLK作為輸入工作時鐘,采用簡單的輪詢方式進行數據接收和發送,不開啟數據接收超時,數據產生錯誤時不產生錯誤狀態中斷,因此:
        UCON0 = 0x05;
        表2-27 UART FIFO控制寄存器(UFCON0)
        寄存器名地址是否讀寫描述復位默認值
        UFCON00x50000008R/W串口0 FIFO控制寄存器0x00

        UFCON0描述初始值
        發送數據
        觸發級別
        [7:6]設置FIFO發送模式的觸發級別:
        00 = FIFO為空觸發01 = 16字節觸發
        10 = 32字節觸發11 = 48字節觸發
        00
        接收數據
        觸發級別
        [5:4]設置FIFO接收模式的觸發級別:
        00 = FIFO為空觸發01 = 16字節觸發
        10 = 32字節觸發11 = 48字節觸發
        00
        保留[3]0
        發送FIFO重置[2]在重置FIFO后自動清除發送緩沖區
        0 =正常模式1 =自動清除
        0
        接收FIFO重置[1]在重置FIFO后自動清除接收緩沖區
        0 =正常模式1 =自動清除
        0
        啟用FIFO[0]0 =不啟用FIFO1 =啟用FIFO0
        表2-28 UART MODEM控制寄存器(UMCON0)
        寄存器名地址是否讀寫描述復位默認值
        UMCON00x5000000CR/W串口0MODEM控制寄存器0x00

        UMCON0描述初始值
        保留[7:5]必須全部置0000
        AFC自動流控[4]0 =不開啟流控1 =開啟流控0
        保留[3:1]必須全部置0000
        請求發送[0]如果啟用AFC,該位無效,S3C2440會自動控制nRTS,如果不啟用AFC,nRTS必須由軟件控制
        0 =高電平激活nRTS1 =低電平激活nRTS
        0

        表2-29 UART發送/接收狀態寄存器(UTRSTAT0)
        寄存器名地址是否讀寫描述復位默認值
        UTRSTAT00x50000010R/W串口0發送/接收狀態寄存器0x06

        UTRSTAT0描述初始值
        發送器為空[2]當發送緩存寄存器中沒有數據要發送且發送移位寄存器為空時,自動置1
        0 =非空
        1 =發送器為空(發送緩存和移位寄存器)
        1
        發送緩存寄存器為空[1]當發送緩存寄存器為空時,自動置1
        0 =發送緩存寄存器非空
        1 =發送緩存寄存器為空
        1
        接收緩存寄存器為空[0]當接收緩存寄存器有數據到達時,自動置1
        0 =接收緩存寄存器為空
        1 =緩存寄存器接收數據
        0

        表2-30 UART發送緩存寄存器(UTXH0)
        寄存器名地址是否讀寫描述復位默認值
        UTXH00x50000020(L)
        0x50000023(B)
        W串口0發送緩存寄存器-

        表2-31 UART接收緩存寄存器(URXH0)
        寄存器名地址是否讀寫描述復位默認值
        URXH00x50000024(L)
        0x50000027(B)
        R串口0接收緩存寄存器-
        表2-32 UART波特率除數寄存器(UBRDIV0)
        寄存器名地址是否讀寫描述復位默認值
        UBRDIV00x50000028R/W串口0波特率除數寄存器-

        UBRDIV0描述初始值
        波特率除數[15:0]設置波特率除數(大于0)使用外部輸入時鐘時可以置0-
        上述寄存器是是和UART通信相關寄存器,使用簡單的無FIFO,無自動流控AFC時,設置如下:
        UFCON0 = 0x00;//不使用FIFO
        UMCON0 = 0x00;//不使用流控
        UBRDIV0 = 26;//波特率為115200,PCLK=50Mhz
        UBRDIV0 = 53;//波特率為57600,PCLK=50Mhz
        UBRDIV0 = 12;//波特率為57600,PCLK=12Mhz
        UTXH0和URXH0分別是數據發送和接收寄存器,發送數據時通過輪詢方式判斷發送狀態寄存器的狀態,當可以發送數據時,執行UTXH0寄存器寫入操作,接收數據時,以輪詢方式檢測接收狀態寄存器狀態,當有數據到達時,讀取URXH0寄存器里的數據即可取得串口數據。
        #defineTXD0READY(1<<2)//發送數據狀態OK
        #defineRXD0READY(1)//接收數據狀態OK

        /* UART串口單個字符打印函數*/
        extern void putc(unsigned char c)
        {
        while( ! (UTRSTAT0 & TXD0READY) );
        UTXH0 = c;
        }

        /* UART串口接受單個字符函數*/
        extern unsigned char getc(void)
        {
        while( ! (UTRSTAT0 & RXD0READY) );
        return URXH0;
        }

        1.1.6UART串口驅動實驗

        init.s:本程序文件對看門狗,內存等基本硬件做初始化,然后跳入到xmain.c中的xmain函數執行。
        ;
        ; UART串口實驗
        ;

        GPBCONEQU0x56000010
        GPBDATEQU0x56000014
        AREA Init, CODE, READONLY
        ENTRY
        start
        ; close watchdog
        ldr r0, = 0x53000000;將看門狗控制寄存器地址放入r0
        mov r1, #0
        str r1, [r0];設置看門狗控制寄存器的值為0

        bl initmem;跳轉到initmem代碼段,初始化內存

        IMPORT xmain;引入main.c中的xmain函數
        ldr sp, =0x34000000;調用C程序之前先初始化棧指針
        ldr lr, =loop;設置xmain函數的返回地址
        ldr pc, =xmain;跳轉到C程序中的xmain函數的入口處執行

        loop
        b loop;死循環

        initmem;內存初始化
        ldr r0, =0x48000000;加載內存相關寄存器首地址r0
        ldr r1, =0x48000034;加載內存相關寄存器尾地址到r1
        adr r2, memdata;將寄存器配置數據地址段首地址加載到r2
        initmemloop
        ldr r3, [r2], #4;循環設置存寄存器
        str r3, [r0], #4
        teq r0, r1
        bne initmemloop;循環到最后一個寄存器時退出函數
        mov pc,lr

        memdata
        DCD0x22000000;BWSCON
        DCD0x00000700;BANKCON0
        DCD0x00000700;BANKCON1
        DCD0x00000700;BANKCON2
        DCD0x00000700;BANKCON3
        DCD0x00000700;BANKCON4
        DCD0x00000700;BANKCON5
        DCD0x00018005;BANKCON6
        DCD0x00018005;BANKCON7
        DCD0x008e07a3;REFRESH
        DCD0x000000b1;BANKSIZE
        DCD0x00000030;MRSRB6
        DCD0x00000030;MRSRB7

        END
        xmain.c:uart_init函數對UART0進行初始化,然后進入死循環內,不停打印字符串“Uart串口打印試驗”。
        /* xmain.c */

        /* GPIO registers */
        #defineGPHCON(*(volatile unsigned long *)0x56000070)
        #defineGPHDAT(*(volatile unsigned long *)0x56000074)
        #defineGPHUP(*(volatile unsigned long *)0x56000078)

        /*UART registers*/
        #defineULCON0(*(volatile unsigned long *)0x50000000)
        #defineUCON0(*(volatile unsigned long *)0x50000004)
        #defineUFCON0(*(volatile unsigned long *)0x50000008)
        #defineUMCON0(*(volatile unsigned long *)0x5000000c)
        #defineUTRSTAT0(*(volatile unsigned long *)0x50000010)
        #defineUTXH0(*(volatile unsigned char *)0x50000020)
        #defineURXH0(*(volatile unsigned char *)0x50000024)
        #defineUBRDIV0(*(volatile unsigned long *)0x50000028)

        #defineTXD0READY(1<<2)//發送數據狀態OK
        #defineRXD0READY(1)//接收數據狀態OK

        /* UART串口初始化*/
        void uart_init( )
        {
        GPHCON |= 0xa0;//GPH2,GPH3 used as TXD0,RXD0
        GPHUP= 0x0;//GPH2,GPH3內部上拉
        ULCON0= 0x03;//8N1
        UCON0= 0x05;//查詢方式為輪詢或中斷;時鐘選擇為PCLK
        UFCON0 = 0x00;//不使用FIFO
        UMCON0 = 0x00;//不使用流控
        UBRDIV0 = 12;//波特率為57600,PCLK=12Mhz
        }

        /* UART串口單個字符打印函數*/
        extern void putc(unsigned char c)
        {
        while( ! (UTRSTAT0 & TXD0READY) );
        UTXH0 = c;
        }

        /* UART串口接受單個字符函數*/
        extern unsigned char getc(void)
        {
        while( ! (UTRSTAT0 & RXD0READY) );
        return URXH0;
        }

        /* UART串口字符串打印函數*/
        extern int printk(const char* str)
        {
        int i = 0;
        while( str[i] ){
        putc( (unsigned char) str[i++] );
        }
        return i;
        }

        __inline void delay(int msec)
        {
        int i, j;
        for(i = 1000; i > 0; i--)
        for(j = msec*10; j > 0; j--)
        /* do nothing */;
        }

        /* xmain通過UART串口打印字符串*/
        int xmain()
        {
        uart_init();
        while(1) {
        delay(10);
        printk("Uart串口打印試驗/r/n");
        }
        return 0;
        }
        當編譯并將生成Norflash,在->所有程序->通訊mini2440,在之后彈出的COM波特率1個停止位,PC串口(筆記本通常沒有串口,可以買一個Uart串口打印試驗”字符串。


        關鍵詞: S3C2440UART串口驅

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 东辽县| 随州市| 万全县| 尼勒克县| 铜山县| 会泽县| 松滋市| 尼木县| 逊克县| 赤壁市| 蕉岭县| 怀柔区| 满洲里市| 武城县| 长葛市| 沛县| 泰兴市| 沁源县| 越西县| 民乐县| 潮州市| 宜川县| 新化县| 芦溪县| 临泽县| 惠东县| 峡江县| 禄丰县| 洪洞县| 新田县| 天祝| 萍乡市| 潮安县| 宽甸| 克山县| 新密市| 嘉祥县| 项城市| 镇远县| 乐至县| 沾益县|