你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

嵌入式学习—STM32串口通信

[复制链接]
STMCU小助手 发布时间:2022-12-14 13:28
640 (29).png
通用同步异步收发器(USART:universal synchronous asynchronous receiver and transmitter)能够灵活地与外部设备进行全双工数据交换,满足外部设备对工业标准NRZ异步串行数据格式的要求。USART通过小数波特率发生器提供了多种波特率。
它支持同步单向通信和半双工单线通信,还支持LIN(局域网互连网络)、智能卡协议与IrDA(红外线数据协会)SIR ENDEC规范,以及调制解调解调器操作(CTS/RTS)。而且,还支持多处理器通信。通过配置多个缓冲区使用DMA可实现高速数据通信。USART主要特性
  • 全双工异步通信
  • NRZ标准格式(NRZ (Non-return-to-zero Code 不归零编码)
  • 可配置为 16 倍过采样或 8 倍过采样,兼顾速度容差与时钟容差
  • 小数波特率发生器系统
  • 数据字长度可编程(8 位或 9 位)
  • 停止位可配置 - 支持 1 或 2 个停止位
  • LIN 主模式同步停止符号发送功能和 LIN 从模式停止符号检测功能
    ) C8 D# I% w  w--对 USART 进行 LIN 硬件配置时可生成 13 位停止符号和检测 10/11 位停止符号
  • 用于同步发送的发送器时钟输出
  • IrDA SIR 编码解码器5 w' Q6 |" C5 Z
    — 正常模式下,支持 3/16 位持续时间
  • 智能卡仿真功能8 ]2 g2 T6 x3 F/ `( J+ n- b
    — 智能卡接口支持符合 ISO 7816-3 标准中定义的异步协议智能卡
    6 B' H; E  b; \/ A+ b# L, J# Z— 智能卡工作模式下,支持 0.5 或 1.5 个停止位
  • 单线半双工通信
  • 使用 DMA(直接存储器访问)实现可配置的多缓冲区通信! P. {5 P& t" g. |9 O
    — 使用 DMA 在预留的 SRAM 缓冲区中收/发字节
  • 发送器和接收器具有单独使能位
  • 传输检测标志:2 x) X3 E! j* u" M9 U
    — 接收缓冲区已满- `( R" @, g. n! H8 j' s% l
    — 发送缓冲区为空4 Q9 i1 z' n+ T* m2 x' M
    — 传输结束标志
  • 奇偶校验控制:
    — 发送奇偶校验位- v7 [! C, ?* O4 P8 x. C& j5 j
    — 检查接收的数据字节的奇偶性
  • 四个错误检测标志:
    ! j$ x$ r" e( q& V5 K/ D, y— 溢出错误
    % o5 H# V: F" F% m4 W  l! b— 噪声检测+ Q1 K& m5 [: E
    — 帧错误
    $ q( e$ A/ J) g— 奇偶校验错误
  • 十个具有标志位的中断源:9 j- Q. y9 c+ ?. S7 I) M6 L3 @9 `
    — CTS 变化
    / x* A9 l, a+ j9 ~( X— LIN 停止符号检测4 o% V6 }# v: v
    — 发送数据寄存器为空
      f3 i; T& R6 ~" e— 发送完成6 P4 o2 a* ]7 Y5 _/ Z* K
    — 接收数据寄存器已满
    , s& z' x9 }1 F/ U) d— 接收到线路空闲! F3 E' \3 g. w' {0 G
    — 溢出错误
    : x' c+ h6 I% m— 帧错误
    9 i' h' S' u4 g! [$ G" m+ i— 噪声错误& }, l, e+ X* R5 s4 E, t
    — 奇偶校验错误
  • 多处理器通信 - 如果地址不匹配,则进入静默模式
  • 从静默模式唤醒(通过线路空闲检测或地址标记检测)
  • 两个接收器唤醒模式:地址位(MSB,第 9 位),线路空闲

    USART 功能说明
    # n1 ~5 M3 d- L/ X0 K接口通过三个引脚从外部连接到其它设备。任何 USART 双向通信均需要5 a: O; H  m& |! L5 Z
    至少两个引脚:接收数据输入引脚 (RX) 和发送数据引脚输出 (TX):6 ]/ J; A7 l. a0 d% s
    RX:接收数据输入引脚就是串行数据输入引脚。过采样技术可区分有效输入数据和噪声,从而用于恢复数据。
    % K: a' @7 U9 r4 O: J" t9 y/ p& `TX:发送数据输出引脚。如果关闭发送器,该输出引脚模式由其 I/O 端口配置决定。如果使能了发送器但没有待发送的数据,则 TX 引脚处于高电平。在单线和智能卡模式下,该 I/O用于发送和接收数据(USART 电平下,随后在 SW_RX 上接收数据)。
    / W% F+ m3 l" u1 b. E正常 USART 模式下,通过这些引脚以帧的形式发送和接收串行数据:- [! G/ [1 p+ t4 c0 C
    ● 发送或接收前保持空闲线路, W1 I( l! J+ {
    ● 起始位
    + |  n) c% n' j9 R) ?7 x8 J) h● 数据(字长 8 位或 9 位),最低有效位在前/ u( N" ?. X7 }2 k( S6 d, K) L3 r9 _
    ● 用于指示帧传输已完成的 0.5 个、 1 个、 1.5 个、 2 个停止位
    / ^5 B% x. }* }( e' [( l● 该接口使用小数波特率发生器 - 带 12 位尾数和 4 位小数
    1 o9 j7 v6 ~( c* X& ^3 d  Y● 状态寄存器 (USART_SR)6 u. h+ ~' [/ j2 D3 D9 {
    ● 数据寄存器 (USART_DR)# g# r- V6 l5 r2 D0 e0 }; n
    ● 波特率寄存器 (USART_BRR) - 12 位尾数和 4 位小数。+ U' v4 T5 n2 p  h
    ● 智能卡模式下的保护时间寄存器 (USART_GTPR)。
    / C8 r" U( J: w5 l/ i在同步模式下连接时需要以下引脚:
    1 H8 \; ?% v6 R● SCLK:发送器时钟输出。该引脚用于输出发送器数据时钟,以便按照 SPI 主模式进行
    6 j' P" }& f# C6 w同步发送(起始位和结束位上无时钟脉冲,可通过软件向最后一个数据位发送时钟脉
    / k% H' A2 b& J" _* U冲)。RX 上可同步接收并行数据。这一点可用于控制带移位寄存器的外设(如 LCD 驱动$ M/ X0 Y) d/ j  z6 X
    器)。时钟相位和极性可通过软件编程。在智能卡模式下, SCLK 可向智能卡提供时钟。
    % k% b0 N9 ]; [* Q  T8 b' i在硬件流控制模式下需要以下引脚:
    $ Z5 `) X1 G1 ~! _. W  w● nCTS:“清除以发送”用于在当前传输结束时阻止数据发送(高电平时)
    ; o* \- m# T. i6 D6 b+ r3 u/ S* [$ [● nRTS:“请求以发送”用于指示 USART 已准备好接收数据(低电平时)。% D/ c  k2 G* V) K4 G: a


    ' w9 u8 j; g# M' j; m/ Y
. e9 e7 F6 c" f0 F* w- {1 E1 z* V

4 Q; {. s' R/ z+ s' f 640 (28).png . J3 e7 {, }, Y5 b& y, R

- v0 N: O/ ?0 H9 y# d
3 R% A) r1 l8 I! ^
  • 可通过对 USART_CR1 寄存器中的 M 位进行编程来选择 8 位或 9 位的字长。9 l: M' t- U' i- ~. T% i5 S# V
    TX 引脚在起始位工作期间处于低电平状态。在停止位工作期间处于高电平状态。# o" b- p2 D9 @  W5 f2 \' V" a
    空闲字符可理解为整个帧周期内电平均为“1”(停止位的电平也是“1”),该字符后是下一个数据帧的起始位。
    - ]( f. X  \# g  T" p7 M停止字符可理解为在一个帧周期内接收到的电平均为“0”。发送器在中断帧的末尾插入 1或 2 个停止位(逻辑“1”位)以确认起始位。
    # N; W; q; [+ K8 r% |发送和接收由通用波特率发生器驱动,发送器和接收器的使能位分别置 1 时将生成相应的发送时钟和接收时钟。
    $ P7 s$ X6 H7 @5 o
    . B/ g! m* q9 a" r: L' A
  • 640 (27).png
    发送器
    6 z7 ~$ u2 x7 |发送器可发送 8 位或 9 位的数据字,具体取决于 M 位的状态。发送使能位 (TE) 置 1 时,发送移位寄存器中的数据在 TX 引脚输出,相应的时钟脉冲在 SCLK 引脚输出。
  • 字符发送* R% F1 Q  l# }9 F
    USART 发送期间,首先通过 TX 引脚移出数据的最低有效位。该模式下, USART_DR 寄存器的缓冲区 (TDR) 位于内部总线和发送移位寄存器之间。% _7 F: s8 m! @% C# M$ f; A
    每个字符前面都有一个起始位,其逻辑电平在一个位周期内为低电平。字符由可配置数量的停止位终止。
  • USART 支持以下停止位:0.5、 1、 1.5 和 2 个停止位。4 {, h6 U: y4 [& P( G% V/ D
    注意:数据发送期间不应复位 TE 位。发送期间复位 TE 位会冻结波特率计数器,从而将损坏 TX 引脚上的数据。当前传输的数据将会丢失。使能 TE 位后,将会发送空闲帧
    单字节通信
    ' k$ A7 B( A" [- `) e/ N始终通过向数据寄存器写入数据来将 TXE 位清零。
    8 ^" z7 r  O) O) {4 ?; ]% ATXE 位由硬件置 1,它表示:' E3 C3 F* L# N- y
    ● 数据已从 TDR 移到移位寄存器中且数据发送已开始。
    ! _3 O4 ]6 X6 p' G$ R● TDR 寄存器为空。
    ' N3 R* O# m9 _! r! d% a) F● USART_DR 寄存器中可写入下一个数据,而不会覆盖前一个数据。
    7 X# K9 G5 Z" S) U2 XTXEIE 位置 1 时该标志位会生成中断。
    - z5 g$ l* K1 B+ w! |5 C6 V2 A发送时,要传入 USART_DR 寄存器的写指令中存有 TDR 寄存器中的数据,该数据将在当
    9 y# x: i4 k4 Q; t& j$ c+ v: t前发送结束时复制到移位寄存器中。$ R' k; n- a& v3 K) |
    未发送时,要传入 USART_DR 寄存器的写指令直接将数据置于移位寄存器中,数据发送开* K# j# t) c+ Q1 ~) ]
    始时, TXE 位立即置 1。4 Z5 r$ L5 W) W  l% F4 Q
    如果帧已发送(停止位后)且 TXE 位置 1, TC 位将变为高电平。如果 USART_CR1 寄存器" R7 ~- g$ `  R; Y! _
    中的 TCIE 位置 1,将生成中断。$ R$ S% Q5 C# h9 P" Z- Q
    向 USART_DR 寄存器中写入最后一个数据后,必须等待至 TC=1,之后才可禁止 USART
    ! x5 p$ d6 a' A或使微控制器进入低功率模式(请参见图 249:发送时的 TC/TXE 行为)。0 i* _* B+ X2 D' Z2 S, U
    TC 位通过以下软件序列清零:
    5 _+ X5 O: B* |+ b1. 从 USART_SR 寄存器读取数据2. 向 USART_DR 寄存器写入数据1 H$ a8 E/ }" u9 J  J, O
    注意:还可通过向 TC 位写入“0”将其清零。建议仅在多缓冲区通信时使用此清零序列。
    ( A5 `9 c% `$ _2 h. K接收器
    ' S% X1 G% t+ c- ?USART 可接收 8 位或 9 位的数据字,具体取决于 USART_CR1 寄存器中的 M 位。
    # P" s) V8 q( u. _5 k( X起始位检测
    & n; U* L* Z; X) I16 倍或 8 倍过采样时,起始位检测序列相同。
    2 U" v/ p8 E9 w$ `& n在 USART 中,识别出特定序列的采样时会检测起始位。该序列为:1 1 1 0 X 0 X 0 X 0 0 0 0
    如果序列不完整,起始位检测将中止,接收器将返回空闲状态(无标志位置 1)等待下降沿。+ j+ H$ N% J! i  [* d0 H% J6 E
    如果 3 个采样位均为 0(针对第 3 位、第 5 位和第 7 位进行首次采样时检测到这 3 位均为 0;& T& B. G9 G7 `" g9 z' }
    针对第 8 位、第 9 位和第 10 位进行第二次采样时检测到这 3 位均为 0),可确认起始位(RXNE 标志位置 1, RXNEIE=1 时生成中断)。
    ; F: d" m8 o* t* c) n. Y如果两次采样时(对第 3 位、第 5 位和第 7 位进行采样以及对第 8位、第 9 位和第 10 位进行采样), 3 个采样位中至少有 2 个为 0,则可验证起始位(RXNE 标志位置 1, RXNEIE=1' Y4 a' b* b, w. ~
    时生成中断)但 NE 噪声标志位置 1。如果不满足此条件,则启动检测中止,接收器返回空闲状态(无标志位置 1)。. z# G, w2 B' }( c( W) A
    字符接收/ p) e1 e" B( j# B4 K
    USART 接收期间,首先通过 RX 引脚移入数据的最低有效位。该模式下, USART_DR 寄存器的缓冲区 (RDR) 位于内部总线和接收移位寄存器之间。; ~0 N  s4 ?) b2 F: ?6 u) s
    步骤:- x" Y$ w: F" K, k- |; N. x
    1. 通过向 USART_CR1 寄存器中的 UE 位写入 1 使能 USART。' Z) Y: l  a/ f1 F9 x1 c9 C+ ]# s
    2. 对 USART_CR1 中的 M 位进行编程以定义字长。
    2 ^! D) r. p4 w2 ?) U( z) Z, _3. 对 USART_CR2 中的停止位数量进行编程。( Y, N( {6 Y6 e0 r! o! y: N4 \4 U7 J
    4. 如果将进行多缓冲区通信,请选择 USART_CR3 中的 DMA 使能 (DMAR)。按照多缓冲区通信中的解释说明配置 DMA 寄存器。步骤 3
    0 B, T3 X5 Q# a- Q+ P5. 使用波特率寄存器 USART_BRR 选择所需波特率  M$ P- p. e. T
    6. 将 RE 位 USART_CR1 置 1。这一操作将使能接收器开始搜索起始位。1 c4 v; J; ^7 Z- `4 ]7 z7 A+ c
    接收到字符时
    # G( |& f7 H3 W" D( O! B: d● RXNE 位置 1。这表明移位寄存器的内容已传送到 RDR。也就是说,已接收到并可读取
    7 {0 Q' M6 _4 E数据(以及其相应的错误标志)。
    , s+ E) S  ~$ z" K% i% p● 如果 RXNEIE 位置 1,则会生成中断。
    7 w- `, L0 V+ E8 l' s+ D/ a6 G& G● 如果接收期间已检测到帧错误、噪声错误或上溢错误,错误标志位可置 1。, R0 ~9 ?7 S8 u' p# P
    ● 在多缓冲区模式下,每接收到一个字节后 RXNE 均置 1,然后通过 DMA 对数据寄存器执行读操作清零。. g, K% A" b9 Q7 |9 t: ^
    ● 在单缓冲区模式下,通过软件对 USART_DR 寄存器执行读操作将 RXNE 位清零。RXNE标志也可以通过向该位写入零来清零。RXNE 位必须在结束接收下一个字符前清零,以避免发生上溢错误。. A# H$ x, }4 e" d
    注意:接收数据时,不应将 RE 位复位。如果接收期间禁止了 RE 位,则会中止接收当前字节。
    , O( O* v1 K% G中断字符
    , i) k6 g! L1 C) K. @& c8 T接收到中断字符时, USART 将会按照帧错误对其进行处理 。
  • 空闲字符
    * [9 ~+ x+ M2 n4 D# Z( ^# @检测到空闲帧时,处理步骤与接收到数据的情况相同;如果 IDLEIE 位为 1,则会产生中断。
    0 U; m$ B* ~' }/ n% Q& L上溢错误5 u4 T# K# Q) O  g1 |2 x
    如果在 RXNE 未复位时接收到字符,则会发生上溢错误。RXNE 位清零前,数据无法从移位* a4 e" a$ [" F9 s9 z! y
    寄存器传送到 RDR 寄存器。1 y# x+ h0 v8 R) v% |
    每接收到一个字节后, RXNE 标志位都将置 1。当 RXNE 标志位是 1 时,如果在接收到下一3 F* O7 I! s- H4 f( [
    个数据或尚未处理上一个 DMA 请求时,则会发生上溢错误。发生上溢错误时:& N+ p. O% S! c: E
    ● ORE 位置 1。
    7 Z- `, {3 n, l# f1 h$ G/ Q- \9 Z● RDR 中的内容不会丢失。对 USART_DR 执行读操作时可使用先前的数据。
    1 \4 X# x' Y+ }: X# s● 移位寄存器将被覆盖。之后,上溢期间接收到的任何数据都将丢失。5 B1 u( _3 P. J( ?8 j! L/ ?2 J
    ● 如果 RXNEIE 位置 1 或 EIE 与 DMAR 位均为 1,则会生成中断。. v9 h! A+ F9 Z: K9 {
    ● 通过先后对 USART_SR 寄存器和 USART_DR 寄存器执行读操作将 ORE 位清除。) i1 z9 i! a& \4 P  b' s. H+ T
    ORE 位置 1 时表示至少 1 个数据丢失。存在两种可能:
    $ c% E( Y, o0 X+ K7 g● 如果 RXNE=1,则最后一个有效数据存储于接收寄存器 RDR 中并且可进行读取;
    ! |3 _( e1 A  T. x5 f● 如果 RXNE=0,则表示最后一个有效数据已被读取,因此 RDR 中没有要读取的数据。接收到新(丢失)数据的同时已读取 RDR 中的最后一个有效数据时,会发生该情况。读取序列期间(在 USART_SR 寄存器读访问与 USART_DR 读访问之间)接收到新数据时也会发生该情况9 q9 J+ n. L1 |1 {& c
    选择合适的过采样方法* S9 w1 N" v. r- H8 X& x' k
    接收器采用不同的用户可配置过采样技术(除了同步模式下),可以从噪声中提取有效数据。
    " M* _/ z9 O5 `7 Q" V可通过编程 USART_CR1 寄存器中的 OVER8 位来选择采样方法,且采样时钟可以是波特率时钟的 16 倍或 8 倍
    " ^( e( H/ o' z! M% ^6 n; T7 P根据应用:
    3 r9 S5 A) x# q" e5 ?● 选择 8 倍过采样 (OVER8=1) 以获得更高的速度(高达 fPCLK/8)。这种情况下接收器对时钟偏差的最大容差将会降低
    7 Z, |% I! b4 H5 z5 `! J; s选择 16 倍过采样 (OVER8=0) 以增加接收器对时钟偏差的容差。这种情况下,最大速度限制为最高 fPCLK/16
    9 l- {1 U2 X0 L+ D( j1 k注意智能卡、 IrDA 和 LIN 模式下不可采用 8 倍过采样。在这些模式下, OVER8 位由硬件强制清零。
    " s! s7 Z/ L; b" o  Y小数波特率生成
    ! [, U2 i4 a* I4 p( a# F4 x对 USARTDIV 的尾数值和小数值进行编程时,接收器和发送器(Rx 和 Tx)的波特率均设置为相同值。
    : ]" ^/ d+ U; Y" G$ a
    640 (26).png

    1 X/ d4 ~; P( z$ M% V
USARTDIV 是一个存放在 USART_BRR 寄存器中的无符号定点数。
● 当 OVER8=0 时,小数部分编码为 4 位并通过 USART_BRR 寄存器中的 DIV_fraction[3:0]位编程。
" A# b+ F( e/ K' h- ?& o; a( S● 当 OVER8=1 时,小数部分编码为 3 位并通过 USART_BRR 寄存器中的 DIV_fraction[2:0]位编程,此时 DIV_fraction[3] 位必须保持清零状态。; g/ H# A" a- r* H/ a
注意:对 USART_BRR 执行写操作后,波特率计数器更新为波特率寄存器中的新值。因此,波特率寄存器的值不应在通信时发生更改。
/ o, b% a! k! b7 f; hOVER8=0 时如何从 USART_BRR 寄存器值中获取 USARTDIV3 X# K8 t) r# O$ ?/ U
示例 1:
% S# V. w" a. O4 B' p如果 DIV_Mantissa = 0d27 且 DIV_Fraction = 0d12 (USART_BRR = 0x1BC),则
$ F1 Q5 e( z: r% x0 V! e尾数 (USARTDIV) = 0d27=0x1B8 @. r( F: S7 Z1 `1 k$ C. \
小数 (USARTDIV) = 12/16 = 0d0.75=0x0C
* N  [0 m) Z' p. U2 J/ O因此 USARTDIV = 0d27.75 =0x1B<<4| 0x0C=0x1BC
! V; P: O/ N4 t8 o/ N1 ~1 i- AUSART 接收器对时钟偏差的容差
7 r" ]$ m/ a+ @9 S4 X2 ~仅当总时钟系统偏差小于 USART 接收器的容差时, USART 异步接收器器才能正常工作。
! M* g+ [  B: y$ B/ v; J影响总偏差的因素包括:
7 I5 ~0 Q: w: }! q8 e5 u● DTRA:发送器误差引起的偏差(其中还包括发送器本地振荡器的偏差)
, @# ]5 z: A1 G1 |# s+ P+ z● DQUANT:接收器的波特率量化引起的误差* e2 A# W7 B; o: s2 Y0 t* d
● DREC:接收器本地振荡器的偏差6 T6 ~, n5 P1 O5 f
● DTCL:传输线路引起的偏差(通常是由于收发器所引起,它可能会在低电平到高电平转换时序与高电平到低电平转换时序之间引入不对称)2 J, {4 [' A* z; K* F6 N+ J# W
DTRA + DQUANT + DREC + DTCL < USART 接收器的容差
% m8 c! U" `7 _0 ^/ M% d- g, p* @2 @对于正常接收数据, USART 接收器的容差等于所容许的最大偏差,具体取决于以下选择:
* @9 K. I" m5 w2 z0 s/ _● 由 USART_CR1 寄存器中的 M 位定义的 10 位或 11 位字符长度
8 `* `8 w) R& {2 J: N" a3 |● 由 USART_CR1 寄存器中的 OVER8 位定义的 8 倍或 16 倍过采样% l8 W5 k- D& x: U6 [0 n" v
● 是否使用小数波特率
2 K. z' r, W" K, p% r5 D* ^+ z( {● 使用 1 位或 3 位对数据进行采样,取决于 USART_CR3 寄存器中 ONEBIT 位的值
多处理器通信
4 Z' G" r0 X1 R6 J) \可以与 USART 进行多处理器通信(多个 USART 连接在一个网络中)。例如,其中一个
. M0 z% E( m/ z! i) wUSART 可以是主 USART,其 TX 输出与其它 USART 的 RX 输入相连接。其它 USART 为
/ P* N* X: u3 Z& n, }4 y2 s从 USART,其各自的 TX 输出在逻辑上通过与运算连在一起,并与主 USART 的 RX 输入相
1 x! P! w1 l7 U2 s' z6 m! r: Z连接。
* }4 d5 |$ c5 W) ?0 C( `! X  U% k在多处理器配置中,理想情况下通常只有预期的消息接收方主动接收完整的消息内容,从而' @7 l! ?: U8 v, _" D, }
减少由所有未被寻址的接收器造成的冗余 USART 服务开销。
$ l* Q! V3 ], T( \1 N可通过静音功能将未被寻址的器件置于静音模式下。在静音模式下:
% M$ o8 j: d0 `  f9 C● 不得将接收状态位置 1。, s$ A6 x) }; X* T& z( K
● 禁止任何接收中断。$ i$ D* n1 z' l3 f* [" s
● USART_CR1 寄存器中的 RWU 位置 1。RWU 可由硬件自动控制,或在特定条件下由软
$ N" Y. {0 J! B1 p8 Q& P! I9 s件写入。
; [  D/ n! s& p7 J0 u2 D6 M根据 USART_CR1 寄存器中 WAKE 位的设置, USART 可使用以下两种方法进入或退出静
  R. S) ^$ M3 [( R音模式:
- i4 ]& _! K6 A3 k" s# [8 Z● 如果 WAKE 位被复位,则进行空闲线路检测,9 p% T% A! a; c# j/ h, L2 U
● 如果 WAKE 位置 1,则进行地址标记检测。
( d5 K- A- K+ ]6 |- G! z空闲线路检测 (WAKE=0)
1 O" Z' Y# t$ m; E* L当向 RWU 位写入 1 时, USART 进入静音模式。: f* Q1 g0 X2 s$ [& D. m
当检测到空闲帧时,它会被唤醒。此时 RWU 位会由硬件清零,但 USART_SR 寄存器中的
7 {- C+ u. q- P# {IDLE 位不会置 1。还可通过软件向 RWU 位写入 0。7 B9 c5 J) o! T% q) G9 L: A" a
图 253 中给出了使用空闲线路检测时静音模式行为的示例
0 Q7 U$ t" R. V
640 (25).png
地址标记检测 (WAKE=1)
1 x1 o  ]) J* d. w# M# C在此模式下,如果字节的 MSB 为 1,则将这些字节识别为地址,否则将其识别为数据。在+ t$ X* [) ~+ e2 e& L% {6 [0 K# f
地址字节中,目标接收器的地址位于 4 个 LSB 上。接收器会将此 4 位字与其地址进行比较,该接收器的地址在 USART_CR2 寄存器的 ADD 位中进行设置。0 o5 B* c3 q  c; h9 ^6 i  |
当接收到与其编程地址不匹配的地址字符时, USART 会进入静音模式。此时, RWU 位将由硬件置 1。由于当时 USART 已经进入了静音模式,所以 RXNE 标志不会针对此地址字节置 1,也不会发出中断或 DMA 请求。
) G% M$ X: q* d# M当接收到与编程地址匹配的地址字符时,它会退出静音模式。然后 RWU 位被清零,可以开始正常接收后续字节。由于 RWU 位已清零, RXNE 位会针对地址字符 置 1。
2 B7 K) a) P, i) y5 x0 e6 L
当接收器的缓冲区不包含任何数据(USART_SR 寄存器中 RXNE=0)时,可向 RWU 位写入 0 或 1。否则会忽略写尝试。! r* G, l$ P1 Q
图 254 中给出了使用地址标记检测时静音模式行为的示例。
! U7 I# j* G# V/ s
640 (24).png
8 q- t% Q. \) U
奇偶校验控制
; B5 [% U  q5 X. P* w- T& J7 X将 USART_CR1 寄存器中的 PCE 位置 1,可以使能奇偶校验控制(发送时生成奇偶校验位,接收时进行奇偶校验检查)。根据 M 位定义的帧长度, 表 120 中列出了可能的 USART 帧格式。
640 (23).png
偶校验
- a% n$ L2 a/ Y对奇偶校验位进行计算,使帧和奇偶校验位中“1”的数量为偶数(帧由 7 个或 8 个 LSB 位组成,具体取决于 M 等于 0 还是 1)。
" V' i$ n3 K) f例如:数据=00110101;4 个位置 1 => 如果选择偶校验(USART_CR1 寄存器中的 PS 位 =0),则校验位是 0。
0 r% H) |6 u/ q" G. M: A7 I9 }& ^1 O奇校验
( B! l7 S7 I7 N+ W9 t4 t对奇偶校验位进行计算,使帧和奇偶校验位中“1”的数量为奇数(帧由 7 个或 8 个 LSB 位组成,具体取决于 M 等于 0 还是 1)。% W; k2 }- _3 z* t
例如:数据=00110101;4 个位置 1 => 如果选择奇校验(USART_CR1 寄存器中的 PS 位 =1),则校验位是 1。
接收时进行奇偶校验检查  T5 Q* F% `5 [+ S- Z
如果奇偶校验检查失败,则 USART_SR 寄存器中的 PE 标志置 1;如果 USART_CR1 寄存1 n7 ~% H' c. ^& H9 v* A; x3 n
器中 PEIE 位置 1,则会生成中断。PE 标志由软件序列清零(从状态寄存器中读取,然后对USART_DR 数据寄存器执行读或写访问)。
8 K  u+ B" m; Y& [: G  l2 u3 ~注意:如果被地址标记唤醒:会使用数据的 MSB 位而非奇偶校验位来识别地址。此外,接收器不会对地址数据进行奇偶校验检查(奇偶校验出错时, PE 不置 1)。
  B2 w% M& k5 F6 P: r3 n: f发送时的奇偶校验生成5 O0 w1 s& k5 i: L* F9 I7 }( a0 g% ^
如果 USART_CR1 寄存器中的 PCE 位置 1,则在数据寄存器中所写入数据的 MSB 位会进行传送,但是会由奇偶校验位进行更改(如果选择偶校验 (PS=0),则“1”的数量为偶数;* f/ E* ^$ I! ~
如果选择奇校验 (PS=1),则“1”的数量为奇数)。3 z! V' g5 i, _2 Z7 L  N( x6 l
注意:用于管理发送过程的软件程序可以激活软件序列,进而将 PE 标志清零(从状态寄存器中读取,然后对数据寄存器执行读或写访问)。在半双工模式下工作时(具体取决于软件),这可能会导致 PE 标志意外清零.
LIN(局域互连网络)模式" V5 w( a  K% I, l9 m8 F
LIN 发送
! e" p- H) w5 b- f( ]& |6 y与正常的 USART 发送相比,在 LIN 主器件中发送时必须采用 第 26.3.2 节 中介绍的相同步骤,同时还具有以下区别:/ @1 }5 H/ V* b5 t+ E1 c4 p0 v" Y
● M 位清零以配置 8 位字长度。
# m$ b9 C) U0 m" n/ `2 s" H● LINEN 位置 1 以进入 LIN 模式。此时,将 SBK 位置 1 会发送 13 个“0”位作为断路字符。然后会发送值为“1”的位以进行下一启动检测。. ^3 h9 Q: i( L! a' W
LIN 接收/ M1 E$ S+ a: J1 U. M( O' A
断路检测电路在 USART 接口上实现。该检测完全独立于正常的 USART 接收器。在空闲状态或某个帧期间,只要发生断路即可检测出来。
/ Q# t6 l1 z8 n5 d( s  r5 l接收器(USART_CR1 寄存器中 RE=1)使能后,电路便开始监测启动信号的 RX 输入。检测起始位的方法与搜索断路字符或数据的方法相同。检测到起始位后,电路会对接下来的位5 {4 h% K$ ?1 [* R' l% p( x
进行采样,方法与数据采样相同(第 8、第 9 和第 10 次采样)。如果 10 个(USART_CR2寄存器中 LBDL = 0 时)或 11 个(USART_CR2 寄存器中 LBDL=1 时)连续位均检测为4 o' k" G$ g9 |
“0”,且其后跟随分隔符,则 USART_SR 寄存器中的 LBD 标志将会置 1。如果 LBDIE 位=1,则会生成中断。在验证断路前,会对分隔符进行检查,因为它表示 RX 线路已恢复到高电平。
2 e5 P1 X- y6 G) R4 \# I) ]: ~如果在第 10 或第 11 次采样前已对“1”采样,则断路检测电路会取消当前检测,并重新搜索起始位。
" V5 \) f4 v5 B: [4 ~如果禁止 LIN 模式 (LINEN=0),接收器会作为正常的 USART 继续工作,不会再进行断路检测。! d  G5 |. @- h/ }6 z
如果使能 LIN 模式 (LINEN=1), 只要发生帧错误(例如,在“0”处检测到停止位,这种情况可能出现在任何断路帧中),接收器即会停止,直到断路检测电路接收到“1”(断路字不完整时)或接收到分隔符(检测到断路时)为止。
USART 同步模式
通过将 USART_CR2 寄存器中的 CLKEN 位写入 1 来选择同步模式。在同步模式下,必须将以下位清零:
1 g/ ~4 S7 r  @* O/ A● USART_CR2 寄存器中的 LINEN 位,- ]# D4 x& {. N: y% H
● USART_CR3 寄存器中的 SCEN、 HDSEL 和 IREN 位。
, K6 u% o% w* N6 e* k4 j7 s: ~4 x通过 USART,用户可以在主模式下控制双向同步串行通信。SCLK 引脚是 USART 发送器时钟的输出。在起始位或停止位期间,不会向 SCLK 引脚发送时钟脉冲。在最后一个有效数据位(地址标记)期间,将会(也可能不会)生成时钟脉冲,这取决于 USART_CR2 寄存器中 LBCL 位的状态。通过 USART_CR2 寄存器中的 CPOL 位,用户可以选择时钟极性;通: c) Q4 T" b9 d& n8 S. y
过 USART_CR2 寄存器中的 CPHA 位,用户可以选择外部时钟相位. B. a( V- n/ S- S  L
在空闲状态、报头模式和发送断路期间,外部 SCLK 时钟处于未激活状态。
2 X  g4 s5 h& e: zUSART 发送器在同步模式下的工作方式与异步模式下完全相同。但是由于 SCLK 与 TX 同步(根据 CPOL 和 CPHA),因此 TX 上的数据是同步的。" H; U% E7 R# [: V$ |
在此模式下, USART 接收器的工作方式与异步模式下不同。如果 RE=1,则数据在 SCLK上采样(上升或下降沿,取决于 CPOL 和 CPHA),而不会进行任何过采样。此时必须确保建立时间和保持时间(取决于波特率:1/16 位时间)符合要求。5 l! p/ u% g$ c% x) m
注意:SCLK 引脚可与 TX 引脚结合使用。因此,仅当使能发送器 (TE=1) 且正在发送数据时(对数据寄存器 USART_DR 已被写入),才会提供时钟。这意味着,没有发送数据的情况下无法接收同步数据。
6 n3 W  V, @/ k, f4 Y当发送器和接收器 (TE=RE=0) 都被禁止时,必须选择 LBCL、 CPOL 和 CPHA 位,以确保时钟脉冲正常工作。当使能发送器或接收器时,不得对这些位进行更改。1 z0 |* s+ N" z1 n, {0 T: w; V! f
建议按照相同指令将 TE 和 RE 位置 1,以尽量缩短接收器的建立时间和保持时间。0 m( @. }8 N. t
USART 只支持主模式:它不能接收或发送与输入时钟相关的数据(SCLK 始终为输出
640 (22).png

" H" K3 E1 Y; ]) \6 K
640 (21).png
& r2 u/ i6 c0 I
( o5 k8 _3 k5 Q: a* G( w* j
单线半双工通信5 ~- @0 W- C$ m8 v, ]* ~8 c: u) v
通过将 USART_CR3 寄存器中的 HDSEL 位置 1 来选择单线半双工模式。在此模式下,必须将以下位清零:* D: |1 a# r; i) V- i
● USART_CR2 寄存器中的 LINEN 和 CLKEN 位,: ^( m' \# {0 F
● USART_CR3 寄存器中的 SCEN 和 IREN 位。
7 e1 L* B2 D* V# ~8 m7 Z. [USART 可以配置为遵循单线半双工协议,其中 TX 和 RX 线路从内部相连接。使用控制位“HALF DUPLEX SEL”(USART_CR3 寄存器中的 HDSEL 位),可以在半双工通信和全双工通信间进行选择。
7 Q7 x2 U2 ?* @& y. A4 t一旦向 HDSEL 位写入 1:/ {- [1 D( i% @/ W, G
● TX 和 RX 线路从内部相连接; g# V7 x; ]/ v/ @- B' A
● 不能再使用 RX 引脚2 M. R: K/ i; ]- W' z  j( a
● 无数据传输时, TX 引脚始终处于释放状态。因此,它在空闲状态或接收过程中用作标准I/O。这意味着,必须对 I/O 进行配置,以便在未受 USART 驱动时,使 TX 成为浮空输入(或高电平开漏输出)
1 x: P# k: X: G# y5 H
除此之外,通信与正常 USART 模式下的通信相似。此线路上的冲突必须由软件进行管理(例如,使用中央仲裁器)。尤其要注意,发送过程永远不会被硬件封锁,只要数据是在TE 位置 1 的情况下写入,发送就会持续进行。
智能卡
' _: o. I9 g) G8 E9 ^0 W* m通过将 USART_CR3 寄存器中的 SCEN 位置 1 来选择智能卡模式。在智能卡模式下,必须将以下位清零:
9 y- `: a7 r/ e2 k3 W* Z+ J● USART_CR2 寄存器中的 LINEN 位,( p' y, r$ _+ h# H% l5 Z
● USART_CR3 寄存器中的 HDSEL 和 IREN 位。3 Y) Q) L% T6 w0 K. Z' i+ _
此外,可能需要将 CLKEN 位置 1,以便为智能卡提供时钟。5 q) N: ~' |. @' {% O
智能卡接口支持符合 ISO 7816-3 标准的异步协议智能卡。USART 应如下所示进行配置:
* x+ J. R/ B) |2 a. s! E● 8 个位加奇偶校验:当 USART_CR1 寄存器中 M=1 且 PCE=1 时
" g6 {% o' r, \/ R* w" S( [& ~7 ?● 发送和接收时使用 1.5 个停止位:当 USART_CR2 寄存器中 STOP=11 时。
640 (20).png
连接到智能卡时, USART 的 TX 输出会驱动一条双向线(它也由智能卡驱动)。必须将 TX引脚配置为开漏引脚。4 k% V6 f) @+ ^+ G/ ^( W
智能卡是一个单线半双工通信协议。
" [, `3 u4 w8 [$ o6 x' B● 从发送移位寄存器发送数据会经过至少 1/2 个时钟周期的延迟。正常工作时,已满的发送移位寄存器会在下一个时钟边沿开始移位。在智能卡模式下,此发送过程还会进一步经过 1/2 波特时钟周期的延迟。- {% O' }7 [1 e' _$ G8 R) r  t
● 如果在接收一个使用 0.5 或 1.5 个停止位编程的帧期间检测到奇偶校验错误,则在完成接收帧后,发送线会被拉低一个时钟周期。这是为了向智能卡指出发送到 USART 的数据尚未正确接收。此 NACK 信号(将发送线拉低 1 个时钟周期)会导致发送器端(配置为 1.5 个停止位)出现帧错误。应用程序可根据协议重新发送数据。如果 NACK 控制位置 1,则接收器会向奇偶校验错误发送“NACK”信号;否则不会发送 NACK 信号 .
( F$ X/ U' D" N  [& Q. x
通过对保护时间寄存器进行编程,可以延迟 TC 标志的置位。正常工作时,当发送移位寄存器为空且没有新的发送请求出现时,会对 TC 标志进行置位。在智能卡模式下,空的发送移位寄存器会触发保护时间计数器,使其递增计数至保护时间寄存器中的值。在此期间, TC 标志被强制为低电平。当保护时间计数器达到设置值时, TC 置位为高电平。7 v, Q# S+ I; r2 W3 ?2 \8 f! y  p: e  s% s
● TC 标志的释放不受智能卡模式的影响。
; i9 a. M; P4 M& y$ c& g4 _3 ~● 如果在发送端检测到帧错误(由来自接收器的 NACK 信号引起),则发送端的接收块不会将 NACK 作为起始位进行检测。根据 ISO 协议,接收到的 NACK 信号的持续时间可以是 1 或 2 个时钟周期。9 J9 ]; X) l3 a3 M; w
● 在接收端,如果检测到奇偶校验错误并发送了 NACK 信号,则接收端不会将 NACK 作为起始位进行检测。
. R9 v3 k, Q6 n! [! d3 @注意:中断字符在智能卡模式下无效。带有帧错误的 0x00 数据将被视为数据,而非中断。
7 y3 U* O6 V7 B* ~7 U' C9 @+ H  l当翻转 TE 位时,不会发送空闲帧。空闲帧(在其它配置中进行了定义)在 ISO 协议中未进行定义
IrDA SIR ENDEC 模块
6 N# S/ q8 {# r4 D3 Y! t) v) S6 Q通过将 USART_CR3 寄存器中的 IREN 位置 1 来选择 IrDA 模式。在 IrDA 模式下,必须将以下位清零:
/ L- U* H: y. y7 q3 r6 K6 P● USART_CR2 寄存器中的 LINEN、 STOP 和 CLKEN 位,
9 D0 X% @9 J6 a● USART_CR3 寄存器中的 SCEN 和 HDSEL 位。% @3 f# a/ \* P3 t" j( G* F# i2 T
IrDA SIR 物理层规定使用反相归零 (RZI) 调制方案,它以红外光脉冲表示逻辑 0。- w2 {/ k4 T+ B( X
SIR 发送编码器用于调制 USART 发出的非归零 (NRZ) 位流。输出脉冲流会发送到外部输出驱动器和红外线 LED。USART 支持的 SIR ENDEC 比特率最高为 115.2Kbps。在正常模式下,所发送的脉冲宽度规定为一个位周期的 3/16。8 P& A1 O" |$ S* Q1 j
SIR 接收解码器用于解调由红外探测器发出的归零位流,并将接收到的 NRZ 串行位流输出到 USART。在空闲状态下,解码器输入通常为高电平(标记状态)。发送编码器输出的极性与解码器输入相反。当解码器输入为低电平时,会检测到起始位。  M- h7 }. j/ q
● IrDA 是一个半双工通信协议。如果发送器忙(例如, USART 正在向 IrDA 编码器发送数据),则 IrDA 解码器会忽略 IrDA 接收线上的所有数据;如果接收器忙(例如, USART正在接收来自 USART 的解码数据),则 IrDA 不会对 USART 发送到 IrDA 的 TX 上的数据进行编码。在接收数据时,应避免同时进行发送,因为这样做可能会破坏要发送的数据。
1 W$ d9 k3 {; T' N● “0”作为高电平脉冲发送,而“1”作为“0”发送。在正常模式下,脉冲宽度规定为所选位周期的 3/16。" @$ O) {! c3 }
● SIR 解码器用于将兼容 IrDA 的接收信号转换为 USART 的位流。% Y8 H* M, [7 t
● SIR 接收逻辑将高电平状态视为逻辑“1”,将低电平脉冲视为逻辑“0”。$ H, J- S8 I2 B* B# ]
● 发送编码器输出的极性与解码器输入相反。SIR 输出在空闲时处于低电平状态。8 \- z9 ^5 t. C2 ~
● IrDA 规范要求脉冲容忍值要大于 1.41 us。可接受的脉冲宽度可通过寄存器设置。接收器端的干扰检测逻辑会滤除宽度小于 2 个 PSC 周期的脉冲(PSC 是在 IrDA 低功耗波特寄存器 USART_GTPR 中编程的预分频器值)。宽度小于 1 个 PSC 周期的脉冲都将被拒绝,但宽度大于 1 个而小于 2 个周期的脉冲可能被接受也可能被拒绝,而宽度大于 2 个周期的脉冲将被接受作为有效脉冲。当 PSC=0 时, IrDA 编码器/解码器不工作。
( v1 x( x) H8 I! ^4 l7 @; L3 a● 接收器能够与低功耗发送器进行通信。8 q+ `0 b+ i. h' h8 e$ Y' z2 D% _
● 在 IrDA 模式下, USART_CR2 寄存器中的 STOP 位必须配置为“1 个停止位”
/ X# x7 v6 P" d" ?& p) n" e/ M- S
IrDA 低功耗模式
发送器:9 j" p0 m7 m7 E# h1 P2 p, h& ?/ k
在低功耗模式下,脉冲宽度不再保持为位周期的 3/16。此时的脉冲宽度为低功耗波特率的3 倍,最小可为 1.42 MHz。通常此值是 1.8432 MHz (1.42 MHz < PSC< 2.12 MHz)。低功耗
9 k" o3 R8 C1 _+ \7 r0 K6 ^模式下的可编程分频器会对系统时钟进行分频,以达到此值。
! B: y- u* o! y1 O接收器:# _; _  S  ~) S% b
在低功耗模式下接收与在正常模式下接收类似。为进行干扰检测, USART 应丢弃持续时间短于 1/PSC 的脉冲。只有当持续时间大于 2 个 IrDA 低功耗波特时钟周期(USART_GTPR 寄存器中的 PSC 值)时,才是有效低电平。( z* h& C, i% h6 G- O; }1 Q
注意:宽度小于两个但大于一个 PSC 周期的脉冲可能被接受,也可能被拒绝。, ?' J. L, R. g, b# }3 N7 |8 N0 G
接收器的建立时间应由软件进行管理。IrDA 物理层规范规定发送和接收之间至少要经过 10 ms的延迟(IrDA 是一个半双工协议)

- q. n5 {+ _+ d9 x
640 (18).png
2 x7 E& M) d. m0 z5 e
使用 DMA 进行连续通信
+ [0 I2 x  d" s0 s- K5 xUSART 能够使用 DMA 进行连续通信。接收缓冲区和发送缓冲区的 DMA 请求是独立的。
' T4 Q7 F7 {: r8 v4 {+ h注意:有关 DMA 控制器可用性的信息,请参见产品规范。如果 DMA 不适用于该产品,应按照第26.3.2 节或 26.3.3 中的解释说明使用 USART。可以将 USART_SR 寄存器中的 TXE/RXNE标志清零,从而实现连续通信。使用 DMA 进行发送
& o) U3 n$ ~7 F( e6 u将 USART_CR3 寄存器中的 DMAT 位置 1 可以使能 DMA 模式进行发送。当 TXE 位置 1 时,可将数据从 SRAM 区(通过 DMA 配置,参见 DMA 部分)加载到 USART_DR 寄存器。要映射一个 DMA 通道以进行 USART 发送,请按以下步骤操作(x 表示通道编号):3 a: ^; w! ]* l# F
1. 在 DMA 控制寄存器中写入 USART_DR 寄存器地址,将其配置为传输的目标地址。每次发生 TXE 事件后,数据都会从存储器移动到此地址。7 K- a8 z1 O3 ^2 I& H" H
2. 在 DMA 控制寄存器中写入存储器地址,将其配置为传输的源地址。每次发生 TXE 事件后,数据都会从这个存储区域加载到 USART_DR 寄存器中。* k' g( J+ i' E# m
3. 在 DMA 控制寄存器中配置要传输的总字节数。
0 }; l$ C# I% p: v* M$ j! B5 j+ U# C4. 在 DMA 寄存器中配置通道优先级! {. O0 d9 [; \( R
5. 根据应用的需求,在完成一半或全部传输后产生 DMA 中断
$ {% L4 @; B+ _! E6. 向 SR 寄存器中的 TC 位写入 0,将其清零。  T/ y' [7 L# W
7. 在 DMA 寄存器中激活该通道。
$ A$ f( ^% u, L( d' V% a当达到在 DMA 控制器中设置的数据传输量时, DMA 控制器会在 DMA 通道的中断向量上产生一个中断。
& }  y6 {* F1 f- U在发送模式下, DMA 对所有要发送的数据执行了写操作(DMA_ISR 寄存器中的 TCIF 标志置 1)后,可以对 TC 标志进行监视,以确保 USART 通信已完成。在禁止 USART 或进入停止模式前必须执行此步骤,以避免损坏最后一次发送。软件必须等待直到 TC=1。TC 标志在所有数据发送期间都必须保持清零状态,然后在最后一帧发送结束后由硬件置 1。
640 (17).png
使用 DMA 进行接收* I: P( a6 m. y: {4 i
将 USART_CR3 寄存器中的 DMAR 位置 1 可以使能 DMA 模式进行接收。接收数据字节时,数据会从 USART_DR 寄存器加载到 SRAM 区域中(通过 DMA 配置,参见 DMA 规范)。要映射一个 DMA 通道以进行 USART 接收,请按以下步骤操作:9 P9 h+ K' x) i
1. 在 DMA 控制寄存器中写入 USART_DR 寄存器地址,将其配置为传输的源地址。每次发生 RXNE 事件后,数据都会从此地址移动到存储器。4 W9 y* S: W3 J! B( M
2. 在 DMA 控制寄存器中写入存储器地址,将其配置为传输的目标地址。每次发生 RXNE 事件后,数据都会从 USART_DR 寄存器加载到此存储区。
2 }* L6 H# W! n' z+ L- K/ v3. 在 DMA 控制寄存器中配置要传输的总字节数。
6 n; L! X) m% G4. 在 DMA 控制寄存器中配置通道优先级。1 o, ^! p7 Y! i+ X5 w
5. 根据应用的需求,在完成一半或全部传输后产生中断。
' A7 i* R) L, `  L, @' ~- w* X6. 在 DMA 控制寄存器中激活该通道。
当达到在 DMA 控制器中设置的数据传输量时, DMA 控制器会在 DMA 通道的中断向量上产生一个中断。在中断子程序中, USART_CR3 寄存器中的 DMAR 位应由软件清零。注意:如果 DMA 用于接收,则不要使能 RXNEIE 位。
640 (16).png
多缓冲区通信中的错误标志和中断生成( _' B! Q1 g' E3 ]
在多缓冲区通信中,如果事务中发生任何错误, 都会在当前字节后放置错误标志。如果中断使能置 1,则会产生中断。在单字节接收过程中,与 RXNE 一同置位的帧错误、上溢错误和噪声
; `8 z9 \1 a; I' E, G, ?7 I" P标志具有单独的错误标志中断使能位(USART_CR3 寄存器中的 EIE 位);如果该位置 1,2 Z0 I% I# p: U
则会因其中任何一个错误而在当前字节后产生中断。
2 b2 V+ W6 z; \
硬件流控制
  y1 w. U( [3 h
使用 nCTS 输入和 nRTS 输出可以控制 2 个器件间的串行数据流。图 267 显示了在这种模式下如何连接 2 个器件:
640 (15).png
分别向 USART_CR3 寄存器中的 RTSE 位和 CTSE 位写入 1,可以分别使能 RTS 和 CTS 流控制。% V( g# d! ?5 {+ A* X5 c
RTS 流控制' C- F5 Q8 q2 J  S/ m+ R
如果使能 RTS 流控制 (RTSE=1),只要 USART 接收器准备好接收新数据,便会将 nRTS 变为有效(连接到低电平)。当接收寄存器已满时,会将 nRTS 变为无效,表明发送过程会在当前帧结束后停止。图 268 显示了在使能 RTS 流控制的情况下进行通信的示例。

3 g! u/ ^. t4 q0 k5 K( y
640 (14).png

. z' Y1 N; ^7 B: M% T
CTS 流控制. g5 G+ q/ S' T: g* Z$ M
如果使能 CTS 流控制 (CTSE=1),则发送器会在发送下一帧前检查 nCTS。如果 nCTS 有效(连接到低电平),则会发送下一数据(假设数据已准备好发送,即 TXE=0);否则不会进行发送。如果在发送过程中 nCTS 变为无效,则当前发送完成之后,发送器停止。
/ R2 F2 b8 _* x; r5 d当 CTSE=1 时,只要 nCTS 发生变化, CTSIF 状态位便会由硬件自动置 1。这指示接收器是否已准备好进行通信。如果 USART_CR3 寄存器中的 CTSIE 位置 1,则会产生中断。下图显示了在使能 CTS 流控制的情况下进行通信的示例。
2 h2 u2 [, X! G" U; [. N! {# j% ~6 R/ R
640 (13).png

+ q, C! k; J5 n5 r* H: o  h2 k
USART 中断
640 (12).png
USART 中断事件被连接到相同的中断向量(请参见图 270)。
+ t* |0 I! q3 w: s# h● 发送期间:发送完成、清除以发送或发送数据寄存器为空中断。
/ z4 g+ H# p; X7 G* ~6 [● 接收期间:空闲线路检测、上溢错误、接收数据寄存器不为空、奇偶校验错误、 LIN 断路检测、噪声标志(仅限多缓冲区通信)和帧错误(仅限多缓冲区通信)如果相应的使能控制位置 1,则这些事件会生成中断。( p$ T4 {7 Y7 k; y1 m( V: e. q
640 (11).png
USART 模式配置
8 D1 i; L- V/ [6 p+ n. r5 `
640 (10).png
USART 寄存器
! P' b1 Y, K) [+ D: D6 q
状态寄存器 (USART_SR)4 D( q" ]3 Q9 H- I' D
640 (9).png
位 31:10 保留,必须保持复位值# N& o1 K& B, Q
位 9 CTS:CTS 标志 (CTS flag)) ~  v7 ^0 H& ^' [! L: j; {) l3 W
如果 CTSE 位置 1,当 nCTS 输入变换时,此位由硬件置 1。通过软件将该位清零(通过向该位中写入 0)。如果 USART_CR3 寄存器中 CTSIE=1,则会生成中断。8 L, ]! }- s3 i( U. ?% W
0:nCTS 状态线上未发生变化- f% b6 r3 g1 `
1:nCTS 状态线上发生变化
. F; {6 }6 ^6 j  t9 b注意:该位不适用于 UART4 和 UART5。
位 8 LBD:LIN 断路检测标志 (LIN break detection flag)
; v& h6 W# P) \) \( y) ^( |4 }检测到 LIN 断路时,该位由硬件置 1。通过软件将该位清零(通过向该位中写入 0)。如果USART_CR2 寄存器中 LBDIE = 1,则会生成中断。
3 j8 f9 S) S" z. d1 ?0 O0:未检测到 LIN 断路& b5 l& y: h- F
1:检测到 LIN 断路
6 f5 B/ F  U' E! n注意:如果 LBDIE=1,则当 LBD=1 时生成中断% {/ Z3 A% C* K" k0 ]/ Q+ G
位 7 TXE:发送数据寄存器为空 (Transmit data register empty)
8 J" w, R$ O, q2 O* u6 a% F! H当 TDR 寄存器的内容已传输到移位寄存器时,该位由硬件置 1。如果USART_CR1 寄存器中 TXEIE 位 = 1,则会生成中断。通过对 USART_DR 寄存器执行写入操作将该位清零。8 S1 W6 X) F" ~8 A8 |4 F
0:数据未传输到移位寄存器: a$ d" Q, C  h6 [
1:数据传输到移位寄存器
9 f- l: n  _" S# w$ L! V注意:单缓冲区发送期间使用该位。; o1 l- p% V+ P! N- N2 m  E
位 6 TC:发送完成 (Transmission complete)9 D; B. T& b" c( ~# N
如果已完成对包含数据的帧的发送并且 TXE 置 1,则该位由硬件置 1。如果 USART_CR1 寄存器中 TCIE = 1,则会生成中断。该位由软件序列清零(读取 USART_SR 寄存器,然后写入USART_DR 寄存器)。TC 位也可以通过向该位写入‘0’来清零。建议仅在多缓冲区通信时使用此清零序列。, k7 \$ l; J, w" H
0:传送未完成
: |& Y: S$ @9 u2 P3 Q1:传送已完成
& _3 y! J+ q! v位 5 RXNE:读取数据寄存器不为空 (Read data register not empty)  P( |+ F, o( n& j  q: s  s* H
当 RDR 移 位 寄 存 器 的 内 容 已 传 输 到 USART_DR 寄 存 器 时,该 位 由 硬 件 置 1。如 果USART_CR1 寄存器中 RXNEIE = 1,则会生成中断。通过对 USART_DR 寄存器执行读入操作将该位清零。RXNE 标志也可以通过向该位写入零来清零。建议仅在多缓冲区通信时使用此清零序列。8 N# N% A% c) z% p3 B
0:未接收到数据) P  t2 O. u6 U( ?1 o- N. A
1:已准备好读取接收到的数据
) z+ S) d, q9 l$ ~+ A+ K9 `1 B! @位 4 IDLE:检测到空闲线路 (IDLE line detected)# I- {4 h8 Q+ p4 O9 n( ~, M
检测到空闲线路时,该位由硬件置 1。如果 USART_CR1 寄存器中 IDLEIE = 1,则会生成中断。该位由软件序列清零(读入 USART_SR 寄存器,然后读入 USART_DR 寄存器)。
( a( y1 `( h2 k$ u$ ^0:未检测到空闲线路% s; b8 z( K  B
1:检测到空闲线路
1 A0 r) f  h% l3 N: j注意:直到 RXNE 位本身已置 1 时(即,当出现新的空闲线路时) IDLE 位才会被再次置 1。
位 3 ORE:上溢错误 (Overrun error)& Q& u' M7 _5 [/ E0 S
在 RXNE = 1 的情况下,当移位寄存器中当前正在接收的字准备好传输到 RDR 寄存器时,该位由硬件置 1。如果 USART_CR1 寄存器中 RXNEIE = 1,则会生成中断。该位由软件序列清零(读入 USART_SR 寄存器,然后读入 USART_DR 寄存器)。
+ Y9 t; Z! G! t6 R0:无上溢错误# R: s% t. Q6 {* z, }
1:检测到上溢错误
! {; e- ~6 n) m7 d* r. I注意:当该位置 1 时, RDR 寄存器的内容不会丢失,但移位寄存器会被覆盖。如果 EIE 位置 1,则在进行多缓冲区通信时会对 ORE 标志生成一个中断。1 V# J& S. N# ~$ ]- r9 F% S" \
位 2 NF:检测到噪声标志 (Noise detected flag)
5 J- J6 K$ N( q; `& D当在接收的帧上检测到噪声时,该位由硬件置 1。该位由软件序列清零(读入 USART_SR 寄存器,然后读入 USART_DR 寄存器)。
* Y3 R2 \6 ?. m2 z6 @0:未检测到噪声
5 X! r" r5 c; q* i- r( l1:检测到噪声
* V* l0 B5 v9 R4 B  z' ~" w4 w注意:如果 EIE 位置 1,则在进行多缓冲区通信时,该位不会生成中断,因为该位出现的时间与本身生成中断的 RXNE 位因 NF 标志而生成的时间相同。. e* Q# s6 Q' y5 b8 z
注意:当线路无噪声时,可以通过将 ONEBIT 位编程为 1 提高 USART 对偏差的容差来禁止NF 标志* e8 f' }6 E; U" L  B
位 1 FE:帧错误 (Framing error)
: Q4 V& Y4 P; C# F. P* l当检测到去同步化、过度的噪声或中断字符时,该位由硬件置 1。该位由软件序列清零(读入USART_SR 寄存器,然后读入 USART_DR 寄存器)。
& l1 \8 b3 O" ?0:未检测到帧错误( b! L3 ^  [3 S8 ~, ]2 U
1:检测到帧错误或中断字符6 f; E: O. K( w/ R0 t
注意:该位不会生成中断,因为该位出现的时间与本身生成中断的 RXNE 位出现的时间相同。如果当前正在传输的字同时导致帧错误和上溢错误,则会传输该字,且仅有 ORE 位被置 1。, X; [5 t$ I2 A8 U
如果 EIE 位置 1,则在进行多缓冲区通信时会对 FE 标志生成一个中断。, q6 L9 N5 F& u: h, N% g
位 0 PE:奇偶校验错误 (Parity error)5 Y: T( T5 k* N
当在接收器模式下发生奇偶校验错误时,该位由硬件置 1。该位由软件序列清零(读取状态寄存器,然后对 USART_DR 数据寄存器执行读或写访问)。将 PE 位清零前软件必须等待。RXNE 标志被置 1。如果 USART_CR1 寄存器中 PEIE = 1,则会生成中断。
. a0 ~1 x& ^) w% F0:无奇偶校验错误( o. e/ p0 G; s/ ^
1:奇偶校验错误
数据寄存器 (USART_DR)
位 31:9 保留,必须保持复位值
  Q. p2 X. o* }9 |位 8:0 DR[8:0]:数据值! g$ O* |' x# \8 t4 W7 A# i- }
包含接收到数据字符或已发送的数据字符,具体取决于所执行的操作是“读取”操作还是“写入”操作。
$ @) \$ k# O/ s因为数据寄存器包含两个寄存器,一个用于发送 (TDR),一个用于接收 (RDR),因此它具有双重功能(读和写)。7 ^+ ~* Q" a, n/ H) Z# k; _
TDR 寄存器在内部总线和输出移位寄存器之间提供了并行接口(参见图 1)。3 o" ~9 q7 i0 s5 X4 k- S' O
RDR 寄存器在输入移位寄存器和内部总线之间提供了并行接口。
: u0 f6 N. D- @" {  a+ Y6 _在使能奇偶校验位的情况下(USART_CR1 寄存器中的 PCE 位被置 1)进行发送时,由于MSB 的写入值(位 7 或位 8,具体取决于数据长度)会被奇偶校验位所取代,因此该值不起任何作用。
6 q& ?0 ?( i  x8 f1 h2 z9 k" h在使能奇偶校验位的情况下进行接收时,从 MSB 位中读取的值为接收到的奇偶校验位 。
+ r- j* n! c3 x0 q& c) m! Y
波特率寄存器 (USART_BRR)
; X4 c" ~. O8 b8 A3 @, n. Q
640 (8).png
1 S2 p& ]6 J4 x. X- [8 @
位 31:16 保留,必须保持复位值
8 F) b% v+ A6 U3 X( i6 Q. J位 15:4 DIV_Mantissa[11:0]:USARTDIV 的尾数. ]  i" f* c% A
这 12 个位用于定义 USART 除数 (USARTDIV) 的尾数1 s2 a+ p  b! X% W! Q
位 3:0 DIV_Fraction[3:0]:USARTDIV 的小数5 Y2 |/ [; ~$ _/ h, o2 ]
这 4 个位用于定义 USART 除数 (USARTDIV) 的小数。当 OVER8 = 1 时,不考虑 DIV_Fraction3位,且必须将该位保持清零$ O" }, }2 R% F: i1 G
控制寄存器 1 (USART_CR1)
640 (7).png
位 31:16 保留,必须保持复位值- n$ k  n+ s; L6 B* o. m2 [5 X
位 15 OVER8:过采样模式 (Oversampling mode)
2 n( m$ K" L. h! ~: K' o0:16 倍过采样' A* m  e, n/ s# D% e$ h% S$ ~
1:8 倍过采样
/ \% P( F- w: D3 A& k' C注意:8 倍过采样在智能卡、 IrDA 和 LIN 模式下不可用:当 SCEN=1、 IREN=1 或 LINEN=1 时,OVER8 由硬件强制清零。8 p/ x5 i/ E# V- [" a
位 14 保留,必须保持复位值! s8 f+ }# y/ B3 w
位 13 UE:USART 使能 (USART enable)5 ]3 o2 q. G/ {7 O& Y
该位清零后, USART 预分频器和输出将停止,并会结束当前字节传输以降低功耗。此位由软& x0 Y; I! ~3 j; D
件置 1 和清零。& ]. T" ~* y% N9 ]8 |
0:禁止 USART 预分频器和输出3 y0 F2 w# q7 n( ^7 i: a
1:使能 USART
4 t( X8 H6 C0 M5 @位 12 M:字长 (Word length)
0 N4 Y: d1 j* }0 x, [: S* U! s该位决定了字长。该位由软件置 1 或清零。/ l0 h& p4 k2 C- g) m% V. O; e, j
0:1 起始位, 8 数据位, n 停止位
# o1 O% F7 S/ ?9 U( D1:1 起始位, 9 数据位, n 停止位! W1 {, D% H3 p# t
注意:在数据传输(发送和接收)期间不得更改 M 位) x$ r- x: E9 _; W
位 11 WAKE:唤醒方法 (Wakeup method)& B: W7 X% d2 F. C9 P+ ?* k/ [
该位决定了 USART 唤醒方法,该位由软件置 1 或清零。
- O7 M4 k! g6 X+ d3 e. Q$ E) b0:空闲线路" l% q% z& _' D' e/ h: {9 c
1:地址标记
/ A2 E) I) ]. O) }+ ^& K位 10 PCE:奇偶校验控制使能 (Parity control enable)0 R* F5 \  J' L& t- r/ W" h. ]
该位选择硬件奇偶校验控制(生成和检测)。使能奇偶校验控制时,计算出的奇偶校验位被插入到 MSB 位置(如果 M=1,则为第 9 位;如果 M=0,则为第 8 位),并对接收到的数据检查奇偶校验位。此位由软件置 1 和清零。一旦该位置 1, PCE 在当前字节的后面处于活动8 X6 V( `( H$ `  {# h( R$ Z
状态(在接收和发送时)。) c$ M3 q+ d1 ^
0:禁止奇偶校验控制- r, X5 F! z6 S$ j+ j' k
1:使能奇偶校验控制
& R- V% N, q' ^0 g; ^* J* g4 s位 9 PS:奇偶校验选择 (Parity selection)6 }4 G9 |  ^, V/ N# d
该位用于在使能奇偶校验生成/检测(PCE 位置 1)时选择奇校验或偶校验。该位由软件置 1 和清零。将在当前字节的后面选择奇偶校验。6 S1 ?; U8 j) T: w# V
0:偶校验. U1 }: n. t! V3 {) P1 q
1:奇校验
4 p( M, V$ U+ s( F0 Q2 H位 8 PEIE:PE 中断使能 (PE interrupt enable)此位由软件置 1 和清零。
, |3 ^' k- U0 m" ]. J0:禁止中断2 H% b% s* j7 {
1:当 USART_SR 寄存器中 PE=1 时,生成 USART 中断
5 i2 o, K$ ?8 d- J% \& \位 7 TXEIE:TXE 中断使能 (TXE interrupt enable)+ L* F) q, ]1 H! O6 d
此位由软件置 1 和清零。8 H1 q' J4 N( t5 A$ R
0:禁止中断
* E! r  H& r9 e/ U/ [* n7 Z1:当 USART_SR 寄存器中 TXE=1 时,生成 USART 中断。4 g0 W+ e5 b& x: b; z2 Z# @5 a
位 6 TCIE:传送完成中断使能 (Transmission complete interrupt enable)7 u8 f2 g# V2 K1 N! e. m
此位由软件置 1 和清零。+ ~  k3 P" o$ L# }) T
0:禁止中断, r3 j# B4 j3 }% ]& c
1:当 USART_SR 寄存器中 TC=1 时,生成 USART 中断) c8 \8 g5 l8 \2 i) e, L
位 5 RXNEIE:RXNE 中断使能 (RXNE interrupt enable)" \! @; T0 E, W* Z# r2 Y% r
此位由软件置 1 和清零。9 u) ?# O' H1 F. G( M
0:禁止中断
7 Q5 u5 A6 W$ @  {1:当 USART_SR 寄存器中 ORE=1 或 RXNE=1 时,生成 USART 中断* D9 x, j6 y  [- f
位 4 IDLEIE:IDLE 中断使能 (IDLE interrupt enable)此位由软件置 1 和清零。
" z( V* _. \0 g6 T0 I# K3 p% G0:禁止中断
# G$ g/ Q8 S1 z) I/ m! m) X1:当 USART_SR 寄存器中 IDLE=1 时,生成 USART 中断
' J; h  ]1 b& `9 [- g  h位 3 TE:发送器使能 (Transmitter enable)该位使能发送器。该位由软件置 1 和清零。
% l  d/ i3 g! |; z& l. E3 G/ f0:禁止发送器
; ]% i: B% M' z: f1:使能发送器
) g9 d9 t, Z$ m" @$ Q: |7 Q4 T- J注意:1:除了在智能卡模式下以外,传送期间 TE 位上的“0”脉冲(“0”后紧跟的是“1”)会在当前字的后面发送一个报头(空闲线路)。$ T+ J0 k$ `; x& U
2:当 TE 置 1 时,在发送开始前存在 1 位的时间延迟。/ |( d& _/ U$ k! A$ w2 M/ {  t
位 2 RE:接收器使能 (Receiver enable)该位使能接收器。该位由软件置 1 和清零。8 X+ S% N3 v; S5 D5 r2 T
0:禁止接收器
. P2 b) |2 G, O. ?. R1:使能接收器并开始搜索起始位
2 {  K. B3 H9 ~6 k, p+ j位 1 RWU:接收器唤醒 (Receiver wakeup)) g+ L) C3 ~* C) h0 v
该位决定 USART 是否处于静音模式。该位由软件置 1 和清零,并可在识别出唤醒序列时由硬件清零。% M8 |3 K3 P' K, ]& ^1 }9 T
0:接收器处于活动模式
. E' [" e8 j  v$ W3 T1:接收器处于静音模式
5 v: U  J- ?6 r! m- B) m) ]注意:1:选择静音模式前(通过将 RWU 位置 1), USART 必须首先接收一个数据字节,否则,当由空闲线路检测到唤醒时,它无法于静音模式下正常工作。, W9 v& n( u7 b( @
2:在地址标记检测唤醒配置(WAKE 位 = 1)中, RXNE 位置 1 时, RWU 位不能由软件进行修改+ e: Q! w, I. b+ u9 c* A2 E/ X
位 0 SBK:发送断路 (Send break). n  M7 P# _+ \* O9 r+ |( W
该位用于发送断路字符。该位可由软件置 1 和清零。该位应由软件置 1,并在断路停止位期间由硬件重置。) D' n$ ~7 x1 H, D: R3 ?, B! [) r
0:不发送断路字符
& ~2 S7 M, V8 F- N6 S0 i" F( d1:将发送断路字符. x6 e6 Z- J& Y8 O
控制寄存器 2 (USART_CR2)7 _3 B" b" p" P! w6 t
640 (6).png
位 31:15 保留,必须保持复位值8 O4 a- u4 K0 H4 H2 c" V6 T3 u, T# C
位 14 LINEN:LIN 模式使能 (LIN mode enable)
此位由软件置 1 和清零。
/ ~, o2 f( o9 ~0 O0:禁止 LIN 模式* @5 O4 }) h+ M& G
1:使能 LIN 模式
' `$ k+ q. ^$ o* q& qLIN 模式可以使用 USART_CR1 寄存器中的 SBK 位发送 LIN 同步断路(13 个低位),并可检测 LIN同步断路。$ F! A2 n; Z7 {# i9 H6 y
位 13:12 STOP:停止位 (STOP bit)6 t$ U. p. O2 C$ I) X
这些位用于编程停止位。" x; z3 u4 Z, O* N. q
00:1 个停止位1 x; s+ o0 k6 @, T4 U+ s% j
01:0.5 个停止位$ ?' b5 i& a& B- Q9 W5 H
10:2 个停止位; P0 i( h! @- X3 v2 Q
11:1.5 个停止位
1 f, D9 }6 Q: A- x# t& w  r& s注意:0.5 个停止位和 1.5 个停止位不适用于 UART4 和 UART5。( i! h& ~' ]* k9 Z3 v& e
位 11 CLKEN:时钟使能 (Clock enable)
' r8 Y0 c; x/ E该位允许用户使能 SCLK 引脚。. c' }6 v+ U% L! j
0:禁止 SCLK 引脚
8 l0 Q' R1 {/ Y7 D6 Y) t1:使能 SCLK 引脚" ]7 U* U" t2 S1 c
该位不适用于 UART4 和 UART5。
- x! v3 E' N3 F8 F9 ~位 10 CPOL:时钟极性 (Clock polarity)
) q( q8 x& F( [$ E. h7 v1 c. F该位允许用户在同步模式下选择 SCLK 引脚上时钟输出的极性。它与 CPHA 位结合使用可获得所需的时钟/数据关系" Z+ d7 V- c; K  h% ]/ w5 V
0:空闲时 SCLK 引脚为低电平。7 x7 d0 f2 J& C$ _! q) ]
1:空闲时 SCLK 引脚为高电平。
+ R" c- Q* _" Z该位不适用于 UART4 和 UART5。) J; M: R+ w0 \7 i
位 9 CPHA:时钟相位: x. g$ n* R% E
该位允许用户在同步模式下选择 SCLK 引脚上时钟输出的相位。它与 CPOL 位结合使用可获得所需的时钟/数据关系
  C# G" s: E% f0 Q  q* ^! J! A% I0:在时钟第一个变化沿捕获数据
6 o7 G7 c8 Z8 O9 v( ~: \# I1:在时钟第二个变化沿捕获数据
7 F& z) ~/ h& ^8 ^注意:该位不适用于 UART4 和 UART5。0 T4 h6 }, h( {7 O3 I6 \8 a
位 8 LBCL:最后一个位时钟脉冲 (Last bit clock pulse)- x! n) a8 W- Q  h  P8 |$ J
该位允许用户在同步模式下选择与发送的最后一个数据位 (MSB) 关联的时钟脉冲是否必须在 SCLK引脚上输出。
7 j0 V0 ?' W/ `% Z0:最后一个数据位的时钟脉冲不在 SCLK 引脚上输出' z) S; f+ c0 B$ `7 A
1:最后一个数据位的时钟脉冲在 SCLK 引脚上输出
9 j: z  s! R5 J1 a% ^2 L2 w2 y. @2 Y注意:1:最后一位为发送的第 8 或第 9 个数据位,具体取决于 USART_CR1 寄存器中 M 位所选择的8 位或 9 位格式。. P5 z5 O6 m9 w1 O" Y: a* B3 H
2:该位不适用于 UART4 和 UART5。
  j, f: X. q1 m; }位 7 保留,必须保持复位值
9 {0 Y/ p3 {8 y, F6 J位 6 LBDIE:LIN 断路检测中断使能 (LIN break detection interrupt enable) 断路中断屏蔽(使用断路分隔符进行断路检测)/ B; R# f' Q. ]: L8 Q5 l! l
0:禁止中断
$ m: P8 P. S, R7 y# T2 G& J1:当 USART_SR 寄存器中 LBD = 1 时,生成中断
& z6 @+ k2 h' U, j7 r位 5 LBDL:lin 断路检测长度 (lin break detection length)7 h  S5 b, e/ @1 M/ ~9 \
该位用于选择 11 位断路检测或 10 位断路检测。
; k3 G# s( ?& Z6 l* C. j( a* A0:10 位断路检测
: d2 O/ U: X( f9 y  l1:11 位断路检测9 E1 x: h/ P5 X; O0 C( G& U; A
位 4 保留,必须保持复位值4 e8 L9 X/ K/ q/ k" v& f
位 3:0 ADD[3:0]:USART 节点的地址,该位域用于指定 USART 节点的地址。将在多处理器通信时于静音模式下使用该位域,以通过地址标记检测进行唤醒。, m6 x' W7 P5 X: `6 Y
注意:使能发送器时不应对这 3 个位(CPOL、 CPHA、 LBCL)进行写操作。
% r/ t% j' v. G# `; w/ v/ l
控制寄存器 3 (USART_CR3)

& a( u" e+ q; Z
640 (5).png

; C% \- \( k' a/ P$ y$ p
位 31:12 保留,必须保持复位值' q' C! K+ n: E1 h7 q
位 11 ONEBIT:一个采样位方法使能 (One sample bit method enable)
# c( A: i) B, ]6 n( ~4 p该位允许用户选择采样方法。选择一个采样位方法后,将禁止噪声检测标志 (NF)。
) p0 A* \- z' H1 R0:三个采样位方法
3 K; c" m1 H' O( C# ]3 `1:一个采样位方法
# C  }3 x7 u. J1 y
位 10 CTSIE:CTS 中断使能 (CTS interrupt enable)
9 T  H% I) D; f0:禁止中断
4 w6 {. q* k$ C0 Q8 t. t& Y& ~% X/ c7 h1:当 USART_SR 寄存器中 CTS = 1 时,生成中断  E1 u) n/ q4 {6 O% \
注意:该位不适用于 UART4 和 UART5。
0 |0 x6 R; U8 K位 9 CTSE:CTS 使能 (CTS enable)8 ^9 E7 C( F# c6 Y$ X! F! N
0:禁止 CTS 硬件流控制# N& y; O" p4 ]. b, p
1:使能 CTS 模式,仅当 nCTS 输入有效 (连接到 0)时才发送数据。如果在发送数据时使
9 c0 E: ~2 J3 |0 ?3 onCTS 输入无效,会在停止之前完成发送。如果使 nCTS 有效时数据已写入数据寄存器,则5 D" M. o6 ?, _6 g8 n2 M* |
将延迟发送,直到 nCTS 有效。
! C  Q. Z6 Y# j8 }8 @% `注意:该位不适用于 UART4 和 UART5。# ~/ Q+ p4 b; a! l9 e2 y8 u- Y7 S
位 8 RTSE:RTS 使能 (RTS enable)+ [& Q( g0 r  ~8 t" P
0:禁止 RTS 硬件流控制0 T. o2 |; t8 l8 n
1:使能 RTS 中断,仅当接收缓冲区中有空间时才会请求数据。发送完当前字符后应停止发9 T0 e" o3 I  W4 R0 @3 R. H8 s! n
送数据。可以接收数据时使 nRTS 输出有效 (连接到 0)。; X' A; N6 \" [$ H
注意:该位不适用于 UART4 和 UART5。7 a8 e5 j6 z& q9 R5 J& b
位 7 DMAT:DMA 使能发送器 (DMA enable transmitter)
; p4 @& M. }" B2 d0 K1 l- f. c该位由软件置 1/ 复位。& e+ x/ o+ H2 F3 J8 T! d9 v+ y- G
1:针对发送使能 DMA 模式。! N  M$ o; I& L* U
0:针对发送禁止 DMA 模式。3 t* x& q. t& L( |
位 6 DMAR:DMA 使能接收器 (DMA enable receiver)
5 t3 |! K; V( U! j$ b  @2 i- \该位由软件置 1/ 复位。9 u$ W4 J0 H* k4 I
1:针对接收使能 DMA 模式' G) {, A" t, u! n+ C
0:针对接收禁止 DMA 模式/ \" s7 S) g" X; O( [
位 5 SCEN:智能卡模式使能 (Smartcard mode enable)# \7 J( w6 K- T' O  i* B0 G1 ?, z
该位用于使能智能卡模式。
# x; v3 \9 ?9 q4 W0 n0:禁止智能卡模式8 w' \& `4 o7 c% ?* Y
1:使能智能卡模式
8 q: t7 N: T" A0 }5 t) C% \( u注意:该位不适用于 UART4 和 UART5。/ O  v2 I1 M# C  o& b3 Y" i
位 4 NACK:智能卡 NACK 使能 (Smartcard NACK enable)
( t( Y" H) A# L! k3 @7 d0:出现奇偶校验错误时禁止 NACK 发送
! o; L. n3 n+ U: A" A1:出现奇偶校验错误时使能 NACK 发送6 W. \" W) W* ?
注意:该位不适用于 UART4 和 UART5。
! Y5 V9 p% H% D/ k5 ?位 3 HDSEL:半双工选择 (Half-duplex selection)- i3 i( N9 c& M7 ]& a0 e% K* ~8 u
选择单线半双工模式! n  m3 L1 h+ u7 i+ j. ^
0:未选择半双工模式
! G, W: }! r3 w4 \1:选择半双工模式2 ?1 W( F( F! O4 L! ]! m0 c
位 2 IRLP:IrDA 低功耗 (IrDA low-power)
. o+ T+ m9 M- v# c该位用于选择正常模式和低功耗 IrDA 模式# F9 d7 W8 F$ R* q" i. h
0:正常模式
1 U( ~+ U1 L* G# f1:低功耗模式
+ k! g0 l% Z* |& {$ l0 g位 1 IREN:IrDA 模式使能 (IrDA mode enable)
: ~( ^! V  B1 x! |此位由软件置 1 和清零。% F  s9 w  J+ V( `
0:禁止 IrDA0 k) S5 E% z, t; j
1:使能 IrDA
" ]. a/ ~: P; N4 F' s  A5 `& T% Z
位 0 EIE:错误中断使能 (Error interrupt enable)$ J6 T' z- _. R6 Q
对于多缓冲区通信(USART_CR3 寄存器中 DMAR = 1),如果发生帧错误、上溢错误或出
" O! V  R6 e$ A6 G/ u8 U' i现噪声标志(USART_SR 寄存器中 FE = 1 或 ORE = 1 或 NF = 1),则需要使用错误中断
/ }! o/ }; l& i; s  P使能位来使能中断生成。
; f. ?+ O! J; g+ e0:禁止中断
; g) O3 O4 _- C; {) k5 h1:当 USART_CR3 寄存器中的 DMAR = 1 并且 USART_SR 寄存器中的 FE = 1 或 ORE = 1或 NF = 1 时,将生成中断。# j5 _1 a4 @5 M9 r! k
保护时间和预分频器寄存器 (USART_GTPR)
640 (4).png
位 31:16 保留,必须保持复位值
; _& _6 o5 u9 _位 15:8 GT[7:0]:保护时间值 (Guard time value)% {- ?0 l, h! G7 j: H% `
该位域提供保护时间值 (以波特时钟数为单位)。
/ o4 s& b  l2 B* {* ^  v8 j* M该位用于智能卡模式。经过此保护时间后,发送完成标志置 1。
7 ]2 a& U& O/ N2 X4 F注意:该位不适用于 UART4 和 UART5。
  ~' c, `. ?4 b- ~6 Q+ B" x9 N( U位 7:0 PSC[7:0]:预分频器值
! c+ M! Z6 q9 q2 G9 q— 在 IrDA 低功耗模式下:/ S0 N9 X& ~7 e1 M0 }0 w2 R
PSC[7:0] = IrDA 低功耗波特率; Y! Q( V. _: R
用于编程预分频器,进行系统时钟分频以获得低功耗频率:4 \7 t! m, O3 }/ J0 J+ ^$ y
使用寄存器中给出的值(8 个有效位)对源时钟进行分频:
7 q9 @& f! O5 k- M/ \' O9 y00000000:保留 - 不编程此值- `# T  n, s2 B; J
源时钟 1 分频4 I$ k; ?+ B2 B( T4 _; [( h8 H
00000010:源时钟 2 分频
...
— 在正常 IrDA 模式下:PSC 必须设置为 00000001。/ b  X3 G! X/ w2 ^7 H; u
— 在智能卡模式下:6 a) z8 x! y: U
PSC[4:0]:预分频器值
+ K8 u- }. P* H% R/ T& z用于编程预分频器,进行系统时钟分频以提供智能卡时钟。
% M" G) K% _, o! R* `! I将寄存器中给出的值(5 个有效位)乘以 2 得出源时钟频率的分频系数:
8 H$ G  `6 k8 f) m* g00000:保留 - 不编程此值
* T, @- e2 g9 Y1 J00001:源时钟 2 分频, ]" p4 d. K6 \  w( f# q, q3 f+ i
00010:源时钟 4 分频, ]: C' G" b( F4 X
00011:源时钟 6 分频
) M( m8 p9 t- P! V1 w...9 I: y( Z& p+ Z
注意:1:如果使用智能卡模式,则位 [7:5] 不起作用。
5 s" r$ c% [: C5 J6 _" G8 c2:该位不适用于 UART4 和 UART5。
3 }0 ^3 S7 m3 R, x

7 k9 a: V1 o# u& I6 ^% d2 h) \! [
串口通信编程的一般步骤:
1.GPIO初始化
--使能GPIO对用的PORT时钟,
--使能复用外设功能的时钟,
--对使用的IO口进行mode ,otype,ospeed,opupd设置,
--设置对应的IO为复用功能,
2.根据波特率和外设时钟,计算波特率,波特率转换为16进制,设置BRR寄存器,
3.配置CR1和CR2,配置字长和停止位,
4.使能发送、接收功能,使能接收中断位,设置中断分组;
5.使能串口,/ g6 m2 a0 Y/ j) w' }% f
6.编写串口发送函数(对单字节和字符串分别处理)
7.编写串口中断服务函数(对串口接收到的数据做分析和处理,提供容错能力,保证接收到错误的数据,不能死机)
1 C# k7 N" u- @# }

5 d. h3 ?- o' Q6 A: i
串口初始化函数
640 (3).png
串口中断服务函数
640 (2).png
串口发送函数
5 u$ Y' \7 C+ E+ y8 z
640 (1).png
接收到的字符串数组设置

+ J/ k4 Z$ |- H( z
640.png

2 P' V" k& z2 h- @! s: E& m
收藏 评论0 发布时间:2022-12-14 13:28

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版