文章目录
1. 串口通讯协议简介
串口通讯是一种设备间非常常用的串行通讯方式,因为它简单 便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通 讯方式输出调试信息。
在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和 片上外设;STM32 标准库则是在寄存器与用户代码之间的软件层。对于通讯协议,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有 机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑, 统一收发双方的数据打包、解包标准。
1.1 物理层(RS-232 标准)
RS-232 标准主要规定了信号的用途、通讯接口以及信号的电平标准。
使用 RS-232 标准的串口设备间常见的通讯结构见下图。
在上面的通讯方式中,两个通讯设备的“DB9 接口”之间通过串口信号线建立起连接, 串口信号线中使用“RS-232标准”传输数据信号。由于 RS-232电平标准的信号不能直接被 控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的 “TTL 标准”的电平信号,才能实现通讯
1.1.1 RS_232电平与TTL电平的区别
通讯标准 | 电平标准(发送端) |
---|---|
5V TTL | 逻辑 1:2.4V-5V |
逻辑 0:0~0.5V | |
RS-232 | 逻辑 1:-15V~-3V |
逻辑 0:+3V~+15V |
使用 RS232 与 TTL 电平校准表示同一个信号时的对比见下图。
1.1.2 USB/TTL转232"模块(以CH340芯片模块为例)的工作原理
1. 模块特点
CH340C USB转TTL模块以CH340C芯片为核心,内部自带晶振,最高波特率可达2Mbps,软件兼容CH341驱动,过流保护,引出相应的通讯接口与电源接口,通讯接口带有指示灯指示工作状态,通讯稳定,体积小。
- 全速USB驱动,兼容USB2.0
- 硬件全双工串口,内置收发缓冲区
- 支持波特率50bps~2Mbps
- 输出TTL电平3.3V,兼容5V的IO电平
2. 模块接口引脚
符号 | 类型 | 描述 |
---|---|---|
TXD | 输出 | 串行数据输出口 |
RXD | 输入串行数据 | 输入口 |
GND | 电源 | 接地引脚 |
3V3 | 电源 | 3.3V电源输出引脚(最高250mA) |
5V | 电源 | 5V电源输出引脚(最高500mA) |
DTS | 输出 | MODEM联络输出信号,请求发送 |
DTR | 输出 | MODEM联络输出信号,数据终端就绪 |
3. 硬件设计
硬件电路设计主要介绍以CH340C芯片为核心,设计出一个USB转TTL的模块(也就是该模块)。主要包括电源的设计、功能的设计等。
模块原理图
模块的USB转TTL电路设计
CH340C芯片的D-,D+与USB的D-,D+连接到一起作为USB电平的信号连接,同时引出TTL电平信号的接口TXD与RXD,还有两个MODEM输出信号接口RTS与DTR。
模块的电源设计
在CH340C的引脚功能表中红色部分是电源相关的引脚。对于不同电压供电系统的TTL电平是不一样的,大部分的系统是5V或3.3V供电。一般5V的系统是兼容3.3V的TTL电平的,但是3.3V系统是不兼容5V的。为了是能兼容3.3V与5V的系统,模块的电源使用3.3V电源供电。
电脑的USB接口电源输出时5V,最大电流是500mA,在电路中为了防止意外的误操作,在5V的电源端加了一个0.5A,6V的保险丝F1,当电压超过6V或电流超过0.5A保险丝就会断开对电路进行保护。
USB输出的电压是5V,而CH340C的芯片采用3.3V供电,为了使模块的供电为3.3V,在电路中加入了一个LDO(低压差线性稳压器)U2,它可以把5V稳压成3.3V,然后对CH340C进行供电(根据手册要求V3引脚也要接3.3V的电源)。每一个电源的输入端都会加上一个0.1uF的滤波电容。
在模块引出的接口中:
- 5V:USB的电源输出,电压为5V,电流最大可达500mA
- 3V3:5V经过LDO稳压后得到的3.3V电压,电流最大可达25mA
- GND:USB的GND
模块的指示灯电路设计
为了检测模块是否通电正常,在5V的输入端设计了一个指示灯LED1(红色),该灯亮表示模块已经上电。通讯时需要了解数据的收发情况,在TXD,RXD数据接口中分别接入了LED2(蓝色),LED3(绿色)指示灯。当模块接收到数据时,RXD的指示灯就会亮;模块发送数据时TXD的指示灯就会亮。另外引出的RTS与DTR信号接口也设计了LED4(黄色),LED5(绿色)指示灯。
因为TXD,RXD,RTS,DTR接口都是从CH340C芯片管脚印出来的,CH340C是3.3V供电,所以设计对应的指示灯的电源应该选择3.3V。TXD与RXD在CH340C中空闲时(没有发生数据传输)是高电平的,对应的指示灯状态时灭的,只有发生数据传输时指示灯才会亮。RTS与DTR接口时CH340C的MODEM输出信号接口,对应的指示灯在用不同的上位机软件它们的亮灭是不确定的。
1.2 协议层
串口通讯的数据包由发送设备通过自身的 TXD 接口传输到接收设备的 RXD 接口。在 串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位 组成,通讯双方的数据包格式要约定一致才能正常收发数据,其组成见下图。
1.2.1 波特率
指的是每秒传输的位数。波特率越高,数据传输速度越快。两个通讯设备之间需要约定好波特率,即每个码元的长度, 以便对信号进行解码,用虚线分开的每一格就是代表一个码元。常见的波特率为 4800、9600、115200 等。
1.2.2 通讯的起始和停止信号
串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一 个逻辑0的数据位表示,而数据包的停止信号可由0.5、1、1.5或2个逻辑1的数据位表示, 只要双方约定一致即可。
1.2.3 有效数据
在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效 数据的长度常被约定为 5、6、7 或 8 位长。
1.2.4 数据校验
在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰 导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验 (odd)、偶校验(even)、0 校验(space)、1 校验(mark)以及无校验(noparity)。
2.1 标准库方式点亮LED灯
其他驱动文件的添加请参考文章结尾的资料链接
代码块
#include "stm32f10x.h"
void Delay(__IO u32 nCount)
{
for(;nCount !=0;nCount--);
}
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启A口的时钟
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //用的GPIO C的13号引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
while(1)
{
//以下可以自己定义
GPIO_Write(GPIOA, ~0x0001);
Delay(720000);
GPIO_Write(GPIOA, ~0x0002);
Delay(720000);
GPIO_Write(GPIOA, ~0x0004);
Delay(720000);
}
}
实验结果:
波形分析:
通过波形可知,与LED灯的亮灯次序一致。
总结
学习到了用除寄存器以外的标准库来点亮LED灯,总体来说标准库相对简单一些。
总结
学习到了用除寄存器以外的标准库来点亮LED灯,总体来说标准库相对简单一些。
参考资料
https://blog.csdn.net/qq_58804208/article/details/127457311
https://blog.csdn.net/weixin_63019977/article/details/133749827