RP-PICO UART adding set_baudrate: refactoring of methods
This commit is contained in:
parent
8fb380b180
commit
7172dfd083
1 changed files with 23 additions and 28 deletions
|
@ -324,25 +324,6 @@ impl<'d, T: Instance, M: Mode> Uart<'d, T, M> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn baudrate_calculations(baudrate: u32) -> (u32, u32) {
|
|
||||||
|
|
||||||
let clk_base = crate::clocks::clk_peri_freq();
|
|
||||||
|
|
||||||
let baud_rate_div = (8 * clk_base) / baudrate;
|
|
||||||
let mut baud_ibrd = baud_rate_div >> 7;
|
|
||||||
let mut baud_fbrd = ((baud_rate_div & 0x7f) + 1) / 2;
|
|
||||||
|
|
||||||
if baud_ibrd == 0 {
|
|
||||||
baud_ibrd = 1;
|
|
||||||
baud_fbrd = 0;
|
|
||||||
} else if baud_ibrd >= 65535 {
|
|
||||||
baud_ibrd = 65535;
|
|
||||||
baud_fbrd = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
(baud_ibrd, baud_fbrd)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn init(
|
fn init(
|
||||||
tx: Option<PeripheralRef<'_, AnyPin>>,
|
tx: Option<PeripheralRef<'_, AnyPin>>,
|
||||||
rx: Option<PeripheralRef<'_, AnyPin>>,
|
rx: Option<PeripheralRef<'_, AnyPin>>,
|
||||||
|
@ -369,11 +350,7 @@ impl<'d, T: Instance, M: Mode> Uart<'d, T, M> {
|
||||||
pin.pad_ctrl().write(|w| w.set_ie(true));
|
pin.pad_ctrl().write(|w| w.set_ie(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
let (baud_ibrd, baud_fbrd) = Uart::<T,M>::baudrate_calculations(config.baudrate);
|
Uart::<T,M>::set_baudrate_inner(config.baudrate);
|
||||||
|
|
||||||
// Load PL011's baud divisor registers
|
|
||||||
r.uartibrd().write_value(pac::uart::regs::Uartibrd(baud_ibrd));
|
|
||||||
r.uartfbrd().write_value(pac::uart::regs::Uartfbrd(baud_fbrd));
|
|
||||||
|
|
||||||
let (pen, eps) = match config.parity {
|
let (pen, eps) = match config.parity {
|
||||||
Parity::ParityNone => (false, false),
|
Parity::ParityNone => (false, false),
|
||||||
|
@ -408,20 +385,38 @@ impl<'d, T: Instance, M: Mode> Uart<'d, T, M> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// sets baudrate on runtime
|
||||||
pub fn set_baudrate(&mut self, baudrate: u32) {
|
pub fn set_baudrate(&mut self, baudrate: u32) {
|
||||||
|
Self::set_baudrate_inner(baudrate);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn set_baudrate_inner(baudrate: u32) {
|
||||||
let r = T::regs();
|
let r = T::regs();
|
||||||
|
|
||||||
let (baud_ibrd, baud_fbrd) = Self::baudrate_calculations(baudrate);
|
let clk_base = crate::clocks::clk_peri_freq();
|
||||||
|
|
||||||
|
let baud_rate_div = (8 * clk_base) / baudrate;
|
||||||
|
let mut baud_ibrd = baud_rate_div >> 7;
|
||||||
|
let mut baud_fbrd = ((baud_rate_div & 0x7f) + 1) / 2;
|
||||||
|
|
||||||
|
if baud_ibrd == 0 {
|
||||||
|
baud_ibrd = 1;
|
||||||
|
baud_fbrd = 0;
|
||||||
|
} else if baud_ibrd >= 65535 {
|
||||||
|
baud_ibrd = 65535;
|
||||||
|
baud_fbrd = 0;
|
||||||
|
}
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
|
|
||||||
// Load PL011's baud divisor registers
|
// Load PL011's baud divisor registers
|
||||||
r.uartibrd().write_value(pac::uart::regs::Uartibrd(baud_ibrd));
|
r.uartibrd().write_value(pac::uart::regs::Uartibrd(baud_ibrd));
|
||||||
r.uartfbrd().write_value(pac::uart::regs::Uartfbrd(baud_fbrd));
|
r.uartfbrd().write_value(pac::uart::regs::Uartfbrd(baud_fbrd));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, T: Instance, M: Mode> Uart<'d, T, M> {
|
impl<'d, T: Instance, M: Mode> Uart<'d, T, M> {
|
||||||
|
|
Loading…
Reference in a new issue