1#include "stm32_uart.hpp"
3#ifdef HAL_UART_MODULE_ENABLED
7STM32UART *STM32UART::map[STM32_UART_NUMBER] = {
nullptr};
13 return stm32_uart_id_t::STM32_UART_ID_ERROR;
18 return stm32_uart_id_t::STM32_USART1;
24 return stm32_uart_id_t::STM32_USART2;
30 return stm32_uart_id_t::STM32_USART3;
36 return stm32_uart_id_t::STM32_USART4;
42 return stm32_uart_id_t::STM32_USART5;
48 return stm32_uart_id_t::STM32_USART6;
54 return stm32_uart_id_t::STM32_USART7;
60 return stm32_uart_id_t::STM32_USART8;
66 return stm32_uart_id_t::STM32_USART9;
72 return stm32_uart_id_t::STM32_USART10;
78 return stm32_uart_id_t::STM32_USART11;
84 return stm32_uart_id_t::STM32_USART12;
90 return stm32_uart_id_t::STM32_USART13;
94 else if (addr ==
UART1)
96 return stm32_uart_id_t::STM32_UART1;
100 else if (addr ==
UART2)
102 return stm32_uart_id_t::STM32_UART2;
106 else if (addr ==
UART3)
108 return stm32_uart_id_t::STM32_UART3;
112 else if (addr ==
UART4)
114 return stm32_uart_id_t::STM32_UART4;
118 else if (addr ==
UART5)
120 return stm32_uart_id_t::STM32_UART5;
124 else if (addr ==
UART6)
126 return stm32_uart_id_t::STM32_UART6;
130 else if (addr ==
UART7)
132 return stm32_uart_id_t::STM32_UART7;
136 else if (addr ==
UART8)
138 return stm32_uart_id_t::STM32_UART8;
142 else if (addr ==
UART9)
144 return stm32_uart_id_t::STM32_UART9;
150 return stm32_uart_id_t::STM32_UART10;
156 return stm32_uart_id_t::STM32_UART11;
162 return stm32_uart_id_t::STM32_UART12;
168 return stm32_uart_id_t::STM32_UART13;
174 return stm32_uart_id_t::STM32_LPUART1;
180 return stm32_uart_id_t::STM32_LPUART2;
186 return stm32_uart_id_t::STM32_LPUART3;
191 return stm32_uart_id_t::STM32_UART_ID_ERROR;
206 uart->read_port_.queue_data_->PushBatch(
uart->dma_buff_rx_.addr_,
len);
207 uart->read_port_.ProcessPendingReads();
209 reinterpret_cast<uint8_t *
>(
uart->dma_buff_rx_.addr_),
210 uart->dma_buff_rx_.size_);
214void STM32_UART_ISR_Handler_TX_CPLT(stm32_uart_id_t
id)
216 auto uart = STM32UART::map[id];
219 if (
uart->write_port_.queue_info_->Pop(
info) != ErrorCode::OK)
225 uart->write_port_.write_size_ =
uart->uart_handle_->TxXferSize;
226 info.op.UpdateStatus(
true, ErrorCode::OK);
228 if (
uart->write_port_.queue_info_->Peek(
info) != ErrorCode::OK)
233 if (
uart->write_port_.queue_data_->PopBatch(
244 info.op.MarkAsRunning();
249 STM32_UART_ISR_Handler_TX_CPLT(STM32_UART_GetID(
huart->Instance));
256 auto uart = STM32UART::map[STM32_UART_GetID(
huart->Instance)];
258 min(
uart->read_port_.queue_data_->Size(),
len));
260 uart->read_port_.ProcessPendingReads();
270 auto uart = STM32UART::map[STM32_UART_GetID(
huart->Instance)];
273 if (
uart->write_port_.queue_info_->Peek(
info) == ErrorCode::OK)
277 uart->read_port_.Reset();
278 uart->write_port_.Reset();
283 auto uart = STM32UART::map[STM32_UART_GetID(
huart->Instance)];
285 if (
uart->write_port_.queue_info_->Peek(
info) == ErrorCode::OK)
289 uart->write_port_.Reset();
296 STM32UART::map[STM32_UART_GetID(
huart->Instance)]->dma_buff_rx_.size_);
ErrorCode PushBatch(const void *data, size_t size)
批量推入多个元素 (Push multiple elements into the queue).
void UpdateStatus(bool in_isr, Args &&...args)
Updates operation status based on type.
ReadPort read_port_
读取端口 / Read port
LibXR Color Control Library / LibXR终端颜色控制库
constexpr auto min(T1 a, T2 b) -> typename std::common_type< T1, T2 >::type
计算两个数的最小值