复旦微FM33 MCU 底层开发指南——UART

0 前言

本系列基于复旦微FM33LC0系列MCU的DataSheet编写,提供基于寄存器开发指南、应用技巧、注意事项等

本文章及本系列其他文章将持续更新,本系列其它文章请跳转↓↓↓
复旦微FM33 MCU 底层开发指南------总集篇

本文章最后更新日期:2026/04/13


文章目录

  • [0 前言](#0 前言)
  • [1 概述](#1 概述)
  • [2 时钟结构](#2 时钟结构)
    • [2.1 UART0 / UART1](#2.1 UART0 / UART1)
    • [2.2 UART4 / UART5](#2.2 UART4 / UART5)
    • [2.3 注意事项](#2.3 注意事项)
      • [2.3.1 UART工作时钟必须大于波特率的16倍](#2.3.1 UART工作时钟必须大于波特率的16倍)
  • [3 IO端口配置](#3 IO端口配置)
  • [4 波特率发生](#4 波特率发生)
  • [5 帧结构](#5 帧结构)
  • [6 功能描述](#6 功能描述)
    • [6.1 接收超时](#6.1 接收超时)
      • [6.1.1 功能描述](#6.1.1 功能描述)
      • [6.1.2 相关寄存器](#6.1.2 相关寄存器)
    • [6.2 发送延时](#6.2 发送延时)
      • [6.2.1 功能描述](#6.2.1 功能描述)
      • [6.2.2 相关寄存器](#6.2.2 相关寄存器)
    • [6.3 数据发送](#6.3 数据发送)
      • [6.3.1 外设结构](#6.3.1 外设结构)
      • [6.3.2 数据的单次发送](#6.3.2 数据的单次发送)
      • [6.3.3 数据的连续发送](#6.3.3 数据的连续发送)
      • [6.3.4 使用DMA的数据发送](#6.3.4 使用DMA的数据发送)
      • [6.3.5 相关寄存器](#6.3.5 相关寄存器)
    • [6.4 数据接收](#6.4 数据接收)
      • [6.4.1 外设结构](#6.4.1 外设结构)
      • [6.4.2 数据的单次接收](#6.4.2 数据的单次接收)
      • [6.4.3 数据的连续接收](#6.4.3 数据的连续接收)
      • [6.4.4 错误处理](#6.4.4 错误处理)
      • [6.4.5 使用DMA的数据接收](#6.4.5 使用DMA的数据接收)
      • [6.4.6 使用DMA和超时中断实现不定长数组接收](#6.4.6 使用DMA和超时中断实现不定长数组接收)
      • [6.4.7 使用DMA和软件超时判断实现不定长数组接收](#6.4.7 使用DMA和软件超时判断实现不定长数组接收)
      • [6.4.8 相关寄存器](#6.4.8 相关寄存器)
    • [6.5 红外调制](#6.5 红外调制)
      • [6.5.1 功能说明](#6.5.1 功能说明)
      • [6.5.2 寄存器](#6.5.2 寄存器)

1 概述

FM33LC0共有4个UART,分别是UART0、UART1、UART4、UART5。

从上图可以看出,UART4和UART5不支持接收超时功能,这也就意味着其没有接收中断,这在不定长的数据接收应用中会受到一定影响。


2 时钟结构

2.1 UART0 / UART1

UART0、UART1的时钟源可以选择APB1总线时钟,RCMFPSC(分频后的中频RC振荡器)、RCHF(高频RC振荡器)和SYSCLK(系统时钟)。

值得注意的是,UART0/1外设使用了双时钟结构。如果想修改其寄存器,则必须使能APB时钟。UART0/1外设在接收和发送过程中使用的时钟则可以选择其它的时钟来源,但由于寄存器修改的需要,应保证APBCLK时钟也是使能的。

手册对UART0/1外设双时钟结构的相关描述如下图所示:

UART0/1外设总线时钟 的使能在RCC->PCLKCR3寄存器中配置。

UART0/1外设工作时钟 的使能和选择在RCC->OPCCR1寄存器中配置。

2.2 UART4 / UART5

而UART4/5是挂载在APB2总线下的,其时钟来源不可以被修改。

手册对UART4/5时钟结构的描述如下图所示:

UART4/5外设总线时钟 的使能在RCC->PCLKCR3寄存器中。

UART4/5外设工作时钟不需要再额外配置。

2.3 注意事项

2.3.1 UART工作时钟必须大于波特率的16倍

手册的相关描述如下:

这是因为UART外设对输入信号进行了16倍过采样,以提高抗干扰能力。手册描述如下:


3 IO端口配置

FM33LC0 UART外设相关的引脚如下图所示:

UART属于数字外设,因此在使用UART外设时,应合理配置对应的GPIO寄存器。

  1. 配置RCC->PCLKCR1的PAD_PCE寄存器,使能GPIO总线时钟

  2. 配置对应的GPIO->FCR寄存器,使串口引脚为数字功能

  3. 配置对应的GPIO->DFS寄存器,使串口引脚为对应的数字功能

  4. 配置对应的GPIO->ODEN寄存器,关闭对应引脚的开漏使能

  5. 配置对应的GPIO->INEN寄存器,打开RX引脚的输入使能,关闭TX引脚的输入使能

  6. 配置对应的GPIO->PUEN寄存器,根据需求开启对应引脚的上拉使能

通过修改UARTx->CSR控制状态寄存器的IOSWAP位,可以交换TX和RX引脚


4 波特率发生

控制UART波特率的寄存器为UARTx->BGR寄存器

注:SPBGR的有效值为15------65535,当小于15时,SPBGR=15。

波特率的计算公式为: B a u d = F C L K / ( S P B R G + 1 ) { Baud = F_{CLK} / (SPBRG+1)} Baud=FCLK/(SPBRG+1)

其中, F C L K {F_{CLK}} FCLK是UART外设的工作时钟,对于 UART4 和 UART5, F C L K {F_{CLK}} FCLK就是 APBCLK;对于 UART0 和 UART1, F C L K {F_{CLK}} FCLK可以是独立于 APBCLK 的工作时钟。

常用系统时钟下,UART不同波特率对应的(SPBRG+1)值如下表所示:


5 帧结构

起始位:固定1bit

数据位:6-9bit

校验位:0-1bit

停止位:1-2bit,仅对发送帧格式有效

结束位、数据位和校验位的配置在UARTx->CSR控制状态寄存器中配置。

UARTx->CSR控制状态寄存器也可以配置大小端、收发数据的极性。


6 功能描述

6.1 接收超时

6.1.1 功能描述

接收超时功能的一种应用场景,就是接收不定长的串口数据。

在这种应用场景下,接收超时可以搭配接收中断或DMA一起使用。

6.1.2 相关寄存器

UARTx->CSR 控制状态寄存器

UARTx->IER 中断使能寄存器

UARTx->ISR 中断标志寄存器

UARTx->TODR 超时和延迟寄存器


6.2 发送延时

6.2.1 功能描述

6.2.2 相关寄存器

UARTx->TODR 超时和延迟寄存器


6.3 数据发送

6.3.1 外设结构

在UART的结构框图中,可以看到两个和发送相关的框图:发送缓冲区和发送移位寄存器,这里需要重点说明一下。

在发送一次发送的过程中:

  1. 总线向发送缓冲区TXBUF写入数据
  2. 发送缓冲区将数据写入到发送移位寄存器中,发送缓冲区被清空
  3. 发送移位寄存器将数据发到TX端口

这也就意味着,当发送缓冲区清空之后,数据在移位寄存器中,并没有完成发送。

所以UART提供了两种中断标志,只有当TXSE置位的时候,才代表TXBUF的所有数据完成了发送。而如果没有等待TXSE置位就关掉了串口,则TXBUF的数据可能没有被正确的发送。

通过手册提供的时序图可以更清晰的帮助理解。在这个例子中,软件首先写入了TXBUF,然后置位了发送使能命令;等待波特率时钟的第一个上升沿后,TXBUF的内容全部进入到移位寄存器中,并置位TXBE标志;此时移位寄存器开始发送数据到TX引脚;当移位寄存器完成所有bit的发送后,TXSE置位。

6.3.2 数据的单次发送

针对上述的时序图,推荐的操作步骤如下:

也可以先置位TXEN,再写入TXBUF,时序图如下:

6.3.3 数据的连续发送

如果想要连续的发送数据,就需要在移位寄存器发送完成之前,再向TXBUF中写入新的数据。下面这个例子展示了在TXBE标志置位的时候向TXBUF写入新的数据,可以实现连续的数据发送。

在第一次写入TXBUF时,由于移位寄存器是空的,所以在第一个波特率时钟上升沿时,TXBUF的数据就会写入移位寄存器,并触发TXBE标志;在TXBE置位时向TXBUF写入新的数据,TXBUF的数据会阻塞,直到移位寄存器的数据完成发送。

6.3.4 使用DMA的数据发送

  • 配置对应的DMA通道,选择为相应的UARTx_TX通道
  • 配置DMA->CHxMAD寄存器,指定缓冲区指针
  • 配置DMA->CHxCR寄存器,指定地址递增递减、通道优先级、传输长度、传输带宽、中断等
  • 配置对应的DMA通道使能
  • 配置UART模块参数,如波特率、数据位等
  • 根据需求,配置UART->CSR寄存器,使能DMA发送结束中断
  • 配置UART发送使能
  • 如果使能了DMA发送结束中断,则在发送完成后进入UART中断

6.3.5 相关寄存器

UARTx->CSR 控制状态寄存器

UARTx->IER 中断使能寄存器

UARTx->ISR 中断标志寄存器

UARTx->TXBUF 发送缓冲寄存器


6.4 数据接收

6.4.1 外设结构

和发送的结构一样,接收也有接收移位寄存器和接收缓冲区的结构。

不同的是,其只有接收缓冲区满标志,而没有移位寄存器空的标志。手册没有写,笔者认为原因是:

  • 在发送过程中,软件向TXBUF写入,在TXBUF的数据转移到移位寄存器后,就会置位 发送缓冲区空 标志,使能中断的话就会进入中断服务函数。此时移位寄存器正在发出数据,如果此时软件认为已经发送完成而关闭了UART外设,就会导致数据无法发出,因此必须有 发送移位寄存器空 的标志,来表明数据确实已经发送完成。
  • 在接收过程中,软件从RXBUF读取数据,在移位寄存器接收到数据后,就会自动向RXBUF写入。因此只要移位寄存器里面有数据,且帧格式正确,那么其一定会向RXBUF写入,并触发 接收缓冲区满 标志,使能中断的话就会进入中断服务函数。因此不需要特别设置 接收移位寄存器空 的标志。

6.4.2 数据的单次接收

6.4.3 数据的连续接收

6.4.4 错误处理

在UARTx->ISR 中断标志寄存器中,指出了UART外设可以检测到的三种错误

  • 接收溢出错误:当接收缓冲区已满,且程序没有读出时,RSR 接收到一帧数据后仍会将其写入接收缓冲区,并覆盖缓冲区中原有数据,此时将触发接收溢出错误。
  • 帧格式错误:接收过程中,如果没有检测到正确的停止位,则发生帧格式错误。
  • 奇偶校验错误:接收过程中,如果奇偶校验错误,则发生奇偶校验错误。

6.4.5 使用DMA的数据接收

6.4.6 使用DMA和超时中断实现不定长数组接收

6.4.7 使用DMA和软件超时判断实现不定长数组接收

对于UART4/5而言,其没有接收超时中断。如果想使其具备类似的功能,可以使用一定的软件手段来模拟超时中断。

6.4.8 相关寄存器

UARTx->CSR 控制状态寄存器

UARTx->IER 中断使能寄存器

UARTx->ISR 中断标志寄存器

UARTx->RXBUF 接收缓冲寄存器


6.5 红外调制

6.5.1 功能说明

红外调制功能可以调整的有3个参数:

  • 输出极性
  • 占空比
  • 调制频率

6.5.2 寄存器

UARTx->IRCR 红外调制配置寄存器

相关推荐
ting_zh3 小时前
基于 STM32F407 Discovery 向 W25Q16 SPI Flash 烧录固件
stm32·spi flash
白掰虾3 小时前
STM32CubeMX2教程——STM32C5 UART
stm32·单片机·嵌入式硬件·mcu·usart·stm32cubemx2·stm32c542
清风6666663 小时前
基于单片机的无线遥控车库门控制
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
我不是程序猿儿4 小时前
【嵌入式】面向 STM32 的 ADC 与 DMA 学习路线
linux·stm32·单片机·嵌入式硬件·学习
一支闲人4 小时前
研究STM32库函数 如何操作寄存器
stm32·单片机
rit84324995 小时前
基于STM32的触控USB鼠标设计
stm32·嵌入式硬件·计算机外设
天狼IoT5 小时前
STM32-keil+CubeMX快速开发:GPIO功能
stm32·单片机·嵌入式硬件
芯岭技术5 小时前
PY32C673单片机特性,应用场景介绍,最高主频可达 72 MHz
单片机·嵌入式硬件
ytttr8735 小时前
STM32 独立看门狗(IWDG)程序设计与实现
stm32·单片机·嵌入式硬件