You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 13:11:37