STM32 中断接收
在 STM32 中使用中断进行数据接收(尤其是串口 UART/USART)是嵌入式开发中常见的方法,它允许 CPU 在数据到达时被即时通知并处理,避免轮询等待。以下是关键步骤和要点(以 HAL 库为例,概念适用于其他库):
主要步骤
-
初始化外设并启用中断:
- 配置外设(如 UART):
- 波特率、数据位、停止位、校验位等。
- 使能接收(
RX模式)。
- 配置中断控制器(NVIC):
- 选择接收完成中断(例如:
USART_IT_RXNE,UART_IT_RXNE,或在 HAL 中是UART_IT_RXNE)。 - 设置该中断的优先级(抢占优先级和子优先级)。
- 使能(Enable)该中断通道(IRQ Channel)的中断。
- 选择接收完成中断(例如:
- 配置外设(如 UART):
-
编写中断服务程序 (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 代码。
- 检查中断源:使用
- STM32 每个中断源(IRQ)有对应的预定义的中断服务函数名(可在启动文件或 CubeMX 生成代码中找到,如
-
(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)。 - 处理完成的数据:在这个回调函数中处理接收到的完整一帧数据(例如:解析指令、设置标志通知主循环等)。
- 用户需提供一个缓冲区
- 当使用
关键点与注意事项
- 中断服务程序要短小精悍:避免在 ISR 内部做复杂操作(如延时、耗时计算、打印等)。仅做必要操作(读数据、存数据、清除标志、设标志)。复杂处理应放在主循环或基于标志位触发。
- 清除中断标志:一定要在 ISR 内清除触发本次中断的标志位,否则会立即再次进入中断,导致程序卡死。
- 缓冲区与数据竞争:如果在 ISR 中填充环形缓冲区或在主程序中读取该缓冲区,需要使用临界区保护(关中断/开中断)或原子操作来防止数据不一致。HAL 的回调函数在主程序上下文中执行,无需中断保护。
- 中断优先级:合理设置中断优先级,特别是多个中断源或需要快速响应的情况(例如 Modbus RTU)。考虑关键中断的抢占。
- 错误处理:考虑实现
HAL_UART_ErrorCallback()回调函数来处理 UART 错误(如帧错误、噪声错误、溢出错误等)。 HAL_UART_Receive_IT与USARTx_IRQHandler的关系:HAL_UART_Receive_IT启动接收:设置目标缓冲区指针、剩余字节计数器、使能 RXNE 中断(如果还没使能的话)。USARTx_IRQHandler中的 HAL 处理:检测到 RXNE 中断 → 调用HAL_UART_IRQHandler(&huartX)。HAL_UART_IRQHandler:读取DR寄存器 → 放入pRxBuffPtr指向的缓冲区 →pRxBuffPtr++,RxXferCount--→ 如果RxXferCount == 0,则关闭 RXNE 中断 (如果需要) 并调用HAL_UART_RxCpltCallback→ 清除中断标志和可能的错误标志。- 重启接收:在回调函数处理完数据后,如果需要持续接收,记得再次调用
HAL_UART_Receive_IT(&huartX, pData, Size)来设置下一次接收。通常 Size=1 用于字节中断接收。
- DMA vs 中断:对于高速或大数据量传输,DMA 是更好的选择,因为它进一步减少 CPU 干预。可以将 DMA 完成中断与接收完成中断结合使用。
示例代码片段 (使用 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中断怎么处理的
STM32是一款非常强大的微控制器系列,具有丰富的外设和功能。中断是STM32中非常重要的部分,能够帮助我们提高系统的响应速度和效率。本文将详细
2024-01-02 17:35:10
STM32 HAL CubeMX 串口IDLE接收空闲中断+DMA
方法:一种是 :IDLE 接收空闲中断+DMA一种是: IDLE 接收空闲中断
资料下载
张龙祥
2021-12-20 19:39:04
STM32 串口使用IDLE中断+DMA接收(HAL库函数)
STM32 串口使用IDLE中断+DMA接收(HAL库函数)一、开发环境单片机型号:S
资料下载
佚名
2021-12-02 21:06:07
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览