实验三-STM32串口通信

一、了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。

1.何为串口通信协议

​ 串口通信指两个或两个以上的设备使用串口按位(bit)发送和接收字节。可以在使用一根线发送数据的同时用另一根线接收数据。 串口通信协议就是串口通讯时共同遵循的协议。 协议的内容是每一个bit 所代表的意义。 常用的串口通信协议 有以下几种:

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标准接口(又称EIA RS-232)是常用的串行通信接口标准之一,它是由美国电子工业协会(EIA)联合贝尔系统公司、调制解调厂家及计算机终端生产厂家于1970年共同制定,其全名是“数据终端设备( DTE)和数据通信设备(DCE)之间串行二进制数据交换接口技术标准”。

3.TTL电平与RS232电平的区别
什么是TTL电平、RS232电平?它们有什么区别呢?

3. TTL电平标准

输出 L: <0.8V ; H:>2.4V。

输入 L: <1.2V ; H:>2.0V

TTL器件输出低电平要小于0.8V,高电平要大于2.4V。输入,低于1.2V就认为是0,高于2.0就认为是1。于是TTL电平的输入低电平的噪声容限就只有(0.8-0)/2=0.4V,高电平的噪声容限为(5-2.4)/2=1.3V。

RS232标准

在TXD和RXD数据线上:
  (1)逻辑1为-3~-15V的电压
  (2)逻辑0为3~15V的电压
在RTS、CTS、DSR、DTR和DCD等控制线上:
  (1)信号有效(ON状态)为3~15V的电压
  (2)信号无效(OFF状态)为-3~-15V的电压
这是由通信协议RS-232规定的。
RS-232:标准串口,最常用的一种串行通讯接口。有三种类型(A,B和C),它们分别采用不同的电压来表示on和off。最被广泛使用的是RS-232C,它将mark(on)比特的电压定义为-3V到-12V之间,而将space(off)的电压定义到+3V到+12V之间。传送距离最大为约15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3~7kΩ。所以RS-232适合本地设备之间的通信。

4、了解“USB/TTL转232“模块(以CH340芯片模块为例)的工作原理。

CH340 是一个USB 总线的转接芯片,实现USB 转串口、USB 转IrDA 红外或者USB 转打印口。为了增加串口通讯的远距离传输及抗干扰能力,RS-232标准使用-15V 表示逻辑 1, +15V 表示逻辑 0。常常会使用 MH340芯片对 USB/TTL与RS-232电平的信号进行转换。

二、串口传输文件

1、准备

将TTL连接为如图所示:

在这里插入图片描述

注意:①两USB串口对应链接 RXD,TXD反串连接 ②TXD -> RXD 后将Usb串口接到电脑com口出

安装串口调试助手

2、传输操作

启动串口调试助手并打开串口,将两台电脑调制相同的波特率,本例使用115200波特率

然后开始发送文件,我发送的是一张png图片

在这里插入图片描述

然后等待发送完毕

接收端接受文件的设置如下图所示勾选:

接收端如图所示:

在这里插入图片描述

之后接收端在串口调试助手的安装目录里能找到传送过来的txt文件,将其另存为png文件:

在这里插入图片描述

在接收端能够打开图片,说明传输成功。

二、任务1:基于HAL库的串口通信

  • STM32系统给上位机(win10)连续发送“hello windows!”,win10采用“串口助手”工具接收。如果STM32的连续发送之间不加延时语句,观察win10端是否出现接收数据丢失的现象。
  • 在完成以上任务基础,继续扩展功能:当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello windows!”;发送一个字符“*”后,stm32继续发送;

1.在STM32CubeMX上为芯片设置引脚、配置时钟,在Keil中生成代码

  • 配置USART,NVIC

在这里插入图片描述

2. 硬件选型与引脚设置

  • 选择STM32芯片型号: STM32F103C8T6
  • 引脚设置:
    • 配置GPIO端口,如GPIOA的PA4方便观察验证烧录。
      在这里插入图片描述

3. 时钟配置

  • 开启HSE时钟: 8 MHz外部晶振

  • 配置时钟树: 确保系统时钟设置正确满足应用需求。

    在这里插入图片描述

4. 代码生成

  • 生成初始化代码: 点击“GENERATE CODE”,选择Keil uVision5作为工具链。

在这里插入图片描述

5. 编写Keil中的代码

5.1 查看工程
  • cubemx为我们生成了工程代码模版。

    在这里插入图片描述

5.2 主函数实现
  • main.c 中编写LED闪烁逻辑,使用 HAL_UART_Transmit 发送数据。
int main(void)
{

  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
	
	
  HAL_UART_Receive_IT(&huart1, (uint8_t *)&order, 1);

  while (1)
  {

	HAL_UART_Transmit(&huart1, (uint8_t *)&message,strlen(message),0xFFFF); 
	HAL_Delay(1000);
			
  }
}

6. 分析代码部分

  • HAL库调用: 通过简化的API接口控制硬件。

  • 延时函数: HAL_Delay()用于实现LED的闪烁时间。

  • **HAL_UART_Transmit_DMA(UART_HandleTypeDef huart, uint8_t pData, uint16_t Size)

    功能:串口通过DMA发送指定长度的数据。
    参数:
    UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1
    *pData 需要发送的数据
    Size 发送的字节数

7.电路板连接

在这里插入图片描述

8. 使用软件烧录

在这里插入图片描述

点击开始编程烧录在keil中生成的hex文件。

8.使用串口助手观察数据传输效果
  • 查看接收区:

    在这里插入图片描述

    成功收到了数据。

9. 波形观察
  • 观察波形: 开始仿真,利用利用逻辑分析仪工具查看GPIO引脚的数字信号波形,验证LED闪烁周期。

9. 实验总结

总结要点:

  • 熟练掌握了STM32CubeMX引脚配置与代码生成。
  • 使用HAL库显著简化了GPIO操作过程。
  • 通过Keil仿真有效验证了代码逻辑的正确性。

反思与展望:

  • 进一步熟悉中断配置与处理,提升系统响应效率。
  • 探索更加复杂的外设如UART、I2C以扩展应用范围。

二、任务2:拓展:发送数据检测

  • 继续扩展功能:当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello windows!”;发送一个字符“*”后,stm32继续发送;

1.在STM32CubeMX上为芯片设置引脚、配置时钟,在Keil中生成代码

  • 配置中断时打开usart中断。

2. 硬件选型与引脚设置(与任务1一致)

3. 时钟配置(与任务1一致)

4. 代码生成(与任务1一致)

5. 编写Keil中的代码(与任务1一致)

5.1 print函数重写
#include <stdio.h>

int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

int fgetc(FILE *f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
  return ch;
}
5.2 主函数实现
  • main部分:
int main(void)
{

  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();

  HAL_UART_Receive_IT(&huart1, (uint8_t *)&order, 1);

  while (1)
  {
	if(flag==1)
	{
	HAL_UART_Transmit(&huart1, (uint8_t *)&message,strlen(message),0xFFFF); 
	HAL_Delay(1000);
	}
			
  }
}

6. 分析代码部分

  • GPIO初始化: 使用HAL库的GPIO初始化函数对端口设置。
  • HAL库调用: 通过简化的API接口控制硬件。
  • 延时函数: HAL_Delay()用于实现延时。
  • 中断控制部分: 使用HAL_UART_Receive_IT(&huart1, (uint8_t *)&order, 1);函数检测接收数据,并用flag变量存储。
  • while循环部分: 当flag为1时,继续发送数据。

7. 实验现象

  • 完成上述步骤后,将程序下载到芯片中。

  • **现象描述:**接收到*开始发送。

    在这里插入图片描述

    接收到#停止发送。

    在这里插入图片描述

6. 实验总结

总结要点:

  • 熟练掌握了STM32CubeMX引脚配置与代码生成。
  • 通过Keil仿真有效验证了代码逻辑的正确性。
  • 了解了中断的相关应用

反思与展望:

  • 进一步熟悉中断配置与处理,提升系统响应效率。
  • 探索更加复杂的外设如UART、I2C以扩展应用范围。

三、学习STM32中断、DMA通信原理和编程方法。使用stm32tubemx和HAL库分别完成以下编程练习

  • 采用串口中断方式重做上面任务二(2)的串口通信实验。

  • STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据

    1.继续使用cubemx生成工程,不同之处是配置dma。

    在这里插入图片描述

2.代码:

int main(void)
{
  uint8_t Senbuff[] = "Hello world\n";
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
	


  while (1)
  {
	HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
  HAL_Delay(1000);
}

}

3.代码分析:

3.1 HAL_UART_Transmit_DMA函数:

功能:串口通过DMA发送指定长度的数据。
参数:
UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1
*pData 需要发送的数据
Size 发送的字节数

4.实际效果

在这里插入图片描述

四、 在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察任务二(1)串口输出波形,并分析时序状态正确与否,计算波特率实际为多少。

1. 设置仿真环境

  • 在Keil中调试设置,如下图所示。

在这里插入图片描述

2 波形观察
  • 开始仿真,利用利用逻辑分析仪工具查看数字信号波形。

在这里插入图片描述

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐