JZ2440 裸機驅動 第11章 通用非同步收發器UART

来源:http://www.cnblogs.com/sz189981/archive/2017/10/22/7712409.html
-Advertisement-
Play Games

瞭解UART原理; 掌握S3C2410/S3C2440中UART的使用 ...


本章目標:

瞭解UART原理; 掌握S3C2410/S3C2440中UART的使用

11.1 UART原理及UART內部使用方法

11.1.1 UART原理說明

    UART用於傳輸串列數據:     發送數據時,CPU將並行數據寫入UART,UART按照一定的格式在一根電線上串列發出;     接收數據時,UART檢測另一根電線上的信號,將串列收集放在緩衝區中,CPU即可讀取 UART獲得這些數據。     UART之間以全雙工方式傳輸數據,最精簡的連接方式只有3根線:TxD、RxD、Gnd。     UART使用標準的TTL/CMOS邏輯電平(0~5V、0~3.3V、0~2.5V或0~1.8V)來表示數據, 高電平表示1,低電平表示0.為了增強數據抗干擾能力、提高傳輸長度,通常將TTL/CMOS 邏輯電平轉換為RS-232邏輯電平,3~12V表示0,-3~-12V表示1。

11.1.2 S3C2410/S3C2440 UART的特性

    S3C2410/S3C2440中UART功能類似,有3個獨立的通道,每個通道都可以工作於中斷 或DMA模式。即UART可以發出中斷或DMA請求以便在UART、CPU間傳輸數據。     UART由波特率發生器、發送器、接收器和控制邏輯組成。     使用系統時鐘時,S3C2410的UART波特率可以達到230.4Kbit/s,S3C2440則可以達到 115.2Kbit/s;如果使用UEXTCLK引腳提供的外部時鐘,則可以達到更高的波特率。波特率 可以通過編程進行控制。     S3C2410 UART的每個通道都有16位元組的發送FIFO和16位元組的接收FIFO,S3C2440 UART 的FIFO深度為64。     S3C2410/S3C2440 UART的每個通道支持的停止位有1、2位,數據位有5、6、7或8位, 支持校驗功能,另外還有紅外發送/接收功能。

11.1.3 S3C2410/S3C2440 UART的使用

    在使用UART之前需要設置波特率、傳輸格式(多少數據位、是否使用校驗位、是奇校驗 還是偶校驗、有多少停止位、是否使用流量控制);對於S3C2410/S3C2440,還要選擇所涉及 管腳為UART功能、選擇UART通道的工作模式為中斷模式或DMA模式。設置好之後,向某個寄存器 中寫入數據即可發送,讀取某個寄存器即可得到接收到的數據。可以通過查詢狀態寄存器或 設置中斷來獲知數據是否已經發送完畢、是否已經接收到數據。     針對上述過程,下麵一一說明。 1.將所涉及的UART通道管腳設為UART功能 2.UBRDIVn寄存器(UART BAUD RATE DIVISOR):設置波特率     S3C2410 UART 的時鐘源有兩種選擇:PCLK、UEXTCLK;S3C2440 UART的時鐘源有 三種選擇:PCLK、UEXTCLK、FCLK/n,其中n的值通過UCON0~UCON2聯合設置。     根據給定的波特率、所選擇的時鐘源的頻率,可以通過如下公式計算UBRDIVn寄 存器(n為0~2,對應3個UART通道)的值。     UBRDIVn = (int)(UART clock / (buad rate * 16)) - 1     上面計算出來的UBRDIVn寄存器不一定是整數,只要其誤差在1.87%之內即可。誤 差計算公式如下:     tUPCLK = (UBRDIVn + 1) * 16 * 1Frame/(UART clock)    //實際的UART時鐘     tUEXACT = 1Frame / baud-rate                  //理論的UART時鐘     UART error = (tUPCLK - tUEXACT) / tUEXACT * 100%     //誤差 3.ULCONn寄存器(n:0~2)(UART LINE CONTROL):設置傳輸格式 4.UCONn寄存器(UART CONTROL)     UCONn寄存器用於選擇UART時鐘源、設置UART中斷方式等。由於S3C2410的UART 只有兩個時鐘源,S3C2440有3個時鐘源,所以在選擇和設置時鐘源時有所不同。     S3C2410的UCONn寄存器格式如下表11.2所示。     S3C2440的UCONn寄存器在UART時鐘的選擇方面與S3C2410有所不同,從位[10]往上 的位含義不一樣,並且原來的位[4]用於徐娜則是否發出“break”信號,這些位的含義 如表11.3所示。     UCON0、UCON1、UCON2這三個寄存器的位[15:12]一起用來確定n的值,它們的意義如下。     (1)UCON2[15]:“FCLK/n”使能位。     它等於0時,禁止使用“FCLK/n”作為UART時鐘源;等於1時,可以用作UART時鐘源。     (2)n的值設置。     UCON0[15:12]、UCON1[15:12]、UCON2[14:12]三者用於設置n的值,當其中一個被射程非 0時,其他兩個必須為0.     ① n的值處於7~21處時,UART時鐘 = FCLK/(divider + 6),divider 為UCON0[15:12]的值,大於0。      ② n的值處於22~36時,UART時鐘 = FCLK/(divider + 21),divider為UCON1[15:12]的值,大於0。     ③ n的值處於37~43時,UART時鐘 = FCLK/(divider + 36),divider為UCON2[14:12]的值,大於0.     ④ UCON0[15:12]、UCON1[15:12]、UCON2[14:12]都等於0時,UART時鐘:FCLK/44。 5.UFCONn寄存器(UART FIFO CONTROL)、UFSTATn寄存器(UART FIFO STATUS)     UFCONn寄存器用於設置是否使用FIFO,設置個FIFO的觸發值。並可以通過設置UFCONn 寄存器來複位個寄存器。     讀取UFSTATn寄存器可以知道各個FIFO是否已經滿、其中有多少個數據。     不使用FIFO時,可以認為FIFO的深度為1,使用FIFO時,S3C2410的FIFO深度為16, S3C2440的FIFO深度為64.這兩類寄存器各位的含義請參考數據手冊,後面的實例部分沒有 使用FIFO。 6.UMCONn寄存器(UART MODEM CONTROL)、UMSTATn寄存器(UART MODEM STATUS)     這兩類寄存器用於流控,這裡不介紹。 7.UTRSTATn寄存器(UART TX/RX STATUS)     UTRSTATn寄存器用於表明數據是否已經發送完畢、是否已經接收到數據,格式如表11.4 所示。緩衝區起始就是圖11.3中的FIFO,只不過不使用FIFO功能時可以認為其深度為1。 8.UERSTATn寄存器(UART ERROR STATUS)     用於表示各種錯誤是否發生,位[0]~位[3]為1時分別表示溢出錯誤、校驗錯誤、幀錯誤、 檢測到“break”信號。讀取這個寄存器時,它會自動清零。     註意:接收數據時,如果使用FIFO,則UART內部會使用一個“錯誤FIFO”來表明接收FIFO 中哪個數據在接收過程中發生了錯誤。CPU只有在讀出這個錯誤的數據時,才會察覺到發生了錯 誤。要想清除“錯誤FIFO”,則必須讀出錯誤的數據,並讀出UERSTATn寄存器。 9.UTXHn寄存器(UART TRANSMIT BUFFER REGISTER)     CPU將數據寫入這個寄存器,UART即將它保存到緩衝區中,並自動發送出去。 10.URXHn寄存器(UART RECEIVE BUFFER REGISTER)     當UART接收到數據時,CPU讀取這個寄存器,即可獲得數據。

11.2 UART 操作實例

11.2.1 代碼詳解

    本實例代碼在/work/hardware/uart目錄下。目的是在串口上輸入一個字元,單板收到後將 它的ASCII值加1後,從串口輸出。     首先設置MPLL提高系統時鐘,令PCLK為50MHz,UART將選擇PCLK作為時鐘源。將代碼複製到 SDRAM之後,調用main函數。這些代碼與第10章相似。重點在於main函數對UART0的初始化、收發 數據,這由3個函數實現:usat0_init、getc和putc,它們在serial.c文件中。 1.UART初始化     uart0_init函數代碼如下:
 1 #define PCLK              50000000    //init.c中的clock_init函數設置PCLK為50MHz
 2 #define UART_CLK          PCLK        //UART0的時鐘源設為PCLK
 3 #define UART_BAUD_RATE    115200      
 4 #define UART_BRD          ((UART_CLK / (UART_BAUD_RATE * 16)) - 1)
 5 
 6 /*
 7 *初始化UART0
 8 *115200, 8N1, 無流控
 9 */
10 void uart0_init(void)
11 {
12     GPHCON |= 0xa0;    //GPH2、GPH3用作TXD0、RXD0
13     GPHUP   = 0x0c;    //GPH2、GPH3內部上拉
14     
15     ULCON0 = 0x03;    //波特率:115200,8N1
16     UCON0  = 0x05;    //查詢方式,UART時鐘源為PCLK
17     UFCON0 = 0x00;    //不使用FIFO
18     UMCON0 = 0x00;    //不使用流控
19     UBRDIV0 = UART_BRD;    //波特率:115200
20 }
serial.c->uart0_init() 2.發送字元的函數     本實例不使用FIFO,發送字元前,先判斷上一個字元是否已經發送出去。如果沒有, 則不斷查詢UTRSTAT0寄存器的位[2],當它為1時表示已經發送完畢。於是,即可向UTXH0寄 存器中寫入要發送的字元。代碼如下(巨集TXD0READY被定義為“(1 << 2)”):
 1 /*
 2 *發送一個字元
 3 */
 4 void putc(unaigned char c)
 5 {
 6     /*等待,直到發送緩衝區中的數據已經全部發送出去*/
 7     while(!(UTRSTAT0 & TXD0READY));
 8     
 9     /*向UTXH0寄存器中寫數據,UART自動將其發送出去*/
10     UTXH0 = c;
11 }
serial.c->putc() 3.接收字元的函數     試圖讀取數據前,先查詢UTRSTAT0寄存器的位[1],當它為1時,表示接收緩衝區中有數據。 於是,即可讀取URXH0得到數據。代碼如下(巨集RXD0READY被定義為“(1)”):
 1 /*
 2 *接收字元
 3 */
 4 unsigned char getc(void)
 5 {
 6     /*等待,知道接收緩衝區中有數據*/
 7     while(!(UTRSTAT0 & RXD0READY));
 8     
 9     /*直接讀取URXH0寄存器,即可獲得接收到的數據*/
10     return URXH0;
11 }
serial.c->getc() 4.主函數     初始化完UART0之後,不斷地讀取串口數據,並判斷它是否是數據或字元。如果是的話, 將它加1後從串口輸出。代碼如下:
 1 #include "serial.h"
 2 
 3 int main()
 4 {
 5     unsigned char c;
 6     uart0_init();    //波特率:115200,8N1
 7     
 8     while(1)
 9     {
10         //從串口接收數據後,判斷其是否為數字或字母,若是則加1後輸出
11         c = getc();
12         if(isDigit(c) || (isLetter(c)))
13             putc(c+1);
14     }
15     
16     return 0;
17 }
main.c

11.2.2 實例測試

1.PC上的串口工具推薦     Windows下推薦使用SecureCRT工具,Linux下推薦使用kermit。     下麵介紹在Linux下安裝、使用kermit的方法。     確保Linux能上網,然後使用下麵命令安裝,會安裝一個kermit命令。
$ sudo apt-get install ckermit
    在使用kermit之前,先建立一個配置文件,在/home/book(假設用戶名為book)目錄下創 建名為.kermrc的文件,內容如下:
 1 set line /dev/ttyS0
 2 set speed 115200
 3 set carrier-watch off
 4 set handshake none
 5 set flow-control none
 6 robust
 7 set file type bin
 8 set file name lit
 9 set rec  pack 1000
10 set send pack 1000
11 set window 5
配置kermrc     然後,運行“$ sudo kermit -c”命令即可開啟串口:要關閉串口,可以先輸入 “Ctrl+\”,然後按住“C”鍵,最後輸入“exit”後回車。 2. 測試方法     首先使用串口線將開發板的COM0和PC的串口連接,打開PC上的串口工具並設置其波 特率為115200、8N1。     然後,在uart目錄下運行make命令生成可執行文件uart.bin,將它燒入NAND Flash 中運行。     最後,在PC上串口工具中輸入數字或字母,可以看到輸出另一個字元(加了1):如果 輸入其他字元,則無輸出。     /work/hardware/stdio目錄下的程式在串口0上實現printf、scanf等函數,它使用 scanf、sscanf和printf等函數從串口接收一個十進位數字序列,然後將它轉換為十六進位 輸出。步驟與UART實例相似,讀者可自行操作。 附:代碼: 鏈接: https://pan.baidu.com/s/1kV24a9L 密碼: tfab
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一:sqlserver 執行計劃介紹 sqlserver 執行計是在sqlser manager studio 工具中打開,是檢查一條sql執行效率的工具。建議配合SET STATISTICS IO ON等語句來一起使用,執行計劃是從右向左看,耗時高的一般顯示在右邊,我們知道,sqlserver 查 ...
  • 例:MySQL5.7.19 下載 當然首先是要下載咯https://dev.mysql.com/downloads/mysql/ 官網下載地址。 選擇適合自己電腦的版本,點擊Download,跳轉,直接No thanks下載好了。 靜靜的等待下載,解壓。這是我的解壓路徑D:\MySQL 正式開始安裝 ...
  • Redis4.0 Cluster — Centos7, Ruby redis-trib.rb , gem redis ...
  • 一、安裝包 先從網路上,下載Mysql安裝包,複製到U盤 下載地址:https://dev.mysql.com/downloads/mysql/ 二、掛載U盤 2.1查看分區 先輸入命令 cat /proc/partitions 插入U盤,重新輸入命令 cat /proc/partitions 結果 ...
  • 熟悉Oracle上機環境及Oracle客戶端的配置;熟練掌握和使用DDL語言,建立、修改和刪除資料庫表、主鍵、外鍵約束關係和索引。 (修改資料庫表名) 將資料庫表S1改名為Student_Temp。 在定義外鍵約束條件時,不能把其他表中沒有的屬性定義在本表的外鍵中,否則會生辰一個錯誤; 在建表時,因 ...
  • 一、流程式控制制語句 1) 迴圈語句 == loop .. end loop 簡單的迴圈,至少被執行一次 == while ... loop end loop == for 2) 控制語句 == goto 用於跳轉到指定的標號去執行,不建議使用 語法: goto 標號名 == null 語句 null語 ...
  • 一、概述 pl/sql (procedural lanaguage/sql)是 oracle 在標準 sql 上的擴展 。不僅允許嵌入sql 語言,還可以定義變數和常量,允許使用條件語句和迴圈語句,允許使用例外處理錯誤。 -- 可以用來編寫過程,函數,和觸發器 -- 上述對象是放在資料庫中的 //數 ...
  • 工作中遇到的數據更新,學習記錄。 1、使用update進行數據更新 1)最簡單的更新 update tablea a set a.price=1.00 2)帶條件的數據更新 update tablea a set a.price = 2.00 where a.id='02' 3)兩張表關聯更新為固定 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...