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

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

# 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-1
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|
|300|0x0007|0x9C|0x3F|
|600|0x0003|0x9C|0x3F|
|1200|0x0001|0x9C|0x3F|
|2400|0x0000|0x9C|0x3F|
|4800|0x0000|0x4E|0x1F|
|9600|0x0000|0x27|0x0F|
|19200|0x0000|0x13|0x87|
|38400|0x0000|0x09|0xC3|
|43000|0x0000|0x08|0xB8|
|56000|0x0000|0x06|0xB1|
|57600|0x0000|0x06|0x82|
|115200|0x0000|0x03|0x40|

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

### 波特率自适应

UART模块支持波特率自适应。一般UART从机在不知晓主机波特率的情况下，会开启波特率自适应，同时等待主机发送特定的同步字，一般是0x55。主机无须开启波特率自适应设置。从机在收到主机发出的同步字后，会将识别到的波特率存储到波特率寄存器，即UART_DIVH和UART_DIVL。若在0x55接收期间，发生干扰可能导致波特率识别不成功，此时主机可以再次发送0x55直到从机完成波特率自适应识别并反馈消息给主机。在波特率自适应器件，同步字0x55可能接收不正确，
UART_IF.STOP_ERR和UART_IF.RX_DONE可能会出现置位。

在LIN模式下（UART_CTRL.LIN_EN=1），如果启用波特率自适应（UART_IOC.ABD_EN=1）则在LIN的每一帧的间隔场break
character+同步场0x55阶段会进行波特率自适应。且UART_IOC.ABD_EN会保持为1。波特率自适应模块需要先识别到10波特以上的低电平，然后识别到0x55才会完成波特率识别。

在UART模式下（UART_CTRL.LIN_EN=0），如果启用波特率自适应（UART_IOC.ABD_EN=1）则需要主机先发送0x55同步字节给从机，同时建议从机设置波特率为0（UART_DIVH=UART_DIVL=0）。从机成功接收0x55完成波特率自适应识别后，硬件会将UART_IOC.ABD_EN清零。

### LIN模式

LIN的每一帧以同步间隔场起始，其后为0x55同步场、PID标识符场、以及数据场。通常由软件将LIN组帧存储在RAM中，然后由DMA逐个字节发送，发送端以UART的BUFFER空作为DMA请求信号，对应UART_RE.TX_BUF_EMPTY标志。接收端以UART的接收完成为DMA请求信号，对应UART_RE.RX_DONE标志。

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

图 17-2 LIN的帧结构

发送端一般需要软件先向UART_IOC.SBK写1，先发送显性间隔场，然后开启DMA使能。无须等待SBK发送完成，可先开启UART发送的DMA使能。

接收端由于会将间隔场作为一个字节接收到，因此配置的接收字节个数=发送端+1。

### 单线半双工

当使用单线半双工时，串口IO输入一直使能，而IO输出只有在软件写入串口发送数据，串口开始发送数据时才会使能，串口不会收到自己发出的数据。当线路上没有串口发送输出时，由于没有IO输出驱动线路，线路处于高阻态，建议电路上开启上拉，使得线路在没有数据发送时处于高电平。

### 收发端口互换(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
UART多机通讯互联拓扑所示，为一个主设备和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-5 从机 9-bit UART 地址帧过滤状态机处理流程

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

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

图17-6
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_1000。

UART1 基地址0x4001_1100。

UART2 基地址0x4001_1600。

表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_1000，0x4001_1100，0x4001_1600

复位值: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_1004，0x4001_1104，0x4001_1604

复位值: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_1008，0x4001_1108，0x4001_1608

复位值: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_100C，0x4001_110C，0x4001_160C

表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_1010，0x4001_1110，0x4001_1610

复位值: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_1014，0x4001_1114，0x4001_1614

复位值:0x03

表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_1018，0x4001_1118，0x4001_1618

复位值: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||RX_DONE||TX_DONE||
||||||||||||||RW||RW||RW||
||||||||||||||0||0||0||

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

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

地址分别是:0x4001_101C，0x4001_111C，0x4001_161C

复位值:0x0

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

||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10||9||8||7||6||5|4|3|2|1|0|
|||||||ABD||IDLE||LBD||RX_OV||TX_OV||CK_ERR|STOP_ERR|TX_BUF_EMPTY|RX_DONE|TX_DONE|
|||||||RW||RW||RW||RW||RW||RW|RW|RW|RW|RW|
|||||||0||0||0||0||0||0|0|0|0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:10\]||未使用|
|\[9\]|ABD|波特率自适应中断使能0:关闭；1:开启|
|\[8\]|IDLE|空闲帧中断使能0:关闭；1:开启|
|\[7\]|LBD|LIN break character检测中断使能0:关闭；1:开启|
|\[6\]|RX_OV|接收缓冲区溢出中断使能0:关闭；1:开启|
|\[5\]|TX_OV|发送缓冲区溢出中断使能0:关闭；1:开启|
|\[4\]|CK_ERR|校验错误中断开关，默认值为0。0:关闭；1:开启|
|\[3\]|STOP_ERR|停止位错误中断开关，默认值为0。0:关闭；1:开启|
|\[2\]|TX_BUF_EMPTY|发送缓冲区空中断开关，默认值为0。0:关闭；1:开启|
|\[1\]|RX_DONE|接收完成中断开关，默认值为0。0:关闭；1:开启|
|\[0\]|TX_DONE|发送完成中断开关，默认值为0。0:关闭；1:开启|

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

地址分别是:0x4001_1020，0x4001_1120，0x4001_1620

复位值:0x05

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

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||ABD|IDLE|LBD|RX_OV|TX_OV|CK_ERR|STOP_ERR|TX_BUF_EMPTY|RX_DONE|TX_DONE|
|||||||RW1C|RW1C|RW1C|RW1C|RW1C|RW1C|RW1C|RW1C|RW1C|RW1C|
|||||||0|0|0|0|0|0|0|1|0|1|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:10\]||未使用|
|\[9\]|ABD|波特率自适应使能情况下，发生波特率更新事件，高有效，写1清零|
|\[8\]|IDLE|空闲帧中断标志，高有效，写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|LIN break character检测中断标志，高有效，写1清零|
|\[6\]|RX_OV|接收缓冲区溢出中断标志，高有效，写1清零|
|\[5\]|TX_OV|发送缓冲区溢出中断标志，高有效，写1清零|
|\[4\]|CK_ERR|校验错误中断标志，高有效，写1清零|
|\[3\]|STOP_ERR|停止位错误中断标志，高有效，写1清零|
|\[2\]|TX_BUF_EMPTY|发送缓冲区空中断标志，高有效，写1清零|
|\[1\]|RX_DONE|接收完成中断标志，高有效，写1清零|
|\[0\]|TX_DONE|发送完成中断标志，高有效，写1清零|

当发生特定事件时，即使中断使能位IE=0，对应的IF仍会置位，但不会向处理器提起中断服务请求。

中断标志写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_1024，0x4001_1124，0x4001_1624

复位值:0x0

表17-13
UARTIO控制寄存器UART_IOC

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||SBK|LBDL||ABD_EN|||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\]|ABD_EN|波特率自适应使能0:关闭；1:开启当配置UARTx_CTRL.LIN_EN=1，每一帧LIN frame都会进行波特率自适应，ABD_EN在软件配置为1后，即保持为1；当配置UARTx_CTRL.LIN_EN=0，软件设置ABD_EN从0置为1，会触发一次波特率自适应，通常主机会发送一个0x55至从机，使从机完成波特率识别，完成后从机的ABD_EN位被硬件清零。主机无须设置波特率自适应。如果UARTx_CTRL.LIN_EN=0且ABD_EN =1，建议软件先设置ABD_EN =0，再设置ABD_EN =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。|

