STM32
直播中

李伟

7年用户 1439经验值
私信 关注
[问答]

STM32L476RG UART_IT_IDLE一打开就卡死的原因?

最近再调试STM32L476RG 串口,使用串口2,在验证DMA空闲中断的时候,
发现初始化的时候    __HAL_UART_ENABLE_IT( huart2, UART_IT_IDLE);        //使能idle中断
一执行这一行代码,程序就不能运行下去,卡在此位置,
验证步骤:
HSE外部晶振都是8M


demo1

stm32cubemx  生成一个demo 仅使用串口4,用来printf输出,串口2验证dma 接收。为了和F103对比  同样的设置时钟pll 72M


初始化的时候 操作

    printf("*****init end ****** n");
        
#ifdef TEStiUART2DMA

    __HAL_UART_ENABLE_IT( huart2, UART_IT_IDLE);        //使能idle中断  卡死
    HAL_UART_Receive_DMA( huart2,UART2_RX_BUF,RECEIVELEN);  //打开DMA接收,数据存入rx_buffer数组中。
    printf("*****init end 222222222****** n");
#else
    HAL_UART_Receive_IT( huart2, uart2rx_buffer,1);    // 重新使能串口1接收中断
    __HAL_UART_DISABLE_IT( huart2,UART_IT_RXNE);

#endif
  /* USER CODE END 2 */

为了对比原因,用stm32f103ret6 板子 stm32cubemx新建了一个同样简单的demo  晶振 pll 72M

串口1 作为printf 串口2 用来验证dma接收,

F103没有任何问题 ,可以正常运行 和接收,

请问有人遇到类似问题吗,谢谢。






回帖(1)

发烧友推温针

2024-4-15 15:40:55
有几种可能的原因会导致在使能UART_IT_IDLE后卡死:

1. 中断优先级配置错误:如果IDLE中断的优先级高于其他中断,可能会导致程序一直停在此处。请确保IDLE中断的优先级低于其他需要处理的中断。

2. IDLE中断标志未被清除:在每次进入IDLE中断处理函数之前,需要手动清除IDLE中断标志位。如果未清除标志位,会导致中断一直触发。

3. 串口传输配置错误:请确保串口的传输参数正确设置,例如波特率、数据位、校验位和停止位。如果参数设置错误,可能会导致无法正常接收数据。

4. 串口DMA配置错误:如果DMA的配置发生错误,可能会导致DMA传输无法完成,从而导致IDLE中断一直触发。请仔细检查DMA的配置是否正确。

5. 时钟配置错误:如果时钟配置错误,可能会导致串口无法正常工作。请确保时钟配置正确,特别是与外部晶振相关的配置。

建议您逐一检查以上可能的原因,查找导致卡死的具体原因。如果需要更详细的帮助,请提供更多的代码和配置信息。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分