<!-- 本文件由脚本自动转换生成，请勿手动编辑 -->

> **《LKS32MC45x User Manual》UART** . 完整目录见 [README.md](README.md)
>
> **声明**：本文档由芯片用户手册自动转换生成，仅供检索与查阅参考。Markdown 格式可被自由编译、修改，本文档不构成正式技术文件，相关内容以凌鸥创芯官方网站正式发布的手册为准。
>
> 南京凌鸥创芯电子有限公司 . (C) 2020, 版权归凌鸥创芯所有 . 机密文件，未经许可不得扩散

# UART

## 概述

通用异步收发传输器（Universal Asynchrounous
Receiver/Transmitter），通常称作UART，是一种异步收发传输器。

UART主要特征如下:

- 支持全双工工作
- 支持单线半双工工作
- 支持8/9位数据位
- 支持1/2停止位
- 支持奇/偶/无校验模式
- 带1字节发送缓存
- 带1字节接收缓存
- 支持LIN模式break character收发
- 支持空闲帧检测
- 支持一主多从的Multi-drop Slave/Master模式

## 功能说明

### 发送

UART包括一个字节发送缓冲区，当发送缓冲区有数据时，UART将发送缓冲区的数据移入串行移位寄存器，并通过UART_TXD端口发送出去。只要UART发送缓冲区有数据，UART就会自动进行发送。

完成加载后，产生发送缓冲区空中断，此时，用户可以往发送缓冲区填入下一个需要发送的字节，这样，发送完成后，UART将加载这个字节进行发送。

完成发送后，会产生发送完成中断。

发送流程：

设置SYS_CLK_FEN. UART_CLK_EN = 1开启UART时钟

设置UART_CTRL.BYTE_LEN，选择8/9bit 数据字节长度

设置UART_CTRL.CK_EN，选择是否启用数据字节校验

设置UART_CTRL.CK_TYPE，选择使用奇校验还是偶校验

设置UART_CTRL.BIT_ORDER，选择发送时LSB first还是MSB first

设置UART_CTRL.STOP_LEN，选择停止比特长度为1bit/2bit

如果使用DMA搬运数据，则设置UART_RE. TX_BUF_EMPTY_RE=1，即TX
buffer空就触发DMA搬运新数据到UART；如果使用软件轮询或中断的方式，则设置UART_IE.
TX_BUF_EMPTY_IE=1

如果使用DMA搬运数据到UART发送，需要对DMA进行相应设置

如果使用软件搬运数据到UART发送，需要软件向UART_BUFF写入数据，可以触发UART开始通过UART_TXD端口发送数据。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

数据字节 (data word, 8bits or 9bits, LSB first or MSB first)

停止比特 (1/2 bit Stop bit: 1/2bit Ones)

数据字节的长度可以通过UART_CTRL.BYTE_LEN进行选择，8bit
(UART_CTRL.BYTE_LEN=0)或9bit
(UART_CTRL.BYTE_LEN=1)。起始比特为1bit零，TX信号线为低，停止比特期间TX信号线为高。

停止比特的长度由UART_CTRL.

需要注意的是，当启用校验位时(UART_CTR.CK_EN=1)，校验位会替换掉数据字节的最高bit，即MSB，此时8bit数据字节实际是7bit数据+1bit校验字，9bit数据字节实际是8bit数据+1bit校验字。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图17-2
UART 帧格式

### 波特率配置

UART输入时钟为系统主时钟，波特率通过两级分频实现。

波特率=UART模块时钟/（256\*DIVH+DIVL+1)

可以通过SYS_CLK_DIV2对UART模块时钟进行分频.

UART模块时钟=系统主时钟/(1+SYS_CLK_DIV2)

表17-1 UART波特率配置示例

|||||
|---|---|---|---|
|UART波特率|SYS_CLK_DIV2|UART_DIVH|UART_DIVL|
|600|0x0007|0x9C|0x3F|
|1200|0x0003|0x9C|0x3F|
|2400|0x0001|0x9C|0x3F|
|4800|0x0000|0x9C|0x3F|
|9600|0x0000|0x4E|0x1F|
|19200|0x0000|0x27|0x0F|
|38400|0x0000|0x13|0x87|
|43000|0x0000|0x11|0x71|
|56000|0x0000|0x0D|0x65|
|57600|0x0000|0x0D|0x05|
|115200|0x0000|0x06|0x83|

注意，同一波特率，其配置系数可能不唯一。

注意，同一波特率，其配置系数可能不唯一。

### 收发端口互换(TX/RX互换)

UART模块支持Tx与Rx端口互换。通过将Tx对应的GPIO配置为输入使能，Rx对应的GPIO配置为输出使能，即可实现Tx与Rx端口的互换。此时，GPIO第二功能仍选择为UART，UART本身配置无需修改。

此外，如果要使用一个GPIO同时作为Tx和Rx，需要将IO分时复用为输入或输出，对应Rx或Tx，即可实现单口半双工逻辑。

### 多机通讯

多机通讯场景通常是一个设备作为主设备master，另有若干个从设备slave，主设备的UARTm_TXD端口连接到所有从设备的UARTs_RXD端口，从设备的UARTs_TXD相与连接到主设备的UARTm_RXD端口。如图17-3所示，为一个主设备和3个从设备（地址分别为0x51,0x52,0x53）的互联情况。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图17-3
UART多机通讯互联拓扑

为了降低从机报文处理的负荷，从设备应该只处理发送给他的UART数据，而忽略发送给其他从设备的数据。在多机通讯场景中，每一个从机有一个8bit的设备地址，即UART_ADR。从设备设置UART_CTRL.MD_EN=1后，开启多机通讯过滤模式，主机无须设置MD_EN。主机、从机均需要使用9bit模式发送数据，即设置UART_CTRL.BYTE_LEN=1。当发送数据字节MSB(BIT8)为1时，低8位(BIT7:BIT0)是主机发出的从机地址，即**地址字节**；当发送数据字节MSB(BIT8)为0时，低8位(BIT7:BIT0)是主机发给特定从机的数据，即**数据字节**。

所有从机接收到MSB(BIT8)=1的数据字节后，判断低8位(BIT7:BIT0)地址是否与自己的UART_ADR配置值相等。如果相等，则说明后续数据都是发送给此从机，否则从机进入静默状态，忽略所有后续主机发出的数据。当从机再次接收到MSB(BIT8)=1的数据字节且低8位(BIT7:BIT0)地址与自己的UART_ADR配置值相等时，表示此从机被选中，退出静默状态。从机设置UART_CTRL.MD_EN=1开启多机通讯过滤模式后，立即进入静默状态。如果主机没有发送MSB=1的地址字节，直接发送数据字节，则所有从机都处于静默状态，不会接收任何数据。

在多机通讯模式中，主设备无需设置UART_CTRL.MD_EN=1，从设备需要设置UART_CTRL.MD_EN=1。如果无需地址过滤，从设备也可以不设置UART_CTRL.MD_EN=1，另使用软件对接收数据进行判读，此时从设备会接收并处理所有报文数据。

在多机通讯模式中，如果从设备设置了UART_CTRL.MD_EN=1，则地址字节无论是否命中UART_ADR，UART_IF.RX_DONE_IF标志均不置位；如果地址不匹配，即从设备处于静默状态，即使主设备发送数据，UART_IF.RX_DONE_IF仍不置位。如果地址匹配，当接收到主设备发送的数据字节时，从设备的UART_IF.RX_DONE_IF标志置位为1，表示从设备接收到一个数据字节。

由于检验位需要占用1bit数据位，而多机通讯需要使用9bit字节长度。因此多机通讯场景下不支持校验位，在设置UART_CTRL.MD_EN=1时，请勿设置UART_CTRL.CK_EN=1。主机、从机均需设置UART_CTRL.BYTE_LEN=1使用9bit模式，并设置UART_CTRL.MD_EN。多机通讯支持MSB
first，即UART_CTRL.BIT_ORDER=1。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图17-4 从机 9-bit UART 地址帧过滤状态机处理流程

如图17-4所示，主设备先发送了数据0x03，但此时没有从设备地址命中，因此3个从设备均不接收0x03。主设备发送地址字节0x151，从设备0x51被选中。但之后主设备没有发送数据，而是直接发送地址字节0x153，从设备0x53被选中，主设备连续发送3个数据字节0x03,0x53,0x04，均被从设备0x53接收。之后主设备发送地址字节0x152，之后发送数据字节0x07，被从设备0x52接收。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图17-5
UART多机通讯示例

### 校验位

可以通过设置UART_CTRL.CK_EN=1来使能校验位。同时根据字节长度UART_CTRL.BYTE_LEN不同，UART的帧格式有4种情况。

表17-2
UART帧格式

||||
|---|---|---|
|BYTE_LEN|CK_EN|UART frame|
|0|0|\| StartBit \| 8bit data \| StopBit \||
|0|1|\| StartBit \| 7bit data \| Parity \| StopBit \||
|1|0|\| StartBit \| 9bit data \| StopBit \||
|1|1|\| StartBit \| 8bit data \| Parity \| StopBit \||

## 寄存器

### 地址分配

UART0，UART1 和UART2实现完全相同。

UART0 基地址0x4001_2000。

UART1 基地址0x4001_2400。

UART2 基地址0x4001_2800。

表17-3 UART地址分配列表

||||
|---|---|---|
|名称|偏移地址|说明|
|UARTx_CTRL|0x00|UART控制寄存器|
|UARTx_DIVH|0x04|UART波特率设置高字节寄存器|
|UARTx_DIVL|0x08|UART波特率设置低字节寄存器|
|UARTx_BUFF|0x0C|UART收发缓冲寄存器|
|UARTx_ADR|0x10|485通信地址匹配寄存器|
|UARTx_STT|0x14|UART状态寄存器|
|UARTx_RE|0x18|UART DMA请求使能寄存器|
|UARTx_IE|0x1C|UART中断使能寄存器|
|UARTx_IF|0x20|UART中断标志寄存器|
|UARTx_IOC|0x24|UART IO控制|

### UARTx_CTRL UARTx控制寄存器 (x = 0,1,2)

地址分别是：0x4001_2000，0x4001_2400，0x4001_2800

复位值:0x0

表17-4
UART控制寄存器UARTx_CTRL

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||DUPLEX|LIN_EN|MD_EN|CK_EN|CK_TYPE|BIT_ORDER|STOP_LEN|BYTE_LEN|
|||||||||RW|RW|RW|RW|RW|RW|RW|RW|
|||||||||0|0|0|0|0|0|0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7\]|DUPLEX|双工，默认值为0。0:全双工；1:半双工|
|\[6\]|LIN_EN|LIN模式使能，默认值为0。0:关闭；1:开启|
|\[5\]|MD_EN|使能Multi-drop，默认值为0。0:关闭；1:开启|
|\[4\]|CK_EN|数据校验开关，默认值为0。0:关闭；1:开启|
|\[3\]|CK_TYPE|奇偶校验配置，默认值为0。0:偶校验（EVEN）；1: 奇校验（ODD）|
|\[2\]|BIT_ORDER|数据发送顺序配置，默认值为0。0:LSB；1:MSB|
|\[1\]|STOP_LEN|停止位长度配置，默认值为0。0:1-Bit；1:2-Bit|
|\[0\]|BYTE_LEN|数据长度配置，默认值为0。0:8-Bit；1:9-Bit|

### UARTx_DIVH UARTx波特率设置高字节寄存器 (x = 0,1,2)

地址分别是：0x4001_2004，0x4001_2404，0x4001_2804

复位值:0x0

表17-5
UART波特率设置高字节寄存器UARTx_DIVH

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||DIVH||||||||
|||||||||RW||||||||
|||||||||0||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7:0\]|DIVH|波特率设置高字节BAUDRATE =主时钟/(1+256\* UART_DIVH+UART_DIVL)|

### UARTx_DIVL UARTx波特率设置低字节寄存器 (x = 0,1,2)

地址分别是：0x4001_2008，0x4001_2408，0x4001_2808

复位值:0x0

表17-6
UART波特率设置低字节寄存器UART_DIVL

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||DIVL||||||||
|||||||||RW||||||||
|||||||||0||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7:0\]|DIVL|波特率设置低字节BAUDRATE =主时钟/(1+256\* UART_DIVH+UART_DIVL)|

### UARTx_BUFF UARTx收发缓冲寄存器 (x = 0,1,2)

地址分别是：0x4001_200C，0x4001_240C，0x4001_280C

表17-7 UART收发缓冲寄存器UART_BUFF

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
||||||||BUFF|||||||||
||||||||RW|||||||||
||||||||0|||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:9\]||未使用|
|\[8:0\]|BUFF|写:发送数据缓存；读:接收数据寄存器|

UART的Tx_buffer和Rx_buffer共享UART_BUFF。其中，Tx_buffer是只写的，Rx_buffer是只读的。因此，读UART_BUFF寄存器是访问UART_RX_BUFF，写UART_BUFF寄存器是访问UART_TX_BUFF。

当UARTx_CTRL.BYTE_LEN=0时，UART收发只使用buffer低8位，即UARTx_BUFF\[7:0\]；

当UARTx_CTRL.BYTE_LEN=1时，UART收发使用buffer全部9位，即UARTx_BUFF\[8:0\]。

如果使能UARTx_CTRL.CK_EN，即使用校验位，则UARTx_BUFF的最高位（BIT8 when
UARTx_CTRL.BYTE_LEN=1 or BIT7
UARTx_CTRL.BYTE_LEN=0）数据无效，发送时会被替换为校验位，接收时会作为校验位，而不会写入UARTx_BUFF。

### UARTx_ADR UARTx地址匹配寄存器 (x = 0,1,2)

地址分别是：0x4001_2010，0x4001_2410，0x4001_2810

复位值:0x0

表17-8
UART地址匹配寄存器UART_ADR

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||ADR||||||||
|||||||||RW||||||||
|||||||||0||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7:0\]|ADR|多机通讯时的从机地址|

### UARTx_STT UARTx状态寄存器 (x = 0,1,2)

地址分别是：0x4001_2014，0x4001_2414，0x4001_2814

复位值:0x0003

表17-9
UART状态寄存器UART_STT

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||||||RX_BUSY|ADR_MATCH|TX_DONE|TX_BUF_EMPTY|
|||||||||||||R|R|R|R|
|||||||||||||0|0|1|1|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:4\]||未使用|
|\[3\]|RX_BUSY|1:UART已检测到起始符并正处于接收状态0:UART接收端空闲此状态位只读，置位与清零均由硬件完成|
|\[2\]|ADR_MATCH|Multi-drop模式下，地址匹配标志位。1:匹配；0:未匹配。|
|\[1\]|TX_DONE|发送完成标志位。1:完成；0:未完成。|
|\[0\]|TX_BUF_EMPTY|发送缓存状态位。1:空；0:非空。|

### UARTx_RE UARTx DMA请求使能寄存器 (x = 0,1,2)

地址分别是：0x4001_2018，0x4001_2418，0x4001_2818

复位值:0x0

表17-10
UART DMA请求使能寄存器UART_RE

||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3||2|1|0|
||||||||||||||TX_BUF_EMPTY_RE||RX_DONE_RE|TX_DONE_RE|
||||||||||||||RW||RW|RW|
||||||||||||||0||0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:3\]||未使用|
|\[2\]|TX_BUF_EMPTY_RE|发送缓冲区空DMA请求开关，默认值为0。0:关闭；1:开启。|
|\[1\]|RX_DONE_RE|接收完成DMA请求开关，默认值为0。0:关闭；1:开启。|
|\[0\]|TX_DONE_RE|发送完成DMA请求开关，默认值为0。0:关闭；1:开启。|

### UARTx_IE UARTx中断使能寄存器 (x = 0,1,2)

地址分别是：0x4001_201C，0x4001_241C，0x4001_281C

复位值:0x0

表17-11
UART中断使能寄存器UART_IE

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
||||||||IDLE_IE|LBD_IE|RX_OV_IE|TX_OV_IE|CK_ERR_IE|STOP_ERR_IE|TX_BUF_EMPTY_IE|RX_DONE_IE|TX_DONE_IE|
||||||||RW|RW|RW|RW|RW|RW|RW|RW|RW|
||||||||0|0|0|0|0|0|0|0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:9\]||未使用|
|\[8\]|IDLE_IE|空闲帧中断使能0:关闭；1:开启|
|\[7\]|LBD_IE|LIN break character检测中断使能0:关闭；1:开启|
|\[6\]|RX_OV_IE|接收缓冲区溢出中断使能0:关闭；1:开启|
|\[5\]|TX_OV_IE|发送缓冲区溢出中断使能0:关闭；1:开启|
|\[4\]|CK_ERR_IE|校验错误中断开关，默认值为0。0:关闭；1:开启|
|\[3\]|STOP_ERR_IE|停止位错误中断开关，默认值为0。0:关闭；1:开启|
|\[2\]|TX_BUF_EMPTY_IE|发送缓冲区空中断开关，默认值为0。0:关闭；1:开启|
|\[1\]|RX_DONE_IE|接收完成中断开关，默认值为0。0:关闭；1:开启|
|\[0\]|TX_DONE_IE|发送完成中断开关，默认值为0。0:关闭；1:开启|

### UARTx_IF UARTx中断标志寄存器 (x = 0,1,2)

地址分别是：0x4001_2020，0x4001_2420，0x4001_2820

复位值:0x0005

表17-12
UART中断使能寄存器UART_IF

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
||||||||IDLE_IF|LBD_IF|RX_OV_IF|TX_OV_IF|CK_ERR_IF|STOP_ERR_IF|TX_BUF_EMPTY_IF|RX_DONE_IF|TX_DONE_IF|
||||||||RW1C|RW1C|RW1C|RW1C|RW1C|RW1C|RW1C|RW1C|RW1C|
||||||||0|0|0|0|0|0|1|0|1|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:9\]||未使用|
|\[8\]|IDLE_IF|空闲帧中断标志，高有效，写1清零当UART检测到空闲帧后，硬件置位这一标志，如果UARTx_IE.IDLE_IE=1，则产生中断请求；写1清零后，只有待RX_DONE_IF标志再次置位后，IDLE_IF标志才会置位。在多从机（Multi-drop）场景中，只有从机地址命中时，即UARTx_STT.ADR_MATCH=1时，表示主机此时欲与本从机通讯，IDLE_IF才会置位，否则即使UARTx_RX信号为常高，IDLE_IF也不会置位。|
|\[7\]|LBD_IF|LIN break character检测中断标志，高有效，写1清零|
|\[6\]|RX_OV_IF|接收缓冲区溢出中断标志，高有效，写1清零|
|\[5\]|TX_OV_IF|发送缓冲区溢出中断标志，高有效，写1清零|
|\[4\]|CK_ERR_IF|校验错误中断标志，高有效，写1清零|
|\[3\]|STOP_ERR_IF|停止位错误中断标志，高有效，写1清零|
|\[2\]|TX_BUF_EMPTY_IF|发送缓冲区空中断标志，高有效，写1清零|
|\[1\]|RX_DONE_IF|接收完成中断标志，高有效，写1清零|
|\[0\]|TX_DONE_IF|发送完成中断标志，高有效，写1清零|

中断标志写1清零，一般不建议用如下\|=方式清零，因为\|=是先读取中断标志，将对应位改为1再写入清零，如果同时有其他中断标志置位，会被一起清零，而这通常不是软件所期望的。例如，如下写法本意是清零TX_DONE_IF，但如果同时RX_DONE_IF在写入执行前置1了，则软件先读取回UART_IF值为0x2，然后执行或操作0x2\|0x1=0x3，然后写入，同时对RX_DONE_IF和TX_DONE_IF进行了清零，可能导致UART少进入一次因接收数据产生的中断，从而少接收到一字节数据。

*UART_IF\|=0x1;*

如果希望清零TX_DONE_IF标志位，应以如下方式，直接对BIT0写1.

*UART_IF=0x1;*

### UARTx_IOC UARTx IO控制寄存器 (x = 0,1,2)

地址分别是：0x4001_2024，0x4001_2424，0x4001_2824

复位值:0x0

表17-13
UARTIO控制寄存器UART_IOC

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||SBK|LBDL||AUTO|||TXD_INV|RXD_INV|
|||||||||RW|RW||RW|||RW|RW|
|||||||||0|0||0|||0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:8\]||未使用|
|\[7\]|SBK|LIN模式下，写1发送一次break character，即连续13个0，完成后自动清零，未完成时读回为1，向此位写1之前需要先配置UARTx_CTRL.LIN_EN=1，否则无法进行break character的发送|
|\[6\]|LBDL|LIN break character检测长度，10/11个00:10bits，1:11bits|
|\[5\]||未使用|
|\[4\]|AUTO|波特率自适应IO端口使能开关。0:关闭；1:开启|
|\[3:2\]||未使用|
|\[1\]|TXD_INV|TXD输出极性使能开关，默认值为0。0:正常输出；1:取反输出。正常输出极性，即软件发送1，硬件发送1；取反输出极性，即应用发送1，硬件发送0。|
|\[0\]|RXD_INV|RXD输入极性使能开关，默认值为0。0:正常输入；1:取反输入。正常输入极性，即硬件接收到1，软件接收的是1；取反输入极性，即硬件接收1，软件接收的是0。|

