使用cubeide+stm32f4进行调试,发现UART4串口会被莫名的关掉,导致不能接收数据,经过排查如下:
- HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
- {
- uint8_t *pdata8bits;
- uint16_t *pdata16bits;
- uint32_t tickstart = 0U;
-
- // 、、、
- /* Process Unlocked */
- __HAL_UNLOCK(huart);
-
- while (huart->TxXferCount > 0U)
- {
- if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
- {
- return HAL_TIMEOUT;
- }
- if (pdata8bits == NULL)
- {
- huart->Instance->DR = (uint16_t)(*pdata16bits & 0x01FFU);
- pdata16bits++;
- }
- else
- {
- huart->Instance->DR = (uint8_t)(*pdata8bits & 0xFFU);
- pdata8bits++;
- }
- huart->TxXferCount--;
- }
-
- // 、、、
- }
其中的超时检测函数
UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout)
会检测发送是否超时,
- /**
- * @brief This function handles UART Communication Timeout.
- * @param huart Pointer to a UART_HandleTypeDef structure that contains
- * the configuration information for the specified UART module.
- * @param Flag specifies the UART flag to check.
- * @param Status The new Flag status (SET or RESET).
- * @param Tickstart Tick start value
- * @param Timeout Timeout duration
- * @retval HAL status
- */
- static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status,
- uint32_t Tickstart, uint32_t Timeout)
- {
- /* Wait until flag is set */
- while ((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status)
- {
- /* Check for the Timeout */
- if (Timeout != HAL_MAX_DELAY)
- {
- if ((Timeout == 0U) || ((HAL_GetTick() - Tickstart) > Timeout))
- {
- /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
- /* 居然把中断都给我关掉了!!!!!!!!!!!!!!!!! */
- ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE));
- ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
-
- huart->gState = HAL_UART_STATE_READY;
- huart->RxState = HAL_UART_STATE_READY;
-
- /* Process Unlocked */
- __HAL_UNLOCK(huart);
-
- return HAL_TIMEOUT;
- }
- }
- }
- return HAL_OK;
- }
超时之后居然把中断都给我关掉了。真是没有天理了。
ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE));
想不通为什么这么做。有知道的可以告诉一声。