ARM串口通信uart


UART概述
通用异步收发器简称UART(Universal Asynchronous Receiver and Transmitter)
工作方式为:串行、全双工。
只需3根线:TXD(发送数据)、RXD(接收数据)、GND。
数据传输流程:
原来是高电平(空闲状态)
发送方拉低电平,保持1bit时间,为起始位。
接收方检测到起始位,然后通信双方按照波特率发送和接收5-8位数据。
若使用校验功能,则发送完数据位后还要接着发送奇偶校验位。
最后,发送停止位。
S3C2440的UART的特性
3个独立异步串行I/O端口,每个都可以是基于中断或基
于 DMA 模式的操作。
UART 通过使用系统时钟可以支持最高 115.2Kbps 的比特率。如果是外部器件提供 UEXTCLK 的 UART,则 UART可以运行在更高的速度。
每个 UART 通道包含两个的 64 字节的 FIFO 给发送和接收。
S3C2440A 的 UART 包括了可编程波特率,红外(IR)发送/接收,插入 1 个或 2 个停止位,5 位、6 位、7 位或 8 位的数据宽度以及奇偶校验。 每个 UART 包含一个波特率发生器、发送器、接收器和一个控制单元。波特率发生器可以由PCLK、FCLK/n 或 UEXTCLK(外部输入时钟)时钟驱动。
UART的结构框图
在这里插入图片描述
要发送数据时,CPU控制内存要发送的数据通过FIFO传给UART单位,UART里面的移位器,依次将数据发送出去,在发送完成后产生中断提醒CPU传输完成。
接收数据时,获取接收引脚的电平,逐位放进接收移位器,再放入FIFO,写入内存。在接收完成后产生中断提醒CPU传输完成。
波特率发生每个 UART 的波特率发生器为发送器和接受器提供串行时钟。波特率发生器的源时钟可以选择 S3C2440A 的内部系统时钟或 UEXTCLK。 换句话说,分频由设置 UCONn 的时钟选项选择。 波特率时钟是通过16 和由 UART波特率分频寄存器(UBRDIVn)指定的 16 位分频系数来分频源时钟(PCLK,FCLK/n 或 UEXTCLK)产生的。
UBRDIVn 由下列表达式决定:
UBRDIVn = (int)( UART 时钟 / ( 波特率 × 16) ) - 1
例如,如果波特率为 115200 bps 并且 UART 时钟为 40 MHz,则 UBRDIVn 为:
UBRDIVn = (int)(40000000 / (115200 x 16) ) - 1
= (int)(21.7) - 1 [取最接近的整数]
= 22 - 1 = 21
**
编程
**
目的:实现串口初始化函数、发送一个字节函数、接收一个字节函数、发送字符串函数。
用到的特殊功能寄存器:
在这里插入图片描述
初始化函数:
1.要配置相应的GPIO引脚为串口功能。
2.设置方式(中断查询方式)、时钟源选择(PCLK)。
3.设置数据位、校验位、停止位。
4.设置波特率(配置UBRDIVn)。

              /* 115200,8n1 */
              void uart0_init()
              {
              /* 配置GPH2、3为 TXD0、RXD0,并且开启上拉电阻 */
              GPHCON &= ~((3<<4) | (3<<6)); GPHCON |=((2<<4) | (2<<6)); GPHUP &=~(3<<2);
              /* 配置UART CONTROL
              REGISTER,时钟源为PCLK,中断/查询方式 */
              UCON0=0x00000005; /* 配置UART LINE CONTROL REGISTER 为 8n1 */
              ULCON0=0x00000003; /* 配置UBRDIV0,波特率为115200,UBRDIVn=(int)( UART clock / ( buad rate x 16) ) –1 */
              UBRDIV0=26;
              }
              1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 发送和接收函数则用到 状态寄存器UTRSTATn 和
              发送缓冲寄存器UTXHn、接收缓冲寄存器URXHn。
              具体代码如下:
              int putchar(int c) {
              while (!(UTRSTAT0 & (1<<2)));
              UTXH0=(unsigned
              char)c;
              }
              int getchar(void) {
              while (!(UTRSTAT0 & (1<<0))); return URXH0;
              }
              int puts(const char *s)
              {
              while (*s) {
              putchar(*s); s++;
              }
              }
              
————————————————
版权声明:本文为CSDN博主「jiaruitao777」的编辑整理,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jiaruitao777/article/details/82894070

相关阅读:
linux基础
linux怎么学
linux和GNU
GNU Free Documentation License
最受欢迎的linux发行版
initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读