stm32串口中断接收hal库
时间: 2025-02-06 17:12:25 浏览: 16
STM32 HAL库实现串口中断接收
使用HAL库初始化UART并设置中断处理程序
为了使用STM32的HAL库来实现串口通信中的中断接收,需要先完成基本的硬件和软件配置。这包括启用相应的外设时钟、GPIO端口配置以及USART实例化。
// 初始化 UART 和 GPIO 引脚
void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
}
上述代码展示了如何通过MX_USART1_UART_Init()
函数初始化USART模块及其参数[^2]。
启用中断服务例程(IRQ)
接下来要做的就是注册一个用于响应RXNE标志位变化(即接收到新字符)的ISR——中断服务子程序。该部分通常由CubeMX自动生成,在这里仅需关注具体逻辑编写:
extern uint8_t aRxBuffer[RXBUFFERSIZE]; // 接收缓冲区定义
volatile uint8_t ubReceiveCounter; // 记录已接收字节数目
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET){
__HAL_UART_CLEAR_IDLEFLAG(&huart1); // 清除IDLE标记
while(HAL_UART_GetState(&huart1)!= HAL_UART_STATE_READY){};
HAL_UART_Receive_IT(&huart1,aRxBuffer,RXBUFFERSIZE);
ubReceiveCounter=0;
}
/* USER CODE END USART1_IRQn 1 */
}
这段代码实现了当检测到空闲线状态(IDLE line detected event)发生时触发的数据包结束判断机制,并启动新的DMA传输以继续监听后续到来的信息流[^1].
数据接收回调函数
最后一步是在应用程序层面添加对实际读取动作的支持,也就是每当有数据到达时执行特定的任务:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1){
// 处理接收到的数据...
ProcessReceivedData(aRxBuffer,ubReceiveCounter);
// 准备下一次接收
HAL_UART_Receive_IT(&huart1,(uint8_t *)aRxBuffer,sizeof(aRxBuffer));
}
}
此段落说明了怎样利用回调接口捕获已完成事件通知,并据此安排进一步的操作流程.
相关推荐

















