嵌入式——USART(2)补充

目录

一、串口——物理层(RS-232标准为例)

1.串口通信结构

2.电平标准

3.计算机与调制调解器的信号线连接

二、串口——协议层

1.介绍

2.串口数据包的组成

(1)波特率

(2) 通信的起始和停止信号

(3) 有效数据

(4) 数据校验

三、USART简介(通用同步异步收发器)

四、USART功能剖析

1.功能引脚

2.数据寄存器

3. 控制器

(1)发送器

(2)接收器

4.波特率生成

5.校验控制

6.中断控制


一、串口——物理层(RS-232标准为例)

1.串口通信结构

        两个通信设备的“DB9接口〞之间通过串口信号线建立起连接,串口信号线中使用“RS-232标准”传输数据信号。由于RS-232电平标准的信号不能被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“TTL标准”的电平信号,才能实现通信。

2.电平标准

        常见的电子电路中常使用TTL的电平标准,理想状态下,使用5V表示二进制逻辑1,使用0V表示逻辑0

        而为了增加串口通信的远距离传输及抗干扰能力,RS-232使用-15V表示逻辑1+15V表示逻辑0

3.计算机与调制调解器的信号线连接

二、串口——协议层

1.介绍

        串口通信的数据包由发送设备通过自身的TXD接口传输到接收设备的RXD接口。在串口通信的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通信双方的数据包格式要约定一致才能正常收发数据。

2.串口数据包的组成

(1)波特率

        异步通信中由于没有时钟信号 (如前面讲解的DB9接口中是没有时钟信号的),所以两个通信设备之间需要约定好波特率,即每个码元的长度以便对信号进行解码,图中用虚线分开的每一格就代表一个码元

(2) 通信的起始和停止信号

        串口通信的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑0的数据位表示,而数据包的停止信号可由0.5、1、1.5或2个逻辑1的数据位表示,只要双方约定一致即可。

(3) 有效数据

        在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据。有效数据的长度常被约定为5、6、7或8位长。

(4) 数据校验

        在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验、偶校验、0校验、1校验以及无校验。

三、USART简介(通用同步异步收发器)

        USART是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。还有一个UART,它是在USART基础上裁剪掉了同步通信功能, 只有异步通信。简单区分同步和异步就是看通信时需要不需要对外提供时钟输出平时用的串口通信基本上都是UART

        串行通信一般是以帧格式传输数据,即一帧一帧地传输,每帧包含有起始信号、数据信息、停止信息,可能还有校验信息。USART就是对这些传输参数有具体规定,但参数值也不唯,很多都可以自定义设置,只是增强它的兼容性。

四、USART功能剖析

1.功能引脚

(1)TX:发送数据输出引脚。

(2)RX:接收数据输入引脚。

(3)SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。

(4)nRTS:请求以发送 ,n表示低电平有效。如果使能RTS流控制,当USART接收器准备好接收新数据时,就会将nRTS变成低电平;当接收寄存器已满时,nRTS将被设置为高电平。该引脚只适用于硬件流控制

(5)nCTS:清除以发送 ,n表示低电平有效。如果使能CTS流控制,发送器在发送下一帧数据之前会检测nCTS引脚,如果为低电平,表示可以发送数据;如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制

(6)SCLK:发送器时钟输出引脚。仅适用于同步模式

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有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等。使用USART之前需要向USART_CR1寄存器的UE位置1使能USART,UE位用来开启供给串口的时钟。发送或者接收数据字长可选8位或9位,由USART_CR1的M位控制。

(1)发送器

        一个字符帧发送需要3个部分:起始位、数据帧、停止位。起始位是一个位周期的低电平,位周期就是每一位占用的时间;数据帧就是要发送的8位或9位数据,数据是从最低位开始传输的;停止位是一定时间周期的高电平。

        停止位时间长短 是可以通过USART控制寄存器2(USART_CR2)的STOP[1:0]位控制,可选0.5个、1个、1.5个和2个停止位。默认使用1个停止位。2个停止位适用于正常USART模式、单线模式和调制解调器模式。0.5个和1.5个停止位用于智能卡模式

        当USART_CR1寄存器的发送使能位TE置1时,启动数据发送,发送移位寄存器的数据会在TX引脚输出,低位在前,高位在后。发送器开始会先发送一个空闲帧(一个数据帧长度的高电平),接下来就可以往USART_DR寄存器写入要发送的数据。在写入最后一个数据后,需要等待USART状态寄存器(USART_SR) 的TC位为1,表示数据传输完成。如果USART_CR1寄存器的TCIE位置1,将产生中断

重点标识位:

        ①TE:发送使能。

        ②TXE:发送寄存器为空,发送单个字节的时候使用。

        ③TC:发送完成,发送多个字节数据的时候使用。

        ④TXIE:发送完成中断使能。

(2)接收器

如果将USART_CR1寄存器的RE位置1,使能USART接收,使得接收器在RX线开始搜索起始位。在确定起始位后,就根据RX线电平状态把数据存放在接收移位寄存器内。接收完成后就把接收移位寄存器数据移到RDR内,并把USART_SR寄存器的RXNE位置1。如果USART_CR2寄存器的RXNEIE置1的话可以产生中断

重点标识位:

        ①RE:接收使能。

        ②RXNE:读数据寄存器非空。

        ③RXNEIE:发送完成中断使能。

4.波特率生成

        其中,fPLCK为USART时钟,USARTDIV是一个存放在波特率寄存器(USART_BRR) 中的无符号定点数DIV_Mantissa[11:0]位定义USARTDIV的整数部分,DIV_Fraction[3:0]位定义USARTDIV的小数部分。

选取USART1作为实例,即fPLCK=72MHz,得到115200bps的波特率

        为得到115200bps的波特率,解得USARTDIV=39.0625

        可算得DIV_Fraction = 0.0625 x 16 = 1 = 0x01,DIV_Mantissa = 39 = 0x17

        即USART_BRR的值为0x171

5.校验控制

        STM32F103系列控制器USART支持奇偶校验。当使用校验位时,串口传输的长度将在8位的数据帧加上1位的校验位,总共9位每个字符帧的格式将变成:起始位+数据帧+校验位+停止位,此时USART_CR1寄存器的M位需要设置为1,即9数据位。

        将USART_CR1寄存器的PCE位置1就可以启动奇偶校验控制奇偶校验由硬件自动完成。启动了奇偶校验控制之后,在发送数据帧时会自动添加校验位,接收数据时自动验证校验位。接收数据时如果出现奇偶校验位验证失败,会将USART_SR寄存器的PE位置1,并可以产生奇偶校验中断

6.中断控制


可以结合之前的文章理解

嵌入式入门——串口(1)笔记:

http://t.csdnimg.cn/WhVV2icon-default.png?t=N7T8http://t.csdnimg.cn/WhVV2嵌入式入门——串口(2)USART:

http://t.csdnimg.cn/bX4sbicon-default.png?t=N7T8http://t.csdnimg.cn/bX4sb

### 隐式声明警告的原因与解决方案 在嵌入式开发中,当编译器报告 `Warning Pe223` 或类似的隐式声明警告时,通常是因为函数未被正确定义或声明。具体到此问题中的 `usart_Init` 函数,以下是可能原因及其对应的解决方法。 #### 原因分析 1. **头文件缺失** 如果 `.h` 文件中缺少对 `usart_Init` 的声明,则编译器无法识别该函数的存在,从而触发隐式声明警告[^1]。 2. **头文件未正确包含** 即使存在相应的 `.h` 文件,如果它未被当前源文件(如 `main.c`)所包含,也会导致同样的问题[^2]。 3. **宏定义未启用** 若某些功能依赖特定的宏定义(例如 `USE_STDPERIPH_DRIVER`),而这些宏未被激活,则可能导致相关函数不可见[^3]。 4. **函数原型不匹配** 当前版本的 C 编译标准严格要求函数签名的一致性。即使只是返回类型不同或者参数列表有差异,也可能引发此类错误[^5]。 #### 解决方案 针对上述每种情况,可以采取以下措施: ##### 方法一:确认并补充必要的头文件 确保所有涉及 USART 初始化逻辑的相关头文件均已被引入至项目的主要实现单元之中。例如: ```c #include "usart.h" ``` ##### 方法二:验证预处理器指令配置 检查是否遗漏了任何重要的全局开关设定。对于基于 Standard Peripheral Library (SPL) 构建的应用而言,务必保证如下语句位于适当位置: ```makefile #define USE_STDPERIPH_DRIVER ``` 通过 MDK 工具链调整工程属性亦可达成相同效果——即导航至目标节点下的 *Options for Target* -> *C/C++* 页面,在 Defined 字段追加该项。 ##### 方法三:修正外部接口描述 重新审视实际调用处以及对应模块内部的具体定义形式之间是否存在偏差。必要时显式指定其行为特征,比如改为接受固定数量实参的形式而非变长序列处理方式;又或者是更改默认预期结果的数据类别等等: ```c // 修改后的函数声明示例 extern void usart_Init(uint32_t baudrate); ``` 最后一步操作完成后记得同步更新关联文档资料以便后续维护人员理解改动意图。 --- ### 示例代码片段 假设最终决定采用第三条路径来消除告警现象,那么完整的修复过程大致如下所示: ```c #ifndef __USART_H__ #define __USART_H__ /* Other declarations */ /** * @brief Initializes the specified USART peripheral. */ void usart_Init(void); #endif /* __USART_H__ */ // Within some other file like main.c or another source unit where usage occurs: #include "usart.h" int main(){ ... usart_Init(); ... } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值