目录
文章目录
前言
学习目标
学习内容
开发流程
串口功能配置
串口功能开启
串口中断配置
串口参数配置
查询配置结果
发送功能测试
中断接收功能测试
printf配置
DMA收发
配置
DMA发送
DMA接收(方式1)
DMA接收(方式2)
总结
前言
在嵌入式系统开发中,掌握串口通信是至关重要的一环。串口通信作为微控制器与外部设备或其他微控制器之间的主要通信方式,在各种嵌入式应用中起着重要作用。本文将介绍如何通过STM32CubeMX配置串口功能,并掌握串口发送、接收以及使用DMA进行数据传输的方法。同时,我们还将讨论如何配置printf函数,使其能够在串口上输出调试信息,以及如何处理串口接收中断。通过学习这些内容,读者将能够在嵌入式系统开发中更加灵活地应用串口通信功能。
学习目标
- 熟悉STM32CubeMX配置流程
- 掌握串口发送和接收
- 掌握串口DMA发送和DMA接收
- 掌握printf配置
学习内容
开发流程
- 配置芯片串口功能
- 编写串口代码
- 调试
串口功能配置
串口功能开启
- 在
Connectivity
下选择合适的串口,这里选择USART1
- 配置模式为异步,
Asynchronous
串口中断配置
- 在
NVIC Settings
下,打开串口中断。
串口参数配置
Parameter Settings
中,根据情况配置串口的参数。
查询配置结果
在GPIO Setting
中可以显示默认的IO引脚
右侧芯片引脚部分会显示配置的结果。
发送功能测试
/* USER CODE BEGIN WHILE */
uint8_t cnt = 0;
while (1)
{
HAL_UART_Transmit(&huart1, &cnt, 1, HAL_MAX_DELAY);
cnt++;
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
通过HAL_UART_Transmit
函数发送数据。
中断接收功能测试
/* USER CODE BEGIN WHILE */
HAL_UART_Receive_IT(&huart1, usart1_buffer, USART1_BUFFER_LEN);
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
/* USER CODE BEGIN 0 */
#define USART1_BUFFER_LEN 1
uint8_t usart1_buffer[USART1_BUFFER_LEN];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
HAL_UART_Transmit(&huart1, (const uint8_t *)usart1_buffer, USART1_BUFFER_LEN, HAL_MAX_DELAY);
// 开启中断接收
HAL_UART_Receive_IT(&huart1, usart1_buffer, USART1_BUFFER_LEN);
}
/* USER CODE END 0 */
接收任意个字节
触发空闲中断接收
HAL_UARTEx_ReceiveToIdle_IT(&huart1, usart_buffer, RX_BUF_LEN); // 常用
使用Idle空闲中断回调
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
usart_buffer[Size] = '\0';
printf("callback2: %s\n", usart_buffer);
HAL_UARTEx_ReceiveToIdle_IT(&huart1, usart_buffer, RX_BUF_LEN); // 常用
}
printf配置
#include <stdio.h>
int fputc(int ch, FILE* f) {
HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1, 0xFFFF);
return ch;
}
注意:如果加了printf无法打印日志,记得在 options 里勾选 MicroLIB
DMA收发
配置
DMA发送
/* USER CODE BEGIN WHILE */
uint8_t cnt = 0;
while (1)
{
HAL_UART_Transmit_DMA(&huart1, &cnt, 1);
cnt++;
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
DMA接收(方式1)
- 触发接收
HAL_UART_Receive_DMA(&huart1, usart_buffer, RX_BUF_LEN); // 常用!
- 接收回调函数
#define RX_BUF_LEN 12
uint8_t usart_buffer[RX_BUF_LEN + 1];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
// 为了打印字符串
usart_buffer[RX_BUF_LEN] = '\0';
printf("callback1: %s\n", usart_buffer);
// 再次启用中断接收(收到指定个字节才执行)
HAL_UART_Receive_DMA(&huart1, usart_buffer, RX_BUF_LEN); // 常用!
}
DMA接收(方式2)
通过空闲中断事件接收,即发生空闲了才进行数据处理
- 触发接收
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, usart_buffer, RX_BUF_LEN); // 常用!!!
- 接收回调函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
// 为了打印字符串
usart_buffer[Size] = '\0';
printf("callback2[%d]: %s\n", Size, usart_buffer);
// 再次启用接收(RX_BUF_LEN为最大接收数量)
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, usart_buffer, RX_BUF_LEN); // 常用!
}
总结
通过本文的学习内容,读者可以熟悉STM32CubeMX的串口配置流程,掌握串口发送和接收的基本方法,并了解如何使用DMA进行串口数据传输。在串口发送功能测试中,通过HAL_UART_Transmit函数实现了简单的数据发送;在中断接收功能测试中,通过HAL_UART_Receive_IT函数实现了中断接收,并介绍了触发空闲中断接收的方法。此外,还讨论了如何配置printf函数,使其能够在串口上输出调试信息。最后,通过DMA收发部分的介绍,读者可以了解如何配置DMA进行高效的串口数据传输,包括DMA发送和DMA接收的两种方式。通过这些学习内容,读者将能够在嵌入式系统开发中灵活运用串口通信功能,为实际应用开发提供技术支持。