STM32CubeIDE如何禁用USART接收中断?附项目需求
解决STM32 USART接收中断禁用问题
方法1:使用HAL官方API(推荐)
HAL库提供了专门中止中断模式接收的函数 HAL_UART_AbortReceive_IT,调用它会自动禁用USART的接收相关中断,并清理中断状态标记,是最安全的标准做法:
if (HAL_GetTick()-currTime > 250) { // 禁用USART2接收中断 HAL_UART_AbortReceive_IT(&huart2); timeoutted ++; }
方法2:直接操作寄存器(底层方式)
如果需要更直接的硬件控制,可通过HAL宏禁用接收相关的中断位,核心需要关闭接收非空中断(RXNEIE)和奇偶错误中断(PEIE):
if (HAL_GetTick()-currTime > 250) { // 禁用USART2接收相关中断 __HAL_UART_DISABLE_IT(&huart2, UART_IT_RXNE | UART_IT_PE); timeoutted ++; }
额外修正:你的现有代码逻辑问题
注意你在250ms等待循环内反复调用 HAL_UART_Receive_IT,这会重复注册接收中断,导致中断逻辑混乱。正确做法是仅在发送CAN消息后调用一次:
修正后的主循环示例:
while (1) { /* USER CODE BEGIN 3 */ i = rand() % 250 ; CAN_TxData[0] = i ; came = 1; currTime = HAL_GetTick(); // 发送CAN消息 HAL_CAN_AddTxMessage(&hcan1, &CAN_TxHeader, CAN_TxData, &CAN_TxMailBox); // 仅注册一次接收中断 HAL_UART_Receive_IT(&huart2, TTL_RxData, 8); // 等待250ms或收到数据(由came变量控制) while((HAL_GetTick()-currTime <= 250) && came) { // 可添加短延时降低CPU占用 HAL_Delay(1); } if (HAL_GetTick()-currTime > 250) { HAL_UART_AbortReceive_IT(&huart2); timeoutted ++; } /* USER CODE END 3 */ }
同时要在USART接收完成回调函数 HAL_UART_RxCpltCallback 中,将 came 置0以跳出等待循环,并完成数据校验统计。
内容的提问来源于stack exchange,提问作者ouston
相关产品推荐
相关产品推荐

