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),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

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

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

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

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

5、程序。它是在主程序的循環(huán)體內(nèi)不斷查詢uart端口,當(dāng)有數(shù)據(jù)來時,就接收數(shù)據(jù),并再通過uart發(fā)送該數(shù)據(jù)。然后根據(jù)所接收數(shù)據(jù)的不同,分別執(zhí)行不同的內(nèi)容,如點亮、熄滅led,蜂鳴器響、或不響。在這里,我們每次只完成一個字節(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無奇偶校驗,一位停止位,8位數(shù)據(jù)rucon0 = 0x245; /pclk為時鐘源,接收和發(fā)送數(shù)據(jù)為查詢或中斷方式rufcon0 = 0; /rumcon0 = 0; /rubrdiv0 =

10、 26; /設(shè)置波特率,pclk為50mhz,波特率為115.2khzwhile(!(rutrstat0 & 0x2); /等待并判斷發(fā)送緩存是否為空傳播優(yōu)秀word版文檔 ,希望對您有幫助,可雙擊去除!rutxh0 = 0xaa; /是空,則發(fā)送0xaa字節(jié)while(1) while(!(rutrstat0 & 0x1); /等待并判斷接收緩存是否準(zhǔn)備好ch = rurxh0; /接收一個字節(jié)數(shù)據(jù) while(!(rutrstat0 & 0x2); /等待并判斷發(fā)送緩存是否為空 rutxh0 = ch; /發(fā)送一個字節(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版文檔 ,希望對您有幫助,可雙擊去除! rgpbdat = 0x1e0; break; 下面是uart中斷程序,它要比查詢復(fù)雜一些,因為涉及到了中斷處理,并且uart發(fā)送數(shù)據(jù)和接收數(shù)據(jù)是一個中斷源。主程序循環(huán)體內(nèi)不執(zhí)

12、行任何程序,都在uart中斷程序內(nèi)執(zhí)行。當(dāng)接收到0x55字節(jié)數(shù)據(jù)時,亮兩個led,當(dāng)接收到其他數(shù)據(jù)時,發(fā)送該字節(jié),并在發(fā)送部分執(zhí)行亮4個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版文檔 ,希望對您有幫助,可雙擊去除! /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; /亮兩個led else rutxh0 = ch; /發(fā)送字節(jié)數(shù)據(jù) else /發(fā)送數(shù)據(jù)處理部分 rgpbdat = 0x1e1; /亮4個led void main(void) rgpbcon = 0x015551;rgpbup = 0x7ff; rgpbda

19、t = 0x1e0;rgphcon = 0x00faaa; rgphup = 0x7ff;傳播優(yōu)秀word版文檔 ,希望對您有幫助,可雙擊去除!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、幾點關(guān)于非fifo模式下uart中斷的一些注意事項:1. 對于s3c2440來說,接收數(shù)據(jù)是被動的,發(fā)送數(shù)據(jù)是主動的,因此一般來說,接收數(shù)據(jù)用中斷方式,發(fā)送數(shù)據(jù)用查詢方式較好;2. 在中斷方式下,當(dāng)接收到數(shù)據(jù)時,盡管可能該數(shù)據(jù)無用,但也一定要讀取它,否則下次再接收數(shù)據(jù)時,不會再引起中斷,因為接收數(shù)據(jù)緩存器被上次接收到的數(shù)據(jù)所霸占,只要沒有讀取它,它就永遠(yuǎn)在那里;3. 由于uart中斷涉及到subsrcpnd寄存器,因此在中斷處理程序中不僅要清srcpnd寄存器,還要清subsrcpnd寄存器,它們的順序一定是先清subsrcpnd寄存器,再清srcpnd寄存器,否則就會引起一個中斷兩次響應(yīng)的問

21、題。因為是否中斷由srcpnd寄存器決定,而srcpnd寄存器的相關(guān)狀態(tài)位由subsrcpnd寄存器決定,如果先清srcpnd寄存器,而還沒有清subsrcpnd寄存器的話,srcpnd寄存器的相關(guān)位還是會被置1,而一旦被置1,則一定還會引起中斷。本文來自csdn博客,轉(zhuǎn)載請標(biāo)明出處:傳播優(yōu)秀word版文檔 ,希望對您有幫助,可雙擊去除!基于arm9 2410的嵌入式串口編程20070417ohy 下面的程式是在2410研發(fā)平臺上調(diào)試通過的,一個串口的發(fā)送實驗程式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來編譯代碼。因為2410是arm體系結(jié)構(gòu),和普通pc機(jī)的體系結(jié)構(gòu)不相同的。 能將armv4l-unknown-linux-gcc這個文件拷貝到剛才編寫c的源程式同一目錄下,這樣就不必使用一串長長的絕對路徑了。如果需要將剛才的serial.c編譯成一個名字為serial的可執(zhí)行文件,可使用下面的命令:./ armv4l-unknown-linux-gcc -o serial serial.c 在運(yùn)行上述生成的文件時,先通過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ī)的這個根目錄就掛載到目標(biāo)板上了。由于要進(jìn)行串口的調(diào)試實驗,minocom需要用來和目標(biāo)板進(jìn)行窗口通信。所有對目標(biāo)板的操作控制,最佳通過telnet來進(jìn)行,能通過下面命令實現(xiàn):telnet 192.168.2.101 連接到目標(biāo)板上成功的時候,需要輸入登陸的用戶名和密碼,一般是輸入root按回車就能,也有例外的。 然后在目標(biāo)板的/tmp目錄中就能看到整個宿主機(jī)根目錄的內(nèi)容,再找到serial所在的目錄,輸入下面命令:./serial就可在宿主機(jī)的minicom中看到一個文

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

27、檢測。每一個uart包括一個波特率產(chǎn)生器,發(fā)送器,接收器和一個控制單元。如圖111所示。波特率產(chǎn)生器可以使用pclk,fclk/n或者uextclk之一控制。發(fā)送器和接收器包含64字節(jié)的fifo和一個數(shù)據(jù)移位器。數(shù)據(jù)先寫到fifo中然后再拷貝到發(fā)送移位器中,然后再移位發(fā)送通過數(shù)據(jù)針txdn。在些期間遠(yuǎn)端發(fā)送過來的數(shù)據(jù)通過針rxdn進(jìn)入到移位器中再拷貝到接收器的fifo中去。傳播優(yōu)秀word版文檔 ,希望對您有幫助,可雙擊去除!屬性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ù)時支持握手uart的操作uart的操作,包括數(shù)據(jù)傳輸,數(shù)據(jù)接收,產(chǎn)生中斷,波特率的產(chǎn)生回環(huán)模式,紅外模式和自動流控制。數(shù)據(jù)傳輸發(fā)送的數(shù)據(jù)幀是可以改變的,它由起始位58個數(shù)據(jù)位一個可選的校驗位和12個停止位構(gòu)成。這些都可以通過策略控制器ulconn設(shè)置。數(shù)據(jù)發(fā)送器也可以產(chǎn)生一個停止標(biāo)志,它可以強(qiáng)迫串口輸出邏輯0達(dá)一幀的時間,它在一個字傳輸完成以后阻塞了停止信號的傳送。然后繼續(xù)傳輸數(shù)據(jù)到tx fifo中。數(shù)據(jù)接收與數(shù)據(jù)的發(fā)送相似,接收到的數(shù)據(jù)幀也是可以修改的。它包括一個起始位,五到八個數(shù)據(jù)位,一個可選的校驗位和一到兩個停止位。接收器可檢測

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

30、以連接到外部的uarts中去。如果用戶想把串口連接到modem上,需要關(guān)閉寄存器umconn的自動流控制位,并通過軟件控制nrts信號線。在afc模式下,nrts依賴于接收器,ncts信號控制著發(fā)送器的操作。uart的數(shù)據(jù)發(fā)送器只在ncts信號使能的時候才把數(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功能,因為s3c2440沒有nrts2和ncts2非自動流量控制的例子(通過軟件控制信號nrts和ncts)接收器對fifo的操作傳播優(yōu)秀word版文檔 ,希望對您有幫助,可雙擊去除!1.選擇接收模式(中斷模式或者dma模式)2.檢查寄存器ufstatn中rx fifo的值,如果這個值小于32,用戶必須設(shè)置umconn0為“1”(使能nrts),如果值大于32,用戶必須設(shè)置umconn0的值為“0”(關(guān)閉nrts)3.重復(fù)第2步。發(fā)送器對fifo的操作1.選擇一個發(fā)送模式(中斷或者dma)2.檢查umstatn0的值,如果為“1”(使能ncts),用戶寫數(shù)據(jù)到

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

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

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

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

36、外部時鐘要低于pclk)例如:如果波特率是115200bps,uart的時鐘是40mhz,除數(shù)因子ubrdivn是ubrdivn = (int)(40000000 / (115200 x 16) ) -1= (int)(21.7) -1 round to the nearest whole number= 22 -1 = 21波特率的錯誤容忍度uart的幀錯誤必須低于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版文檔 ,希望對您有幫助,可雙擊去除!#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版文檔 ,希望對您有幫助,可雙擊去除!#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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論