登录/注册

STM32 中断接收

更多

在 STM32 中使用中断进行数据接收(尤其是串口 UART/USART)是嵌入式开发中常见的方法,它允许 CPU 在数据到达时被即时通知并处理,避免轮询等待。以下是关键步骤和要点(以 HAL 库为例,概念适用于其他库):

主要步骤

  1. 初始化外设并启用中断

    • 配置外设(如 UART)
      • 波特率、数据位、停止位、校验位等。
      • 使能接收(RX 模式)。
    • 配置中断控制器(NVIC)
      • 选择接收完成中断(例如:USART_IT_RXNEUART_IT_RXNE,或在 HAL 中是 UART_IT_RXNE)。
      • 设置该中断的优先级(抢占优先级和子优先级)。
      • 使能(Enable)该中断通道(IRQ Channel)的中断。
  2. 编写中断服务程序 (ISR - Interrupt Service Routine)

    • STM32 每个中断源(IRQ)有对应的预定义的中断服务函数名(可在启动文件或 CubeMX 生成代码中找到,如 USART1_IRQHandler())。
    • 在该函数中:
      • 检查中断源:使用 __HAL_UART_GET_IT_SOURCE(&huartX, UART_IT_RXNE) 或类似方法确认是否为接收中断。
      • 清除中断标志位__HAL_UART_CLEAR_IT(&huartX, UART_FLAG_RXNE) 或等效操作 (至关重要!否则会连续触发中断)。
      • 读取接收到的数据:从接收数据寄存器(如 huartX.Instance->DR 或使用库函数 HAL_UART_Receive_IT() 管理的缓冲区)。
      • (可选) 将数据存入用户定义的缓冲区、设置标志位或进行初步处理尽量精简 ISR 代码
  3. (HAL 库特有) 处理 HAL_UART_RxCpltCallback 回调函数

    • 当使用 HAL_UART_Receive_IT(&huartX, pData, Size) 函数启动中断接收时:
      • 用户需提供一个缓冲区 pData 和大小 Size
      • 每次收到一个字节,HAL 库的 ISR 会将其放入缓冲区并递减计数器。
      • 当接收到 Size 个字节后,HAL 库会调用 HAL_UART_RxCpltCallback() 函数
      • 用户需要在自己的代码中实现(重写) 这个弱定义 (Weak) 的回调函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
      • 处理完成的数据:在这个回调函数中处理接收到的完整一帧数据(例如:解析指令、设置标志通知主循环等)。

关键点与注意事项

示例代码片段 (使用 HAL 库)

// 1. 定义句柄 (通常在CubeMX生成的部分定义)
UART_HandleTypeDef huart1;
uint8_t RxByte; // 用于单字节中断接收的缓冲区

// 2. 初始化 (通常在MX_USART1_UART_Init()中)
void MX_USART1_UART_Init(void) {
    ... // CubeMX生成的GPIO、USART基本配置
    // 使能USART1中断 (在NVIC配置部分)
    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);
}

// 3. 启动接收中断 (在main初始化后调用)
HAL_UART_Receive_IT(&huart1, &RxByte, 1); // 启动接收一个字节的中断

// 4. 用户实现接收完成回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    if (huart->Instance == USART1) {
        // 处理接收到的字节 (RxByte)
        // 例如: 放入环形缓冲区,设标志等
        ProcessRxByte(RxByte); // 用户自定义处理函数

        // 非常重要:为了持续接收,重新启动中断接收
        HAL_UART_Receive_IT(&huart1, &RxByte, 1);
    }
}

// 5. 预定义的IRQHandler (通常在stm32fXxx_it.c中)
void USART1_IRQHandler(void) {
    HAL_UART_IRQHandler(&huart1); // HAL库的标准中断处理函数
    // 用户代码一般不加在这里
}

标准外设库 (SPL) 提示:概念类似,但函数名不同(如 USART_ITConfig 使能中断, USART_GetITStatus 检查标志, USART_ClearITPendingBit 清除标志, USART_ReceiveData 读取数据)。直接在 USART1_IRQHandler() 中编写接收逻辑(包括读数据、清标志、处理数据、重启接收等)。

通过遵循这些步骤和注意事项,你可以有效地在 STM32 中使用中断实现可靠的数据接收。

stm32串口接收中断触发原理

配置串口接收中断使能:在初始化串口时,需要设置相应的控制寄存器来使能串口接收中断

2024-01-17 15:42:52

stm32中断怎么处理的

STM32是一款非常强大的微控制器系列,具有丰富的外设和功能。中断是STM32中非常重要的部分,能够帮助我们提高系统的响应速度和效率。本文将详细

2024-01-02 17:35:10

STM32如何配置外部中断STM32外部中断配置步骤

STM32如何配置外部中断?STM32外部中断配置步骤  作为一款现代化

2023-10-26 17:47:25

STM32 外部中断实验参考程序

STM32 外部中断实验程序,供STM32初学者参考。

资料下载 郑兵 2021-12-30 10:46:50

STM32 HAL CubeMX 串口IDLE接收空闲中断+DMA

方法:一种是 :IDLE 接收空闲中断+DMA一种是: IDLE 接收空闲中断

资料下载 张龙祥 2021-12-20 19:39:04

STM32使用CubeMAX配置的串口中断接收方法

STM32使用CubeMAX配置的串口中断接收方法目录1.定位串口中断发

资料下载 靓仔峰 2021-12-14 18:45:20

STM32 串口使用IDLE中断+DMA接收(HAL库函数)

STM32 串口使用IDLE中断+DMA接收(HAL库函数)一、开发环境单片机型号:S

资料下载 佚名 2021-12-02 21:06:07

STM32 | 串口空闲中断接收不定长数据(DMA方式)

在使用STM32的串口接收数据的时候,我们常常会使用接收中断的方式来

资料下载 佚名 2021-11-20 12:51:02

STM32串口中断及DMA接收常见的几个问题

STM32串口中断及DMA接收常见的几个问题

2023-10-26 16:41:12

STM32串口中断应用实例

本文将介绍如何使用STM32F4的串口接收中断,通过串口助手模拟上位机发送指令、STM

2023-04-20 11:45:59

STM32关全局中断的方法 STM32中断类型

STM32中断很强大,STM32中断可以嵌套,任何外设都可以产生

2021-07-22 10:52:54

STM32_ EXIT中断

STM32_EXIT中断

2020-04-08 11:12:48

STM32F10x_硬件I2C主从通信 (轮询发送,中断接收

STM32F10x_硬件I2C主从通信(轮询发送,中断接收)

2020-03-25 10:59:11

STM32串口中断 DMA接收的几点注意地方

STM32串口中断、DMA接收的几点注意地方

2020-03-04 13:57:48

STM32中断及FreeRTOS中断优先级配置

STM32中断,及FreeRTOS中断优先级配置

2020-03-04 11:45:36

7天热门专题 换一换
相关标签