国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

UART原理說明:


通用異步收發(fā)器簡稱UART,即"Universal Asynchronous Receiver Transmitter",它用來傳輸串行數(shù)據(jù):發(fā)送數(shù)據(jù)時,CPU將并行數(shù)據(jù)寫入UART,UART按照一定的格式在一根電線上串行發(fā)出;接收數(shù)據(jù)時,UART檢測另一根電線上的信號,將串行收集放在緩沖區(qū)中,CPU即可讀取UART獲得這些數(shù)據(jù)。UART之間以全雙工方式傳輸數(shù)據(jù),最精簡的連線方法只有三根電線:TxD用于發(fā)送數(shù)據(jù),RxD用于接收數(shù)據(jù),Gnd用于給雙方提供參考電平,連線如圖1所示:

圖1. UART連線圖


UART使用標準的TTL/CMOS邏輯電平(0~5V、0~3.3V、0~2.5V或0~1.8V四種)來表示數(shù)據(jù),高電平表示1,低電平表示0。為了增強數(shù)據(jù)的抗干擾能力、提高傳輸長度,通常將TTL/CMOS邏輯電平轉(zhuǎn)換為RS-232邏輯電平,3~12V表示0,-3~-12V表示1。


TxD、RxD數(shù)據(jù)線以"位"為最小單位傳輸數(shù)據(jù)。幀(frame)由具有完整意義的、不可分割的若干位組成,它包含開始位、數(shù)據(jù)位、較驗位(需要的話)和停止位。發(fā)送數(shù)據(jù)之前,UART之間要約定好數(shù)據(jù)的傳輸速率(即每位所占據(jù)的時間,其倒數(shù)稱為波特率)、數(shù)據(jù)的傳輸格式(即有多少個數(shù)據(jù)位、是否使用較驗位、是奇較驗還是偶較驗、有多少個停止位)。


數(shù)據(jù)傳輸流程如下:


(1)平時數(shù)據(jù)線處于"空閉"狀態(tài)(1狀態(tài))。

(2)當(dāng)要發(fā)送數(shù)據(jù)時,UART改變TxD數(shù)據(jù)線的狀態(tài)(變?yōu)?狀態(tài))并維持1位的時間──這樣接收方檢測到開始位后,再等待1.5位的時間就開始一位一位地檢測數(shù)據(jù)線的狀態(tài)得到所傳輸?shù)臄?shù)據(jù)。

(3)UART一幀中可以有5、6、7或8位的數(shù)據(jù),發(fā)送方一位一位地改變數(shù)據(jù)線的狀態(tài)將它們發(fā)送出去,首先發(fā)送最低位(LSB)。

(4)如果使用較驗功能,UART在發(fā)送完數(shù)據(jù)位后,還要發(fā)送1個較驗位。有兩種較驗方法:奇較驗、偶較驗──數(shù)據(jù)位連同較驗位中,"1"的數(shù)目等于奇數(shù)或偶數(shù)。

(5)最后,發(fā)送停止位,數(shù)據(jù)線恢復(fù)到"空閉"狀態(tài)(1狀態(tài))。停止位的長度有3種:1位、1.5位、2位。


圖2演示了UART使用7個數(shù)據(jù)位、偶較驗、2個停止位的格式傳輸字符"A"(二進制值為0b1000001)時,TTL/CMOS邏輯電平對應(yīng)的波形。

圖2. TTL/CMOS邏輯電平下,傳輸"A"時的波形


UART還有其他功能,比如流量控制等,想深入了解的讀者請自行查閱相關(guān)資料。


Exynos4412的UART特性:


Exynos4412中UART,有4個獨立的通道,每個通道都可以工作于中斷模式或DMA模式,即UART可以發(fā)出中斷或DMA請求以便在UART、CPU間傳輸數(shù)據(jù)。UART由波特率發(fā)生器、發(fā)送器、接收器和控制邏輯組成。


使用系統(tǒng)時鐘時,Exynos4412的UART波特率可以達到4Mbps。波特率可以通過編程進行控制。


Exynos4412 UART的通道0有256字節(jié)的發(fā)送FIFO和256字節(jié)的接收FIFO;通道1、4有64字節(jié)的發(fā)送FIFO和64字節(jié)的接收FIFO;通道2、3有16字節(jié)的發(fā)送FIFO和16字節(jié)的接收FIFO。發(fā)送數(shù)據(jù)時,CPU先將數(shù)據(jù)寫入發(fā)送FIFO中,然后UART會自動將FIFO中的數(shù)據(jù)復(fù)制到"發(fā)送移位器"(Transmit Shifter)中,發(fā)送移位器將數(shù)據(jù)一位一位地發(fā)送到TxDn數(shù)據(jù)線上(根據(jù)設(shè)定的格式,插入開始位、較驗位和停止位)。接收數(shù)據(jù)時,"接收移位器"(Receive Shifter)將RxDn數(shù)據(jù)線上的數(shù)據(jù)一位一位接收進來,然后復(fù)制到接收FIFO中,CPU即可從中讀取數(shù)據(jù)。


Exynos4412 UART的每個通道支持的停止位有1位、2位,數(shù)據(jù)位有5、6、7或8位,支持較驗功能,另外還有紅外發(fā)送/接收功能。Exynos4412 UART結(jié)構(gòu)如圖3所示:

圖3. Exynos4412 UART結(jié)構(gòu)圖


Exynos4412 UART的使用:

圖4. 設(shè)置Serial連接圖


如圖4所示,我們在使用UART與PC通信的時候,PC端需要設(shè)置波特率、數(shù)據(jù)位、是否使用校驗位、有多少個停止位、是否使用流控等。UART是工作在異步模式下,接收器自身實現(xiàn)幀的同步,因此要實現(xiàn)通信,Exynos4412的UART也要作相同的設(shè)置,另外還要選擇所涉及管腳為UART功能、選擇UART通道的工作模式為中斷模式或DMA模式。設(shè)置好之后,往某個寄存器寫入數(shù)據(jù)即可發(fā)送,讀取某個寄存器即可得到接收到的數(shù)據(jù)。在中斷模式(查詢模式)下,我們一般通過查詢狀態(tài)寄存器或設(shè)置中斷來獲知數(shù)據(jù)是否已經(jīng)發(fā)送完成、是否已經(jīng)接收到數(shù)據(jù)。下面詳細講解上述設(shè)置過程。


1.將所涉及的UART通道管腳設(shè)為UART功能


比如UART通道0中,GPA0_0、GPA0_1分別用作RXD0、TXD0,要使用UART通道0時,先設(shè)置GPA0CON寄存器將GPA0_0、GPA0_1引腳的功能設(shè)為RXD0、TXD0。


2.選擇UART的時鐘源

圖5. UART時鐘


Exynos4412 UART的時鐘源有八種選擇:XXTI、XusbXTI、SCLK_HDMI24M、SCLK_USBPHY0、SCLK_HDMIPHY、SCLKMPLL_USER_T、SCLKEPLL、SCLKVPLL,由CLK_SRC_PERIL0寄存器控制。


選擇好時鐘源后,還可以通過DIVUART0~4設(shè)置分頻系數(shù),由CLK_DIV_PERIL0寄存器控制。從分頻器得到的時鐘被稱為SCLK_UART。


SCLK_UART經(jīng)過圖5中的"UCLK Generator"后,得到UCLK,它的頻率就是UART的波特率。"UCLK Generator"通過這2個寄存器來設(shè)置:UBRDEVn、UFRACVALn(在下面描述)。


表1 CLK_SRC_PERIL0的寄存器格式

由于在iROM的代碼中設(shè)置了相關(guān)時鐘的寄存器,我們在試驗的使用選擇XusbXTI作為時鐘源。


表2 CLK_DIV_PERIL0的寄存器格式

3.設(shè)置波特率:UBRDIVn寄存器(UART BAUD RATE DIVISOR)、UFRACVALn寄存器


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


UBRDIVn = (int)(UART clock/(buad rate x 16)) – 1

上式計算出來的UBRDIVn寄存器值不一定是整數(shù),UBRDIVn寄存器取其整數(shù)部分,小數(shù)部分由UFRACVALn寄存器設(shè)置,UFRACVALn寄存器的引入,使產(chǎn)生的波特率更加精確。


例如,當(dāng)UART clock為100MHz時,要求波特率為115200bps,則:

100000000/(115200 x 16) – 1 = 54.25 – 1 = 53.25

UBRDIVn = 整數(shù)部分 = 53

UFRACVALn/16 = 小數(shù)部分 = 0.25

UFRACVALn = 4

4.設(shè)置傳輸格式:ULCONn寄存器(UART LINE CONTROL)


ULCONn寄存器(n為0~4)格式如表3所示。


表3 ULCONn寄存器格式

我們這里設(shè)置為,普通模式、無校驗位、一幀中有一個停止位和8位的數(shù)據(jù)位。


UART通道被設(shè)為紅外模式時,其串行數(shù)據(jù)的波形與正常模式稍有不同,有興趣的讀者請自行閱讀數(shù)據(jù)手冊。


5.設(shè)置UART工作模式:UCONn寄存器(UART CONTROL)


Exynos4412的UCONn寄存器格式,如表4所示。


表4 UCONn寄存器格式

我們寫程序時使用中斷或查詢方式。


6.UFCONn寄存器(UART FIFO CONTROL)、UFSTATn寄存器(UART FIFO STATUS)


UFCONn寄存器用于設(shè)置是否使用FIFO,設(shè)置各FIFO的觸發(fā)閥值,即發(fā)送FIFO中有多少個數(shù)據(jù)時產(chǎn)生中斷、接收FIFO中有多少個數(shù)據(jù)時產(chǎn)生中斷。并可以通過設(shè)置UFCONn寄存器來復(fù)位各個FIFO。


讀取UFSTATn寄存器可以知道各個FIFO是否已經(jīng)滿、其中有多少個數(shù)據(jù)。

不使用FIFO時,可以認為FIFO的深度為1,使用FIFO時Exynos4412的FIFO深度最高可達到256。這兩類寄存器各位的含義請讀者查閱數(shù)據(jù)手冊。


7.UMCONn寄存器(UART MODEM CONTROL)、UMSTATn寄存器(UART MODEM STATUS)


這兩類寄存器用于流量控制,這里不介紹。


8.UTRSTATn寄存器(UART TX/RX STATUS)


UTRSTATn寄存器用來表明數(shù)據(jù)是否已經(jīng)發(fā)送完畢、是否已經(jīng)接收到數(shù)據(jù),格式如下表4所示。下面說的"緩沖區(qū)",其實就是圖3中的FIFO,不使用FIFO功能時可以認為其深度為1。


表5 UTRSTATn寄存器格式

9.UERSTATn寄存器(UART ERROR STATUS)


用來表示各種錯誤是否發(fā)生,位[0]至位[3]為1時分別表示溢出錯誤、較驗錯誤、幀錯誤、檢測到"break"信號。讀取這個寄存器時,它會自動清0。


需要注意的是,接收數(shù)據(jù)時如果使用FIFO,則UART內(nèi)部會使用一個"錯誤 FIFO"來表明接收FIFO中哪個數(shù)據(jù)在接收過程中發(fā)生了錯誤。CPU只有在讀出這個錯誤的數(shù)據(jù)時,才會覺察到發(fā)生了錯誤。要想清除"錯誤 FIFO",則必須讀出錯誤的數(shù)據(jù),并讀出UERSTATn寄存器。


10.UTXHn寄存器(UART TRANSMIT BUFFER REGISTER)


CPU將數(shù)據(jù)寫入這個寄存器,UART即會將它保存到緩沖區(qū)中,并自動發(fā)送出去。


11.URXHn寄存器(UART RECEIVE BUFFER REGISTER)


當(dāng)UART接收到數(shù)據(jù)時,CPU讀取這個寄存器,即可獲得數(shù)據(jù)。


示例程序詳解,主要涉及到三個文件,start.S文件主要設(shè)置棧等基本的功能;uart.c文件主要就是初始化串口和定義操作串口用到的函數(shù)。main.c文件主要做相關(guān)的操作。


start.S文件內(nèi)容如下:


.text

.global _start

_start:

ldr sp, =0x02027400 //調(diào)用C函數(shù)之前必須設(shè)置棧,棧用于保存運行環(huán)境,給局部變量分配空間;

//參考ROM手冊P14,我們把棧指向BL2的最上方;

//即:0x02020000(iROM基地址)+5K(iROM代碼用)+8K(BL1用)+16K(BL2用)

bl main //跳轉(zhuǎn)到C函數(shù)中執(zhí)行

 

halt: //死循環(huán)

b halt

uart.c文件的內(nèi)容如下,已經(jīng)在里面做了詳細的注釋,這里不再做詳細的介紹。


//串口0使用的引腳

#define GPA0CON (*(volatile unsigned int *)0x11400000)

//選擇時鐘源

#define CLK_SRC_PERIL0 (*(volatile unsigned int *)0x1003C250)

//設(shè)置uart0的分頻系數(shù)

#define CLK_DIV_PERIL0 (*(volatile unsigned int *)0x1003C550)

#define UBRDIV0 (*(volatile unsigned int *)0x13800028)

#define UFRACVAL0 (*(volatile unsigned int *)0x1380002C)

#define UFCON0 (*(volatile unsigned int *)0x13800008)

#define ULCON0 (*(volatile unsigned int *)0x13800000)

#define UCON0 (*(volatile unsigned int *)0x13800004)

#define UTXH0 (*(volatile unsigned int *)0x13800020)

#define URXH0 (*(volatile unsigned int *)0x13800024)

#define UTRSTAT0 (*(volatile unsigned int *)0x13800010)

 

void uart0_init()

{

//配置GPA0CON的引腳為串口功能;

GPA0CON = 0x22222222;

//設(shè)置串口0使用的時鐘源;使用XusbXTI作為時鐘源

CLK_SRC_PERIL0 &= ~(0xF); //低四位清零

CLK_SRC_PERIL0 |= (0x1); //低四位設(shè)置為0b0001  MOUTUART0 = 24MHz

//uart0的時鐘源為24MHz;設(shè)置分頻系數(shù)

CLK_DIV_PERIL0 &= ~(0xF); //低四位清零

CLK_DIV_PERIL0 |= (0x2); //SCLK_UART0 = MOUTUART0/(UART0_RATIO + 1)

//MOUTUART0=24,UART0_RATIO=2;所以,SCLK_UART0=8MHz

//程序走到這里SCLK_UART0(8MHz)時鐘已經(jīng)獲得了。

/*

* 使能FIFO;Rx FIFO:64 bytes  Tx FIFO:32 bytes

*/

UFCON0 =0x111;

/* 設(shè)置數(shù)據(jù)格式: 8n1, 即8個數(shù)據(jù)位,沒有較驗位,1個停止位 */

ULCON0 = 0x3;

/* 工作于中斷/查詢模式

* 另一種是DMA模式,本章不使用

*/

UCON0 = 0x5;

//SCLK_UART0=8MHz;設(shè)置UBRDIV0和UFRACVAL0寄存器;波特率是115200

UBRDIV0 = 0x3;

UFRACVAL0 = 0x5;

}

 

//從串口獲得一個字符

char getc(void)

{

char c;

/* 查詢狀態(tài)寄存器,直到有有效數(shù)據(jù) */

while (!(UTRSTAT0 & (1<<0)));

c = URXH0; /* 讀取接收寄存器的值 */

return c;

}

 

//輸出一個字符

void putc(char c)

{

/* 查詢狀態(tài)寄存器,直到發(fā)送緩存為空 */

while (!(UTRSTAT0 & (1<<2)));

UTXH0 = c; /* 寫入發(fā)送寄存器 */

return;

}

 

//打印字符串

void puts(char *s)

{

while (*s)

{

putc(*s);

s++;

}

}

 

//將數(shù)字按照十六進制格式打印

void puthex(unsigned long val)

{

/* val = 0x1234ABCD */

unsigned char c;

int i = 0;

putc('0');

putc('x');

for (i = 0; i < 8; i++)

{

c = (val >> ((7-i)*4)) & 0xf;

if ((c >= 0) && (c <= 9))

{

c = '0' + c;

}

else if ((c >= 0xA) && (c <= 0xF))

{

c = 'A' + (c -  0xA);

}

putc(c);

}

putc('n');

putc('r');

}

main.c文件主要做使用試驗使用,內(nèi)容如下:


int main()

{

char c;

uart0_init();

puts("Test uart by Haitao Cai!nr");

puthex(100); //打印十六進制數(shù)

while(1)

{

c = getc(); //從串口獲得一個字符

if(c == 'r')

{

puts("Test over!");

break;

}

putc(c);

putc(':');

putc(c+1); //將字符加1輸出

putc('n');

putc('r');

}

return 0;

}

將文件上傳,編譯并燒寫SD卡;開機試驗過程如下:

本文完畢!

關(guān)鍵字:tiny4412  開發(fā)板  串口 引用地址:tiny4412開發(fā)板的串口介紹與操作

上一篇:tiny4412裸機程序——代碼重定位
下一篇:tiny4412開發(fā)板icache操作程序

推薦閱讀

內(nèi)存芯片在2017年掀起一陣狂熱,價格只增不減??v觀2018年甚至2019年局勢,5大跡象顯示內(nèi)存芯片「超級循環(huán)」將結(jié)束,全球 DRAM 的平均售價將降低。在蘋果下調(diào) iPhoneX 產(chǎn)量,以及大陸半導(dǎo)體公司預(yù)計在 2019 年將完成內(nèi)存廠設(shè)置,內(nèi)存的供需出現(xiàn)變化,在產(chǎn)能預(yù)期可提升的情況下,全球 DRAM 的平均售價將降低?!禨eeking Alpha》專欄作家 Robert ...
stm32的定時器功能非常強大,包括基本定時器,通用定時器以及高級定時器。 本章介紹定時器的基本應(yīng)用,通過定時器中斷控制LED閃爍,間隔1s.這一章我們在前一章GPIO的工程修改。復(fù)制GPIO的工程,修改文件夾名。點XXX.ioc擊打開STM32cubeMX的工程文件重新配置。開啟定時器TIM3,選擇內(nèi)部時鐘。另外,關(guān)于HAL庫API的使用方法可以到ST官網(wǎng)下載:https://www.stm...
不知各位嵌入式開發(fā)者有沒有遇到這樣的經(jīng)歷:J-link的線長限制了我們編程的姿勢,很多時候我們的工程都需要板子產(chǎn)生一些位移(比如調(diào)小車之類的),這時候J-link的線會讓我們Debug的過程變得非常痛苦。。。那么有沒有辦法讓我們解決這個數(shù)據(jù)線的痛苦呢??答案是當(dāng)然有的!只要有著一顆折騰的心,辦法總是會慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢...
3月23日,一加在海外發(fā)布了首款智能手表OnePlus Watch。  這款手表配備了1.39英寸AMOLED顯示屏,采用圓形表盤設(shè)計,外殼為不銹鋼材質(zhì),表盤尺寸為36mm,表盤側(cè)面有兩個長方形按鍵。  配備402mAh電池,采用Warp Charge快充技術(shù),據(jù)官方介紹,充電20分鐘即可使用一周?! nePlus Watch有1GB內(nèi)存、4GB存儲,最多可以存儲500首歌。內(nèi)置GPS...

史海拾趣

問答坊 | AI 解惑

數(shù)控直流電壓源的設(shè)計 急求

本帖最后由 paulhyde 于 2014-9-15 09:13 編輯 設(shè)計一個具有一定輸出電壓范圍和功能的數(shù)控電壓源。輸出電壓范圍:0~9.9V,步進0.1V,紋波不大于10mV;輸出電流:5A;輸出電壓值由共陰極數(shù)碼管顯示;由“+”、“-”兩鍵分別控制輸出電壓步進增減; ...…

查看全部問答∨

繼電器常識

一、繼電器常識        繼電器是我們生活中常用的一種控制設(shè)備,通俗的意義上來說就是開關(guān),在條件滿足的情況下關(guān)閉或者開啟。繼電器的開關(guān)特性在很多的控制系統(tǒng)尤其是離散的控制系統(tǒng)中得到廣泛的應(yīng)用。從另一個角度來說,由 ...…

查看全部問答∨

pcb中元器件封裝和原理圖中元器件封裝是什么關(guān)系

CPU: 從CPU誕生的那一天起,其封裝技術(shù)就經(jīng)歷了多種變化。直到Pentium時代,封裝形式才基本上穩(wěn)定下來。80X86系列的CPU從8088開始經(jīng)歷了DIP、PQFP、PFP、PGA、BGA等多種在集成電路芯片中使用過的封裝技術(shù),其技術(shù)性能越來越強,適應(yīng)的工作頻率越 ...…

查看全部問答∨

群星系列實用資料共享

1_Cortex-M3支持的Thumb-2指令 2_Stellaris產(chǎn)品選型工具 3_LM3S系列Protel元件庫 4_Stellaris外設(shè)驅(qū)動庫用戶指南 5_API函數(shù)介紹 6_I2C總線協(xié)議  …

查看全部問答∨

分析一個簡單CPLD程序問題

如題:    硬件為EPM570T100C5N的開發(fā)板。實現(xiàn)不了小燈閃爍功能,可以單獨對小燈進行控制(只可以控制亮滅,不能控制閃爍),不知道什么原因,特來請教大家。以下是程序部分:module LEDxiaodeng(CLK,LED);input CLK;output [8:1]LED;re ...…

查看全部問答∨

STM32耗電流問題,看了資料還是迷茫中...

資料中所說:IVDD Total current into VDD/VDDA power lines (source)IVSS Total current out of VSS ground lines (sink)兩者最大值均為150mA那我就郁悶了...目 ...…

查看全部問答∨

求助關(guān)于QT和html交互問題

開發(fā)板上用戶界面是用html寫的(主要是建立了幾個按鈕),然后由Qt程序解析html文件實現(xiàn)功能是在用戶界面上摁按鈕來執(zhí)行外部程序! html按鈕部分都差不多是這樣的:                  ...…

查看全部問答∨

如何判斷AVR芯片是好的還是壞的,另外如何判斷程序是否燒錄到芯片中

在我們的產(chǎn)品中出現(xiàn)壞機的時候,很難判斷是AVR壞了,還是其它部分壞了。有沒有什么方法直接的判斷AVR是好的還是壞的。越簡單越好! 另外還有就是產(chǎn)品中出現(xiàn)壞機,經(jīng)過調(diào)查是程序沒有寫進去,我想問一下各位AVR的高手,怎樣方便的判斷AVR芯片是否程 ...…

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved