USART发送与接收

发送

在这里插入图片描述

  • TX:发生引脚,发生的数据会从 USART_DR 寄存器移位到发送移位寄存器,发送移位寄存器会将数据一位一位的通过 TX 引脚发送出去。
  • TXE:看后文。
  • USART_DR:发送数据寄存器,软件将数据写入该寄存器,从而发送出去。
  • TC:发送完成标志位。如果发送一个帧,并且没有新的数据(帧)写入 USART_DR 寄存器(等价于没有清零 TXE 标志位),当该帧发送结束就会设置 TC 标志位。可以产生相关的 TC 中断。

TXE

在这里插入图片描述
在发送数据时,我们将32位的数据写到 USART_TDR 寄存器中,如果没有启动 TxFIFO 那么该数据就会被移动到 TX Shift Reg 发送移位寄存器上,然后一位一位的发送出去。

如果我们启动了 TxFIFO,那么该数据就会从 USART_TDR 被缓存到 TxFIFO 里,然后我们就可以接着往 USART_TDR 寄存器中写入数据,而不用担心覆盖 USART_TDR 中的数据。

至于 TXE 标志位在这两种情况下有不同的表意:

  • 当没有启动 FIFO :

    • 表明数据已经从 USART_TDR 移动到了 TX Shift Reg 寄存器。
    • USART_TDR 寄存器此时是空的,即可以往 USART_TDR 写入数据。
    • 此时写入 USART_TDR 寄存器不会覆盖先前在 USART_TDR 中的数据。

    我们可以通过设置控制寄存器中的 TXEIE 位,使得 TXE 被设置时,产生中断。

  • 当启动 FIFO :

    • TxFIFO 此时还没有满。

      只要 TxFIFO 没有满,此标志位就会一直被设置为1,即使我们往 USART_TDR 写入了数据,最后该数据填充进了 TxFIFO。只要 TxFIFO 最终没有满,TXE 就会被设置为1。

    • USART_TDR 寄存器此时是空的,即可以往 USART_TDR 写入数据。

    • 此时写入 USART_TDR 寄存器不会覆盖先前在 USART_TDR 中的数据。

    此时我们可以使用 TXFNF 这个中断(当 FIFO 没有满时触发)来代替前面 TXE 中断,通过设置 TXFNFIE 位来设置。

接收

Start bit 检测

在这里插入图片描述

读数据

在这里插入图片描述
接收数据分为三种情况:

  • 情况一:没有开启 RxFIFO

    • 通过设置控制寄存器中的 RXNE 位,来设置将 RX Shift Reg 接收的数据移动到 USART_RDR 寄存器里。
    • 可以通过设置 RXNEIE 位,来使能 RXNE 中断,指示 USART_RDR 中有新的数据到来。
  • 情况二:开启 RxFIFO

    • RXFNE 位用于表明 RxFIFO 不为空。此时我们读取 USART_RDR 寄存器,读取的数据为最先存入 RxFIFO 中的数据,即可严格按照先进先出。
    • 可以设置 RXFNEIE 位来产生 RXFNE 中断,用于表示 RxFIFO 中有新的数据。
  • 情况三:启动了多缓存通讯模式

    • 如果禁止 FIFO。每次接收到数据后 RXNE 会被置位,DMA 会读取 USART_RDR 中的值,然后自动清除 RXNE 位。
    • 如果启动 FIFO。当 RxFIFO 中有数据时 RXFNE 会被置位,这时会触发 DMA 请求,DMA 会从 RxFIFO 中获取数据,直到 RxFIFO 为空。
  • 情况四:单一缓存模式

    • 如果禁止 FIFO。当读取了 USART_RDR 寄存器后,RXNE 会被清除。可以通过写 USART_RQR 寄存器中的 RXFRQ 位来清除 USART_RDR 中的数据,进而清除 RXNE 标志位。

      The RXNE flag must be cleared before the end of the reception of the next character to avoid an overrun error.

    • 如果启动 FIFO。只要 RxFIFO 不为空 RXFNE 就会被置位,读取 USART_RDR 寄存器,会读取最先存入 RxFIFO 中的数据。但 RxFIFO 为空会清除 RXFNE 标志位。可以通过置位 USART_RQR 寄存器的 RXFRQ 位来清空 RxFIFO 内的数据,进而清除 RXFNE 标志位。

      When the RXFIFO is full, the first entry in the RXFIFO must be read before the end of the reception of the next character, to avoid an overrun error.

      如果要读取数据块,可以设置 RxFIFO threshold,当 RxFIFO 中累积接收的数据达到 threshold 值时,可以触发一个 RxFNE 中断。

超出错误(Overrun error)

  • 情况一:没有启动 FIFO

    当 USART_RDR 寄存器中的数据还未被读取(RXNE 未被置位),而此时又有新的数据到达 RX Shift Reg 寄存器,导致 RX Shift Reg 寄存器中的数据无法转移到 USART_RDR 寄存器就会发送 Overrun error。当发送 Overrun error 后:

    • ORE 位会被设置;
    • USART_RDR 寄存器的内容不会丢失,之前的数据仍然有效,可以从 USART_RDR 寄存器中读取;
    • RX Shift Reg 寄存器中的数据将会被覆盖;
    • 将会产生中断,如果设置了 RXNEIE 或者 EIE;
  • 情况二:启动了 FIFO

    这时 Overrun error 会发送在 RX Shift Reg 寄存器有新的数据到来,而 RxFIFO 已经满了。当发送 Overrun error 后:

    • ORE 位会被设置;
    • RxFIFO 中的数据将不会丢失,之前的数据仍然有效,可以从 USART_RDR 寄存器中读取;
    • RX Shift Reg 寄存器中的数据将会被覆盖;
    • 将会产生中断,如果设置了 RXFNEIE 或者 EIE;

    可以通过 USART_ICR 寄存器重置 ORE 。

注意:一旦 ORE 位被设置,则说明至少有一个数据丢失了

如果没有设置 FIFO,有以下两种情况可能会出现 ORE 被设置:

  • RXNE = 1,然后最后一个有效数据存储在 RDR 寄存器。后续的数据发送了 Overrun error。
  • RXNE = 0,这种情况发送在当我们读取 RDR 寄存器的同时有一个新数据达到 RX Shift Reg 寄存器。

采样

采样时钟

USART 的原始时钟来自于 usart_ker_ck 时钟源,该时钟源的来源可以参考下图:
在这里插入图片描述
usart_ker_ck 时钟还可以进一步分频,通过设置 USARTx_PRESC[3:0] 来实现:
在这里插入图片描述
寄存器 USARTx_BBR 记录了 USART 的波特率
在这里插入图片描述

采样模式

STM32H7 系列支持 2 种采样模式,可以通过设置 USART_CR1 寄存器中的 OVER8 位来设置,当其为1时,会采样一个比特会8次,否则采样16次。详细如下:
在这里插入图片描述
采样8次和采样16次影响的是通讯的速率:

  • 采样8次,最大的接收速率为 u s a r t _ k e r _ c k _ p r e s / 8 usart\_ker\_ck\_pres/8 usart_ker_ck_pres/8
  • 采样16次,最大的接收速率为 u s a r t _ k e r _ c k _ p r e s / 16 usart\_ker\_ck\_pres/16 usart_ker_ck_pres/16

采样数据

USART_CR3 寄存器的 ONEBIT 位用于评估逻辑水平,有两种评估方式可选:

  • 在中间的比特中选3个主要的采样结果,当这三者不同时,设置 NE bit;
  • 单一采样:
    • 选择3个采样结果,如果三者不同则拒绝该数据,同于 noise 环境中;
    • 选择单一采样结果,在这种情况下不会设置 NE 位。

当在一个帧中有 noise 后:

  • 当设置 RXNE 或 RXFNE 位时,NE 位会被设置;(Noise detection)
  • 无效的数据会从 Rx Shift Reg 寄存器转移到 USART_RDR 寄存器;
  • single byte communication 模式不会触发中断,因为在该模式下可以设置触发 RXNE 或者 RXFNE 中断。在 multibuffer communication 模式下,也就是使用 DMA,这时如果设置 USART_CR3 寄存器的 EIE 位(Error Interrupt enable)就会触发中断。

例子:
在这里插入图片描述

波特率产生

波特率:表示单位时间内传送的码元符号的个数,它是对符号传输速率的一种度量,它用单位时间内载波调制状态改变的次数来表示,波特率,即指一个单位时间内传输符号的个数。

公式1:标准 USART 模式波特率 (SPI mode included) (OVER8 = ‘0’ or ‘1’)

In case of oversampling by 16, the baud rate is given by the following formula:

T x / R x b a u d = u s a r t _ k e r _ c k p r e s U S A R T D I V Tx/Rx baud = \frac{usart\_ker\_ckpres}{USARTDIV} Tx/Rxbaud=USARTDIVusart_ker_ckpres

In case of oversampling by 8, the baud rate is given by the following formula:

T x / R x b a u d = 2 ∗ u s a r t _ k e r _ c k p r e s U S A R T D I V Tx/Rx baud = \frac{2 * usart\_ker\_ckpres}{USARTDIV} Tx/Rxbaud=USARTDIV2usart_ker_ckpres

公式2:Smartcard, LIN 和 IrDA 模式(OVER8 = 0)

The baud rate is given by the following formula:

T x / R x b a u d = u s a r t _ k e r _ c k p r e s U S A R T D I V Tx/Rx baud = \frac{usart\_ker\_ckpres}{USARTDIV} Tx/Rxbaud=USARTDIVusart_ker_ckpres

详细参考:《STM32HT750BX 参考手册》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值