女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

UART的原理以及驅動程序如何編寫

GReq_mcu168 ? 來源:玩轉單片機 ? 作者:玩轉單片機 ? 2020-12-09 16:14 ? 次閱讀

前言

Uart在一個嵌入式系統中是一個非常重要的模塊,他承擔了CPU與用戶交互的橋梁。用戶輸入信息給程序、CPU要打印一些信息給終端都要依賴UART。

本文將以Exynos4412的UART控制器為基礎,講解UART的原理以及驅動程序如何編寫。

UART是什么

UART是通用異步收發傳輸器(Universal Asynchronous Receiver/Transmitter),通常稱作UART,是一種異步收發傳輸器,是設備間進行異步通信的關鍵模塊。UART負責處理數據總線和串行口之間的串/并、并/串轉換,并規定了幀格式;通信雙方只要采用相同的幀格式和波特率,就能在未共享時鐘信號的情況下,僅用兩根信號線(Rx 和Tx)就可以完成通信過程,因此也稱為異步串行通信。UART總線雙向通信,可以實現全雙工傳輸和接收。在嵌入式設計中,UART用于主機與輔助設備通信,如汽車音響與外接AP之間的通信,與PC機通信包括與監控調試器和其它器件,如EEPROM通信。

通常需要加入一個合適的電平轉換器,如SP3232E、SP3485,UART還能用于RS-232、RS-485 通信,或與計算機的端口連接。UART 應用非常廣泛,手機工業控制、PC 等應用中都要用到UART。

UART通信方式

UART使用的是 異步,串行通信方式。

串行通信

串行通信是指利用一條傳輸線將資料一位位地順序傳送。好比是一列縱隊,每個數據元素依次縱向排列。如下圖所示,傳輸時一個比特一個比特的串行傳輸,每個時鐘周期傳輸一個比特,這種傳輸方式相對比較簡單,速度較慢,但是使用總線數較少,通常一根接收線,一根發送線即可實現串行通信。

它的缺點是要增加額外的數據來控制一個數據幀的開始和結束。特點是通信線路簡單,利用簡單的線纜就可實現通信,降低成本,適用于遠距離通信,但傳輸速度慢的應用場合。

并行通信

并行通信好比一排橫隊,齊頭并進同時傳輸。這種通信方式每個時鐘周期傳輸的數據量和其總線寬度成正比,但是實現較為復雜。

d62b13a0-2e2a-11eb-a64d-12bb97331649.png

異步通信

異步通信以一個字符為傳輸單位,通信中兩個字符間的時間間隔多少是不固定的,然而在同一個字符中的兩個相鄰位間的時間間隔是固定的。

在異步通信技術中,數據發送方和數據接收方沒有同步時鐘,只有數據信號線,只不過發送端和接收端會按照協商好的協議(固定頻率)來進行數據采樣。數據發送方以每秒鐘57600bits的速度發送數據,接收方也以57600bits的速度去接收數據,這樣就可以保證數據的有效和正確。通常異步通信中使用波特率(Baud-Rate)來規定雙方傳輸速度,其單位為bps(bits per second每秒傳輸位數)。

同步通信

在發送數據信號的時候,會同時送出一根同步時鐘信號, 用來同步發送方和接收方的數據采樣頻率。如下圖所示,同步通信時,信號線1是一根同步時鐘信號線,以固定的頻率進行電平的切換,其頻率周期為t,在每個電平的上升沿之后進行對同步送出的數據信號線2進行采樣(高電平代表1,低電平代表0),根據采樣數據電平高低取得輸出數據信息。如果雙方沒有同步時鐘的話,那么接收方就不知道采樣周期,也就不能正常的取得數據信息。

d684d200-2e2a-11eb-a64d-12bb97331649.png

幀格式

數據傳送速率用波特率來表示,即每秒鐘傳送的二進制位數。例如數據傳送速率為120字符/秒,而每一個字符為10位(1個起始位,7個數據位,1個校驗位,1個結束位),則其傳送的波特率為10×120=1200字符/秒=1200波特。數據通信格式如下圖:

d6b52388-2e2a-11eb-a64d-12bb97331649.png

其中各位的意義如下:

起始位:先發出一個邏輯”0”信號,表示傳輸字符的開始。*數據位:可以是5~8位邏輯”0”或”1”。如ASCII碼(7位),擴展BCD碼(8位)。小端傳輸 *校驗位:數據位加上這一位后,使得“1”的位數應為偶數(偶校驗)或奇數(奇校驗) *停止位:它是一個字符數據的結束標志??梢允?位、1.5位、2位的高電平。*空閑位:處于邏輯“1”狀態,表示當前線路上沒有資料傳送。

注:異步通信是按字符傳輸的,接收設備在收到起始信號之后只要在一個字符的傳輸時間內能和發送設備保持同步就能正確接收。下一個字符起始位的到來又使同步重新校準(依靠檢測起始位來實現發送與接收方的時鐘自同步的)

關于RS-232、RS-422、RS-485等標準,大家可以參考文章《一篇文章了解什么是串口,UART、RS-232、RS-422、RS-485 》

Exynos4412 Uart

本文討論UART 是基于Cortex-A9架構的Exynos4412 為例。

特性

Exynos4412 中UART,有4 個獨立的通道,每個通道都可以工作于中斷模式或DMA 模式,即UART 可以發出中斷或 DMA 請求以便在UART 、CPU 間傳輸數據。使用系統時鐘時,Exynos4412 的 UART 波特率可以達到 4Mbps 。每個UART通道包含兩個FIFO用來接收和發送:

通道 0有 256 字節的發送 FIFO 和 256 字節的接收FIFO

通道 1、4有 64 字節的發送 FIFO 和 64 字節的接收FIFO

通道 2、3有 16 字節的發送FIFO 和 16 字節 的接收 FIFO 。

UART include:

波特率可以通過編程進行 。

紅外接收/發送

每個通道支持停止位有 1位、 2位

數據位有 5、6、7或 8位

每個UART還包括

波特率發生器、發送器、接收器、控制邏輯組成。

Uart控制器

功能模塊

d6ead4e2-2e2a-11eb-a64d-12bb97331649.png

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

發送數據 CPU 先將數據寫入發送FIFO 中,然后 UART 會自動將FIFO 中的數據復制到“發送移位器” (Transmit Shifter )中,發送移位器將數據一位一位地發送到 TxDn 數據線上 (根據設定的格式,插入開始位 、較驗和停止)。

接收數據 “移位器” (Receive Shifter )將 RxDn 數據線上的數據一位一位的接收進來,然后復制到FIFO 中, CPU即可從中讀取數據。

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)數據接收 同樣接收端的數據也是可編程的,接收器可以偵測到溢出錯誤奇偶校驗錯誤,幀錯誤和終止條件,每個錯誤都可以設置一個錯誤標志。? 溢出錯誤 :在舊數據被讀取到之前,新數據覆蓋了舊數據 ? 奇偶校驗錯誤:接收器偵測到了接收數據校驗結果失敗,接收數據無效 ? 幀錯誤 :接收到的數據沒有一個有效的停止位,無法判定數據幀結束 ? 終止條件 :RxDn接收到保持邏輯0狀態持續長于一個數據幀的傳輸時間

(3)自動流控AFC(Auto Float Control) UART0和UART1支持有nRTS和nCTS的自動流控。在AFC情況下,通信雙方nRTS和nCTS管腳分別連接對方的nCTS和nRTS管腳。通過軟件控制數據幀的發送和接收。在開啟AFC時,發送端接收發送前要判斷nCTS信號狀態,當接收到nCTS激活信號時,發送數據幀。該nCTS管腳連接對方nRTS管腳。接收端在準備接收數據幀前,其接收器FIFO有大于32個字節的空閑空間,nRTS管腳會發送激活信號,當其接收FIFO小于32個字節的空閑空間,nRTS必須置非激活狀態。

d7279346-2e2a-11eb-a64d-12bb97331649.png

選擇時鐘源

d754dd92-2e2a-11eb-a64d-12bb97331649.png

Exynos4412 UART的時鐘源有八種選擇:XXTI 、XusbXTI 、SCLK_HDMI24M 、SCLK_USBPHY0 、 SCLK_HDMIPHY 、SCLKMPLL_USER_T 、SCLKEPLL 、SCLKVPLL ,由 CLK_SRC_PERIL0 寄存器控制。選擇好時鐘源后,還可以通過 DIVUART0 ~4設置分頻系數,由 CLK_DIV_PERIL0 寄存器控制。從分頻器得到的時鐘被稱為SCLK UART 。SCLK UART 經過上圖中的“ UCLK Generator”后,得到UCLK ,它的頻率就是UART 的波特率?!?Generator UCLK Generator ”通過這 2個寄存器來設置:UBRDIVn(UART BAUD RATE DIVISOR) 、UFRACVALn 。

UART配置寄存器

d7819422-2e2a-11eb-a64d-12bb97331649.png

ULCONn

d7c19ac2-2e2a-11eb-a64d-12bb97331649.png

bite [6] 紅外模式 選擇串口0是否使用紅外模式:0 = 正常通信模式 1 = 紅外通信模式

bite [5:3] 校驗模式 設置串口0在數據接收和發送時采用的校驗方式:0xx = 無校驗 100 = 奇校驗 101 = 偶校驗 110 = 強制校驗/檢測是否為1 111 = 強制校驗/檢測是否為0

[2] 停止位 設置串口0停止位數:0 = 每個數據幀一個停止位 1 = 每個數據幀二個停止位

[1:0] 數據位 設置串口0數據位數:00 = 5個數據位 01 = 6個數據位 10 = 7個數據位 11 = 8個數據位

該寄存器我們通用的配置是:

ULCON2=0x3;//Normalmode,Noparity,Onestopbit,8databits

UCONn

d7f44166-2e2a-11eb-a64d-12bb97331649.png

d8253ec4-2e2a-11eb-a64d-12bb97331649.png

d87a2b5a-2e2a-11eb-a64d-12bb97331649.png

d8af5136-2e2a-11eb-a64d-12bb97331649.png

[15:12]FCLK分頻因子當UART0選擇FCLK作為時鐘源時,設置其FCLK的分頻因子 UART0 工作時鐘頻率 = FCLK/ FCLK分頻因子 + 6

[11:10] UART時鐘源選擇 選擇UART0的工作時鐘PCLK,UEXTCLK,FCLK/n:00,10 = PCLK 01 = UEXTCLK 11 = FCLK/n 當選擇FCLK/n作為UART0工作時鐘時還要做其它設置,具體請讀者自行查看硬件手冊

[9] 發送數據中斷產生類型 設置UART0中斷請求類型,在非FIFO傳輸模式下,一旦發送數據緩沖區為空,立即產生中斷信號,在FIFO傳輸模式下達到發送數據觸發條件時立即產生中斷信號:0 = 脈沖觸發 1 = 電平觸發

[8] 接收數據中斷產生類型 設置UART0中斷請求類型,在非FIFO傳輸模式下,一旦接收到數據,立即產生中斷信號,在FIFO傳輸模式下達到接收數據觸發條件時立即產生中斷信號:0 = 脈沖觸發 1 = 電平觸發

[7] 接收數據超時 設置當接收數據時,如果數據超時,是否產生接收中斷:0 = 不開啟超時中斷 1 = 開啟超時中斷 10 = 7個數據位 11 = 8個數據位

[6] 接收數據錯誤中斷 設置當接收數據時,如果產生異常,如傳輸中止,幀錯誤,校驗錯誤時,是否產生接收狀態中斷信號:0 = 不產生錯誤狀態中斷 1 = 產生錯誤狀態中斷

[5] 回送模式 設置該位時UART會進入回送模式,該模式僅用于測試 0 = 正常模式 1 = 回送模式

[4] 發送終止信號 設置該位時,UART會發送一個幀長度的終止信號,發送完畢后,該位自動恢復為0 0 = 正常傳輸 1 = 發送終止信號

[3:2] 發送模式 設置采用哪個方式執行數據寫入發送緩沖區 00 = 無效 01 = 中斷請求或查詢模式 10 = DMA0請求

[1:0] 接收模式 設置采用哪個方式執行數據寫入接收緩沖區 00 = 無效 01 = 中斷請求或查詢模式 10 = DMA0請求

該寄存器通用配置為:

UCON2=0x5;//Interruptrequestorpollingmode

一般裸機情況下,采用輪詢模式。

UTRSTATn

UTRSTAT n寄存器用來表明數據是否已經發送完畢、是否已經接收到數據,格式如下圖所示,上面說的“緩沖區”,其實就是下圖中的 FIFO ,不使用 FIFO 功能時可以認為其深度為 1。當我們讀取數據時,就輪詢檢查bit[0]置1之后,然后再從URXHn寄存器讀取數據;當我們讀取數據時,就輪詢檢查bit[1]置1之后,然后再向UTXHn寄存器寫入數據來發送數據;

d8da3dba-2e2a-11eb-a64d-12bb97331649.png

d906b3ea-2e2a-11eb-a64d-12bb97331649.png

UTXHn寄存器(UART TRANSMIT BUFFER REGISTER)

CPU 將數據寫入這個寄存器, UART即會將它保存到緩沖區中,并自動發送出去。

URXHn寄存器(UART RECEIVE BUFFER REGISTER)

當 UART 接收到數據時,讀取這個寄存器,即可獲得數據。

UFRACVALn 計算波特率

d9394922-2e2a-11eb-a64d-12bb97331649.png

根據給定的波特率、所選擇時鐘源頻率,可以通過以下公式計算 UBRDIVn 寄存器 (n 為 0~4,對應 5個 UART 通道 )的值。

UBRDIVn=(int)(UARTclock/(buadratex16))–1

上式計算出來的 UBRDIVn 寄存器值不一定是整數, UBRDIVn 寄存器取其整數部分,小部分由 UFRACVALn 寄存器設置, UFRACVALn 寄存器的引入,使產生波特率更加精確?!九e例】當UART clock為100MHz時,要求波特率為115200 bps,則:

100000000/(115200x16)–1=54.25–1=53.25 UBRDIVn=整數部分=53 UFRACVALn/16=小數部分=0.25 UFRACVALn=4

電路圖

外設電路圖:

d96576aa-2e2a-11eb-a64d-12bb97331649.png

SP3232EEA 用來將TTL電平轉換成RS232電平。我們使用的是COM2。

外設與核心板連接電路圖

d98ffde4-2e2a-11eb-a64d-12bb97331649.jpg

可見UART的收發引腳連接到了GPA上,打開exynos4412芯片手冊:

d9b90734-2e2a-11eb-a64d-12bb97331649.png

我們只需要將GPA1 的低8位設置為0x22。

實例代碼

裸機代碼,主要實現uart_init()、putc()、getc()這三個函數。

uart_init()

該函數主要配置UART的,波特率115200,數據位:8,奇偶校驗位:0,終止位:1,不設置流控。如下圖:是運行在windows下常用的串口工具配置信息,配置信息必須完全一致。

putc()

該函數是向串口發送一個數據data,他的實現邏輯就是輪詢檢查寄存器UART2.UTRSTAT2 ,判斷其bite【1】是否置1,如果置1,則向UART2.UTXH2存入要發送的數據即可。

getc()

該函數是從串口接收一個數據data,他的實現邏輯就是輪詢檢查寄存器UART2.UTRSTAT2 ,判斷其bite【0】是否置1,如果置1,說明數據準備好,則可以從寄存器UART2.URXH2取出數據。

/* *UART2 */ typedefstruct{ unsignedintULCON2; unsignedintUCON2; unsignedintUFCON2; unsignedintUMCON2; unsignedintUTRSTAT2; unsignedintUERSTAT2; unsignedintUFSTAT2; unsignedintUMSTAT2; unsignedintUTXH2; unsignedintURXH2; unsignedintUBRDIV2; unsignedintUFRACVAL2; unsignedintUINTP2; unsignedintUINTSP2; unsignedintUINTM2; }uart2; #defineUART2(*(volatileuart2*)0x13820000) /*GPA1*/ typedefstruct{ unsignedintCON; unsignedintDAT; unsignedintPUD; unsignedintDRV; unsignedintCONPDN; unsignedintPUDPDN; }gpa1; #defineGPA1(*(volatilegpa1*)0x11400020) voiduart_init() {/*UART2initialize*/ GPA1.CON=(GPA1.CON&~0xFF)|(0x22);//GPA1_0:RX;GPA1_1:TX UART2.ULCON2=0x3;//Normalmode,Noparity,Onestopbit,8databits UART2.UCON2=0x5;//Interruptrequestorpollingmode //Baud-rate:src_clock:100Mhz UART2.UBRDIV2=0x35; UART2.UFRACVAL2=0x4; } voidputc(constchardata) {while(!(UART2.UTRSTAT2&0X2)); UART2.UTXH2=data; if(data==) putc(); } chargetc(void) {chardata; while(!(UART2.UTRSTAT2&0x1)); data=UART2.URXH2; if((data==)||(data==)) { putc(); putc(); }else putc(data); returndata; } voidputs(constchar*pstr) {while(*pstr!=') putc(*pstr++); } voidgets(char*p) {chardata; while((data=getc())!=) {if(data==') {p--; } *p++=data; } if(data==) *p++=; *p='; }

責任編輯:lq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 轉換器
    +關注

    關注

    27

    文章

    8960

    瀏覽量

    150747
  • ARM
    ARM
    +關注

    關注

    134

    文章

    9309

    瀏覽量

    375048
  • uart
    +關注

    關注

    22

    文章

    1268

    瀏覽量

    103264

原文標題:基于ARM UART裸機驅動詳解

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    Linux環境再升級:PLIN驅動程序正式發布

    PLIN驅動程序現已正式發布,本文將展示如何安裝PLIN驅動程序,以及如何在Linux環境下進行基本的PLIN通信操作,確保您能夠快速掌握并應用這一新工具。
    的頭像 發表于 04-21 15:29 ?251次閱讀
    Linux環境再升級:PLIN<b class='flag-5'>驅動程序</b>正式發布

    AN3761-KSZ DSA驅動程序的使用

    電子發燒友網站提供《AN3761-KSZ DSA驅動程序的使用.pdf》資料免費下載
    發表于 01-22 16:28 ?0次下載
    AN3761-KSZ DSA<b class='flag-5'>驅動程序</b>的使用

    ub933驅動程序是基于I2c編寫的,請問驅動程序應該放在內核drivers目錄下的哪個子目錄里?

    ub933驅動程序是基于I2c編寫的,請問驅動程序應該放在內核drivers目錄下的哪個子目錄里,驅動注冊時應該使用什么函數?
    發表于 12-13 06:03

    Linux驅動程序程序員指南

    電子發燒友網站提供《Linux驅動程序程序員指南.pdf》資料免費下載
    發表于 11-22 15:53 ?0次下載
    Linux<b class='flag-5'>驅動程序</b><b class='flag-5'>程序</b>員指南

    pcie設備驅動程序安裝步驟

    PCIe(Peripheral Component Interconnect Express)是一種高速串行計算機擴展總線標準,用于計算機內部硬件組件之間的連接。安裝PCIe設備驅動程序是確保硬件
    的頭像 發表于 11-13 10:32 ?3042次閱讀

    arduino 6軸同步電機驅動程序

    arduino 6軸同步電機驅動程序。含加加減速。
    發表于 11-09 14:09 ?0次下載

    TSC2003 WinCE 5.0驅動程序

    電子發燒友網站提供《TSC2003 WinCE 5.0驅動程序.pdf》資料免費下載
    發表于 10-23 10:33 ?0次下載
    TSC2003 WinCE 5.0<b class='flag-5'>驅動程序</b>

    硬盤電機怎么驅動程序?它有什么典型特征?

    硬盤電機的驅動程序是硬盤中一個非常重要的組成部分,它負責控制硬盤電機的啟動、停止、轉速調節等操作。硬盤電機驅動程序的設計和實現涉及到電機控制理論、電子技術、計算機編程等多個領域的知識。 一、硬盤電機
    的頭像 發表于 10-22 11:10 ?1037次閱讀

    LSP 2.10 DaVinci Linux驅動程序

    電子發燒友網站提供《LSP 2.10 DaVinci Linux驅動程序.pdf》資料免費下載
    發表于 10-09 09:30 ?0次下載
    LSP 2.10 DaVinci Linux<b class='flag-5'>驅動程序</b>

    Linux設備驅動程序分類有哪些

    Linux設備驅動程序是操作系統與硬件設備之間的橋梁,負責實現硬件設備與操作系統之間的通信和控制。Linux設備驅動程序的分類繁多,可以根據不同的標準進行分類。 按硬件類型分類 Linux設備
    的頭像 發表于 08-30 15:11 ?1095次閱讀

    linux驅動程序如何加載進內核

    在Linux系統中,驅動程序是內核與硬件設備之間的橋梁。它們允許內核與硬件設備進行通信,從而實現對硬件設備的控制和管理。 驅動程序編寫 驅動程序
    的頭像 發表于 08-30 15:02 ?966次閱讀

    linux驅動程序主要有哪些功能

    能夠識別連接到系統的硬件設備,并對其進行初始化。這包括檢測設備的存在、獲取設備的基本屬性(如設備類型、制造商、型號等)、分配必要的資源(如內存、中斷號等)以及初始化設備的工作狀態。 數據傳輸 Linux驅動程序需要實現設備與操作系統之間的數
    的頭像 發表于 08-30 14:47 ?753次閱讀

    linux驅動程序的編譯方法是什么

    Linux驅動程序的編譯方法主要包括兩種: 與內核一起編譯 和 編譯成獨立的內核模塊 。以下是對這兩種方法的介紹: 一、與內核一起編譯 與內核一起編譯意味著將驅動程序的源代碼直接集成到Linux內核
    的頭像 發表于 08-30 14:46 ?1114次閱讀

    linux驅動程序運行在什么空間

    Linux 驅動程序是操作系統的一部分,負責管理硬件設備與操作系統之間的交互。驅動程序運行在內核空間(Kernel Space),這是操作系統的核心部分,與用戶空間(User Space)相對。內核
    的頭像 發表于 08-30 14:37 ?800次閱讀

    虹科技術 Linux環境再升級:PLIN驅動程序正式發布

    Linux驅動程序領域再添新成員,PLIN驅動程序現已正式發布。
    的頭像 發表于 06-28 13:34 ?567次閱讀
    虹科技術 Linux環境再升級:PLIN<b class='flag-5'>驅動程序</b>正式發布