目录
一、概述
本篇文章我们进入STM32串口收发功能的教学,主要讲解阻塞模式与中断模式两种收发模式,源码将在最后免费提供。
开发工具:STM32CubeMx、STM32开发板(型号不限)
二、串口通信原理
串口通信的本质,是发送者将信号调制之后通过传输介质被接收者接收并解析的过程。

数据的发送,则是通过高低电平来实现的:

串口都是往往是三根线实现的,即RX(接收)、TX(发送)、GND(地)。
而波特率(bit/s) 常用的有9600,38400,115200等,代表的是每秒传输的bit位数,比特率越高传输速率越快,出现错码的概率越大。
两个设备必须设置相同的比特率、校验方式、停止位等参数才能正常通信。
三、串口调试
这里的串口调试我们需要用到USB转TTL,使用线连接开发板的TX与RX,并安装好USB转TTL驱动,打开串口即可。
安装完驱动,我们连接好串口,打开串口调试助手,注意波特率等信息需要与程序设置的一致。

四、程序实现
首先打开STM32CubeMx选择对应开发板的芯片:

简单做一些基础的配置工作(请以实际开发板电路为准):


随后我们按照下图配置USART,此处我Mode选择异步、波特率是9600,8位、无校验、停止位1位。

随后我们进入GPIO的USART菜单,查看USART端口是否正确,此处我们发现位PA9与PA10。

查看开发板电路图,核对引脚是否正确,发现电路图中引脚为PA9与PA10,引脚正确我们不需要做其他操作。

至此我们已经完成了工程配置,生成代码并打开:


(一)阻塞模式
这里我们写一个读取串口信息并发送回来的程序,在主函数中,代码如下:
此处我们使用HAL_UART_Transmit函数,参数分别为串口句柄、数据、数据长度、超时时间。

/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
uint8_t receive[10];
HAL_UART_Receive(&huart1,receive,0xFFFF);
HAL_UART_Transmit(&huart1,receive,sizeof(receive),0xFFFF);
}
/* USER CODE END 3 */
至此,编译并烧写程序以后,我们开始调试。

可以发现,程序功能已经实现,我们还可以通过对printf与scanf的重定向来实现功能。
/* USER CODE BEGIN 0 */
#include <stdio.h>
int fputc(int c, FILE* stream)
{
uint8_t ch[]={c};
HAL_UART_Transmit(&huart1,ch,1,0xffff);
return c;
}
int fgetc(FILE * stream)
{
uint8_t ch[1];
HAL_UART_Receive(&huart1,ch,1,0xffff);
return ch[0];
}
/* USER CODE END 0 */
(二)中断模式
返回到STM32CubeMx,在NVIC选项卡中使能USART1的中断。

重新编译并生成代码,我们来是实现接收与发送的功能。
/* USER CODE BEGIN WHILE */
uint8_t receive[10];
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_UART_Receive_IT(&huart1,receive,10);//接收函数
HAL_UART_Transmit_IT(&huart1,receive,10);//发送函数
}
/* USER CODE END 3 */
本质上,代码是没有什么区别的,不过发送和接收的函数发生了改变,中断接收函数HAL_UART_Receive_IT在接收完毕之后会调用接收完成的中断处理函数,为了实现刚刚的功能,我们重写此函数并进行相关操作以实现功能。
声明receive为全局变量,在接收完成处理函数中调用发送函数,然后再次进入接收状态。同时在主程序需要调用一次接收函数,使其进入接收状态。
uint8_t receive[10];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit_IT(&huart1,receive,10);//发送函数
HAL_UART_Receive_IT(&huart1,receive,10);//接收函数
}

至此,串口中断程序完成。
五、总结
本篇的重点在于阻塞模式与中断模式两种模式的串口通信,需要熟悉并重写中断处理函数,培养编程思维,下次我们将继续介绍DMA相关知识。
本文详细介绍了STM32的串口通信,包括串口原理、串口调试方法以及如何在STM32CubeMx中配置串口。重点讲述了阻塞模式和中断模式下的串口收发程序实现,提供了相应的代码示例,并讨论了如何通过重定向printf和scanf实现功能。最后,简要总结并预告了DMA相关知识。
3419

被折叠的 条评论
为什么被折叠?



