s3c2440的UART用法Word版_第1頁
s3c2440的UART用法Word版_第2頁
s3c2440的UART用法Word版_第3頁
s3c2440的UART用法Word版_第4頁
s3c2440的UART用法Word版_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、傳播優(yōu)秀word版文檔 ,希望對(duì)您有幫助,可雙擊去除! s3c2440的uart用法 spi、iic和uart是最常用的三種串行總線,這三種總線在s3c2440中都被集成了。在這里我們主要介紹uart,另兩個(gè)總線在后面的文章中給出。 uart(universal asynchronous receiver/transmitter,通用異步接收/發(fā)送裝置)用于異步通信,可以實(shí)現(xiàn)全雙工發(fā)送和接收。它不僅可以實(shí)現(xiàn)不同嵌入式系統(tǒng)之間的通信,還可以實(shí)現(xiàn)與pc之間的通信。 s3c2440提供了三個(gè)uart端口,它們都可以通過查詢、中斷和dma方式傳輸數(shù)據(jù),而且每個(gè)uart都分別有一個(gè)64個(gè)字節(jié)的接收fif

2、o和一個(gè)64個(gè)字節(jié)的發(fā)送fifo。在這里,我們只給出非fifo模式,即傳輸數(shù)據(jù)不利用fifo緩存,一個(gè)字節(jié)一個(gè)字節(jié)地傳輸。 下面我們就給出如何用s3c2440來實(shí)現(xiàn)非fifo的uart通信。要實(shí)現(xiàn)某種通信,就必須遵循該通信協(xié)議。uart的協(xié)議包括傳輸數(shù)據(jù)的位數(shù),停止位的位數(shù),以及是否進(jìn)行奇偶校驗(yàn),這些設(shè)置是利用ulconn寄存器完成的。另一個(gè)很重要的地方就是設(shè)置波特率。s3c2440波特率的時(shí)鐘源有三個(gè):pclk、fclk/n和uextclk。時(shí)鐘源的選擇是由uconn的第10位和第11位來完成的。波特率的具體計(jì)算公式為:時(shí)鐘源頻率(波特率16)1這個(gè)計(jì)算結(jié)果很可能是小數(shù),把該小數(shù)取最接近的整

3、數(shù),放入寄存器ubrdivn中就完成了波特率的設(shè)置。如我們選擇波特率的時(shí)鐘源為pclk,它為50mhz,我們?cè)O(shè)置的波特率為115.2khz,通過上式計(jì)算的結(jié)果為26.13,取整后得到26,那么我們把26放入ubrdivn中即可。由于我們沒有使用fifo和modem,所以可以不用設(shè)置fifo控制寄存器ufconn和modem控制寄存器umconn。通過以上寄存器的設(shè)置,uart就可以正常傳輸數(shù)據(jù)。接收到的數(shù)據(jù)是放到接收緩存器urxhn中,要發(fā)送數(shù)據(jù)時(shí),是把數(shù)據(jù)放入發(fā)送緩存器utxhn中。由于uart是通過字節(jié)方式傳輸數(shù)據(jù)的,因此要區(qū)分是大端模式還是小端模式,也就是說這兩個(gè)寄存器在這兩種模式下,所

4、在的地址是不同。為了了解當(dāng)前數(shù)據(jù)傳輸?shù)母鞣N狀態(tài),還需要一些狀態(tài)寄存器。傳輸狀態(tài)寄存器utrstatn非常有用,它的第0位可以用來判斷接受緩存器內(nèi)是否有可接收的數(shù)據(jù),第1位和第2位可以用來判斷發(fā)送緩存器中是否為空,為空時(shí)可以發(fā)送數(shù)據(jù)。由于在這里我們不進(jìn)行傳輸數(shù)據(jù)時(shí)錯(cuò)誤的判斷,因此錯(cuò)誤狀態(tài)寄存器uerstatn不需要,fifo狀態(tài)寄存器ufstatn和modem狀態(tài)寄存器umstatn在這里也不需要。 我們給出uart通信的兩種方法:查詢和中斷。為了驗(yàn)證程序,使用任一款的串行通信軟件來實(shí)現(xiàn)pc和s3c2440之間的通信即可。 傳播優(yōu)秀word版文檔 ,希望對(duì)您有幫助,可雙擊去除! 首先給出的是查詢

5、程序。它是在主程序的循環(huán)體內(nèi)不斷查詢uart端口,當(dāng)有數(shù)據(jù)來時(shí),就接收數(shù)據(jù),并再通過uart發(fā)送該數(shù)據(jù)。然后根據(jù)所接收數(shù)據(jù)的不同,分別執(zhí)行不同的內(nèi)容,如點(diǎn)亮、熄滅led,蜂鳴器響、或不響。在這里,我們每次只完成一個(gè)字節(jié)的傳輸。 #define rgpbcon (*(volatile unsigned *)0x56000010) /port b control#define rgpbdat (*(volatile unsigned *)0x56000014) /port b data#define rgpbup (*(volatile unsigned *)0x56000018) /pull-u

6、p control b#define rgphcon (*(volatile unsigned *)0x56000070) /port h control#define rgphup (*(volatile unsigned *)0x56000078) /pull-up control h#define rulcon0 (*(volatile unsigned *)0x50000000) /uart 0 line control#define rucon0 (*(volatile unsigned *)0x50000004) /uart 0 control#define rufcon0 (*(

7、volatile unsigned *)0x50000008) /uart 0 fifo control#define rumcon0 (*(volatile unsigned *)0x5000000c) /uart 0 modem control#define rutrstat0 (*(volatile unsigned *)0x50000010) /uart 0 tx/rx status#define ruerstat0 (*(volatile unsigned *)0x50000014) /uart 0 rx error status#define rufstat0 (*(volatil

8、e unsigned *)0x50000018) /uart 0 fifo status#define rumstat0 (*(volatile unsigned *)0x5000001c) /uart 0 modem status#define rubrdiv0 (*(volatile unsigned *)0x50000028) /uart 0 baud rate divisor/little endian#define rutxh0 (*(volatile unsigned char *)0x50000020) /uart 0 transmission hold#define rurxh

9、0 (*(volatile unsigned char *)0x50000024) /uart 0 receive buffervoid main(void)char ch;rgpbcon = 0x015551;rgpbup = 0x7ff;rgpbdat = 0x1e0;rgphcon = 0x00faaa; /使用uart0功能rgphup = 0x7ff;rulcon0 = 0x3; /設(shè)置uart0無奇偶校驗(yàn),一位停止位,8位數(shù)據(jù)rucon0 = 0x245; /pclk為時(shí)鐘源,接收和發(fā)送數(shù)據(jù)為查詢或中斷方式rufcon0 = 0; /rumcon0 = 0; /rubrdiv0 =

10、 26; /設(shè)置波特率,pclk為50mhz,波特率為115.2khzwhile(!(rutrstat0 & 0x2); /等待并判斷發(fā)送緩存是否為空傳播優(yōu)秀word版文檔 ,希望對(duì)您有幫助,可雙擊去除!rutxh0 = 0xaa; /是空,則發(fā)送0xaa字節(jié)while(1) while(!(rutrstat0 & 0x1); /等待并判斷接收緩存是否準(zhǔn)備好ch = rurxh0; /接收一個(gè)字節(jié)數(shù)據(jù) while(!(rutrstat0 & 0x2); /等待并判斷發(fā)送緩存是否為空 rutxh0 = ch; /發(fā)送一個(gè)字節(jié)數(shù)據(jù) switch(ch) /根據(jù)所接收數(shù)據(jù)的不同,執(zhí)行不同的程序 ca

11、se 0x11: /滅led rgpbdat |= 0x1e0; break; case 0x22: /亮led rgpbdat &= 0x1f; break; case 0x33: /蜂鳴器不響 rgpbdat &= 0x1e0; break; case 0x44: /蜂鳴器響 rgpbdat |= 0x1; break; default: /led滅,蜂鳴器不響傳播優(yōu)秀word版文檔 ,希望對(duì)您有幫助,可雙擊去除! rgpbdat = 0x1e0; break; 下面是uart中斷程序,它要比查詢復(fù)雜一些,因?yàn)樯婕暗搅酥袛嗵幚?,并且uart發(fā)送數(shù)據(jù)和接收數(shù)據(jù)是一個(gè)中斷源。主程序循環(huán)體內(nèi)不執(zhí)

12、行任何程序,都在uart中斷程序內(nèi)執(zhí)行。當(dāng)接收到0x55字節(jié)數(shù)據(jù)時(shí),亮兩個(gè)led,當(dāng)接收到其他數(shù)據(jù)時(shí),發(fā)送該字節(jié),并在發(fā)送部分執(zhí)行亮4個(gè)led程序。 #define _isr_startaddress 0x33ffff00#define pisr_uart0 (*(unsigned *)(_isr_startaddress+0x90)#define u32 unsigned int#define rgpbcon (*(volatile unsigned *)0x56000010) /port b control#define rgpbdat (*(volatile unsigned *)0x5

13、6000014) /port b data#define rgpbup (*(volatile unsigned *)0x56000018) /pull-up control b#define rgphcon (*(volatile unsigned *)0x56000070) /port h control/#define rgphdat (*(volatile unsigned *)0x56000074) /port h data#define rgphup (*(volatile unsigned *)0x56000078) /pull-up control h#define rulco

14、n0 (*(volatile unsigned *)0x50000000) /uart 0 line control#define rucon0 (*(volatile unsigned *)0x50000004) /uart 0 control#define rufcon0 (*(volatile unsigned *)0x50000008) /uart 0 fifo control#define rumcon0 (*(volatile unsigned *)0x5000000c) /uart 0 modem control#define rutrstat0 (*(volatile unsi

15、gned *)0x50000010) /uart 0 tx/rx status#define ruerstat0 (*(volatile unsigned *)0x50000014) /uart 0 rx error status#define rufstat0 (*(volatile unsigned *)0x50000018) /uart 0 fifo status#define rumstat0 (*(volatile unsigned *)0x5000001c) /uart 0 modem status#define rubrdiv0 (*(volatile unsigned *)0x

16、50000028) /uart 0 baud rate divisor傳播優(yōu)秀word版文檔 ,希望對(duì)您有幫助,可雙擊去除! /little endian#define rutxh0 (*(volatile unsigned char *)0x50000020) /uart 0 transmission hold#define rurxh0 (*(volatile unsigned char *)0x50000024) /uart 0 receive buffer#define rsrcpnd (*(volatile unsigned *)0x4a000000) /interrupt requ

17、est status#define rintmsk (*(volatile unsigned *)0x4a000008) /interrupt mask control#define rintpnd (*(volatile unsigned *)0x4a000010) /interrupt request status#define rsubsrcpnd (*(volatile unsigned *)0x4a000018) /sub source pending#define rintsubmsk (*(volatile unsigned *)0x4a00001c) /interrupt su

18、b maskvoid _irq uartisp(void) char ch; rsubsrcpnd |= 0x3; rsrcpnd = 0x128; rintpnd = 0x128; if(rutrstat0 & 1) /接收數(shù)據(jù)處理部分 ch = rurxh0; /接收字節(jié)數(shù)據(jù) if(ch=0x55) rgpbdat = 0x61; /亮兩個(gè)led else rutxh0 = ch; /發(fā)送字節(jié)數(shù)據(jù) else /發(fā)送數(shù)據(jù)處理部分 rgpbdat = 0x1e1; /亮4個(gè)led void main(void) rgpbcon = 0x015551;rgpbup = 0x7ff; rgpbda

19、t = 0x1e0;rgphcon = 0x00faaa; rgphup = 0x7ff;傳播優(yōu)秀word版文檔 ,希望對(duì)您有幫助,可雙擊去除!rulcon0 = 0x3; rucon0 = 0x5;rufcon0 = 0;rumcon0 = 0;rubrdiv0 = 26;rsrcpnd = 0x128; rsubsrcpnd = 0x3;rintpnd = 0x128; rintsubmsk = (0x3); /打開uart0發(fā)送和接收中斷屏蔽 rintmsk = (0x128); /打開uart0中斷屏蔽 pisr_uart0 = (u32)uartisp;while(1) 最后還要強(qiáng)調(diào)

20、幾點(diǎn)關(guān)于非fifo模式下uart中斷的一些注意事項(xiàng):1. 對(duì)于s3c2440來說,接收數(shù)據(jù)是被動(dòng)的,發(fā)送數(shù)據(jù)是主動(dòng)的,因此一般來說,接收數(shù)據(jù)用中斷方式,發(fā)送數(shù)據(jù)用查詢方式較好;2. 在中斷方式下,當(dāng)接收到數(shù)據(jù)時(shí),盡管可能該數(shù)據(jù)無用,但也一定要讀取它,否則下次再接收數(shù)據(jù)時(shí),不會(huì)再引起中斷,因?yàn)榻邮諗?shù)據(jù)緩存器被上次接收到的數(shù)據(jù)所霸占,只要沒有讀取它,它就永遠(yuǎn)在那里;3. 由于uart中斷涉及到subsrcpnd寄存器,因此在中斷處理程序中不僅要清srcpnd寄存器,還要清subsrcpnd寄存器,它們的順序一定是先清subsrcpnd寄存器,再清srcpnd寄存器,否則就會(huì)引起一個(gè)中斷兩次響應(yīng)的問

21、題。因?yàn)槭欠裰袛嘤蓅rcpnd寄存器決定,而srcpnd寄存器的相關(guān)狀態(tài)位由subsrcpnd寄存器決定,如果先清srcpnd寄存器,而還沒有清subsrcpnd寄存器的話,srcpnd寄存器的相關(guān)位還是會(huì)被置1,而一旦被置1,則一定還會(huì)引起中斷。本文來自csdn博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:傳播優(yōu)秀word版文檔 ,希望對(duì)您有幫助,可雙擊去除!基于arm9 2410的嵌入式串口編程20070417ohy 下面的程式是在2410研發(fā)平臺(tái)上調(diào)試通過的,一個(gè)串口的發(fā)送實(shí)驗(yàn)程式serial.c。#include #include #include #include #include #include #in

22、clude #include #include int main()char szsendbuf4;int fd,c,res,nsize = 4;file *pfile;int filel;struct termios oldtio,newtio;struct stat st;fd = open(/dev/ttys0,o_rdwr | o_noctty);tcgetattr(fd, &oldtio);bzero(&newtio, sizeof(newtio);newtio.c_cflag = b115200 | crtscts | cs8 | clocal | cread;newtio.c_i

23、flag = ignpar | icrnl;tcflush(fd, tciflush);tcsetattr(fd, tcsanow, &newtio);stat(a.txt, &st);pfile = fopen(a.txt, r);filel = st.st_size;while(4 = nsize)bzero(szsendbuf, 4);nsize = fread(szsendbuf, 1, 4, pfile);nsize = write(fd, szsendbuf, nsize);fclose(pfile);tcsetattr(fd, tcsanow, &oldtio);close(fd

24、); 代碼寫完以后,需要用arm的gcc編譯器來編譯代碼,而不能以gcc來編譯代碼。因?yàn)?410是arm體系結(jié)構(gòu),和普通pc機(jī)的體系結(jié)構(gòu)不相同的。 能將armv4l-unknown-linux-gcc這個(gè)文件拷貝到剛才編寫c的源程式同一目錄下,這樣就不必使用一串長(zhǎng)長(zhǎng)的絕對(duì)路徑了。如果需要將剛才的serial.c編譯成一個(gè)名字為serial的可執(zhí)行文件,可使用下面的命令:./ armv4l-unknown-linux-gcc -o serial serial.c 在運(yùn)行上述生成的文件時(shí),先通過minicom將宿主機(jī)掛載到目標(biāo)板上。例如宿主機(jī)的ip地址為:192.168.2.100,目標(biāo)板的ip地

25、址為:192.168.2.101。能通過下面的命令將其掛載:mount 192.168.2.100:/ /tmp 這樣,宿主機(jī)的這個(gè)根目錄就掛載到目標(biāo)板上了。由于要進(jìn)行串口的調(diào)試實(shí)驗(yàn),minocom需要用來和目標(biāo)板進(jìn)行窗口通信。所有對(duì)目標(biāo)板的操作控制,最佳通過telnet來進(jìn)行,能通過下面命令實(shí)現(xiàn):telnet 192.168.2.101 連接到目標(biāo)板上成功的時(shí)候,需要輸入登陸的用戶名和密碼,一般是輸入root按回車就能,也有例外的。 然后在目標(biāo)板的/tmp目錄中就能看到整個(gè)宿主機(jī)根目錄的內(nèi)容,再找到serial所在的目錄,輸入下面命令:./serial就可在宿主機(jī)的minicom中看到一個(gè)文

26、件屬性的輸出了。傳播優(yōu)秀word版文檔 ,希望對(duì)您有幫助,可雙擊去除!s3c2440串口文檔s3c2440的uart提供了三個(gè)同步串行io口,第一個(gè)串口都可以使用中斷模式和dma模式,換句話說就是uart可以產(chǎn)生一個(gè)中斷或者是dma請(qǐng)求使數(shù)據(jù)在cpu和uart之間進(jìn)行傳遞。uart在系統(tǒng)時(shí)鐘下可以支持最高位傳送為115.2k bps.如果一個(gè)外部設(shè)備能過uextclk為uart提供時(shí)鐘,uart可以達(dá)到更高的速度。每個(gè)uart通道包括兩個(gè)64字節(jié)的fifo作為接收數(shù)據(jù)和發(fā)送數(shù)據(jù)使用。 s3c2440的uart包括可編程的波特率,紅外收發(fā),一個(gè)或者兩個(gè)停止位。5位,6們,7位,8位的數(shù)據(jù)位和校驗(yàn)

27、檢測(cè)。每一個(gè)uart包括一個(gè)波特率產(chǎn)生器,發(fā)送器,接收器和一個(gè)控制單元。如圖111所示。波特率產(chǎn)生器可以使用pclk,fclk/n或者uextclk之一控制。發(fā)送器和接收器包含64字節(jié)的fifo和一個(gè)數(shù)據(jù)移位器。數(shù)據(jù)先寫到fifo中然后再拷貝到發(fā)送移位器中,然后再移位發(fā)送通過數(shù)據(jù)針txdn。在些期間遠(yuǎn)端發(fā)送過來的數(shù)據(jù)通過針rxdn進(jìn)入到移位器中再拷貝到接收器的fifo中去。傳播優(yōu)秀word版文檔 ,希望對(duì)您有幫助,可雙擊去除!屬性rxd0,txd0,rxd1,txd1,rxd2,和txd2都可使用基于dma的和中斷的操作。uart通道0,1,和2都擁有irda和64字節(jié)的fifouart通道0

28、和1:nrts0,ncts0,nrts1,ncts1收發(fā)數(shù)據(jù)時(shí)支持握手uart的操作uart的操作,包括數(shù)據(jù)傳輸,數(shù)據(jù)接收,產(chǎn)生中斷,波特率的產(chǎn)生回環(huán)模式,紅外模式和自動(dòng)流控制。數(shù)據(jù)傳輸發(fā)送的數(shù)據(jù)幀是可以改變的,它由起始位58個(gè)數(shù)據(jù)位一個(gè)可選的校驗(yàn)位和12個(gè)停止位構(gòu)成。這些都可以通過策略控制器ulconn設(shè)置。數(shù)據(jù)發(fā)送器也可以產(chǎn)生一個(gè)停止標(biāo)志,它可以強(qiáng)迫串口輸出邏輯0達(dá)一幀的時(shí)間,它在一個(gè)字傳輸完成以后阻塞了停止信號(hào)的傳送。然后繼續(xù)傳輸數(shù)據(jù)到tx fifo中。數(shù)據(jù)接收與數(shù)據(jù)的發(fā)送相似,接收到的數(shù)據(jù)幀也是可以修改的。它包括一個(gè)起始位,五到八個(gè)數(shù)據(jù)位,一個(gè)可選的校驗(yàn)位和一到兩個(gè)停止位。接收器可檢測(cè)

29、到覆蓋錯(cuò)誤,校驗(yàn)錯(cuò)誤,幀錯(cuò)誤和終止的情況。每一種情況都會(huì)設(shè)置一個(gè)錯(cuò)誤標(biāo)志位。覆蓋錯(cuò)誤產(chǎn)生的情況是這樣的,新數(shù)據(jù)覆蓋掉了還沒有來的及取出的舊數(shù)據(jù),也就是說接收數(shù)據(jù)速度快于取出的速度導(dǎo)致一部分?jǐn)?shù)據(jù)還沒有取出就被新的數(shù)據(jù)蓋掉了。校驗(yàn)錯(cuò)誤是指接收到的數(shù)據(jù)經(jīng)過計(jì)算與校驗(yàn)位不符。幀錯(cuò)誤是指收到的數(shù)據(jù)不含有停止位。終止的情況是指rxdn端保持在邏輯零的狀態(tài)時(shí)間長(zhǎng)于一幀數(shù)據(jù)傳送的時(shí)間。接收超時(shí)的情況是指在可以接收3個(gè)字的時(shí)間里沒有收到任何的數(shù)據(jù),并且在fifo模式時(shí)rx的fifo非空。自動(dòng)流量控制(afc)s3c2440的uart 0和uart 1通過信號(hào)nrts和ncts支持自動(dòng)流量控制。在這種情況下,它可

30、以連接到外部的uarts中去。如果用戶想把串口連接到modem上,需要關(guān)閉寄存器umconn的自動(dòng)流控制位,并通過軟件控制nrts信號(hào)線。在afc模式下,nrts依賴于接收器,ncts信號(hào)控制著發(fā)送器的操作。uart的數(shù)據(jù)發(fā)送器只在ncts信號(hào)使能的時(shí)候才把數(shù)據(jù)傳送到fifo中(在afc模式下ncts的意思是其它uart的fifo已經(jīng)準(zhǔn)備好接收數(shù)據(jù)了)。在uart開始接收數(shù)據(jù)之前,需要先根據(jù)數(shù)據(jù)接收器的fifo剩余空間設(shè)置nrts的值,如果剩余空間大于32字節(jié)則nrts使能,否則如果剩余空間小于32字節(jié)則nrts關(guān)閉(在afc模式下,nrts的作用就是表示它所控制的接收器的fifo準(zhǔn)備好接收數(shù)

31、據(jù)了)。 uart 2不支持afc功能,因?yàn)閟3c2440沒有nrts2和ncts2非自動(dòng)流量控制的例子(通過軟件控制信號(hào)nrts和ncts)接收器對(duì)fifo的操作傳播優(yōu)秀word版文檔 ,希望對(duì)您有幫助,可雙擊去除!1.選擇接收模式(中斷模式或者dma模式)2.檢查寄存器ufstatn中rx fifo的值,如果這個(gè)值小于32,用戶必須設(shè)置umconn0為“1”(使能nrts),如果值大于32,用戶必須設(shè)置umconn0的值為“0”(關(guān)閉nrts)3.重復(fù)第2步。發(fā)送器對(duì)fifo的操作1.選擇一個(gè)發(fā)送模式(中斷或者dma)2.檢查umstatn0的值,如果為“1”(使能ncts),用戶寫數(shù)據(jù)到

32、tx fifo寄存器s3c2440的每個(gè)uart都有七個(gè)狀態(tài):覆蓋錯(cuò)誤,校驗(yàn)錯(cuò)誤,幀錯(cuò)誤,終止,接收緩沖區(qū)已準(zhǔn)備好,發(fā)送緩沖區(qū)空,和發(fā)送移位器空。所有這些都對(duì)應(yīng)到uart的狀態(tài)寄存器中(utrstatn/uerstatn).覆蓋錯(cuò)誤,校驗(yàn)錯(cuò)誤,幀錯(cuò)誤和終止屬于接收錯(cuò)誤,它們中的任何一個(gè)都可以引起一個(gè)叫“receive error status”的中斷請(qǐng)求。如果這個(gè)中斷請(qǐng)求在寄存器uconn中的使能位被置為“1”,并且當(dāng)這個(gè)請(qǐng)求被處理時(shí)通過讀取uerstsatn的值可知引起這個(gè)中斷的信號(hào),也就是找到是哪種錯(cuò)誤引起的中斷。fifo模式與非fifo模式在fifo模式下,接收器從接收移位器中收數(shù)據(jù)然后

33、寫入到fifo中,如果收到數(shù)據(jù)的個(gè)數(shù)達(dá)到rx fifo的觸發(fā)點(diǎn),且在寄存器uconn中的接收模式被設(shè)置成“1”(中斷或者輪巡模式),將會(huì)產(chǎn)生一個(gè)rx中斷。在非fifo模式下,不論是中斷模式還是輪巡模式,只要有數(shù)據(jù)從接收移位寄存器中傳送到數(shù)據(jù)接收保持寄存器中都會(huì)產(chǎn)生一個(gè)rx中斷。在fifo模式下,如果發(fā)送模式在控制寄存器uconn中被設(shè)置成中斷模式或者輪巡模式,發(fā)送數(shù)據(jù)要從發(fā)送fifo中傳送到發(fā)送移位器中,如果在fifo中剩余的數(shù)據(jù)個(gè)數(shù)達(dá)到了tx fifo的觸發(fā)點(diǎn),就是產(chǎn)生一個(gè)tx中斷。在非fifo模式下,發(fā)送的數(shù)據(jù)從發(fā)送保持寄存器傳送到發(fā)送移位器中后會(huì)產(chǎn)生一個(gè)tx中斷,這個(gè)也是要求數(shù)據(jù)發(fā)送方送

34、方式為中斷模式或者是輪巡模式。如果在控制寄存器中數(shù)據(jù)發(fā)送方式和接收方式被設(shè)置成dma模式,那么和上面的情況一樣,只是產(chǎn)生的rx和tx中斷被換成了dma請(qǐng)求。uart的錯(cuò)誤fifouart有一個(gè)“錯(cuò)誤狀態(tài)”fifo組,它對(duì)應(yīng)著接收器的fifo,它指示在接收器的fifo中哪個(gè)數(shù)據(jù)錯(cuò)誤了。只有在接收器中錯(cuò)誤數(shù)據(jù)被讀取的時(shí)候才會(huì)產(chǎn)生錯(cuò)誤中斷。在從urxhn讀取數(shù)據(jù)的時(shí)候同時(shí)讀取uerstatn寄存器的值就知道這個(gè)數(shù)據(jù)哪里錯(cuò)了,什么錯(cuò)誤。例子假設(shè)uart順序接收了a b c d e這五個(gè)數(shù)據(jù),其中接收b的時(shí)候發(fā)生了幀錯(cuò)誤,接收d的時(shí)候發(fā)生了校驗(yàn)錯(cuò)誤。在接收b的時(shí)候不會(huì)產(chǎn)生“錯(cuò)誤中斷”,在接收“d”的時(shí)候

35、也不會(huì)產(chǎn)生“錯(cuò)誤中斷”。當(dāng)讀取b數(shù)據(jù)和d數(shù)據(jù)的時(shí)候“錯(cuò)誤中斷”才會(huì)產(chǎn)生。波特率的產(chǎn)生傳播優(yōu)秀word版文檔 ,希望對(duì)您有幫助,可雙擊去除!art的波特率發(fā)生器為串行數(shù)據(jù)的發(fā)送與接收提供時(shí)鐘,波特率發(fā)生器的“源時(shí)鐘”可以是s3c2440的內(nèi)部系統(tǒng)時(shí)鐘也可以是外部時(shí)鐘(uextclk),換句話說就是通過設(shè)置uconn的“時(shí)鐘”選項(xiàng)可以改變除數(shù)因子。波特率是由“源時(shí)鐘”(pclk,fclk/n uextclk)除以16和一個(gè)除數(shù)因子。公式是這樣的:除數(shù)因子(整型)(“源時(shí)鐘”除以波特率乘以16)減1除數(shù)因子ubrdivn的取值范圍是1216-1,但當(dāng)使用外部時(shí)鐘uextclk時(shí)它卻可以等于0.(這個(gè)

36、外部時(shí)鐘要低于pclk)例如:如果波特率是115200bps,uart的時(shí)鐘是40mhz,除數(shù)因子ubrdivn是ubrdivn = (int)(40000000 / (115200 x 16) ) -1= (int)(21.7) -1 round to the nearest whole number= 22 -1 = 21波特率的錯(cuò)誤容忍度uart的幀錯(cuò)誤必須低于1.87%ads下的串口配置def.h 中的uart寄存器定義:#define rulcon0 (*(volatile unsigned *)0x50000000) /uart 0 line control#define ruco

37、n0 (*(volatile unsigned *)0x50000004) /uart 0 control#define rufcon0 (*(volatile unsigned *)0x50000008) /uart 0 fifo control#define rumcon0 (*(volatile unsigned *)0x5000000c) /uart 0 modem control#define rutrstat0 (*(volatile unsigned *)0x50000010) /uart 0 tx/rx status#define ruerstat0 (*(volatile u

38、nsigned *)0x50000014) /uart 0 rx error status#define rufstat0 (*(volatile unsigned *)0x50000018) /uart 0 fifo status#define rumstat0 (*(volatile unsigned *)0x5000001c) /uart 0 modem status#define rubrdiv0 (*(volatile unsigned *)0x50000028) /uart 0 baud rate divisor#define rulcon1 (*(volatile unsigne

39、d *)0x50004000) /uart 1 line control#define rucon1 (*(volatile unsigned *)0x50004004) /uart 1 control#define rufcon1 (*(volatile unsigned *)0x50004008) /uart 1 fifo control#define rumcon1 (*(volatile unsigned *)0x5000400c) /uart 1 modem control#define rutrstat1 (*(volatile unsigned *)0x50004010) /ua

40、rt 1 tx/rx status傳播優(yōu)秀word版文檔 ,希望對(duì)您有幫助,可雙擊去除!#define ruerstat1 (*(volatile unsigned *)0x50004014) /uart 1 rx error status#define rufstat1 (*(volatile unsigned *)0x50004018) /uart 1 fifo status#define rumstat1 (*(volatile unsigned *)0x5000401c) /uart 1 modem status#define rubrdiv1 (*(volatile unsigned

41、 *)0x50004028) /uart 1 baud rate divisor#define rulcon2 (*(volatile unsigned *)0x50008000) /uart 2 line control#define rucon2 (*(volatile unsigned *)0x50008004) /uart 2 control#define rufcon2 (*(volatile unsigned *)0x50008008) /uart 2 fifo control#define rumcon2 (*(volatile unsigned *)0x5000800c) /u

42、art 2 modem control#define rutrstat2 (*(volatile unsigned *)0x50008010) /uart 2 tx/rx status#define ruerstat2 (*(volatile unsigned *)0x50008014) /uart 2 rx error status#define rufstat2 (*(volatile unsigned *)0x50008018) /uart 2 fifo status#define rumstat2 (*(volatile unsigned *)0x5000801c) /uart 2 m

43、odem status#define rubrdiv2 (*(volatile unsigned *)0x50008028) /uart 2 baud rate divisor#ifdef _big_endian#define rutxh0 (*(volatile unsigned char *)0x50000023) /uart 0 transmission hold#define rurxh0 (*(volatile unsigned char *)0x50000027) /uart 0 receive buffer#define rutxh1 (*(volatile unsigned c

44、har *)0x50004023) /uart 1 transmission hold#define rurxh1 (*(volatile unsigned char *)0x50004027) /uart 1 receive buffer#define rutxh2 (*(volatile unsigned char *)0x50008023) /uart 2 transmission hold#define rurxh2 (*(volatile unsigned char *)0x50008027) /uart 2 receive buffer#define wrutxh0(ch) (*(

45、volatile unsigned char *)0x50000023)=(unsigned char)(ch)#define rdurxh0() (*(volatile unsigned char *)0x50000027)#define wrutxh1(ch) (*(volatile unsigned char *)0x50004023)=(unsigned char)(ch)#define rdurxh1() (*(volatile unsigned char *)0x50004027)#define wrutxh2(ch) (*(volatile unsigned char *)0x5

46、0008023)=(unsigned char)(ch)#define rdurxh2() (*(volatile unsigned char *)0x50008027)#define utxh0 (0x50000020+3) /byte_access address by dma傳播優(yōu)秀word版文檔 ,希望對(duì)您有幫助,可雙擊去除!#define urxh0 (0x50000024+3)#define utxh1 (0x50004020+3)#define urxh1 (0x50004024+3)#define utxh2 (0x50008020+3)#define urxh2 (0x500

47、08024+3)#else /little endian#define rutxh0 (*(volatile unsigned char *)0x50000020) /uart 0 transmission hold#define rurxh0 (*(volatile unsigned char *)0x50000024) /uart 0 receive buffer#define rutxh1 (*(volatile unsigned char *)0x50004020) /uart 1 transmission hold#define rurxh1 (*(volatile unsigned

48、 char *)0x50004024) /uart 1 receive buffer#define rutxh2 (*(volatile unsigned char *)0x50008020) /uart 2 transmission hold#define rurxh2 (*(volatile unsigned char *)0x50008024) /uart 2 receive buffer#define wrutxh0(ch) (*(volatile unsigned char *)0x50000020)=(unsigned char)(ch)#define rdurxh0() (*(v

49、olatile unsigned char *)0x50000024)#define wrutxh1(ch) (*(volatile unsigned char *)0x50004020)=(unsigned char)(ch)#define rdurxh1() (*(volatile unsigned char *)0x50004024)#define wrutxh2(ch) (*(volatile unsigned char *)0x50008020)=(unsigned char)(ch)#define rdurxh2() (*(volatile unsigned char *)0x500080

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論