STM32专题 UART中断
环境搭建:
- 硬件平台:STM32H750XBH6
- 开发环境:STM32CubeMX V6.8.1+KEIL V5.28.0.0
- STM32H750固件版本:package V1.11.0
- 仿真下载驱动:ST-Link
使用外部中断
UART和USART的区别
UART和USART都是用于串行通信的接口,但它们之间存在一些关键区别。下面是它们的定义和主要差异:
- 定义:
- UART (Universal Asynchronous Receiver-Transmitter):是一个无时钟串行通信协议。它使用异步模式,即发送和接收是独立进行,不同步的。这意味着数据字节之间的时间间隔可能是不固定的。
- USART (Universal Synchronous/Asynchronous Receiver-Transmitter):既可以用于同步串行通信也可以用于异步串行通信。在同步模式下,发送方和接收方通过一个外部时钟或数据线上的时钟来同步。
- 同步 vs. 异步:
- UART只支持异步通信。
- USART支持同步和异步通信。这意味着USART是更加灵活的,因为它可以在需要的时候切换到同步模式。
- 时钟:
- UART没有外部时钟信号。它依赖于独立的时钟源,并且在通信的两端,时钟的速率必须相同或非常接近,以确保数据的正确接收。
- USART在同步模式下需要一个外部时钟信号来同步发送和接收操作。
- 用途和应用场景:
- UART是串行通信中最常用的接口之一,用于多种应用,包括与PC、GPS模块、蓝牙模块等的通信。
- USART由于其同步能力,通常用于需要高速、短距离通信的场景,如与其他微控制器或数字接口如SPI进行通信。
- 硬件复杂性:
- UART相对简单,因为它不需要同步逻辑。
- USART由于其同步功能,其硬件实现可能稍微复杂一些。
- 其他特性:
- 一些USART设备可能还支持其他增强功能,如错误检测、自动寻址等。
在实际应用中,很多现代微控制器都提供USART模块,因为它们具有更大的灵活性。但在异步模式下,USART的工作方式与UART基本相同。
我们使用cubemx配置好在结构体中看详细配置,cubemx上的配置情况最后再讲
UART初始化代码
//UART4初始化
UART_HandleTypeDef huart4;
void MX_UART4_Init(void)
{
/* USER CODE BEGIN UART4_Init 0 */
/* USER CODE END UART4_Init 0 */
/* USER CODE BEGIN UART4_Init 1 */
/* USER CODE END UART4_Init 1 */
huart4.Instance = UART4;
huart4.Init.BaudRate = 115200;
huart4.Init.WordLength = UART_WORDLENGTH_8B;
huart4.Init.StopBits = UART_STOPBITS_1;
huart4.Init.Parity = UART_PARITY_NONE;
huart4.Init.Mode = UART_MODE_TX_RX;
huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart4.Init.OverSampling = UART_OVERSAMPLING_16;
huart4.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart4.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart4.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart4) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetTxFifoThreshold(&huart4, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetRxFifoThreshold(&huart4, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_DisableFifoMode(&huart4) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN UART4_Init 2 */
/* USER CODE END UART4_Init 2 */
}
我们看下UART_HandleTypeDef结构体都定义了什么
typedef struct __UART_HandleTypeDef
{
USART_TypeDef *Instance; /*!< UART registers base address */
UART_InitTypeDef Init; /*!< UART communication parameters */
UART_AdvFeatureInitTypeDef AdvancedInit; /*!< UART Advanced Features initialization parameters */
const uint8_t *pTxBuffPtr; /*!< Pointer to UART Tx transfer Buffer */
uint16_t TxXferSize; /*!< UART Tx Transfer size */
__IO uint16_t TxXferCount; /*!< UART Tx Transfer Counter */
uint8_t *pRxBuffPtr; /*!< Pointer to UART Rx transfer Buffer */
uint16_t RxXferSize; /*!< UART Rx Transfer size */
__IO uint16_t RxXferCount; /*!< UART Rx Transfer Counter */
uint16_t Mask; /*!< UART Rx RDR register mask */
uint32_t FifoMode; /*!< Specifies if the FIFO mode is being used.
This parameter can be a value of @ref UARTEx_FIFO_mode. */
uint16_t NbRxDataToProcess; /*!< Number of data to process during RX ISR execution */
uint16_t NbTxDataToProcess; /*!< Number of data to process during TX ISR execution */
__IO HAL_UART_RxTypeTypeDef ReceptionType; /*!< Type of ongoing reception */
__IO HAL_UART_RxEventTypeTypeDef RxEventType; /*!< Type of Rx Event */