s3c2440的UART用法.docx

上传人:rrsccc 文档编号:9697170 上传时间:2021-03-18 格式:DOCX 页数:18 大小:34.29KB
返回 下载 相关 举报
s3c2440的UART用法.docx_第1页
第1页 / 共18页
s3c2440的UART用法.docx_第2页
第2页 / 共18页
s3c2440的UART用法.docx_第3页
第3页 / 共18页
亲,该文档总共18页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《s3c2440的UART用法.docx》由会员分享,可在线阅读,更多相关《s3c2440的UART用法.docx(18页珍藏版)》请在三一文库上搜索。

1、s3c2440 的 UART 用法SPI、IIC 和 UART 是最常用的三种串行总线, 这三种总线在 s3c2440 中都被集成了。 在 这里我们主要介绍 UART ,另两个总线在后面的文章中给出。UART ( Universal Asynchronous Receiver/Transmitter ,通用异步接收 / 发送装置)用于异 步通信, 可以实现全双工发送和接收。 它不仅可以实现不同嵌入式系统之间的通信, 还可以 实现与 PC 之间的通信。s3c2440 提供了三个 UART 端口,它们都可以通过查询、中断和 DMA 方式传输数据, 而且每个 UART 都分别有一个 64 个字节的接

2、收 FIFO 和一个 64 个字节的发送 FIFO 。在这 里,我们只给出非 FIFO 模式,即传输数据不利用 FIFO 缓存,一个字节一个字节地传输。下面我们就给出如何用 s3c2440 来实现非 FIFO 的 UART 通信。要实现某种通信,就必 须遵循该通信协议。 UART 的协议包括传输数据的位数,停止位的位数,以及是否进行奇偶 校验,这些设置是利用 ULCONn 寄存器完成的。另一个很重要的地方就是设置波特率。S3C2440波特率的时钟源有三个:PCLK、FCLK/n和UEXTCLK 。时钟源的选择是由 UCONn的第 10 位和第 11 位来完成的。波特率的具体计算公式为:时钟源频

3、率+(波特率X 16) 1这个计算结果很可能是小数, 把该小数取最接近的整数, 放入寄存器 UBRDIVn 中就完成了 波特率的设置。如我们选择波特率的时钟源为PCLK,它为50MHz,我们设置的波特率为115.2kHz,通过上式计算的结果为26.13,取整后得到 26,那么我们把 26放入UBRDIVn中即可。由于我们没有使用 FIFO 和 MODEM ,所以可以不用设置 FIFO 控制寄存器 UFCONn 和 MODEM 控制寄存器 UMCONn 。通过以上寄存器的设置, UART 就可以正常传输数据。接收到的数据是放到接收缓存器 URXHn 中,要发送数据时, 是把数据放入发送缓存器 U

4、TXHn 中。由于 UART 是通过字节方式传输数据的, 因此要区分是大端模式还是小端模式, 也就是说这两个寄存器在这两种模式下, 所在的地址是不同。 为了了解当前数据传输的各种 状态,还需要一些状态寄存器。传输状态寄存器 UTRSTATn 非常有用,它的第 0 位可以用 来判断接受缓存器内是否有可接收的数据, 第1位和第 2位可以用来判断发送缓存器中是否 为空, 为空时可以发送数据。 由于在这里我们不进行传输数据时错误的判断, 因此错误状态 寄存器 UERSTATn 不需要, FIFO 状态寄存器 UFSTATn 和 MODEM 状态寄存器 UMSTATn 在这里也不需要。我们给出 UART

5、 通信的两种方法:查询和中断。为了验证程序,使用任一款的串行通 信软件来实现 PC 和 S3C2440 之间的通信即可。首先给出的是查询程序。它是在主程序的循环体内不断查询UART 端口,当有数据来时,就接收数据,并再通过 UART 发送该数据。然后根据所接收数据的不同,分别执行不同的内容,如点亮、熄灭LED,蜂鸣器响、或不响。在这里,我们每次只完成一个字节的传输。#defi ne rGPBCON(*( volatile unsigned *)0x56000010)/Port B con trol#defi ne rGPBDAT(*(volatile un sig ned *)0x560000

6、14)/Port B data#defi ne rGPBUP(*(volatile un sig ned *)0x56000018)/Pull-up control B#defi ne rGPHCON(*(volatile un sig ned *)0x56000070)/Port H con trol#defi ne rGPHUP(*(volatile unsigned *)0x56000078)/Pull-up control H#defi ne rULCON0(*(volatile un sig ned *)0x50000000)/UART 0 Line con trol#defi ne

7、 rUCON0(*(volatile unsigned *)0x50000004)/UART 0 Co ntrol#defi ne rUFCON0(*(volatile un sig ned *)0x50000008)/UART 0 FIFO con trol#defi ne rUMCON0(*(volatile un sig ned *)0x5000000c)/UART 0 Modem con trol#defi ne rUTRSTAT0(*(volatile un sig ned *)0x50000010)/UART 0 Tx/Rx status#defi ne rUERSTAT0(*(v

8、olatile unsigned *)0x50000014)/UART 0 Rx error status#defi ne rUFSTAT0(*(volatile un sig ned *)0x50000018)/UART 0 FIFO status#defi ne rUMSTAT0(*(volatile un sig ned *)0x5000001c)/UART 0 Modem status#defi ne rUBRDIV0(*(volatile un sig ned *)0x50000028)/UART 0 Baud rate divisor/little en dia n#defi ne

9、 rUTXHO (*(volatile un sig ned char *)0x50000020) /UART 0 Tran smissio n Hold #defi ne rURXH0 (*(volatile un sig ned char *)0x50000024) /UART 0 Receive buffervoid Main (void)rGPBCON=0x015551;rGPBUP=0x7ff;rGPBDAT:=0x1e0;rGPHCON=0x00faaa;rGPHUP=0x7ff;rULCON0 :=0x3;rUCON0 =0x245;rUFCON0 :=0;rUMCON0=0;r

10、UBRDIV0 = 26;while(!(rUTRSTAT0 & 0x2);char ch;/使用UART0功能/设置UART0无奇偶校验,一位停止位,8位数据/PCLK为时钟源,接收和发送数据为查询或中断方式/设置波特率,PCLK为50MHz,波特率为115.2kHz/等待并判断发送缓存是否为空rUTXH0 = 0xaa;/是空,则发送0xAA字节while(1) while(!(rUTRSTAT0 & 0x1); / 等待并判断接收缓存是否准备好ch = rURXH0; / 接收一个字节数据while(!(rUTRSTAT0 & 0x2);/等待并判断发送缓存是否为空rUTXH0 = ch

11、;/ 发送一个字节数据switch(ch)/根据所接收数据的不同,执行不同的程序case 0x11:/ 灭 LEDrGPBDAT |= 0x1e0;break;case 0x22:/亮 LEDrGPBDA T &= 0x1f;break;case 0x33: /蜂鸣器不响rGPBDAT &= 0x1e0;break;case 0x44:/蜂鸣器响rGPBDAT |= 0x1;break;default: /LED 灭,蜂鸣器不响rGPBDAT = 0x1e0;break;下面是 UART 中断程序, 它要比查询复杂一些, 因为涉及到了中断处理, 并且 UART 发送数据和接收数据是一个中断源。

12、主程序循环体内不执行任何程序,都在 UART 中断程 序内执行。当接收到 0x55 字节数据时,亮两个 LED ,当接收到其他数据时,发送该字节, 并在发送部分执行亮 4 个 LED 程序。#define _ISR_STARTADDRESS0x33ffff00#define pISR_UART0(*(unsigned *)(_ISR_STARTADDRESS+0x90)#define U32 unsigned int#define rGPBCON#define rGPBDAT#define rGPBUP(*(volatile unsigned *)0x56000010)/Port B cont

13、rol(*(volatile unsigned *)0x56000014)/Port B data(*(volatile unsigned *)0x56000018) /Pull-up control B#define rGPHCON /#define rGPHDAT #define rGPHUP(*(volatile unsigned *)0x56000070)(*(volatile unsigned *)0x56000074)(*(volatile unsigned *)0x56000078)/Port H control /Port H data /Pull-up control H#d

14、efine rULCON0 #define rUCON0 #define rUFCON0 #define rUMCON0 #define rUTRSTAT0 #define rUERSTAT0 #define rUFSTAT0 #define rUMSTAT0 #define rUBRDIV0(*(volatile unsigned *)0x50000000) (*(volatile unsigned *)0x50000004) (*(volatile unsigned *)0x50000008) (*(volatile unsigned *)0x5000000c) (*(volatile u

15、nsigned *)0x50000010) (*(volatile unsigned *)0x50000014) (*(volatile unsigned *)0x50000018) (*(volatile unsigned *)0x5000001c) (*(volatile unsigned *)0x50000028)/UART 0 Line control /UART 0 Control/UART 0 FIFO control /UART 0 Modem control/UART 0 Tx/Rx status/UART 0 Rx error status/UART 0 FIFO statu

16、s/UART 0 Modem status/UART 0 Baud rate divisor/little endian#define rUTXH0 (*(volatile unsigned char *)0x50000020) /UART 0 Transmission Hold#define rURXH0 (*(volatile unsigned char *)0x50000024) /UART 0 Receive buffer#define rSRCPND#define rINTMSK#define rINTPND(*(volatile unsigned *)0x4a000000)(*(v

17、olatile unsigned *)0x4a000008)(*(volatile unsigned *)0x4a000010)/Interrupt request status/Interrupt mask control/Interrupt request status#define rSUBSRCPND (*(volatile unsigned *)0x4a000018)/Sub source pending#define rINTSUBMSK (*(volatile unsigned *)0x4a00001c)/Interrupt sub maskvoid _irq uartISP(v

18、oid)char ch; rSUBSRCPND |= 0x3; rSRCPND = 0x128; rINTPND = 0x128;if(rUTRSTA T0 & 1)/接收数据处理部分ch = rURXH0; /接收字节数据 if(ch=0x55)rGPBDAT = 0x61;/亮两个 LEDelserUTXH0 = ch;/发送字节数据 else/发送数据处理部分 rGPBDA T = 0x1e1;/亮 4个 LEDvoid Main(void)rGPBCON = 0x015551; rGPBUP = 0x7ff; rGPBDAT = 0x1e0;rGPHCON = 0x00faaa; rG

19、PHUP = 0x7ff;rULCON0 = 0x3; rUCON0 = 0x5;rUFCONO = 0;rUMCONO = 0;rUBRDIVO = 26;rSRCPND = 0x128;rSUBSRCPND = 0x3;rINTPND = 0x128;rINTSUBMSK = (0x3);/打开UARTO发送和接收中断屏蔽rINTMSK = (0x128);/打开 UARTO 中断屏蔽plSR_UARTO = (U32)uartISP;while(1)最后还要强调几点关于非 FIFO模式下UART中断的一些注意事项:1. 对于S3C2440来说,接收数据是被动的,发送数据是主动的,因此一般

20、来说,接收数据 用中断方式,发送数据用查询方式较好;2. 在中断方式下,当接收到数据时,尽管可能该数据无用,但也一定要读取它,否则下次再接收数据时,不会再引起中断,因为接收数据缓存器被上次接收到的数据所霸占,只要没有读取它,它就永远在那里;3. 由于UART中断涉及到SUBSRCPND寄存器,因此在中断处理程序中不仅要清SRCPND寄存器,还要清 SUBSRCPND寄存器,它们的顺序一定是先清SUBSRCPND寄存器,再清SRCPND寄存器,否则就会引起一个中断两次响应的问题。因为是否中断由SRCPND寄存器决定,而SRCPND寄存器的相关状态位由 SUBSRCPND寄存器决定,如果先清 SR

21、CPND 寄存器,而还没有清 SUBSRCPND寄存器的话,SRCPND寄存器的相关位还是会被置1,而一旦被置1,则一定还会引起中断。本文来 自 CSDN 博客, 转载请标明 出 处: http:/blog.csd n.n et/zhaocj/archive/2010/03/10/5364412.aspx基于 ARM9 2410 的嵌入式串口编程2007 04 17 OHY下面的程式是在 2410 研发平台上调试通过的,一个串口的发送实验程式 serial.c #include#include#include#include#include#include#include#include#in

22、cludeint 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_iflag = IGNPAR | IC

23、RNL;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);代码写完以后,需要用 ARM 的

24、 GCC 编译器来编译代码,而不能以 GCC 来编译代码。因为 2410 是 ARM 体系结构,和普通 PC 机的体系结构不相同的。能将 armv4l-unknown-linux-gcc 这个文件拷贝到刚才编写 C 的源程式同一目录下,这样就不必使用一串长长的绝对路径了。 如果需要将刚才的 serial.c 编译成一个名字为 serial 的可执行文件, 可使用下面的命 令:./ armv4l-unknown-linux-gcc -o serial serial.c在运行上述生成的文件时,先通过 minicom 将宿主机挂载到目标板上。例如宿主机的 IP 地址为:192.168.2.100 ,

25、目标板的 IP 地址为: 192.168.2.101 。能通过下面的命令将其挂载 : mount 192.168.2.100:/ /tmp这样,宿主机的这个根目录就挂载到目标板上了。由于要进行串口的调试实验, minocom 需要用来和目 标板进行窗口通信。所有对目标板的操作控制,最佳通过 telnet 来进行,能通过下面命令实现: telnet 192.168.2.101连接到目标板上成功的时候, 需要输入登陆的用户名和密码, 一般是输入 root 按回车就能, 也有例外的。 然后在目标板的 /tmp 目录中就能看到整个宿主机根目录的内容,再找到 serial 所在的目录,输入下面命 令:.

26、/serial 就可在宿主机的 minicom 中看到一个文件属性的输出了。s3c2440串口文档s3c2440的UART提供了三个同步串行10 口,第一个串口都可以使用中断 模式和 DMA 模式,换句话说就是 UART 可以产生一个中断或者是 DMA 请求使 数据在 CPU 和 UART 之间进行传递。 UART 在系统时钟下可以支持最高位传送 为115.2K BPS.如果一个外部设备能过 UEXTCLK为UART提供时钟,UART可 以达到更高的速度。每个UART通道包括两个64字节的FIFO作为接收数据和 发送数据使用。s3c2440的UART包括可编程的波特率,红外收发,一个或者两个停

27、止位。5 位, 6 们, 7 位, 8 位的数据位和校验检测。每一个 UART 包括一个波特率产生器,发送器,接收器和一个控制单元。如图 111 所示。波特率产生器可以使用 PCLK,FCLK/n 或者 UEXTCLK 之一控制。 发送器和接收器包含 64 字节的 FIFO 和一个数据移位器。 数据先写到 FIFO 中然 后再拷贝到发送移位器中,然后再移位发送通过数据针TxDn。在些期间远端发送过来的数据通过针RxDn进入到移位器中再拷贝到接收器的 FIFO中去。属性RxD0,TxD0,RxD1,TxD1,Rxd2,和TxD2都可使用基于 DMA的和中断的操作。 UART通道0, 1,和2都拥

28、有IrDA和64字节的FIFO UART 通道 0和 1:nRTS0,nCTS0,nRTS1,nCTS1 收发数据时支持握手UART 的操作UART 的操作,包括数据传输,数据接收,产生中断,波特率的产生回环模式, 红外模式和自动流控制。数据传输发送的数据帧是可以改变的, 它由起始位 58 个数据位一个可选的校验位和 12 个停止位构成。这些都可以通过策略控制器 ULCONn 设置。数据发送器也可以 产生一个停止标志, 它可以强迫串口输出逻辑 0 达一帧的时间, 它在一个字传输 完成以后阻塞了停止信号的传送。然后继续传输数据到 Tx FIFO 中。数据接收与数据的发送相似, 接收到的数据帧也是

29、可以修改的。 它包括一个起始位, 五到 八个数据位,一个可选的校验位和一到两个停止位。接收器可检测到覆盖错误, 校验错误,帧错误和终止的情况。每一种情况都会设置一个错误标志位。覆盖错误产生的情况是这样的,新数据覆盖掉了还没有来的及取出的旧数 据,也就是说接收数据速度快于取出的速度导致一部分数据还没有取出就被新的 数据盖掉了。校验错误是指接收到的数据经过计算与校验位不符。 帧错误是指收到的数据不含有停止位。终止的情况是指 RxDn 端保持在逻辑零的状态时间长于一帧数据传送的时 间。接收超时的情况是指在可以接收 3 个字的时间里没有收到任何的数据, 并且 在 FIFO 模式时 Rx 的 FIFO

30、非空。自动流量控制 (AFC)S3C2440的UART 0和UART 1通过信号n RTS和nCTS支持自动流量控制。 在这种情况下,它可以连接到外部的 UARTs 中去。如果用户想把串口连接到 Modem 上,需要关闭寄存器 UMCONn 的自动流控制位,并通过软件控制 nRTS 信号线。在AFC模式下,nRTS依赖于接收器,nCTS信号控制着发送器的操作。UART 的数据发送器只在nCTS信号使能的时候才把数据传送到 FIFO中(在AFC模式 下 nCTS 的意思是其它 UART 的 FIFO 已经准备好接收数据了)。在UART开始接收数据之前,需要先根据数据接收器的FIFO剩余空间设置n

31、RTS 的值,如果剩余空间大于32字节则nRTS使能,否则如果剩余空间小于32字节 则 nRTS 关闭(在 AFC 模式下, nRTS 的作用就是表示它所控制的接收器的 FIFO 准备好接收数据了)。UART 2不支持 AFC功能,因为S3C2440没有nRTS2和nCTS2 非自动流量控制的例子(通过软件控制信号 nRTS和nCTS) 接收器对 FIFO 的操作1. 选择接收模式(中断模式或者 DMA 模式)2. 检查寄存器UFSTATn中Rx FIFO的值,如果这个值小于32,用户必须设置 UMCONn0为“ 1”(使能nRTS),如果值大于32,用户必须设置 UMCONn0 的值为“0(

32、”关闭 nRTS)3. 重复第 2 步。发送器对 FIFO 的操作1.选择一个发送模式(中断或者 DMA )2检查UMSTATn0的值,如果为“1”(使能nCTS),用户写数据到Tx FIFO寄 存器S3C2440的每个UART都有七个状态:覆盖错误,校验错误,帧错误,终止, 接收缓冲区已准备好, 发送缓冲区空,和发送移位器空。所有这些都对应到 UART 的状态寄存器中( UTRSTATn/UERSTATn).覆盖错误, 校验错误, 帧错误和终止属于接收错误, 它们中的任何一个都可以引 起一个叫“receive error stat u的中断请求。如果这个中断请求在寄存器 UCO Nn 中的使

33、能位被置为 “ 1 ,(并且当这个请求被处理时通过读取 UERSTSATn 的值可 知引起这个中断的信号,也就是找到是哪种错误引起的中断。FIFO 模式与非 FIFO 模式在FIFO模式下,接收器从接收移位器中收数据然后写入到FIFO中,如果收到数据的个数达到Rx FIFO的触发点,且在寄存器UCONn中的接收模式被设置 成“ 1”(中断或者轮巡模式),将会产生一个 Rx中断。在非FIFO模式下,不论 是中断模式还是轮巡模式, 只要有数据从接收移位寄存器中传送到数据接收保持 寄存器中都会产生一个Rx中断。在FIFO模式下,如果发送模式在控制寄存器 UCONn中被设置成中断模式或者 轮巡模式,发

34、送数据要从发送 FIFO 中传送到发送移位器中,如果在 FIFO 中剩 余的数据个数达到了 Tx FIFO的触发点,就是产生一个 Tx中断。在非FIFO模 式下,发送的数据从发送保持寄存器传送到发送移位器中后会产生一个Tx中断,这个也是要求数据发送方送方式为中断模式或者是轮巡模式。如果在控制寄存器中数据发送方式和接收方式被设置成 DMA 模式,那么和上面 的情况一样,只是产生的 Rx 和 Tx 中断被换成了 DMA 请求。UART 的错误 FIFOUART有一个错误状态” FIFOS,它对应着接收器的FIFO,它指示在接收 器的FIFO中哪个数据错误了。只有在接收器中错误数据被读取的时候才会产

35、生 错误中断。 在从 URXHn 读取数据的时候同时读取 UERSTATn 寄存器的值就知 道这个数据哪里错了,什么错误。例子假设UART顺序接收了 A B C D E这五个数据,其中接收B的时候发生了帧 错误,接收 D 的时候发生了校验错误。在接收B的时候不会产生 错误中断”,在接收“D的时候也不会产生 错误中断”。 当读取 B 数据和 D 数据的时候 “错误中断 (才会产生。波特率的产生ART 的波特率发生器为串行数据的发送与接收提供时钟,波特率发生器的源时钟”可以是S3C2440的内部系统时钟也可以是外部时钟” UEXTCLK ),换 句话说就是通过设置 UCONn 的“时钟(选项可以改

36、变除数因子。波特率是由 “源 时钟(” PCLK,FCLK/n UEXTCLK) 除以 16和一个除数因子。公式是这样的: 除数因子=(整型)(源时钟”除以波特率乘以16)减1除数因子UBRDIVn的取值范围是12A16-1但当使用外部时钟UEXTCLK时它却可以等于 0.(这个外部时钟要低于 PCLK)例如:如果波特率是115200bps, UART的时钟是40MHz,除数因子UBRDIVn 是UBRDIVn = (int)(40000000 / (115200 x 16) ) -1= (int)(21.7) -1 round to the nearest whole number= 22

37、-1 = 21波特率的错误容忍度UART 的帧错误必须低于 1.87%ADS 下的串口配置def.h 中的 UART 寄存器定义:#define rULCON0 control#define rUCON0#define rUFCON0 control#define rUMCON0 control#define rUTRSTAT0status#define rUERSTAT0status#define rUFSTAT0 status#define rUMSTAT0 status#define rUBRDIV0divisor#define rULCON1#define rUCON1#define

38、rUFCON1#define rUMCON1 control#define rUTRSTAT1 #define rUERSTAT1 status#define rUFSTAT1 #define rUMSTAT1(*(volatile unsigned *)0x50000000) /UART 0 Line(*(volatile unsigned *)0x50000004) /UART 0 Control(*(volatile unsigned *)0x50000008) /UART 0 FIFO(*(volatile unsigned *)0x5000000c) /UART 0 Modem(*(

39、volatile unsigned *)0x50000010) /UART 0 Tx/Rx (*(volatile unsigned *)0x50000014) /UART 0 Rx error(*(volatile unsigned *)0x50000018) /UART 0 FIFO (*(volatile unsigned *)0x5000001c) /UART 0 Modem (*(volatile unsigned *)0x50000028) /UART 0 Baud rate(*(volatile unsigned *)0x50004000) /UART 1 Line contro

40、l (*(volatile unsigned *)0x50004004) /UART 1 Control (*(volatile unsigned *)0x50004008) /UART 1 FIFO control (*(volatile unsigned *)0x5000400c) /UART 1 Modem(*(volatile unsigned *)0x50004010) /UART 1 Tx/Rx status(*(volatile unsigned *)0x50004014) /UART 1 Rx error(*(volatile unsigned *)0x50004018) /U

41、ART 1 FIFO status(*(volatile unsigned *)0x5000401c) /UART 1 Modem status#define rUBRDIV1 divisor(*(volatile unsigned *)0x50004028) /UART 1 Baud rate#define rULCON2(*(volatile unsigned *)0x50008000) /UART 2 Line control#define rUCON2(*(volatile unsigned *)0x50008004) /UART 2 Control#define rUFCON2(*(

42、volatile unsigned *)0x50008008) /UART 2 FIFO control#define rUMCON2 control(*(volatile unsigned *)0x5000800c) /UART 2 Modem#define rUTRSTAT2(*(volatile unsigned *)0x50008010) /UART 2 Tx/Rx status#define rUERSTAT2(*(volatile unsigned *)0x50008014) /UART 2 Rx errorstatus#define rUFSTAT2#define rUMSTAT

43、2status#define rUBRDIV2(*(volatile unsigned *)0x50008018) /UART 2 FIFO status(*(volatile unsigned *)0x5000801c) /UART 2 Modem(*(volatile unsigned *)0x50008028) /UART 2 Baud rate divisor #ifdef _BIG_ENDIAN(*(volatile unsigned char *)0x50000023) /UART 0#define rUTXH0 Transmission Hold#define rURXH0 bu

44、ffer#define rUTXH1Transmission Hold#define rURXH1 buffer#define rUTXH2 Transmission Hold #define rURXH2 buffer(*(volatile unsigned char *)0x50000027) /UART 0 Receive(*(volatile unsigned char *)0x50004023) /UART 1(*(volatile unsigned char *)0x50004027) /UART 1 Receive(*(volatile unsigned char *)0x500

45、08023) /UART 2(*(volatile unsigned char *)0x50008027) /UART 2 Receive #define WrUTXH0(ch) (*(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

46、() (*(volatile unsigned char *)0x50004027)#define WrUTXH2(ch) (*(volatile unsigned char *)0x50008023)=(unsigned char)(ch)#define RdURXH2() (*(volatile unsigned char *)0x50008027)#define UTXH0 #define URXH0 #define UTXH1 #define URXH1 #define UTXH2 #define URXH2(0x50000020+3) /Byte_access address by DMA(

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1