STM32使用HAL库时 UART ErrorCode

在STM32的UART(通用异步收发传输器)通信中,ErrorCode用于指示UART通信过程中发生的错误。这些错误码通常定义在STM32 HAL(硬件抽象层)库中,以便用户能够方便地识别和处理各种通信错误。以下是一些常见的STM32 UART ErrorCode及其描述:

  1. HAL_UART_ERROR_NONE
    • 描述:无错误。
    • 值:通常定义为0x00。
  2. HAL_UART_ERROR_PE
    • 描述:奇偶校验错误。当接收到的数据字节的奇偶校验位与预期不符时发生。
    • 值:一个特定的错误码,具体值取决于HAL库的实现。
  3. HAL_UART_ERROR_NE
    • 描述:噪声错误或帧错误(虽然HAL库中可能未直接定义HAL_UART_ERROR_NE,但这里为描述性说明)。这通常是由于线路噪声或信号不同步导致的。
    • 值:与帧错误(FE)相关的错误码,具体值取决于HAL库的实现。
  4. HAL_UART_ERROR_FE
    • 描述:帧错误。当接收到的数据帧不符合预期格式时发生,例如,检测到起始位或停止位错误。
    • 值:一个特定的错误码,具体值取决于HAL库的实现。
  5. HAL_UART_ERROR_ORE
    • 描述:上溢错误。当接收缓冲区已满,但新的数据仍被接收时发生。
    • 值:一个特定的错误码,具体值取决于HAL库的实现。
  6. HAL_UART_ERROR_DMA
    • 描述:DMA(直接内存访问)错误。当使用DMA进行UART通信时,可能发生的与DMA相关的错误。
    • 值:一个特定的错误码,具体值取决于HAL库的实现。

请注意,具体的错误码和值可能会因STM32系列、型号和HAL库版本的不同而有所差异。因此,在编写代码时,建议查阅相关的STM32参考手册和HAL库文档,以获取准确的错误码和值。

在STM32的UART通信中,通常会在中断服务程序(ISR)或回调函数(如HAL_UART_RxCpltCallbackHAL_UART_ErrorCallback)中检查ErrorCode的值,以便对发生的错误进行适当的处理。例如,当检测到奇偶校验错误时,可以选择记录错误、重新发送数据或采取其他恢复措施。

以下是STM32F407 HALuart发送函数的示例代码: ``` /** * @brief Sends an amount of data through the UARTx peripheral. * @param huart: UART handle. * @param pData: Pointer to data buffer. * @param Size: Amount of data to be sent. * @retval HAL status. */ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) { uint16_t* tmp; uint16_t uhMask; uint32_t tickstart = 0U; /* Check that a Tx process is not already ongoing */ if(huart->gState == HAL_UART_STATE_READY) { /* Compile time check if possible */ #if (USE_HAL_UART_REGISTER_CALLBACKS == 1) /* Call registered Tx complete callback */ huart->TxCpltCallback(huart); #else /* Tx transfer start */ huart->gState = HAL_UART_STATE_BUSY_TX; #endif /* USE_HAL_UART_REGISTER_CALLBACKS */ huart->ErrorCode = HAL_UART_ERROR_NONE; if(huart->Init.WordLength == UART_WORDLENGTH_9B) { if(huart->Init.Parity == UART_PARITY_NONE) { tmp = (uint16_t*) pData; uhMask = 0x01FFU; /* 9 bits */ } else { tmp = (uint16_t*) pData; uhMask = 0x00FFU; /* 8 bits + parity */ } } else { tmp = (uint16_t*) pData; uhMask = 0x007FU; /* 7 bits */ } huart->TxXferCount = Size; /* To avoid building warning message */ /* (__GNUC__ compiler: cast between incompatible function types) */ /* cast pData to uint16_t* in case of 9bits or 8bits + parity format */ huart->pTxBuffPtr = (uint8_t*)(tmp); huart->TxXferSize = Size; /* Process Locked */ __HAL_LOCK(huart); /* Enable the UART Transmit data register empty Interrupt */ __HAL_UART_ENABLE_IT(huart, UART_IT_TXE); tickstart = HAL_GetTick(); while(huart->TxXferCount > 0U) { if((Timeout == 0U) || ((HAL_GetTick()-tickstart) > Timeout)) { huart->gState = HAL_UART_STATE_TIMEOUT; /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_TIMEOUT; } } /* At end of Tx process, restore huart->pTxBuffPtr and huart->TxXferSize (could have been changed during Tx process) */ huart->pTxBuffPtr = pData; huart->TxXferSize = Size; /* Disable the UART Transmit data register empty Interrupt */ __HAL_UART_DISABLE_IT(huart, UART_IT_TXE); /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */ __HAL_UART_DISABLE_IT(huart, UART_IT_ERR); /* Process Unlocked */ __HAL_UNLOCK(huart); /* Call Tx complete callback */ #if (USE_HAL_UART_REGISTER_CALLBACKS == 1) /* Call registered Tx complete callback */ huart->TxCpltCallback(huart); #else /* Call legacy weak Tx complete callback */ HAL_UART_TxCpltCallback(huart); #endif /* USE_HAL_UART_REGISTER_CALLBACKS */ return HAL_OK; } else { return HAL_BUSY; } } ``` 此函数将发送数据缓冲区指针,要发送的数据大小和超作为参数。在调用此函数之前,必须先初始化UART外设和使用HAL_UART_MspInit()函数配置外设钟、GPIO等引脚。在发送数据之后,可以使用回调函数处理传输完成事件,或者使用轮询检查状态。在数据传输期间,数据将通过UART外设发送,并在传输完成后通过回调函数或轮询调用进行通知。如果传输过程中超,函数将返回HAL_TIMEOUT状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值