stm32h7串口发送寄存器空中断

关于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)。
触发条件: 当所有数据都发送完成,包括移位寄存器中的数据发送完毕,并且标志位 TC(Transmission 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。不然程序会一直在发送数据,跳不出中断,while(1)中的程序无法执行。中断里本就不允许有延时操作。

我的main.c里的大循环while(1)里只做了点灯操作
在这里插入图片描述

效果

烧录下载,就可以看到打印效果了。同时led灯正常闪烁。
在这里插入图片描述

### 回答1: STM32H7系列微控制器具有DMA(Direct Memory Access)功能,可以通过DMA实现高效的串口通信。DMA超时中断是指当通过DMA进行串口数据传输时,如果在设定的超时时间内未能完成传输,则会触发DMA超时中断。 在STM32H7中,可以通过以下步骤来配置串口DMA超时中断: 1. 首先,要确保已经正确配置了串口和DMA。通过使能对应的串口和DMA时钟,并进行相应的GPIO配置。 2. 在DMA控制器寄存器中配置DMA的通道、传输方向、传输数据的大小等参数。可以使用HAL库提供的DMA初始化函数来进行配置。 3. 在串口寄存器中配置串口的工作模式、波特率和数据位数等参数。同样可以使用HAL库提供的串口初始化函数来进行配置。 4. 在DMA配置完成后,需要配置DMA的超时功能。可以通过设置DMA的超时周期和超时中断标志来实现。通过设置超时周期,可以确定DMA在指定时间内未完成数据传输时触发中断。同时,需要设置超时标志以启用超时中断功能。 5. 最后,启用DMA和串口,开始数据传输。可以通过使能DMA和串口传输完成中断来进行数据传输的管理。 在发生超时中断时,可以在中断服务函数中进行相应的处理操作,例如重启DMA传输、重新发送数据等。 总而言之,STM32H7串口DMA超时中断可以通过正确配置串口、DMA和DMA超时功能来实现。在触发超时中断时,可以在中断服务函数中进行相应的处理操作,确保数据传输的稳定性和可靠性。 ### 回答2: STM32H7系列微控制器使用DMA(Direct Memory Access,直接内存访问)和串口来实现高效的数据传输。DMA超时中断是指在进行串口数据传输时,如果DMA传输超时(即传输时间超过预设的时间),则会触发超时中断,以便及时处理异常情况。 在STM32H7中,DMA超时中断可以通过以下步骤来实现:首先,需要设置串口的超时时间,通过设置USART_CR2寄存器的TO字段,将超时时间设置为一个适当的值。接下来,打开串口的超时中断使能位,通过设置USART_CR1寄存器的TOIE字段为1,使能超时中断。然后,通过STM32H7的DMA控制器设置DMA的传输时间,以确保在设置超时时间后,如果DMA传输的时间超过了设定的超时时间,就会触发超时中断。 当DMA超时中断发生时,CPU会跳转到相应的中断处理函数进行处理。在中断处理函数中,我们可以根据具体的需求进行处理,例如关闭UART的DMA传输,重启传输等。同时,还可以通过读取USART_SR寄存器的TO字段来清除超时中断标志位。 总之,STM32H7系列微控制器提供了灵活的串口DMA超时中断功能,可以帮助我们实现高效可靠的数据传输,提高系统的稳定性和可靠性。在使用过程中,需要根据具体的应用需求进行合理的设置和处理。 ### 回答3: STM32H7系列的MCU支持串口DMA超时中断功能。串口DMA超时中断是一种特殊的DMA传输模式,用于在数据传输超时时触发中断。 在串口DMA超时中断模式下,通过设置串口的超时模式和超时值来配置。超时模式可以选择基于帧错误或空闲线路的超时,并且可以配置超时值来指定超时时间。 当数据传输超时时,串口DMA控制器会触发超时中断,并执行相应的中断服务程序。在中断服务程序中,可以采取适当的措施来处理超时情况,例如重新启动DMA传输或向主控制器报告超时错误等。 使用串口DMA超时中断功能可以大幅度提高串口通信的可靠性和稳定性。它可以帮助检测和处理数据传输的异常情况,例如数据丢失或传输错误,从而减少了数据传输的风险。 需要注意的是,在使用串口DMA超时中断功能时,需要正确配置串口的超时模式和超时值,以及相应的中断服务程序。此外,还需要确保其他相关的串口、DMA和时钟设置也正确,并根据实际需求进行适当的调试和优化。 总之,STM32H7系列的MCU支持串口DMA超时中断功能,它是一种有效的机制来处理串口通信中的传输超时情况,提高串口通信的可靠性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值