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寄存器。
-
配置RCC->PCLKCR1的PAD_PCE寄存器,使能GPIO总线时钟

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

-
配置对应的GPIO->ODEN寄存器,关闭对应引脚的开漏使能
-
配置对应的GPIO->INEN寄存器,打开RX引脚的输入使能,关闭TX引脚的输入使能
-
配置对应的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的结构框图中,可以看到两个和发送相关的框图:发送缓冲区和发送移位寄存器,这里需要重点说明一下。


在发送一次发送的过程中:
- 总线向发送缓冲区TXBUF写入数据
- 发送缓冲区将数据写入到发送移位寄存器中,发送缓冲区被清空
- 发送移位寄存器将数据发到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 红外调制配置寄存器
