HALライブラリのシリアルポートの受信割り込みの問題が壊れています



Hal Library Serial Port Receive Interrupt Problem Broken



問題のHALライブラリシリアルポート割り込みメカニズムのため、ブレークは自動的に割り込みイネーブルフラグを入力してオフにし、割り込みを入力した後にHAL_UART_Receive_IT()を呼び出します

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance==USART2) { if(mUART2.TEMP == '$' && mUART2.FLG == 0) { mUART2.FLG = 1 Uart2_Len = 0 } if(mUART2.FLG) { mUART2.BUF[Uart2_Len] = mUART2.TEMP ++Uart2_Len } if(Uart2_Len >7 && mUART2.BUF[Uart2_Len - 1] == 0x0a) { mUART2.LEN = Uart2_Len Uart2_Len = 0 mUART2.FLG = 0 mUART2.RX_FLG = 1 } HAL_UART_Receive_IT(&huart2,&mUART2.TEMP,RECLEN) } }

問題は、ブレークブレーク割り込みエントリの後、HAL_UART_Receive_IT()関数が割り込みの正常な実行につながらないことです。



HAL_UART_Transmit_ITが送信時に()またはHAL_UART_Transmit()関数を呼び出すときに実行が失敗した理由だけでなく、受信時にも、受信者が高速で送信プロセスで再び失敗した場合、HAL_UART_Receive_IT()関数が失敗すると、基になるHAL_UART_Receive_IT()を調べることができますアクション。

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) { /* Check that a Rx process is not already ongoing */ if (huart->RxState == HAL_UART_STATE_READY) { if ((pData == NULL) || (Size == 0U)) { return HAL_ERROR } /* In case of 9bits/No Parity transfer, pData buffer provided as input parameter should be aligned on a u16 frontier, as data to be received from RDR will be handled through a u16 cast. */ if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) { if ((((uint32_t)pData) & 1) != 0) { return HAL_ERROR } } /* Process Locked */ __HAL_LOCK(huart) huart->pRxBuffPtr = pData huart->RxXferSize = Size huart->RxXferCount = Size huart->RxISR = NULL /* Computation of UART mask to apply to RDR register */ UART_MASK_COMPUTATION(huart) huart->ErrorCode = HAL_UART_ERROR_NONE huart->RxState = HAL_UART_STATE_BUSY_RX /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */ SET_BIT(huart->Instance->CR3, USART_CR3_EIE) /* Set the Rx ISR function pointer according to the data word length */ if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) { huart->RxISR = UART_RxISR_16BIT } else { huart->RxISR = UART_RxISR_8BIT } /* Process Unlocked */ __HAL_UNLOCK(huart) /* Enable the UART Parity Error interrupt and Data Register Not Empty interrupt */ SET_BIT(huart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE) return HAL_OK } else { return HAL_BUSY } }

シリアル実行状態の送信がHAL_UART_STATE_READYでない場合は、HAL_UART_Receive_ITダイレクトリターンHAL_BUSYを入力します。