HAL_UART_Receive 中断
时间: 2024-12-31 08:12:22 浏览: 23
### 关于 HAL_UART_Receive 中断处理
对于 STM32 的 UART 接收操作,`HAL_UART_Receive` 函数可以用于阻塞模式下的数据接收。然而,当涉及到中断驱动的数据接收时,则应采用 `HAL_UART_Receive_IT` 函数来启动异步接收过程[^1]。
#### 初始化配置
为了实现基于中断的 UART 数据接收,在初始化阶段需执行以下设置:
- 调用特定外设的初始化函数(例如 `MX_USART2_UART_Init()`),并确保调用了 `HAL_UART_Init(&huart2)` 来完成硬件资源分配。
- 如果初始化失败,可能需要通过 `HAL_UART_MspInit(huart)` 进行进一步的底层初始化工作。
- 设置 NVIC (嵌套向量中断控制器)优先级,并使能相应的 IRQ 请求以便能够响应外部事件触发的中断请求,如 `HAL_NVIC_SetPriority(USART2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART2_IRQn);`.
```c
// USART2 Initialization Function
static void MX_USART2_UART_Init(void){
huart2.Instance = USART2;
huart2.Init.BaudRate = 9600;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK){
Error_Handler();
}
}
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void){
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init();
/* Enable and set USART2 Interrupt to a lower priority */
HAL_NVIC_SetPriority(USART2_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(USART2_IRQn);
uint8_t rx_buffer;
// Start receiving data using interrupt method.
HAL_UART_Receive_IT(&huart2, &rx_buffer, 1);
while (1){}
}
```
#### 开启接收中断
在主程序循环之前,应该调用 `HAL_UART_Receive_IT(&huart2, (uint8_t *)rx_buf, 1);` 启动一次性的单字节接收任务。每当接收到一个新的字符时就会触发中断服务例程(ISR),ISR内部会自动更新缓冲区中的内容直到达到指定长度为止[^2].
#### 处理接收错误
如果遇到无法正常读取数据的情况,可能是由于超时参数设定不当或其他原因引起的。可以通过调整超时时间或者检查其他可能导致通信异常的因素来进行排查。另外需要注意的是,在某些情况下,直接使用 `HAL_UART_Receive` 可能不会立即返回结果,因为它会在未接收到预期数量的数据前一直等待,这可能会造成看似“无反应”的现象[^3].
阅读全文