13. UART接口控制器 (UART)

13.1. 概述

UART模块支持波特率配置,最高速度可达到模块时钟16分频。具备深度为8的FIFO,同时提供了多种中断供选择。

13.2. 特性

  • 支持标准的UART协议

  • 支持全双工模式

  • 支持波特率可配置

  • 支持8位/9位数据格式选择

  • 可配置的奇偶校验位

  • 支持1位/2位停止位选择

  • 支持波特率自动调整

  • 深度为8字节的发送和接收FIFO

  • 支持break操作自动检测

  • 支持接收超时中断

  • 支持发送/接收数据LSB/MSB选择

  • 支持发送/接收数据电平反向

13.3. 功能描述

13.3.1. 数据格式及波特率配置

数据位

可以通过向CTRL寄存器的DATA9B位写1,选择支持9位数据模式。该位默认为0,即8位数据模式

奇偶校验位

CTRL寄存器PAREN位使能奇偶校验,PARMD 位选择奇偶校验模式,分别有奇校验、偶校验、常1、常0等四种校验格式,根据需求可以灵活选择配置具体看 表格 6

表格 6 校验模式配置

校验类型

CTRL[21]

CTRL[20]

CTRL[19]

无校验

x

x

0

奇校验

0

0

1

偶校验

0

1

1

校验位常为1

1

0

1

校验位常为0

1

1

1

停止位

停止位位数默认为1位,可通过向CTRL寄存器STOP2B位选择停止位位数为2位。

字符格式如 图 55 所示:

../../_images/uart_character.svg

图 55 UART字符格式

使能波特率配置后,对BAUD寄存器BAUD位写入特定值,配置波特率。

配置方式如下:

目标波特率 = 系统主时钟 / (BAUD.BAUD *16 +BAUD.FRAC + 1)

波特率配置完成后,需将CTRL寄存器EN位使能,使能UART模块,使波特率配置生效。

13.3.2. 自动波特率功能

UART自动波特率功能可以自动测量UART_RX脚输入数据的波特率。当自动波特率测量完成后,测量的结果保存在BAUD寄存器的BAUD位。

自动波特率的检测时间,从UART_RX数据的起始位到第一个上升沿的时间,通过配置BAUD寄存器ABRBIT位设定检测的时间长度,即2 ABRDBITS位。配置BAUD寄存器ABREN位,使能自动波特率检测功能。

以BAUD.ABRBIT=0,即设定检测的时间长度1位,通过测量起始位脉宽计算波特率为例:初始阶段,RXD保持为1,一旦检测到下降沿,即为接收到起始位,自动波特率计数器开始计数,当检测到第一个上升沿时,自动波特率计数器停止计数。

自动波特率计数值除以检测时间长度的结果保存在BAUD位,ABREN位清零。

当自动波特率计数器溢出,BAUD寄存器的ABRERR置1,调节失败,写1清零。

配置流程:

  • 选择检测时间的长度,配置BAUD寄存器ABRBIT位

  • 配置BAUD寄存器ABREN位,使能自动波特率检测功能

  • 等待接收调节的数据,查看BAUD寄存器ABREN位是否清零,清零表示波特率检测完成

  • 检测完成后查看BAUD寄存器ABRERR位,查看自动调节波特率时计数器是否溢出

  • 如果数据未溢出,则表示成功

../../_images/uart_auto_baud_rate.svg

图 56 自动波特率示意图

13.3.3. 数据发送及接收

将控制及状态寄存器(CTRL)EN位置1后,对应UART模块使能

对于发送操作:

  • 向DATA寄存器写入数据,数据发送至UART_TX线

  • 通过读取CTRL寄存器TXIDLE位状态,获取当前发送状态

  • 可通过读取BAUD寄存器TXD位,获取当前TX线实时状态

对于接收操作:

  • 通过判断DATA寄存器中VALID位,判断是否接收到有效数据

  • 当接收到有效数据后,读取DATA寄存器,可获得UART_RX线接收的数据

  • 可通过读取BAUD寄存器RXD位,获取当前RX线实时状态

  • 可设置接收超时中断。使能后,当接收相邻两个数据间隔时长超过设置时长时,将触发中断

13.3.4. 电平反向

通过设置CFG寄存器的TXINV位及RXINV位,分别对TX和RX线设置取反,设置后电平立刻生效。

13.3.5. 大小端控制

通过CFG寄存器的MSBF位进行配置,设置数据传输是从高位(MSB)开始传输还是从低位(LSB)

13.3.6. LIN Fram

UART 支持 LIN 功能。在主机模式下,支持 LIN_BREAK 产生,在从机模式下,支持 LIN_BREAK 检测。报文是以报文帧的格式传输和发送。报文帧由主机节点发送的报文头和从机发送的应答组成。报文帧的报头包括 break 域,同步域和帧识别码(帧ID)。帧 ID 仅作为定义帧的用途,从机负责响应相关的帧 ID,响应由数据域和校验域组成。

../../_images/uart_lin_fram.svg

图 57 LIN Fram示意图

当使用LIN Fram时,可通过LINCR寄存器进行相关设置。

发送操作:

与正常的UART发送相比,选用LIN Fram发送时,除了基本操作步骤外,还需:

  • 通过配置CFG寄存器BRKTXLEN位配置发送BRK的长度

  • 置位LINCR寄存器中GENBRK位,TX线上会发送设定的BRK的长度位时间的低电平

  • 设定的BRK的长度位低电平发送完成时LINCR寄存器GENBRK自动清零,LINCR寄存器GENBRKIF置位

  • LINCR寄存器GENBRK清零后,软件可以写DATA寄存器发送数据

注意:发送BREAK信号时,向DATA寄存器写入数据,数据同样会执行发送操作,但数据电平不会体现到TX线上,除非发送数据期间清除CTRL寄存器GENBRK位。

接收操作:

与正常的UART接收相比,选用LIN Fram接收时,除了基本操作步骤外,还需:

  • 通过配置CFG寄存器BRKRXLEN位配置接收BRK的判定长度

  • 通过LINCR寄存器将BRKDETIE位置1,使能检测到Break信号中断

  • 当RX线上出现低电平宽度超过设定判断长度时,LINCR寄存器BRKDETIF置位,执行UART中断处理函数

  • 在UART中断处理函数中检测LINCR寄存器BRKDETIF是否为1,,如果为1表示检测到了break,向BRKDETIF写1清除中断标志

当Break信号不够长时,丢弃Break,BRKDETIF不置1,如 图 58 所示:

../../_images/uart_break_not_long_enough.svg

图 58 Break信号不够长示意图

当Break信号恰好够长时,等接收线上收到高电平后,检测到Break,BRKDETIF置1,如 图 59 所示:

../../_images/uart_break_long_enough.svg

图 59 Break信号恰好够长示意图

当Break信号足够长时,等接收线上收到高电平后,检测到Break,BRKDETIF置1,如 图 60 所示:

../../_images/uart_break_over_long_enough.svg

图 60 信号足够长示意图

硬件流控

硬件流控(RTS/CTS)制主要功能为防止串口传输时出现丢失数据的现象,使用流控制功能时需将通信两端的RTS和CTS对应相连,通过RTS和CTS可以控制两个串口设备间的串行数据流。

RTS流控制

RTS为输出信号,通过自动流控控制寄存器使能该信号并设置有效极性(高电平/低电平)以及触发阈值,当RTS为有效电平时表示可以接收数据,当接收数据达到所设置的阈值时,RTS无效。

CTS流控制

CTS为输入信号,通过自动流控控制寄存器使能该信号并设置有效极性(高电平/低电平),当RTS为有效电平时表示可以发送数据。

../../_images/uart_hardware_control_flow.svg

图 61 硬件流控

13.3.7. 接收中断与超时中断

以如下配置为例:

方式一:FIFO清空后,不产生超时中断

  • 配置FIFO寄存器RXLVL位为3,即RXThreshold=3,接收FIFO取值3

  • 配置CTRL寄存器RXIE位为1,即RXThresholdIEn=1,配置接收FIFO中的个数> RXThreshold时触发中断

  • 配置TOCR寄存器TIME位为10,即TimeoutTime = 10,超时时长 = TimeoutTime/(Baudrate/10) 秒

  • 配置UARTx.TOCR寄存器MODE位为0,FIFO清空后,不产生超时中断

  • 配置CTRL寄存器TOIE位为1,即TimeoutIEn = 1,超时中断,超过TimeoutTime/(Baudrate/10) 秒没有在RX线上接收到数据且接收FIFO中数据个数不为零时可触发中断

对方发送8个数据

../../_images/uart_8bit_receive_FIFO.svg

图 62 对方发送8个数据接收FIFO示意图

每接收到一个数据,RX FIFO中数据个数加一,当RX FIFO中数据个数大于RXThreshold时,触发接收中断。

../../_images/uart_9bit_receive_FIFO.svg

图 63 对方发送9个数据接收FIFO示意图

只有当接收FIFO中有数据,且在指定时间内未接收到新的数据时,才会触发超时中断。

若应用中希望通过数据间时间间隔作为帧间隔依据,即不管对方发送过来多少个数据,最后都能产生超时中断,可以通过在接收ISR中从RX FIFO中读取数据时总是少读一个(即让一个数据留在RX FIFO中)来实现。

方式二:无论FIFO是否清空,间隔指定时间后均产生超时中断

  • 配置FIFO寄存器RXLVL位为3,即RXThreshold=3,接收FIFO取值3

  • 配置CTRL寄存器RXIE位为1,即RXThresholdIEn=1,配置接收FIFO中的个数 RXThreshold时触发中断

  • 配置TOCR寄存器TIME位为10,即TimeoutTime = 10,超时时长 = TimeoutTime/(Baudrate/10) 秒

  • 配置UARTx.TOCR寄存器MODE位为1,无论FIFO是否清空,间隔指定时间后均产生超时中断

  • 配置CTRL寄存器TOIE位为1,即TimeoutIEn = 1,超时中断,超过 TimeoutTime/(Baudrate/10) 秒没有在RX线上接收到数据时可触发中断

无论接收FIFO中是否有数据,只要在指定时间内未接收到新的数据时,就会触发超时中断。

13.3.8. 发送中断

以如下配置为例:

  • 配置FIFO寄存器TXLVL位为3,即TXThreshold = 4,发送FIFO取值4

  • 配置CTRL寄存器TXIE位为1,即TXThresholdIEn = 1,配置发送FIFO中的个数 TXThreshold时触发中断

../../_images/uart_send_FIFO.svg

图 64 发送FIFO示意图

每发送出一个数据,TX_FIFO中数据个数减1,当TX_FIFO中数据个数小于等于TXThreshold时,触发发送中断。

如果初始化时TX_FIFO中数据个数为零,则开启发送中断后会立即触发发送中断。建议在发送FIFO填入数据后再开启发送中断。

13.3.9. 中断清除

此模块中中断状态位详见寄存器中各个中断标志位属性,当其中断标志位属性为R/W1C时,如需清除此标志,需在对应标志位中写1清零(R/W1C),否则中断在开启状态下会一直进入;当其中断标志位属性为AC时,表示此中断状态位会自动清零;当其中断标志位属性为RO时,表示此标志位会随着水位的变化而改变,标志位只与其当前状态有关,不需要清除。具体详见寄存器描述。

13.4. 寄存器映射

名称

偏移

复位值

UART0 BASE:0x40040000

UART1 BASE:0x40040800

DATA

0x00

0x00000000

CTRL

0x04

0x00000001

BAUD

0x08

0xF0184000

FIFO

0x0C

0x00000000

LINCR

0x10

0x00000000

FCCTRL

0x14

0x00000000

CFG

0x18

0x00000334

TOCTRL

0x1C

0x00000000

13.5. 寄存器描述

13.5.1. 数据接口寄存器DATA

偏移: 0x00

复位值: 0x00000000

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

PAERR

VALID

DATA

7

6

5

4

3

2

1

0

DATA

位域

名称

类型

描述

31:11

RO

10

PAERR

RO

当前读回的的数据是否存在校验错误

1:存在

0:不存在

9

VALID

RO

数据有效位

1:DATA字段有有效的接收数据

0:DATA字段无有效的接收数据

8:0

DATA

R/W

UART数据位

读操作,返回缓存中接收到的数据

写操作,将待发送的数据写入缓存中

13.5.2. 控制及状态寄存器CTRL

偏移: 0x04

复位值: 0x00000001

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

STOP2B

PARMD

PAREN

DATA9B

15

14

13

12

11

10

9

8

TOIE

LOOP

EN

7

6

5

4

3

2

1

0

TXDOIE

RXOV

RXIE

RXNE

TXIE

TXFF

TXIDLE

位域

名称

类型

描述

31:24

RO

23:22

STOP2B

R/W

停止位模式

00:1位

01:2位

1x:保留

21:20

PARMD

R/W

奇偶校验位模式

00:奇校验

01:偶校验

10:常1

11:常0

19

PAREN

R/W

奇偶校验使能位

1:使能

0:禁能

18

DATA9B

R/W

数据位模式

1:9位数据位

0:8位数据位

17:15

RO

14

TOIE

R/W

接收数据超时中断

1:使能

0:禁能

13:11

RO

10

LOOP

R/W

回环测试模式使能位(从TX线发送出去的数据,在自身RX线上可以收到,从而测试硬件是否正常工作)

1:使能

0:禁能

9

EN

R/W

UART模块使能位

1:使能

0:禁能

8:7

RO

6

TXDOIE

R/W

发送完成中断使能位

1:使能

0:禁能

5

RXOV

R/W1C

接收端FIFO溢出标志位

1:接收FIFO溢出

0:接收FIFO没有溢出

4

RXIE

R/W

接收端FIFO中断使能位

1:接收FIFO达到预定的数量时产生中断

0:接收FIFO达到预定的数量时不产生中断

注:接收FIFO中此位为0表示接收到1个数据,依次类推

3

RXNE

RO

接收端FIFO非空标志位

1:非空

0:空

2

TXIE

R/W

发送端FIFO中断使能位

1:当发送FIFO内的数据少于预定的数量时产生中断

0:当发送FIFO内的数据少于预定的数量时不产生中断

注:发送FIFO中此位为0表示发送0个数据,依次类推

1

TXFF

RO

发送端FIFO满标志位

1:发送FIFO内的数据满

0:发送FIFO内的数据不满

0

TXIDLE

RO

发送线空闲标志位

1:发送线空闲

0:发送线忙,正在发送数据

13.5.3. 波特率寄存器BAUD

偏移: 0x08

复位值: 0xF0184000

31

30

29

28

27

26

25

24

FRAC

TXDOIF

ABRERR

ABRBIT

23

22

21

20

19

18

17

16

ABREN

RXIF

TOIF

TXTHRF

RXTHRF

TXIF

RXTOIF

15

14

13

12

11

10

9

8

RXD

TXD

BAUD

7

6

5

4

3

2

1

0

BAUD

位域

名称

类型

描述

31:28

FRAC

R/W

波特率设置微调(波特率分频值的小数部分),参考BAUD的设置

27

TXDOIF

RO

发送完成中断状态位

1:中断已产生

0:中断未产生

RO,表示此标志位会随着FIFO门限的变化而改变,标志位只与其当前状态有关,不需要清除

26

ABRERR

R/W1C

自动调节波特率时,计数器溢出中断标志

1:自动调节波特率时,计数器溢出,调节失败。

0:自动调节波特率时,计数器没有溢出。

25:24

ABRBIT

R/W

自动调节波特率时,检测的时间长度

00:1位长度

01:2位长度

10:4位长度

11:8位长度

23

ABREN

R/WAC

1:打开波特率自动调节功能。

0:关闭波特率自动调节功能。

调节完成自动清零

22

RXIF

RO

1:接收数据缓存达到预定数量

0:接收数据缓存未达到预定数量

RO,表示此标志位会随着FIFO门限的变化而改变,标志位只与其当前状态有关,不需要清除

21

TOIF

RO

1:接收数据超出TIME确定的时间

0:接收数据未超出TIME确定的时间

RO,表示此标志位会随着FIFO门限的变化而改变,标志位只与其当前状态有关,不需要清除

超过 TOTIME/BAUDRAUD 秒没有接收到新的数据时若TOIE=1,此位由硬件置位

20

TXTHRF

RO

1:发送数据缓存达到预定数量

0:发送数据缓存未达到预定数量

RO,表示此标志位会随着FIFO门限的变化而改变,标志位只与其当前状态有关,不需要清除

19

RXTHRF

RO

1:接收数据缓存达到预定数量

0:接收数据缓存未达到预定数量

RO,表示此标志位会随着FIFO门限的变化而改变,标志位只与其当前状态有关,不需要清除

18

RO

17

TXIF

RO

1:发送数据缓存内的数据少于预定的数量

0:发送数据缓存内的数据大于预定的数量

RO,表示此标志位会随着FIFO门限的变化而改变,标志位只与其当前状态有关,不需要清除

16

RXTOIF

RO

接收或超时中断标志

11:中断已产生

0:中断未产生

RO,表示此标志位会随着FIFO门限的变化而改变,标志位只与其当前状态有关,不需要清除

15

RXD

RO

直接读取接收线状态

14

TXD

RO

直接读取发送线状态

13:0

BAUD

R/W

用于控制UART工作的波特率

得到的波特率为:系统主时钟 / (BAUD.BAUD x 16 +BAUD.FRAC + 1)

可通过BAUD寄存器FRAC位进行波特率微调,使波特率的误差在5%以内。

13.5.4. 数据队列寄存器FIFO

偏移: 0x0C

复位值: 0x00000000

31

30

29

28

27

26

25

24

TXTHR

23

22

21

20

19

18

17

16

RXTHR

15

14

13

12

11

10

9

8

TXLVL

7

6

5

4

3

2

1

0

RXLVL

位域

名称

类型

描述

31:28

RO

27:24

TXTHR

R/W

设置发送FIFO中断(TXIF)阈值

1:当发送FIFO里的门限不超过设置值时产生中断

0:当发送FIFO里的门限不超过设置值时不产生中断

23:20

RO

19:16

RXTHR

R/W

设置接收FIFO中断(RXIF)阈值

1:当接收FIFO里的门限超过设置值时产生中断

0:当接收FIFO里的门限超过设置值时不产生中断

15:12

RO

11:8

TXLVL

RO

发送缓存的实际门限

7:4

RO

3:0

RXLVL

RO

接收缓存的实际门限

13.5.5. LIN Frame控制寄存器LINCR

偏移: 0x10

复位值: 0x00000000

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

GENBRK

GENBRKIF

GENBRKIE

BRKDETIF

BRKDETIE

位域

名称

类型

描述

31:5

RO

4

GENBRK

R/WAC

发送LIN Break

1:发送

0:不发送

发送完成自动清零

3

GENBRKIF

R/W1C

LIN Break发送完成中断状态

1:中断已产生

0:中断未产生

注:无论GENBRKIE是0还是1,此标志位都可以置位

2

GENBRKIE

R/W

发送LIN Break完成中断的使能

1:使能

0:禁能

注:此位负责控制GENBRKIF中断标志是否要触发内核中断

1

BRKDETIF

R/W1C

检测到LIN Break中断状态

1:中断已产生

0:中断未产生

0

BRKDETIE

R/W

检测到LIN Break中断的使能

1:使能

0:禁能

13.5.6. 自动流控控制寄存器CTSCR/ RTSCR

偏移: 0x14

复位值: 0x00000000

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

RTSCR_STAT

7

6

5

4

3

2

1

0

CTSCR_STAT

RTSCR_THR

RTSCR_POL

CTSCR_POL

RTSCR_EN

CTSCR_EN

位域

名称

类型

描述

31:9

RO

8

RTSCR_STAT

RO

RTS的当前状态

7

CTSCR_STAT

RO

CTS的当前状态

6:4

RTSCR_THR

R/W

RTS流控的触发阈值

000 :触发阈值为1BYTE,内部缓存的剩余空间最多只剩1BYTE。

001:触发阈值为2BYTE,内部缓存的剩余空间最多只剩2BYTE。

010:触发阈值为4BYTE,内部缓存的剩余空间最多只剩4BYTE。

011:触发阈值为6BYTE,内部缓存的剩余空间最多只剩6BYTE。

3

RTSCR_POL

R/W

RTS信号的极性。

1:高有效,RTS输出高,可以接收数据。

0:低有效,RTS输出低,可以接收数据

2

CTSCR_POL

R/W

CTS信号的极性。

1:高有效,CTS输入为高,可以发送数据。

0:低有效,CTS输入为低,可以发送数据。

1

RTSCR_EN

R/W

RTS流控使能

1:RTS信号发挥流控的作用

0:忽略RTS。

0

CTSCR_EN

R/W

CTS流控使能

1:CTS信号发挥流控的作用

0:忽略CTS。

13.5.7. 配置寄存器CFG

偏移: 0x18

复位值: 0x00000334

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

TXINV

RXINV

BRKRXLEN

7

6

5

4

3

2

1

0

BRKRXLEN

BRKTXLEN

MSBF

RXEN

位域

名称

类型

描述

31:12

RO

11

TXINV

R/W

1:发送时电平取反

0:发送时电平不取反

10

RXINV

R/W

1:接收时电平取反

0:接收时电平不取反

9:6

BRKRXLEN

R/W

接收BRK的判定长度。

0表示收到1个bit的0,1表示收到2bit的0,依次类推

5:2

BRKTXLEN

R/W

发送BRK的长度。

1表示发送1bit的0,2表示发送2bit的0,依次类推

1

MSBF

R/W

1:发送和接收时MSB在前

0:发送和接收时LSB在前

0

RXEN

R/W

接收打开使能

1:接收使能。

0:接收禁止。

13.5.8. 接收超时控制寄存器TOCR

偏移: 0x1C

复位值: 0x00000000

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

IFCLR

MODE

TIME

7

6

5

4

3

2

1

0

TIME

位域

名称

类型

描述

31:14

RO

13

IFCLR

R/W1C

超时计数器清零

12

MODE

R/W

1:无论FIFO是否清空,间隔指定时间后均产生超时中断

0:FIFO清空后,不产生超时中断

11:0

TIME

R/W

接收数据超时中断的触发条件。

计时单位为10个SYMBOL TIME

具体和实际波特率的设置相关。如波特率为9600,则计时单位为1/960秒。