1.串口通讯介绍
通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于 USART 还有一个UART(Universal Asynchronous Receiver and Transmitter),它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。串行通信一般是以帧格式传输数据,即是一帧一帧的传输,每帧包含有起始信号、数据信息、停止信息,可能还有校验信息。USART 就是对这些传输参数有具体规定,当然也不是只有唯一一个参数值,很多参数值都可以自定义设置,只是增强它的兼容性。
2.USART 主要的系统功能解释
1. ①功能引脚:TX:发送数据输出引脚。RX:接收数据输入引脚。同时接一个地。
2. ②数据寄存器:USART 数据寄存器(USART_DR)只有低 9 位有效,并且第 9 位数据是否有效要取决于
USART 控制寄存器 1(USART_CR1)的 M 位设置,当 M 位为 0 时表示 8 位数据字长,当 M位为 1 表示 9 位数据字长,我们一般使用 8 位数据字长。USART_DR 包含了已发送的数据或者接收到的数据。USART_DR 实际是包含了两个寄存器,一个专门用于发送的可写 TDR,一个专门用于接收的可读 RDR。当进行发送操作时往 USART_DR 写入数据会自动存储在 TDR 内;当进行读取操作时,向 USART_DR读取数据会自动提取 RDR 数据。TDR 和 RDR 都是介于系统总线和移位寄存器之间。串行通信是一个位一个位传输的,发送时把 TDR 内容转移到发送移位寄存器,然后把移位寄存器数据每一位发送出去,接收时把接收到的每一位顺序保存在接收移位寄存器内然后才转移到 RDR。
3. ③控制器:
发送器:当 USART_CR1 寄存器的发送使能位 TE 置 1 时,启动数据发送,发送移位寄存器的数据会在 TX 引脚输出,低位在前,高位在后。接收器:如果将 USART_CR1 寄存器的 RE 位置 1,使能 USART 接收,使得接收器在 RX 线开始搜索起始位。在确定到起始位后就根据 RX 线电平状态把数据存放在接收移位寄存器内。
4.USART 初始化结构体详解:
1 typedef struct {
2 uint32_t USART_BaudRate; // 波特率-------一般设置为 2400、9600、19200、115200
3 uint16_t USART_WordLength; // 字长------数据帧字长,可选 8 位或 9 位
4 uint16_t USART_StopBits; // 停止位--------停止位设置,可选 0.5 个、1 个、1.5 个和 2 个停止位,
5 uint16_t USART_Parity; // 校验位
6 uint16_t USART_Mode; // USART 模式 ----USART 模式选择,有 USART_Mode_Rx 和 USART_Mode_Tx
7 uint16_t USART_HardwareFlowControl; // 硬件流控制
8 } USART_InitTypeDef;
5.编程要点;
(1)使能 RX 和 TX 引脚 GPIO 时钟和 USART 时钟;
(2)初始化 GPIO,并将 GPIO 复用到 USART 上;
(3)配置 USART 参数;
(4)配置中断控制器并使能 USART 接收中断;
(5)使能 USART;
(6)在 USART 接收中断服务函数实现数据接收和发送。
6.总结:使用 fput 和 fgetc 函数达到重定向 C 语言标准库输入输出函数必须在 MDK 的工程选项把“Use MicroLIB”勾选上,MicoroLIB 是缺省 C 库的备选库,它对标准 C 库进行了高度优化使代码更少,占用更少资源。
更加具体的例子可以参考我们SDK关于串口发送和接收的例程。 |