首页 > 编程语言 >STM32F407单片机编程入门(七)USART串口485通讯实战含源码

STM32F407单片机编程入门(七)USART串口485通讯实战含源码

时间:2024-09-19 12:22:32浏览次数:9  
标签:CODE USART 发送 源码 USER 串口 数据

文章目录

一.概要

USART(Universal Synchronous/Asynchronous Receiver/Transmitter)是通用同步/异步收发器,它是嵌入式领域中使用十分广泛的一种串口通信协议,大部分MCU都具备USART硬件接口。

USART串口通信的主要特点:
双向串口通信有两根通信线(发送端TX和接收端RX)。
发送的TX和接收的RX要交叉连接。
当只需单向的数据传输时,可以只接一根通信线。
两个设备之间当电平标准不一致时,比如3.3V系统和5V系统通讯最好加电平转换芯片或者隔离芯片。
两个设备之间的GND一定要接在一起,VCC可以各自供电。

本文介绍了STM32 USART串口的基本概念,内部结构,波形时序,以及用串口进行数据通讯的例程。

在这里插入图片描述
本文介绍了STM32的USART串口的基本特点,用一个485通讯实验加深对串口通讯的理解。

二.USART串口基本介绍

基本数据帧组成

在这里插入图片描述

1)波特率

   USART波特率是指每秒钟传输的位数,‌它决定了数据传输的速率和精确度。
   波特率是USART通信中的一个关键参数,‌它表征了串口的传输速度,‌即单位时间内传输的码元个数。‌对于USART而言,‌码元通常是二进制的,‌通过高低电平传输,‌因此波特率和比特率在数值上是相等的。‌例如,‌当波特率为115200时,‌意味着UART串口每秒传输115200个bit的数据量。‌常见的UART串口波特率包括300、‌600、‌1200、‌4800、‌9600、‌19200、‌38400、‌57600、‌115200等,‌这些标准波特率广泛应用于各种设备和通信接口中。例如:数据传送速率为120字符/秒,而每一个字符为10位,则传送的波特率为10×120=1200位/秒=1200波特

2)停止位

   每个字发送后,紧跟停止位,停止位可以选择“1、2、0.5、1.5”bit(0.5实际代表停止位高电平持续半个周期的时间)。
   不过F1的USART做通信时,停止位只支持1或2个,一般情况下,停止位选择1。

3)校验位

   UART传送的每个字节都可以选择是否增加1bit的奇偶校验位,而且奇校验或偶校验都可以选择。

4)字长度

   传送一个字的位数,一般情况下都会选择8bit字节,这也和国际标准单位的字节宽度相对应。

5)起始位

   起始位是必须的,由硬件产生,无需软件配置。STM32单片机的起始位就是在发送每个字的第一个有效位之前,先发送1周期的低电平,表示发送开始。
   嵌入式应用中, 包括STM32F1的应用,最常见的配置是:8位字节,1个停止位,无校验,波特率9600/115200。

在这里插入图片描述

三.STM32单片机USART内部结构图

USART内部结构图如下
在这里插入图片描述

我们一般串口通讯使用串口的TX,RX引脚就可以了。
在这里插入图片描述

四.USART内部信号流向

在这里插入图片描述

串口发送:

在配置串口的各个参数时,可以选择发送数据帧的数据位的大小,可选8位。串口发送数据实际上就是对发送数据寄存器USART_DR进行写操作。
1.当串口发送数据时,会检测发送移位寄存器是不是有数据正在移位,如果没有移位,那么这个数据就会立刻转移到发送移位寄存器里,准备发送。
2.当数据移动到移位寄存器时,会产生一个TC发送寄存器空标志位,该位描述如下。当TXE被置1,那么就可以在USART_DR写入下一个数据了,即发送下一个数据。
3.发送移位寄存器在发送器控制的控制下,向右移位,一位一位的把数据传输到TX引脚。
4.数据移位完成后,新的数据就会再次从USART_DR转移到发送移位寄存器里来,依次重复1-3的过程。通过读取TXE标志位来判断是否发送下一个数据。

串口接收:

1.数据从RX引脚通向接收移位寄存器,在接收控制的控制下,一位一位的读取RX的电平,把第一位放在最高位,然后右移,移位8次之后就可以接收一个字节了。
2.当一个字节数据移位完成之后,这一个字节的数据就会整体的移到接收数据寄存器USART_DR里来。在转移时会置RXNE接收标志位,即USART_DR寄存器非空,就说明数据可以被读出。

串口数据收发程序相关:

串口发送一般以下操作:
写入数据:‌使用STM32提供的函数(‌如HAL_UART_Transmit)‌将数据写入串口的发送数据寄存器。‌通过检查发送完成标志(‌如TC)‌来确认数据是否已经成功发送。‌

串口接收一般以下操作:
1.轮询方式:‌通过不断查询接收标志位(‌如RXNE)‌来判断数据是否到达接收缓冲区,这个效率比较低。‌

2.中断方式:通过配置收到1字节数据单片机串口产生一次中断,在中断服务例程中处理接收到的数据。有时候会遇到接收的数据长度不固定,STM32单片机串口提供了一个更好用的功能,就是空闲中断(IDLE)功能。也就是说当一帧数据接收结束后,就会产生一个空闲中断。这样就可以利用这个空闲中断来判断一帧数据接收是否完成。

在这里插入图片描述

五.USART示波器信号解析

用串口调试器软件发送0x12数据,9600波特率,8位数据,无校验,1位停止位,用示波器采集波形如下图所示。
在这里插入图片描述
在这里插入图片描述

根据下图分析,数据是低位在前,高位在后,二进制就是00010010。转换成十六进制就是0x12,分析的波形数据内容跟电脑串口调试器发送的内容一致。
在这里插入图片描述

六.485通讯基本概念

RS485通讯采用的是差分信号负逻辑控制模式,即2~6V表示“0”,-6~-2V表示“1”。RS485通讯一般采用两线制接线方式(端口A,端口B)。两线制接线方式是目前采用较多的为总线式拓朴结构,属于半双工传输方式,也就是说收发是不同步的。

485通讯一般就是单片机的串口加RS485芯片实现。
在这里插入图片描述

七.CubeMX配置一个USART数据收发例程进行485通讯实验

485转TTL模块插开发板子上(板子PD5接模块TX,板子PD6接模块RX,板子3.3V接模块VCC,板子GND接模块GND),USB转485模块插电脑,把两个485模块通过杜邦线连接,A跟A连,B跟B连。

在这里插入图片描述

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F407VE,再双击就创建新的工程
在这里插入图片描述

配置下载口引脚
在这里插入图片描述

配置外部晶振引脚
在这里插入图片描述

配置系统主频168Mhz,使用外部晶振
在这里插入图片描述

配置PD5,PD6配置成串口2收发脚,波特率9600,8位数据,无校验,1位停止位。

在这里插入图片描述
串口2中断使能
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述
生成工程
在这里插入图片描述
用Keil5打开工程
在这里插入图片描述

main中增加代码
在这里插入图片描述
在这里插入图片描述

主要代码


void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  /* USER CODE BEGIN SysTick_IRQn 1 */
 UART_RecvDealwith();//1ms调用一次,用来判断是否收到完整一帧数据
  /* USER CODE END SysTick_IRQn 1 */
}
volatile uint8_t UartRxData;
uint8_t UartTxbuf[100]="helloworld";
uint8_t UartRxbuf[100],UartIntRxbuf[100],UartRxIndex=0,UartRxFlag,UartRxLen=0,UartRxTimer,UartRxOKFlag,UartIntRxLen;

//接收标志函数,返回0说明没收据接收,返回1说明有数据收到
uint8_t Uart_RecvFlag(void)
{
		if(UartRxOKFlag==0x55)
		{
			UartRxOKFlag=0;
			UartRxLen=UartIntRxLen;
			memcpy(UartRxbuf,UartIntRxbuf,UartIntRxLen);//把缓冲区的数据,放入需要解析的数组
			UartIntRxLen=0;
			return 1;
		}
		return 0;
}
//串口2在1字节接收完成回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	
	if(huart==&huart2)//判断是否串口2
	{
		UartRxFlag=0x55;//接收标志置位
		UartIntRxbuf[UartRxIndex]=UartRxData;//数据写入缓冲区
		UartRxIndex++;//记载数目加1
		if(UartRxIndex>=sizeof(UartIntRxbuf))//缓冲区是10字节,如果存满,归零
		{
			UartRxIndex=0;
		}
		HAL_UART_Receive_IT(&huart2,(unsigned char*)&UartRxData,1);//继续接收下一字节
 }

}

//1ms调用一次,用来判断是否收完一帧
void UART_RecvDealwith(void)
{
	if(UartRxFlag==0x55)
	{
		if(UartIntRxLen<UartRxIndex)//UartIntRxLen小于UartRxIndex,说明有收到新的数据,把接收长度增加
		{
		UartIntRxLen=UartRxIndex;
		}else
		{
			UartRxTimer++;
			if(UartRxTimer>=50)//50ms,等待,没收到新数据,说明已经收完一帧
			{
				UartRxTimer=0;
				UartRxFlag=0;
				UartRxOKFlag=0x55;
				UartRxIndex=0;
			}
		}
	}
}
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();//8M外部晶振,168M主频

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();//串口2配置,PD5-> USART2_TX,PD6-> USART2_RX ,9600波特率,8位数据,1位停止位,无校验
  /* USER CODE BEGIN 2 */
	HAL_UART_Transmit(&huart2, (uint8_t *)UartTxbuf, 10,1000);//发送helloworld
  HAL_UART_Receive_IT(&huart2,(unsigned char*)&UartRxData,1);//485接收
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		if(Uart_RecvFlag()==1)//如果接收到485口数据
		{
				HAL_UART_Transmit(&huart2, (uint8_t *)UartRxbuf, UartRxLen,1000);//发送收到的数据
		}
		HAL_Delay(10);
  }
  /* USER CODE END 3 */
}

实验效果

串口调试器发HELLOWORLD板子会回HELLOWORLD。
在这里插入图片描述

八.工程源代码下载

通过网盘分享的文件:7.485(USART串口)通讯实验.zip
链接: https://pan.baidu.com/s/1bQZCgp6dXD-gLAwTFn87tA 提取码: quaz

如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行

九.小结

STM32的串口(USART)主要用于与其他设备进行数据通信和调试。STM32的串口还支持多种通信协议,如LIN、IrDA等,这使得它能够与各种类型的设备进行通信。串口通信在软件开发中也是一个重要的调试手段,通过串口可以输出调试信息,帮助开发者了解程序的运行状态。‌

标签:CODE,USART,发送,源码,USER,串口,数据
From: https://blog.csdn.net/zy2232652/article/details/142349646

相关文章