-
目录
发送完成回调(HAL_UART_TxCpltCallback)
接收完成回调(HAL_UART_RxCpltCallback)
接收完成后空闲回调(HAL_UARTEx_RxEventCallback)
引言
- 项目基于STM32F103C8T6开发,工程代码基于CubeMX生成。
- 具体代码生成步骤见用CubeMX生成STM32F103C8T6的工程。
- 串口初步使用见CubeMX生成STM32工程文件,对串口测试使用(一)
- 本节对生成的工程代码进行初步的解析,实现利用串口中断完成数据收发和数据解析功能。
-
中断处理流程(前提为使用中断方式发送 / 接收)
-
中断触发
-
硬件层面
- 当 UART满足中断条件时,硬件会自动将中断请求标志位置位。当UART 接收数据寄存器非空(RXNE)或者发送完成(TC)等情况发生时,对应的中断标志位就会被置位。
- 这里的中断触发的条件是串口接收到数据或者发送数据
-
中断使能
- 在硬件触发中断的同时,还需要确保中断是被使能的。在 STM32 的 HAL 库中,通过对相应的中断使能寄存器进行设置来开启中断。
- 对于 UART 的接收中断,需要设置 UART 控制寄存器(USART_CR1)中的接收中断使能位(RXNEIE)。只有当中断使能并且中断条件满足时,才会真正触发中断请求。
-
-
中断向量表和中断服务程序(ISR)入口
-
中断向量表
- 当一个中断请求被触发后,处理器会根据中断向量表来找到对应的中断服务程序的入口地址。中断向量表是一个存储了中断服务程序入口地址的表格,每个中断源在向量表中都有对应的位置,中断向量表位于.s文件中。

- 不同的 STM32 芯片系列可能会有不同的中断向量表结构,但基本原理相同。
-
中断服务程序入口
- 以 UART1 的接收中断为例,当中断发生时,处理器会跳转到
USART1_IRQHandler这个中断服务程序入口,该函数位于stm32f1xx_it.c中。 - 在 HAL 库中,这个中断服务程序通常是由用户定义的,但一般会在其中调用 HAL 库提供的中断处理函数。
-
-
HAL 库中断处理函数调用
-
HAL_UART_IRQHandler函数调用 - 在中断服务程序中,如
USART1_IRQHandler,通常会调用HAL_UART_IRQHandler函数,并且将对应的UART_HandleTypeDef结构体指针(如&huart1)作为参数传入。这个函数是 HAL 库中 UART 中断处理的核心函数。 -
/** * @brief This function handles USART1 global interrupt. */ void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(&huart1); /* USER CODE BEGIN USART1_IRQn 1 */ /* USER CODE END USART1_IRQn 1 */ } -
HAL_UART_IRQHandler内部处理-
中断源判断
HAL_UART_IRQHandler函数首先会检查 UART 的状态寄存器,以确定是哪种中断源触发了中断,它会检查接收数据寄存器非空(RXNE)标志位来判断是否是接收中断,或者检查发送完成(TC)标志位来判断是否是发送中断。
-
-
| 标志位 | 功能描述 | 触发条件 | 中断作用 | 清除方式 |
|---|---|---|---|---|
| RXNE | 指示接收数据寄存器中有新数据待读取 | 当完整的数据字节接收完成并存储到接收数据寄存器后触发 | 触发接收中断,读取接收数据并存储到缓冲区,更新接收相关状态 | 对USART_RDR的读 操作可以将该位清零,也可以将USART_RQR的RXFRQ位置1实现清除标志。 |
| TC | 表示一帧数据发送已经完成 | 在数据位、停止位等所有数据发送结束后触发 | 触发发送完成中断,进行发送完成后的操作,调用发送完成回调函数 | 对USART_TDR的写操作可 以清零该位,也可以将USART_ICR的TCCF位置1实现清除标志 |
| IDLE | 用于标识串口接收线路处于空闲状态 | 在接收数据过程中,一段时间没有新的数据接收时触发 | 触发空闲中断,确定不定长数据接收完成,处理数据,重新启动接收流程 | 将USART_ICR的IDLECF位置1实现清除标志。 |
| TXE | 表明发送数据寄存器已空,可加载新的数据 | 当发送数据寄存器中的数据发送出去后,寄存器为空时触发 | 触发发送数据寄存器空中断,加载下一个待发送的数据字节 | 对USART_TDR的写操 作,将该位清零,也可以将USART_RQR的TXFRQ位置1实现清除标志。 |
| PE |

最低0.47元/天 解锁文章
298

被折叠的 条评论
为什么被折叠?



