122 if (port.queue_info_->Peek(info) != ErrorCode::OK)
124 return ErrorCode::EMPTY;
127 uint8_t *buffer =
nullptr;
128 bool use_pending =
false;
130 if (uart->uart_handle_->gState == HAL_UART_STATE_READY)
132 buffer =
reinterpret_cast<uint8_t *
>(uart->dma_buff_tx_.
ActiveBuffer());
136 buffer =
reinterpret_cast<uint8_t *
>(uart->dma_buff_tx_.
PendingBuffer());
140 if (port.queue_data_->
PopBatch(
reinterpret_cast<uint8_t *
>(buffer),
141 info.data.
size_) != ErrorCode::OK)
144 return ErrorCode::EMPTY;
150 if (uart->uart_handle_->gState == HAL_UART_STATE_READY)
152 uart->dma_buff_tx_.
Switch();
156 return ErrorCode::FAILED;
160 port.queue_info_->Pop(uart->write_info_active_);
163 SCB_CleanDCache_by_Addr(
reinterpret_cast<uint32_t *
>(uart->dma_buff_tx_.
ActiveBuffer()),
167 auto ans = HAL_UART_Transmit_DMA(
168 uart->uart_handle_,
static_cast<uint8_t *
>(uart->dma_buff_tx_.
ActiveBuffer()),
173 port.
Finish(
false, ErrorCode::FAILED, info, 0);
176 return ErrorCode::FAILED;
179 return ErrorCode::FAILED;
187 return ErrorCode::EMPTY;
191 uint32_t tx_queue_size = 5)
192 :
UART(&_read_port, &_write_port),
193 _read_port(dma_buff_rx.
size_),
194 _write_port(tx_queue_size, dma_buff_tx.
size_ / 2),
195 dma_buff_rx_(dma_buff_rx),
196 dma_buff_tx_(dma_buff_tx),
197 uart_handle_(uart_handle),
198 id_(STM32_UART_GetID(uart_handle_->Instance))
200 ASSERT(id_ != STM32_UART_ID_ERROR);
204 if ((uart_handle->Init.Mode & UART_MODE_TX) == UART_MODE_TX)
206 ASSERT(uart_handle_->hdmatx != NULL);
210 if ((uart_handle->Init.Mode & UART_MODE_RX) == UART_MODE_RX)
212 ASSERT(uart_handle->hdmarx != NULL);
214 uart_handle_->hdmarx->Init.Mode = DMA_CIRCULAR;
215 HAL_DMA_Init(uart_handle_->hdmarx);
217 __HAL_UART_ENABLE_IT(uart_handle, UART_IT_IDLE);
219 HAL_UART_Receive_DMA(uart_handle,
reinterpret_cast<uint8_t *
>(dma_buff_rx_.
addr_),
227 uart_handle_->Init.BaudRate = config.
baudrate;
232 uart_handle_->Init.Parity = UART_PARITY_NONE;
233 uart_handle_->Init.WordLength = UART_WORDLENGTH_8B;
236 uart_handle_->Init.Parity = UART_PARITY_EVEN;
237 uart_handle_->Init.WordLength = UART_WORDLENGTH_9B;
240 uart_handle_->Init.Parity = UART_PARITY_ODD;
241 uart_handle_->Init.WordLength = UART_WORDLENGTH_9B;
250 uart_handle_->Init.StopBits = UART_STOPBITS_1;
253 uart_handle_->Init.StopBits = UART_STOPBITS_2;
259 if (HAL_UART_Init(uart_handle_) != HAL_OK)
261 return ErrorCode::INIT_ERR;
263 return ErrorCode::OK;
273 size_t last_rx_pos_ = 0;
275 UART_HandleTypeDef *uart_handle_;
277 stm32_uart_id_t id_ = STM32_UART_ID_ERROR;
279 static STM32UART *map[STM32_UART_NUMBER];
void Finish(bool in_isr, ErrorCode ans, WriteInfoBlock &info, uint32_t size)
更新写入操作的状态。 Updates the status of the write operation.