Помогите разобраться со значениями ErrorCode. Пробую передавать и принимать данные по USART1 на плате Blue Pill (микроконтроллер STM32F103). В определенный момент обмен по какой-то причине прекращается. В результате отладки заметил, что значение ErrorCode в UART_HandleTypeDef huart4 (huart4.ErrorCode) не нулевое. Вот это поле структуры в самом низу:
typedef struct __UART_HandleTypeDef { USART_TypeDef *Instance; /*!< UART registers base address */ UART_InitTypeDef Init; /*!< UART communication parameters */ const uint8_t *pTxBuffPtr; /*!< Pointer to UART Tx transfer Buffer */ uint16_t TxXferSize; /*!< UART Tx Transfer size */ __IO uint16_t TxXferCount; /*!< UART Tx Transfer Counter */ uint8_t *pRxBuffPtr; /*!< Pointer to UART Rx transfer Buffer */ uint16_t RxXferSize; /*!< UART Rx Transfer size */ __IO uint16_t RxXferCount; /*!< UART Rx Transfer Counter */ __IO HAL_UART_RxTypeTypeDef ReceptionType; /*!< Type of ongoing reception */ __IO HAL_UART_RxEventTypeTypeDef RxEventType; /*!< Type of Rx Event */ DMA_HandleTypeDef *hdmatx; /*!< UART Tx DMA Handle parameters */ DMA_HandleTypeDef *hdmarx; /*!< UART Rx DMA Handle parameters */ HAL_LockTypeDef Lock; /*!< Locking object */ __IO HAL_UART_StateTypeDef gState; /*!< UART state information related to global Handle management and also related to Tx operations. This parameter can be a value of @ref HAL_UART_StateTypeDef */ __IO HAL_UART_StateTypeDef RxState; /*!< UART state information related to Rx operations. This parameter can be a value of @ref HAL_UART_StateTypeDef */ __IO uint32_t ErrorCode; /*!< UART Error code */
Решил начать с расшифровки этого кода, возможно тогда станет понятно в чем глобальная проблема с передачей-приемом.
Приветствую, вот возможные значения:
#define HAL_UART_ERROR_NONE 0x00000000U /*!< No error */ #define HAL_UART_ERROR_PE 0x00000001U /*!< Parity error */ #define HAL_UART_ERROR_NE 0x00000002U /*!< Noise error */ #define HAL_UART_ERROR_FE 0x00000004U /*!< Frame error */ #define HAL_UART_ERROR_ORE 0x00000008U /*!< Overrun error */ #define HAL_UART_ERROR_DMA 0x00000010U /*!< DMA transfer error */ #if (USE_HAL_UART_REGISTER_CALLBACKS == 1) #define HAL_UART_ERROR_INVALID_CALLBACK 0x00000020U /*!< Invalid Callback error */ #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
Благодарю, по этим значениям выяснил что у меня Overrun Error:
HAL_UART_ERROR_ORE
Возможно данные приходят в тот момент, когда контроллер еще не встал на прием, посмотри в этой теме - usart overrun.
Возможно данные приходят в тот момент, когда контроллер еще не встал на прием, посмотри в этой теме - usart overrun.
Судя по описанию похоже на мой случай, буду думать
@aveal в итоге переделал всю систему обмена данными целиком и сделал сброс ошибок как в той теме - полет нормальный, работает стабильно 👍