基於UART實現資料的自發自收

2021-06-02 09:51:03 字數 2567 閱讀 9461

基於uart的自發自收除錯

uart(universal asynchronous receiver  and  transmiter)通用非同步接收/傳送裝置。uart提供了rs—232c資料介面。

uart是什麼?uart是一種通用序列資料匯流排,用於非同步通訊,該匯流排雙向通訊,可以實現全雙工傳輸和接受。在嵌入式設計中,uart用來與pc進行通訊,包括與監控偵錯程式和其他部件,比如eeprom。

uart的工作原理和功能。他將由計算機內部傳送過來的並行資料轉化為輸出的序列資料流,將計算機外部來的序列資料轉換為位元組,供計算機內部使用並行資料的器件使用。在輸出的序列資料流中加入奇偶校驗為。在輸出資料流中加入啟停標誌,並從接受資料流中刪除啟停標誌。處理有鍵盤或滑鼠發出的中斷訊號(鍵盤和滑鼠也是序列裝置)。可以處理計算機與外部序列裝置的同步管理問題。

在使用uart之前,我們需要設定波特率,傳輸格式(資料位個數,是否校驗位,奇還是偶校驗位,停止位個數,是否流量控制)。對於具體的cpu來說,例如(2410/2440)還要選擇所涉及的管腳為uart功能,選擇uart通道的工作模式為中斷模式還是dma模式,設定好後,往某個暫存器寫入資料即可傳送,讀取某個暫存器即可接收到資料。可以通過輪詢的方式來獲知資料的收發情況。

初步了解了uart的功能和基本工作原理之後,開始今天的整理。相信在整理的過程中,自己又會有與眾不同的收穫。

對於uart的設定,這個需要根據電路圖,設定gphcon的對應管腳(s3c2410有3個uart介面,具體接哪個介面,需要結合電路圖),我的是要求在uart0上的。

ulconn暫存器,他包括三種暫存器uart0,uart1,uart2,通過這個暫存器可以設定fifo的相關屬性。可以設定傳輸資料的位數,停止位的位數,校驗模式,紅外模式。

uconn暫存器,同樣包括三個,ucon0,ucon1,ucon2。他可以用來設定接收資料和傳送資料的模式,接收錯誤狀態使能,接受超時使能,接收中斷方式,傳送中斷方式,時鐘選擇。

ufconn暫存器,同樣有三個ufcon[0:2],共有八位,可以設定fifo使能,設定fifo的觸發閥值。

umconn暫存器,同樣也有三個,由八位組成,它主要用於流量控制。

utrstatn暫存器,他由三位構成,這個暫存器主要用來表明資料是否已經傳送完畢,是否已經接收到資料。

uerstatn暫存器,用來表示各種錯誤是否發生。

ufstatn暫存器,由16位組成,主要用來設定fifo什麼時候傳送和接收資料。

utxhn暫存器,cpu寫暫存器。

urxhn暫存器,cpu讀暫存器。

ubrdivn暫存器,主要用來設定波特率,這個波特率的值的確定需要根據時鐘源和公式。計算公式如下:uardivnn=(int)(uart時鐘)/(設定的波特率*16)。

下面來說說實驗程式,本次實驗的程式是使用板子接收pc機上傳送過來的資料,按原樣進行顯示。

彙編在此就不寫了,直接寫c程式,因為彙編部分還有不懂得,還得繼續啃。

在ads1.2裡,建立乙個標頭檔案,在c程式中呼叫一下即可。

在reg2410.h中:

#define rgphcon      (*(volatile     unsigned*)0x56000070)

#define  rubrdiv0     (*(volatile     unsigned*)0x56000028)

#define  rulcon0      (*(volatile    unsigned *)0x50000000)

#define  rucon0        (*(volatile    unsigned *)0x56000004)

#define rutrstat0   (*(volatile   unsigned *)0x50000010)

#define rutxh0               (*(volatile   unsigned *)0x50000020)

#define rurxh0               (*(volatile   unsigned *)0x50000024)

在reg2410.h這個檔案裡,設定了控制uart的相關暫存器的位址,這些位址都是固定的,在文件查詢即可,他們分別是什麼暫存器以及各自的功能上面有描述,就不再贅述。

reg2410.c檔案如下:

#include「reg2410.h」          //上面所建立的標頭檔案

#define  txd0ready (1<<2)   //(1<<2)=4

#define  rxd0ready        (1)   

#define  pclk  50700000

#defineuart_clk     pclk     //設定uart的時鐘為pclk

#define  uart_bps    115200   //設定串列埠的波特率為115200

#defineuart_brd (int)(uart_pclk/(uart_bps)*16)-1//設定uart的波特率

void       sendbyte(char dat)    //傳送的位元組

char       recbyte(void)

intmain()

}有點抽象,有點難度,理解最重要!

實現簡單的自發自收的EventDispatcher

下午自己寫了個簡單的實現demo不是很完善,貼出來與大家分享。這是乙個簡單的demo,實現了傳送接收,引數攜帶等基本功能。沒有實現冒泡等複雜的東東,有興趣的可以自己繼續擴充套件實現。1 package218 19private function callbackfun event event voi...

基於FPGA的uart協議時序分析和實現

背景 在fpga應用中常常會有一種情況,我們需要將pc端的一些資料送給fpga,這些資料可以是作為debug的引數,或者一些控制fpga的指令,或者作為運算的資料 1 波特率 要想通過uart協議進行資料傳輸,首先要確定的就是波特率,波特率即是單位時間傳輸的位元數,常見的波特率有9600 19200...

基於ZYNQ的uart傳輸任意長度的資料

ug585 網路筆記 參考 zynq高階之路14 ps端uart串列埠接收不定長資料 參見上一次實驗 基於zynq 的uart中斷實驗之串列埠寫資料到ddr3中 基於zynq 的uart中斷實驗,這裡在上一次實驗的基礎上將傳送固定的資料改為可以傳送不定的資料。建立工程,設定並初始化串列埠中斷,在執行...