• STM32 串口接收中断被莫名关闭


    使用cubeide+stm32f4进行调试,发现UART4串口会被莫名的关掉,导致不能接收数据,经过排查如下:

    1. HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
    2. {
    3. uint8_t *pdata8bits;
    4. uint16_t *pdata16bits;
    5. uint32_t tickstart = 0U;
    6. // 、、、
    7. /* Process Unlocked */
    8. __HAL_UNLOCK(huart);
    9. while (huart->TxXferCount > 0U)
    10. {
    11. if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
    12. {
    13. return HAL_TIMEOUT;
    14. }
    15. if (pdata8bits == NULL)
    16. {
    17. huart->Instance->DR = (uint16_t)(*pdata16bits & 0x01FFU);
    18. pdata16bits++;
    19. }
    20. else
    21. {
    22. huart->Instance->DR = (uint8_t)(*pdata8bits & 0xFFU);
    23. pdata8bits++;
    24. }
    25. huart->TxXferCount--;
    26. }
    27. // 、、、
    28. }

     其中的超时检测函数

    UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout)

    会检测发送是否超时,

    1. /**
    2. * @brief This function handles UART Communication Timeout.
    3. * @param huart Pointer to a UART_HandleTypeDef structure that contains
    4. * the configuration information for the specified UART module.
    5. * @param Flag specifies the UART flag to check.
    6. * @param Status The new Flag status (SET or RESET).
    7. * @param Tickstart Tick start value
    8. * @param Timeout Timeout duration
    9. * @retval HAL status
    10. */
    11. static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status,
    12. uint32_t Tickstart, uint32_t Timeout)
    13. {
    14. /* Wait until flag is set */
    15. while ((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status)
    16. {
    17. /* Check for the Timeout */
    18. if (Timeout != HAL_MAX_DELAY)
    19. {
    20. if ((Timeout == 0U) || ((HAL_GetTick() - Tickstart) > Timeout))
    21. {
    22. /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
    23. /* 居然把中断都给我关掉了!!!!!!!!!!!!!!!!! */
    24. ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE));
    25. ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
    26. huart->gState = HAL_UART_STATE_READY;
    27. huart->RxState = HAL_UART_STATE_READY;
    28. /* Process Unlocked */
    29. __HAL_UNLOCK(huart);
    30. return HAL_TIMEOUT;
    31. }
    32. }
    33. }
    34. return HAL_OK;
    35. }

    超时之后居然把中断都给我关掉了。真是没有天理了。

    ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE)); 

    想不通为什么这么做。有知道的可以告诉一声。

  • 相关阅读:
    springcloud面试题及答案
    基于JAVA三合国际影城计算机毕业设计源码+数据库+lw文档+系统+部署
    element-ui tree组件实现在线增删改
    360度评估前HR必须掌握的优劣势
    C语言 | Leetcode C语言题解之第513题找树左下角的值
    “存储随笔“官方定制python代码月饼免费领取
    基于SpringBoot+MyBatis-Plus的校园图书管理系统
    数组的最小不可组成和问题
    java —— 打印流
    Vue3实现 SKU 规格
  • 原文地址:https://blog.csdn.net/ben392797097/article/details/133881838