stm32_rust_template/driver/usart/
mod.rs1#![allow(dead_code)]
10
11use bitflags::bitflags;
12use core::ops::FnMut;
13
14#[derive(Debug, Clone, Copy, PartialEq, Eq)]
16pub enum Mode {
17 Asynchronous,
19 SynchronousMaster,
21 SynchronousSlave,
23 SingleWire,
25 IrDA,
27 SmartCard,
29}
30
31#[derive(Debug, Clone, Copy, PartialEq, Eq)]
33pub enum DataBits {
34 Bits5 = 5,
35 Bits6 = 6,
36 Bits7 = 7,
37 Bits8 = 8,
39 Bits9 = 9,
40}
41
42#[derive(Debug, Clone, Copy, PartialEq, Eq)]
44pub enum Parity {
45 None,
47 Even,
48 Odd,
49}
50
51#[derive(Debug, Clone, Copy, PartialEq, Eq)]
53pub enum StopBits {
54 Bits1,
56 Bits2,
57 Bits1_5,
58 Bits0_5,
59}
60
61#[derive(Debug, Clone, Copy, PartialEq, Eq)]
63pub enum FlowControl {
64 None,
66 RTS,
67 CTS,
68 RTS_CTS,
69}
70
71#[derive(Debug, Clone, Copy, PartialEq, Eq)]
73pub enum ClockPolarity {
74 CPOL0,
76 CPOL1,
77}
78
79#[derive(Debug, Clone, Copy, PartialEq, Eq)]
81pub enum ClockPhase {
82 CPHA0,
84 CPHA1,
85}
86
87#[derive(Debug, Clone, Copy, PartialEq, Eq)]
89pub enum ModemControl {
90 RTSClear,
91 RTSSet,
92 DTRClear,
93 DTRSet,
94}
95
96#[derive(Debug, Clone, Copy, PartialEq, Eq)]
98pub struct Status {
99 pub tx_busy: bool,
101 pub rx_busy: bool,
103 pub tx_underflow: bool,
105 pub rx_overflow: bool,
107 pub rx_break: bool,
109 pub rx_framing_error: bool,
111 pub rx_parity_error: bool,
113}
114
115#[derive(Debug, Clone, Copy, PartialEq, Eq)]
117pub struct ModemStatus {
118 pub cts: bool,
120 pub dsr: bool,
122 pub dcd: bool,
124 pub ri: bool,
126}
127
128bitflags! {
129 #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
131 pub struct Event: u32 {
132 const SEND_COMPLETE = (1 << 0);
134 const RECEIVE_COMPLETE = (1 << 1);
136 const TRANSFER_COMPLETE = (1 << 2);
138 const TX_COMPLETE = (1 << 3);
140 const TX_UNDERFLOW = (1 << 4);
142 const RX_OVERFLOW = (1 << 5);
144 const RX_TIMEOUT = (1 << 6);
146 const RX_BREAK = (1 << 7);
148 const RX_FRAMING_ERROR = (1 << 8);
150 const RX_PARITY_ERROR = (1 << 9);
152 const CTS = (1 << 10);
154 const DSR = (1 << 11);
156 const DCD = (1 << 12);
158 const RI = (1 << 13);
160 }
161}
162
163pub type Error = i32;
165
166pub type Result<T> = core::result::Result<T, Error>;
168
169#[derive(Debug, Clone, PartialEq, Eq)]
171pub struct Config {
172 pub mode: Mode,
173 pub baudrate: u32,
174 pub data_bits: DataBits,
175 pub parity: Parity,
176 pub stop_bits: StopBits,
177 pub flow_control: FlowControl,
178 pub clock_polarity: ClockPolarity,
180 pub clock_phase: ClockPhase,
182}
183
184impl Default for Config {
185 fn default() -> Self {
186 Self {
187 mode: Mode::Asynchronous,
188 baudrate: 115200,
189 data_bits: DataBits::Bits8,
190 parity: Parity::None,
191 stop_bits: StopBits::Bits1,
192 flow_control: FlowControl::None,
193 clock_polarity: ClockPolarity::CPOL0,
194 clock_phase: ClockPhase::CPHA0,
195 }
196 }
197}
198
199pub trait Usart<'a> {
201 fn initialize(&mut self, callback: impl FnMut(Event) + 'a) -> Result<()>;
205
206 fn uninitialize(&mut self) -> Result<()>;
208
209 fn configure(&mut self, config: &Config) -> Result<()>;
211
212 fn send(&mut self, data: &[u8]) -> Result<()>;
214
215 fn receive(&mut self, data: &mut [u8]) -> Result<()>;
217
218 fn transfer(&mut self, data_out: &[u8], data_in: &mut [u8]) -> Result<()>;
220
221 fn get_tx_count(&self) -> u32;
223
224 fn get_rx_count(&self) -> u32;
226
227 fn get_status(&self) -> Status;
229
230 fn set_modem_control(&mut self, control: ModemControl) -> Result<()>;
232
233 fn get_modem_status(&self) -> ModemStatus;
235
236 fn tx_enable(&mut self, enable: bool) -> Result<()>;
238
239 fn rx_enable(&mut self, enable: bool) -> Result<()>;
241
242 fn control_break(&mut self, enable: bool) -> Result<()>;
244
245 fn abort_send(&mut self) -> Result<()>;
247
248 fn abort_receive(&mut self) -> Result<()>;
250
251 fn abort_transfer(&mut self) -> Result<()>;
253}
254
255#[cfg(feature = "stm32f407")]
256pub mod stm32f407;
257
258#[cfg(feature = "stm32f401")]
259pub mod stm32f401;
260
261#[cfg(feature = "stm32f411")]
262pub mod stm32f411;
263
264#[cfg(feature = "stm32f103")]
265pub mod stm32f103;