Skip to main content

HAL 库开发笔记 - 串口通信

本篇基于自研 RobotCtrl 开发套件,单片机内核为 STM32F407ZET6,RS-232 通信使用 SP3232EEN 芯片,原理图及详细介绍请见 RobotCtrl - STM32 通用开发套件

基本原理

串口通信的基本原理请跳转文章 通信协议-串口通信

串口通讯实验

在进行下一步实验之前,需要在 CubeMX 里配置串口下载、时钟等各类参数。
具体步骤请跳转文章 HAL 库开发笔记 - 环境配置 中的方法进行配置。

在 CubeMX 内配置串口

根据原理图,我们用来进行通讯实验的串口是 USART1 ,即 PA9 PA10 引脚。那么,我们首先需要在 CubeMX 内将这两个引脚配置为 USART1 的发送和接受功能,然后点击左侧 USART1 标签页,将模式(Mode)设为异步(Asynchronous),并在下方修改波特率(Baud Rate)等参数:

参数详情如下:

  • 波特率设置(Baud Rate):没有哪种波特率最好,根据实际情况进行修改,要与串口调试助手上一致。
  • 数据位数(Word Length):如果使能了奇偶校验,那么实际数据将在该位数上减一。
  • 校验(Parity):可选择奇偶校验或不校验。
  • 停止位(Stop Bits):额外一位或两位用于作为发送或接收完毕信号位。
  • 数据方向(Data Direction):可选择仅发送,仅接收或收发模式。
  • 过采样(Over Sampling):8 倍或 16 倍采样率可以有效防止数据出错。

最后,在 NVIC 标签页使能 USART1 的串口中断,如图:

在代码内配置串口

首先需要在 stm32f4xx_it.c 末尾添加如下代码:

stm32f4xx_it.c
/* USER CODE BEGIN 1 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1)
{
HAL_UART_Receive_IT(huart, &aRxBuffer, 1); // 接收并写入 aRxBuffer
HAL_UART_Transmit(huart, &aRxBuffer, 10, 0xFFFF); // 把接收到的 aRxBuffer 发回去
}
}
/* USER CODE END 1 */

其中,Buffer 是在 main.c 中定义的 uint8_t 类型全局变量。这里每接受的一个字节后就产生中断,将该字节数据返回并重新开启中断。我们需要分别在 main.cstm32f4xx_it.c 中定义它:

main.c
/* Private variables -----------------------------------------------------------*/
/* USER CODE BEGIN PV */

uint8_t aTxBuffer[] = "USART TEST\r\n"; //用于发送的字符串
uint8_t aRxBuffer[20]; //用于接收的字符串

/* USER CODE END PV */
stm32f4xx_it.c
/* Private variables -----------------------------------------------------------*/
/* USER CODE BEGIN PV */

extern uint8_t aTxBuffer;
extern uint8_t aRxBuffer;

/* USER CODE END PV */

另外,在 main.c 中,我们需要在串口初始化后、主循环前,添加接收中断开启函数:

main.c
/* USER CODE BEGIN 2 */

HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 1); // 接收中断开启函数

/* USER CODE END 2 */

也可以发送一条初始化消息,代表串口已启动:

main.c
/* USER CODE BEGIN 2 */

HAL_UART_Transmit(&huart1, (uint8_t*) aTxBuffer, sizeof(aTxBuffer) - 1, 0xFFFF); // 发上一次自定义的 aTxBuffer

/* USER CODE END 2 */

如果需要对 printf 进行重定向(把 printf 函数用在 STM32 中做串口输出功能),请参考 STM32CubeIDE 串口重定向(printf)及输出浮点型

下载验证

程序烧录成功后,我们打开串口助手,配置对应的端口和波特率。

连上串口后,会先打印一行 aTxBuffer 的内容,然后将会把接收到的 aRxBuffer 回传打印出来。如图:

参考与致谢

文章作者:Power Lin
原文地址:https://wiki-power.com
版权声明:文章采用 CC BY-NC-SA 4.0 协议,转载请注明出处。