STM32串口操作-中断#

TXE(Transmit data register empty)中断#

This bit is set by hardware when the content of the TDR register has been transferred into the shift register. An interrupt is generated if the TXEIE bit =1 in the USART_CR1 register. It is cleared by a write to the USART_DR register. 0: Data is not transferred to the shift register 1: Data is transferred to the shift register

  • 如果使能了TXE中断,当数据从TDR寄存器传输到shift寄存器时,也就是TDR寄存器为空时,将会触发TXE中断,但是数据并不一定被完全发送出去了,数据被完全发送出去之后,将会产生TC中断(如果使能了TC中断)

  • 如果使能了TXE中断,但是没有向USART_DR寄存器写入数据,那么这个中断将不会被清除,将会一直被触发

UART HAL层函数使用注意事项#

  • 参数pData要使用全局变量
// 参数pData要使用全局变量
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

1.使用CubeMX进行串口配置#

Note

System Core配置略

在CubeMX中开启UART global interrupt只会使能NVIC中的相应通道,其他比如UART接收中断,UART空闲中断等需要自己添加代码使能。

使用函数UART_Receive_IT(UART_HandleTypeDef *huart)可以使能接收中断:

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
    // ...

    /* Enable the UART Parity Error Interrupt */
    __HAL_UART_ENABLE_IT(huart, UART_IT_PE);

    /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
    __HAL_UART_ENABLE_IT(huart, UART_IT_ERR);

    /* Enable the UART Data Register not empty Interrupt */
    __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);

    return HAL_OK;
  }
  else
  {
    return HAL_BUSY;
  }
}

或者可以使用宏__HAL_UART_ENABLE_IT直接使能需要的中断。

CubeMX生成的UART中断处理函数,会在接收完指定个数的数据后关闭接收中断。所以在本次数据接收完成后,需要再次开启UART接收中断。

如果DMA开启了循环模式,那么HAL库是不会在DAM中断处理函数中关闭DAM中断的。

2.开启中断#

在main.c中添加


  /* USER CODE BEGIN 2 */
   // 中断方式接收  最后一个参数10表示接收到10个字节才会调用回调函数
   HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 10);

   // DMA方式接收 最后一个参数10表示接收到10个字节才会调用回调函数
  /* USER CODE END 2 */
  HAL_UART_Receive_DMA(&huart1, usart1_rx_buff, 10);


  ......

  /* USER CODE BEGIN 4 */

// 串口接收回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_7);
}


/* USER CODE END 4 */