libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
mspm0_uart.hpp
1#pragma once
2
3#include "dl_uart_main.h"
4#include "ti_msp_dl_config.h"
5#include "uart.hpp"
6
7namespace LibXR
8{
9
10class MSPM0UART : public UART
11{
12 public:
13 enum class RxTimeoutMode : uint8_t
14 {
15 LIN_COMPARE,
16 BYTE_INTERRUPT
17 };
18
19 struct Resources
20 {
21 UART_Regs* instance;
22 IRQn_Type irqn;
23 uint32_t clock_freq;
24 uint8_t index;
25 };
26
27 MSPM0UART(Resources res, RawData rx_stage_buffer, uint32_t tx_queue_size = 5,
28 uint32_t tx_buffer_size = 128,
29 UART::Configuration config = {115200, UART::Parity::NO_PARITY, 8, 1});
30
31 ErrorCode SetConfig(UART::Configuration config) override;
32
33 static ErrorCode WriteFun(WritePort& port);
34
35 static ErrorCode ReadFun(ReadPort& port);
36
37 static void OnInterrupt(uint8_t index);
38 static UART::Configuration BuildConfigFromSysCfg(UART_Regs* instance,
39 uint32_t baudrate);
40
41 RxTimeoutMode GetRxTimeoutMode() const { return rx_timeout_mode_; }
42 uint32_t GetRxTimeoutCount() const { return rx_timeout_count_; }
43 uint32_t GetRxDropCount() const { return rx_drop_count_; }
44 uint32_t GetTimeoutInterruptEnabledMask() const;
45 uint32_t GetTimeoutInterruptMaskedStatus() const;
46 uint32_t GetTimeoutInterruptRawStatus() const;
47 uint32_t GetRxInterruptTimeoutValue() const;
48 uint32_t GetRxFifoThresholdValue() const;
49
50 ReadPort _read_port; // NOLINT
51 WritePort _write_port; // NOLINT
52
53 static constexpr uint8_t ResolveIndex(IRQn_Type irqn)
54 {
55 switch (irqn)
56 {
57#if defined(UART0_BASE)
58 case UART0_INT_IRQn:
59 return 0;
60#endif
61#if defined(UART1_BASE)
62 case UART1_INT_IRQn:
63 return 1;
64#endif
65#if defined(UART2_BASE)
66 case UART2_INT_IRQn:
67 return 2;
68#endif
69#if defined(UART3_BASE)
70 case UART3_INT_IRQn:
71 return 3;
72#endif
73#if defined(UART4_BASE)
74 case UART4_INT_IRQn:
75 return 4;
76#endif
77#if defined(UART5_BASE)
78 case UART5_INT_IRQn:
79 return 5;
80#endif
81#if defined(UART6_BASE)
82 case UART6_INT_IRQn:
83 return 6;
84#endif
85#if defined(UART7_BASE)
86 case UART7_INT_IRQn:
87 return 7;
88#endif
89 default:
90 return INVALID_INSTANCE_INDEX;
91 }
92 }
93
94 private:
95 static constexpr uint8_t MAX_UART_INSTANCES = 8;
96 static constexpr uint8_t INVALID_INSTANCE_INDEX = 0xFF;
97
98 void HandleInterrupt();
99
100 void HandleRxInterrupt(uint32_t timeout_mask);
101
102 void HandleRxTimeoutInterrupt(uint32_t pending, uint32_t timeout_mask);
103
104 void DrainRxFIFO(bool& received, bool& pushed);
105
106 void HandleTxInterrupt(bool in_isr);
107
108 void HandleErrorInterrupt(DL_UART_IIDX iidx);
109
110 void CompletePendingReadOnTimeout(bool in_isr);
111
112 void ApplyRxTimeoutMode();
113
114 RxTimeoutMode ResolveRxTimeoutMode() const;
115
116 uint32_t GetTimeoutInterruptMask() const;
117
118 void ResetLinCounter();
119
120 void DisableTxInterrupt();
121
122 Resources res_;
123 WriteInfoBlock tx_active_info_;
124 bool tx_active_valid_ = false;
125 size_t tx_active_remaining_ = 0;
126 size_t tx_active_total_ = 0;
127 RxTimeoutMode rx_timeout_mode_ = RxTimeoutMode::BYTE_INTERRUPT;
128 uint32_t rx_drop_count_ = 0;
129 uint32_t rx_timeout_count_ = 0;
130
131 static MSPM0UART* instance_map_[MAX_UART_INSTANCES];
132};
133
134// Helper macro to initialize MSPM0UART from SysConfig in one shot
135#define MSPM0_UART_INIT(name, rx_stage_addr, rx_stage_size, tx_queue_size, \
136 tx_buffer_size) \
137 ::LibXR::MSPM0UART::Resources{name##_INST, name##_INST_INT_IRQN, \
138 name##_INST_FREQUENCY, \
139 ::LibXR::MSPM0UART::ResolveIndex(name##_INST_INT_IRQN)}, \
140 ::LibXR::RawData{(rx_stage_addr), (rx_stage_size)}, (tx_queue_size), \
141 (tx_buffer_size), \
142 ::LibXR::MSPM0UART::BuildConfigFromSysCfg(name##_INST, \
143 static_cast<uint32_t>(name##_BAUD_RATE))
144
145} // namespace LibXR
ErrorCode SetConfig(UART::Configuration config) override
设置 UART 配置 / Sets the UART configuration
原始数据封装类。 A class for encapsulating raw data.
ReadPort class for handling read operations.
Definition libxr_rw.hpp:279
通用异步收发传输(UART)基类 / Abstract base class for Universal Asynchronous Receiver-Transmitter (UART)
Definition uart.hpp:19
@ NO_PARITY
无校验 / No parity
WritePort class for handling write operations.
Definition libxr_rw.hpp:438
LibXR 命名空间
Definition ch32_can.hpp:14
ErrorCode(* ReadFun)(ReadPort &port, bool in_isr)
Function pointer type for read operations.
Definition libxr_rw.hpp:256
ErrorCode(* WriteFun)(WritePort &port, bool in_isr)
Function pointer type for write operations.
Definition libxr_rw.hpp:252
UART 配置结构体 / UART configuration structure.
Definition uart.hpp:44