【STM32】CUBEMX之串口:串口三种模式(轮询模式、中断模式、DMA模式)的配置与使用

在 STM32 中,串口(USART/UART)是非常常用的通信接口之一。STM32 支持多种串口通信模式,包括轮询模式、中断模式和 DMA 模式。本文将通过 CUBEMX 配置 STM32 的串口,并演示如何在这三种模式下进行通信。

1. STM32 串口基础

1.1 串口简介

串口通信是一种常见的异步通信协议,通常用于微控制器与外部设备(如电脑、传感器、模块)之间的数据传输。STM32 的串口外设既可以支持全双工通信,也可以支持半双工通信。

1.2 串口通信的基本参数

配置串口时需要设置以下基本参数:

  • 波特率(Baud Rate):数据传输速率,常用的值有 9600、115200 等。
  • 数据位(Data bits):一般为 8 位。
  • 停止位(Stop bits):用于同步通信,常用值为 1 位或 2 位。
  • 校验位(Parity):可选项,用于检测传输中的错误,常用值为无校验(None)、偶校验(Even)和奇校验(Odd)。
  • 流控制(Flow Control):可选项,用于控制数据流量,常用值为无流控制、硬件流控制(RTS/CTS)。
  • 2. 三种模式简介

    STM32 的串口通信有三种模式:

  • 轮询模式:通过查询数据寄存器来实现数据的发送与接收。简单但占用 CPU 资源。
  • 中断模式:通过中断机制实现数据接收和发送,减少了 CPU 的占用率。
  • DMA 模式:通过直接内存访问控制器(DMA)自动完成数据传输,大大减轻了 CPU 的负担,适用于大数据量传输场景。
  • 3. CUBEMX 串口配置

    3.1 基本配置

    1. 创建项目:打开 CUBEMX,新建项目并选择使用的 STM32 芯片型号。
    2. 启用串口:在 “Pinout & Configuration” 界面中,找到并启用 USART1(或其他串口)。这会自动分配 TX 和 RX 引脚。
    3. 配置串口参数:在 “Configuration” 界面,点击 USART1 进行参数设置,如下所示:
    4. Baud Rate: 115200
    5. Word Length: 8 Bits
    6. Stop Bits: 1 Stop Bit
    7. Parity: None
    8. Hardware Flow Control: None
    9. Mode: Asynchronous

    3.2 模式选择

    根据不同的使用场景,我们可以选择不同的工作模式:

  • 轮询模式:无需额外设置,直接调用 HAL 函数。
  • 中断模式:在 Configuration 中,启用 “NVIC Settings” 下的 USART 中断。
  • DMA 模式:启用 USART 的 DMA 选项,设置传输方向为 Memory To Peripheral(发送)或 Peripheral To Memory(接收)。
  • 4. 轮询模式代码实现

    轮询模式下,发送与接收数据需要不断查询串口状态,并使用 HAL_UART_TransmitHAL_UART_Receive 函数。

    #include "stm32f4xx_hal.h"
    
    UART_HandleTypeDef huart1;
    
    void SystemClock_Config(void);
    void MX_USART1_UART_Init(void);
    
    int main(void) {
        HAL_Init();
        SystemClock_Config();
        MX_USART1_UART_Init();
    
        uint8_t tx_data[] = "Hello, USART Polling Mode!\r\n";
        uint8_t rx_data[10] = {0};
    
        while (1) {
            // 轮询发送数据
            HAL_UART_Transmit(&huart1, tx_data, sizeof(tx_data) - 1, HAL_MAX_DELAY);
            
            // 轮询接收数据
            HAL_UART_Receive(&huart1, rx_data, sizeof(rx_data), HAL_MAX_DELAY);
    
            // 根据接收到的数据进行处理
            HAL_Delay(1000);
        }
    }
    
    void MX_USART1_UART_Init(void) {
        huart1.Instance = USART1;
        huart1.Init.BaudRate = 115200;
        huart1.Init.WordLength = UART_WORDLENGTH_8B;
        huart1.Init.StopBits = UART_STOPBITS_1;
        huart1.Init.Parity = UART_PARITY_NONE;
        huart1.Init.Mode = UART_MODE_TX_RX;
        huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
        huart1.Init.OverSampling = UART_OVERSAMPLING_16;
        HAL_UART_Init(&huart1);
    }
    

    优点:

  • 实现简单,无需额外的中断或 DMA 设置。
  • 缺点:

  • 占用 CPU 资源较多,不适合高频数据传输。
  • 5. 中断模式代码实现

    中断模式可以减少 CPU 负担。当数据接收完成时,触发中断,并在中断回调函数中处理数据。

    5.1 中断初始化

    首先,在 CUBEMX 中启用 USART1 的中断功能。接着编写代码。

    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
        if (huart->Instance == USART1) {
            // 接收完成回调函数
            HAL_UART_Transmit(&huart1, (uint8_t *)"Data received\r\n", 15, HAL_MAX_DELAY);
            // 重新启用接收中断
            HAL_UART_Receive_IT(&huart1, rx_data, sizeof(rx_data));
        }
    }
    
    int main(void) {
        HAL_Init();
        SystemClock_Config();
        MX_USART1_UART_Init();
    
        uint8_t tx_data[] = "Hello, USART Interrupt Mode!\r\n";
        uint8_t rx_data[10] = {0};
    
        // 启用接收中断
        HAL_UART_Receive_IT(&huart1, rx_data, sizeof(rx_data));
    
        while (1) {
            HAL_UART_Transmit(&huart1, tx_data, sizeof(tx_data) - 1, HAL_MAX_DELAY);
            HAL_Delay(1000);
        }
    }
    

    5.2 中断回调函数

    当接收到数据时,STM32 会触发 HAL_UART_RxCpltCallback 回调函数。我们可以在该函数中对接收的数据进行处理,并重新启用中断。

    优点:

  • 有效减少 CPU 资源的占用,响应速度快。
  • 缺点:

  • 需要处理较为复杂的中断优先级和回调机制。
  • 6. DMA 模式代码实现

    DMA 模式用于大批量数据的传输,通过 DMA 控制器将数据自动传输到内存或外设,无需 CPU 介入,适合长时间、大数据传输场景。

    6.1 DMA 初始化

    在 CUBEMX 中启用 DMA 功能,并配置 DMA 通道。然后在代码中进行 DMA 的初始化与使用。

    void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
        if (huart->Instance == USART1) {
            // 发送完成回调
            HAL_UART_Transmit(&huart1, (uint8_t *)"DMA Transmit Complete\r\n", 23, HAL_MAX_DELAY);
        }
    }
    
    int main(void) {
        HAL_Init();
        SystemClock_Config();
        MX_USART1_UART_Init();
    
        uint8_t tx_data[] = "Hello, USART DMA Mode!\r\n";
        uint8_t rx_data[10] = {0};
    
        // 使用 DMA 发送数据
        HAL_UART_Transmit_DMA(&huart1, tx_data, sizeof(tx_data) - 1);
    
        // 使用 DMA 接收数据
        HAL_UART_Receive_DMA(&huart1, rx_data, sizeof(rx_data));
    
        while (1) {
            HAL_Delay(1000);  // 主循环中不需要频繁处理数据
        }
    }
    

    6.2 回调函数

    与中断模式类似,DMA 模式中也有回调函数来处理数据传输完成事件。

    优点:

  • 对 CPU 影响最小,适合大数据量传输。
  • 缺点:

  • 实现较复杂,尤其是 DMA 配置和回调函数的处理。
  • 7. 总结

    本文介绍了 STM32 串口的三种模式(轮询模式、中断模式和 DMA 模式)在 CUBEMX 中的配置和代码实现。这三种模式各有优缺点,开发者可以根据实际应用场景选择合适的模式:

  • 轮询模式:简单,但占用 CPU 时间,适合小数据量、低速通信。
  • 中断模式:高效,占用 CPU 资源少,适合中等数据量、
  • 响应速度要求高的场景。

  • DMA 模式:最为高效,适合大数据量、长时间的数据传输。
  • 在实际项目中,根据不同的需求,选择最合适的模式可以极大提高系统的性能。

    作者:一只蜗牛儿

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【STM32】CUBEMX之串口:串口三种模式(轮询模式、中断模式、DMA模式)的配置与使用

    发表回复