libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
stm32_usb.hpp
1#pragma once
2
3#include "double_buffer.hpp"
4#include "main.h"
5#include "stm32_usbx.hpp"
6
7#if defined(HAL_PCD_MODULE_ENABLED) && !defined(LIBXR_SYSTEM_ThreadX)
8
9#ifdef UART
10#undef UART
11#endif
12
13#include <type_traits>
14#include <utility>
15
16#include "libxr_def.hpp"
17#include "libxr_rw.hpp"
18#include "uart.hpp"
19#include "usbd_cdc.h"
20#include "usbd_cdc_if.h"
21
22extern uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
23extern uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
24
25int8_t libxr_stm32_virtual_uart_init(void);
26
27int8_t libxr_stm32_virtual_uart_deinit(void);
28
29int8_t libxr_stm32_virtual_uart_control(uint8_t cmd, uint8_t *pbuf, uint16_t len);
30
31int8_t libxr_stm32_virtual_uart_receive(uint8_t *pbuf, uint32_t *Len);
32
33int8_t libxr_stm32_virtual_uart_transmit(uint8_t *pbuf, uint32_t *Len, uint8_t epnum);
34
35namespace LibXR
36{
37class STM32VirtualUART : public UART
38{
39 public:
40 template <typename, typename = void>
41 struct HasTransmitCplt : std::false_type
42 {
43 };
44
45 template <typename T>
46 struct HasTransmitCplt<T, std::void_t<decltype(std::declval<T>().TransmitCplt)>>
47 : std::true_type
48 {
49 };
50 template <typename T>
51 typename std::enable_if<!HasTransmitCplt<T>::value, USBD_CDC_ItfTypeDef>::type Apply()
52 {
53 return {libxr_stm32_virtual_uart_init, libxr_stm32_virtual_uart_deinit,
54 libxr_stm32_virtual_uart_control, libxr_stm32_virtual_uart_receive};
55 }
56
57 template <typename T>
58 typename std::enable_if<HasTransmitCplt<T>::value, USBD_CDC_ItfTypeDef>::type Apply()
59 {
60 return {libxr_stm32_virtual_uart_init, libxr_stm32_virtual_uart_deinit,
61 libxr_stm32_virtual_uart_control, libxr_stm32_virtual_uart_receive,
62 libxr_stm32_virtual_uart_transmit};
63 }
64
65 using WriteFunctionType = ErrorCode (*)(WritePort &);
66
67 static ErrorCode WriteFun(WritePort &port);
68
69 static ErrorCode ReadFun(ReadPort &port);
70
71 STM32VirtualUART(USBD_HandleTypeDef &usb_handle, uint8_t *tx_buffer = UserTxBufferFS,
72 uint8_t *rx_buffer = UserRxBufferFS, uint32_t tx_queue_size = 5);
73
74 ErrorCode SetConfig(UART::Configuration config);
75
76 static STM32VirtualUART *map[1]; // NOLINT
77
78 USBD_HandleTypeDef *usb_handle_ = nullptr;
79 DoubleBuffer tx_buffer_;
80 DoubleBuffer rx_buffer_;
81
82 WritePort _write_port;
83 ReadPort _read_port;
84
85 WriteInfoBlock write_info_active_;
86 ReadInfoBlock read_info_active_;
87
88#if defined(STM32F1)
89 bool writing_ = false;
90 uint32_t write_size_ = 0;
91#endif
92};
93
94} // namespace LibXR
95
96#endif
ErrorCode SetConfig(UART::Configuration config)
设置 UART 配置 / Sets the UART configuration
通用异步收发传输(UART)基类 / Abstract base class for Universal Asynchronous Receiver-Transmitter (UART)
Definition uart.hpp:19
LibXR 命名空间
Definition ch32_gpio.hpp:9
ErrorCode(* ReadFun)(ReadPort &port)
Function pointer type for read operations.
Definition libxr_rw.hpp:245
ErrorCode(* WriteFun)(WritePort &port)
Function pointer type for write operations.
Definition libxr_rw.hpp:241