个人网站的搭建步骤,做网站的必要条件,上海商城网站开发,福州企业网站建站系统关于stm32串口的发送完成中断UART_IT_TC网上资料挺多的#xff0c;但是使用发送寄存器空中断UART_IT_TXE的不太多
UART_IT_TC 和 UART_IT_TXE区别
UART_IT_TC 和 UART_IT_TXE 是两种不同的 UART 中断源#xff0c;用于表示不同的发送状态。它们的主要区别如下#xff1a; …关于stm32串口的发送完成中断UART_IT_TC网上资料挺多的但是使用发送寄存器空中断UART_IT_TXE的不太多
UART_IT_TC 和 UART_IT_TXE区别
UART_IT_TC 和 UART_IT_TXE 是两种不同的 UART 中断源用于表示不同的发送状态。它们的主要区别如下
UART_IT_TC (Transmission Complete) 定义: UART_IT_TC 是发送完成中断Transmission Complete Interrupt。 触发条件: 当所有数据都发送完成包括移位寄存器中的数据发送完毕并且标志位 TCTransmission Complete被置位时触发。 典型用途: 通常用于指示整个数据包已经完全发送完毕适合于某些需要知道整个数据传输结束的场景。例如在全双工通信中确保在发送下一组数据之前当前发送的数据已经完全传输完毕。 示例: 当发送缓冲区为空且传输已完成通常设置这个中断来执行某些后续操作比如通知主机传输完毕。
UART_IT_TXE (Transmit Data Register Empty) 定义: UART_IT_TXE 是发送数据寄存器空中断Transmit Data Register Empty Interrupt。 触发条件: 当发送数据寄存器TDR为空即刚写入的数据已被移到移位寄存器并且 TDR 可以接受新的数据时触发。 典型用途: 常用于准备下一个要发送的数据适合于需要实现串口发送的持续填充过程。例如在发送数据时确保发送缓存不会溢出。 示例: 当 TDR 为空且可以写入新的数据时通常设置这个中断来连续发送数据。
串口配置
串口配置这个不多介绍 在代码生成中我把 中断回调函数去掉了 然后生成的代码就会是这样子就是中断函数由自己来写了。
代码
在main.c中串口初始化后使能串口的发送寄存器空中断 然后在stm32h7xx_it.c文件中的写USART2_IRQHandler函数。 我这里简单测试是发送hello,world!\r\n
void USART2_IRQHandler(void)
{/* USER CODE BEGIN USART2_IRQn 0 *///发送数据 static uint8_t transmit_data[] hello,world!\r\n;static uint8_t i 0;//发送寄存器空中断if ((__HAL_UART_GET_IT_SOURCE(huart2, UART_IT_TXE)! RESET)(__HAL_UART_GET_FLAG(huart2, UART_FLAG_TXE)! RESET)){huart2.Instance-TDR (uint8_t)transmit_data[i];if(i sizeof(transmit_data)){i 0;}// 清除TXE中断标志__HAL_UART_CLEAR_FLAG(huart2, UART_FLAG_TXE);}/* USER CODE END USART2_IRQn 0 *//* USER CODE BEGIN USART2_IRQn 1 *//* USER CODE END USART2_IRQn 1 */
}我是通过huart2.Instance-TDR (uint8_t)transmit_data[i];直接往TDR寄存器也就是发送数据寄存器写数据串口会自动的把数据从发送寄存器拿到移位寄存器里。
当然也可以通过HAL_UART_Transmit(huart2, (uint8_t*)“a”, 1, 0);这个函数来实现。
在 HAL_UART_Transmit 函数中发送数据的过程如下 函数将数据逐字节或逐字根据配置写入 TDR 寄存器。 写入 TDR 寄存器后UART 外设会自动将数据从 TDR 移到移位寄存器然后通过串行通信接口发送出去。 然后这个函数会等待传输完成标志 UART_FLAG_TC 置位保证所有数据发送完毕并且发送移位寄存器中的数据也已发送完毕
所以我们要注意如果使用这个函数最后一个参数等待时间一定要设为0。不然程序会一直在发送数据跳不出中断while1中的程序无法执行。中断里本就不允许有延时操作。
我的main.c里的大循环while1里只做了点灯操作
效果
烧录下载就可以看到打印效果了。同时led灯正常闪烁。