一. 了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。
二. 安装 stm32CubeMX,配合Keil,使用HAL库(或标准库)方式,设置USART1 波特率为115200,1位停止位,无校验位,完成下列任务:
1)STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。
2)在完成以上任务基础,继续扩展功能:当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello windows!”;发送一个字符“*”后,stm32继续发送。
三. 在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察串口输出波形,并分析时序状态正确与否,计算波特率实际为多少。
文章目录
一、串口通信基本知识
了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。
1.串口协议
串口通信协议就是 串口通讯时共同遵循的协议,其定义了双方遵循的协议 数据帧格式 和其 传输方式。通讯协议分为 物理层和协议层。
- 物理层:
规定通讯系统中具有 机械、电子功能部分的特性 ,确保原始数据在 物理媒体 的传输(通俗一点就是硬件部分)。 - 协议层:
主要规定 通讯逻辑,统一收发双方的数据打包、解包标准(软件)。协议的内容是 每一个bit 所代表的意义 。
串口通信协议 规定了数据包的内容,内容包含了 起始位、主体数据、校验位及停止位 ,双方需要 约定一致的数据包格式 才能正常收发数据的有关规范。
- 在串口通信中,常用的协议包括 RS-232、RS-422和RS-485。
1、RS-232(ANSI/EIA-232标准): 只支持点对点, 最大距离 50英尺。最大速度为128000bit/s, 距离越远,速度越慢。 支持全双工(发送同时也可接收)。
2、RS-422(EIA RS-422-AStandard): 支持点对多一条平衡总线上连接最多10个接收器 将传输速率提高到10Mbps,传输距离延长到4000英尺(约1219米),所以在100kbps速率以内,传输距离最大。支持全双工(发送同时也可接收)。
3、RS-485(EIA-485标准): 是RS-422的改进, 支持多对多(2线连接),从10个增加到32个,可以用超过4000英尺的线进行串行通行。速率最大10Mbps。支持全双工(发送同时也可接收)。2线连接时 是半双工状态。
2.RS-232标准
RS-232是现在主流的串行通信接口之一。通常 RS-232 接口以9个引脚 (DB-9) 或是25个引脚 (DB-25) 的型态出现,对每个引脚的信号内容加以规定,还对信号电平加以规定。但是工业控制的RS232接口一般只使用RXD、TXD、GND三条线。
-
特点:
(1)信号线少
RS-232总线规定了25条线,包含了两个信号通道,即第一通道(称为主通道)和第二通道(称为副通道)。利用RS- 232总线可以实现全双工通信,通常使用的是主通道,而副通道使用较少。在一般应用中,使用3条~9条信号线就可以实现全双工通信,采用三条信号线(接收线、发送线和信号线)能实现简单的全双工通信过程。
(2)灵活的波特率选择
RS-232规定的标准传送速率有50b/s、75b/s、110b/s、150b/s、300b/s、600b/s、1200b/s、2400b/s、4800b/s、9600b/s、19200b/s,可以灵活地适应不同速率的设备。对于慢速外设,可以选择较低的传送速率:反之,可以选择较高的传送速率。
(3)采用负逻辑传送
规定 逻辑“1”的电平为-5V~-15 V,逻辑“0”的电平为+5 V~+15 V。选用该电气标准的目的在于提高抗干扰能力,增大通信距离。RS -232的噪声容限为2V,接收器 将能识别高至+3V的信号作为逻辑“0”,将低到-3 V的信号作为逻辑“1”。
(4)传送距离较远
由于RS -232采用串行传送方式,并且将微机的TTL电平转换为RS-232C电平,其传送距离一般可达30 m。若采用光电隔离20 mA的电流环进行传送,其传送距离可以达到1000 m。另外,如果在RS-232总线接口再加上Modem,通过有线、无线或光纤进行传送,其传输距离可以更远。 -
缺点:
(1)接口的信号电平值较高,易损坏接口电路的芯片。RS232接口任何一条信号线的电压均为负逻辑关系。即:逻辑“1”为-3— -15V;逻辑“0”:+3— +15V ,噪声容限为2V。即要求接收器能识别高于+3V的信号作为逻辑“0”,低于-3V的信号作为逻辑“1”,TTL电平为5V为逻辑正,0为逻辑负 。与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接。
(2)传输速率较低,在异步传输时,比特率为20Kbps;因此在51CPLD开发板中,综合程序波特率只能采用19200,也是这个原因。
(3)接口使用一根信号线和一根信号返回线与地线构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。
(4)传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在15米左右。 -
连接方式
RS232接口是9针(或引脚),通常是TxD和RxD经过电平转换得到的。要想使得芯片与PC机的RS232接口直接通信,需要也将芯片的输入输出端口也电平转换成RS232类型,再交叉连接。
经过电平转换后,芯片串口和RS232的电平标准是不一样的:
单片机是TTL电平:+5V表示1,0V表示0
RS232是负逻辑电平,-3 ~ -15V为1,+3~+15V为0
RS-232通讯协议标准串口的设备间通讯结构图如下:
3.RS232电平与TTL电平的区别
TTL电平标准是 低电平为0,高电平为1(对地,标准数字电路逻辑)。
TTL电平信号被利用的最多是因为通常数据表示采用二进制规定,+5V等价于逻辑“1”,0V等价于逻辑“0”
RS232电平标准 是 正电平为0,负电平为1(对地,正负3-15V皆可,甚至可以用高阻态)。
在RS-232-C中任何一条信号线的电压均为负逻辑关系。即:逻辑“1”为-3到-15V;逻辑“0”为+3到+15V。
4."USB/TTL转232"模块工作原理
USB转串口即实现计算机USB接口到物理串口之间的转换。可以为没有串口的计算机或其他USB主机增加串口,使用USB转串口设备等于将传统的串口设备变成了即插即用的USB设备
4.1基本工作原理
串口发送
串口应用发送数据->USB串口驱动获取数据->驱动将数据经过USB通道发送给USB串口设备->USB串口设备接收到数据通过串口发送
串口接收
USB串口设备接收串口数据->将串口数据经过USB打包后上传给USB主机->USB串口驱动获取到通过USB上传的串口数据->驱动将数据保存在串口缓冲区提供给串口应用读取
4.2CH340芯片模块
CH340 是一个USB 总线的转接芯片,实现USB 转串口、USB 转IrDA 红外或者USB 转打印口。为了增加串口通讯的远距离传输及抗干扰能力,RS-232标准使用-15V 表示逻辑 1, +15V 表示逻辑 0。常常会使用 MH340芯片 对 USB/TTL与RS-232电平的信号进行转换。
USB转串口模块可以使用5V、3V3电压供电,需要将跳线帽进行安装。
USB转串口电路板与单片机的接线图,VCC接线是为了单片机供电,USB转串口的RXD引脚与单片机的TXD引脚相连,USB转串口的TXD引脚与单片机的RXD引脚相连,两者的GND引脚直接相连。
二、环境搭建
1.硬件环境
- STM32F103C8T6核心板
- USB转TTL
- 面包板一块
- 杜邦线(公对公、母对母)若干
- 连接方法:
注意将核心板上的BOOT0设置为1,BOOT1设置为0
2.软件环境
- MDK5、stm32CubeMX
- CH340驱动(USB串口驱动)
- FlyMcu 烧录助手
- 串口通信助手(SSCOM)
三、HAL库实现串口通信
1.创建工程
1.1 点击File,创建新项目New Project
1.2 选择芯片STM32F103C8T6
1.3 配置RCC
1.4 配置SYS
1.5 配置USART1
1.6 配置NVIC
勾选下方选项表示支持中断操作
1.7 配置Clock Configuration
1.8 配置Project Manager
1.9 工程创建完成,用keil打开
2.keil代码配置
2.1 在main函数前定义全局变量
char c;//指令 #:停止 *:开始
char message[]="hello Windows\n";//输出信息
int flag=0;//标志 #:停止发送 *.开始发送
2.2 在main函数中设置接收中断
//设置接收中断
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
/*函数原型
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
功能:串口中断接收,以中断方式接收指定长度数据。
大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。
接收到数据时,会触发串口中断。
再然后,串口中断函数处理,直到接收到指定长度数据
而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)
参数:
UART_HandleTypeDef *huart UATR的别名
huart1 *pData 接收到的数据存放地址
Size 接收的字节数
*/
2.3 main函数中的while循环里面添加传输代码
while (1)
{
if(flag==1){
//发送信息
HAL_UART_Transmit(&huart1, (uint8_t *)"hello windows!\r\n", 16 , 0xffff);
//延时
HAL_Delay(1000);
}
2.4 在main函数下面重写中断处理函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
//当输入的指令为#时,发送提示并改变flag
if(c=='#'){
flag=0;
}
//当输入的指令为*时,发送提示并改变flag
else if(c=='*'){
flag=1;
}
//重新设置中断
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
}
3.编译并烧录
- 点击魔术棒,在 Output下勾选 Create HEX File
- 在Debug里面选择 Use Simulator
Dailog DLL设置为DARMSTM.DLL,Parameter设置为-pSTM32F103C8;
- 点击ok 点击编译 编译成功
- 按照硬件环境部分将硬件连接到电脑串口上,打开 FlyMcu烧录软件
- 找到生成的 hex 文件,点击打开
- 搜索串口,设置波特率为115200bps
- 点击开始编程,进行烧录
4.实现效果
- 打开SSCOM串口/网络数据调试器
- 打开串口设置,匹配串口设置
- 点击打开串口,得到以下效果
当发送“*”后可以看到不断输出“hello Windows!"
当发送“#”后端口停止输出
四、Keil软件仿真
1.逻辑分析仪功能
- 点击debug,进入调试页面
选择逻辑分析仪
- 选择要观察的引脚
- 点击右上角,添加USART1_SR引脚,引脚的Display Type选择为Bit
2.波形分析
- 运行程序
- 得出波形
- 发送信息时高电平的持续时间为0.778us
- 发送信息时低电平的持续时间为87.7us
- 延时100ms
通过查看peripherals中的USART1可看到其波特率实际为115200baud
五、总结
在本次实验中学习了STM32F103单片机的串口协议,介绍了RS-232 、RS485标准以及TTL电平,分析了RSS-232以及TLL的区别。阐述了USB转接串口基本原理,并以CH340模块为案例介绍。
实践中主要介绍利用stm32CubeMX+Keil,在STM32F103C8T6上,使用HAL库方式,采用中断模式,实现串口通信。通过实验发现,stm32CubeMX中HAL库函数则封装了许多stm32的常用函数,相较于寄存器方式,利用固件库方式,HAL库函数stm32的学习和使用更加容易上手。在本次实验中将理论的学习运用到实践中,过程中虽然出现了不少问题,但通过不断的查询资料最终将问题解决,收获颇多。