aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Hurtado Lopez <[email protected]>2023-02-26 18:40:23 -0500
committerAndres Hurtado Lopez <[email protected]>2023-02-26 18:40:23 -0500
commit8fb380b18052c2393ae1dc3466bb87e9402181d8 (patch)
tree8762b6347526008c281d1502343fc5c499a07e6f
parentbc71230cd07296468f2e03c00f9ceddbab67c9d9 (diff)
RP-PICO UART adding set_baudrate
-rw-r--r--embassy-rp/src/uart/mod.rs50
1 files changed, 36 insertions, 14 deletions
diff --git a/embassy-rp/src/uart/mod.rs b/embassy-rp/src/uart/mod.rs
index bbbf97c01..7540052b8 100644
--- a/embassy-rp/src/uart/mod.rs
+++ b/embassy-rp/src/uart/mod.rs
@@ -296,7 +296,7 @@ impl<'d, T: Instance> Uart<'d, T, Async> {
296 Some(rx_dma.map_into()), 296 Some(rx_dma.map_into()),
297 config, 297 config,
298 ) 298 )
299 } 299 }
300} 300}
301 301
302impl<'d, T: Instance, M: Mode> Uart<'d, T, M> { 302impl<'d, T: Instance, M: Mode> Uart<'d, T, M> {
@@ -324,6 +324,25 @@ impl<'d, T: Instance, M: Mode> Uart<'d, T, M> {
324 } 324 }
325 } 325 }
326 326
327 fn baudrate_calculations(baudrate: u32) -> (u32, u32) {
328
329 let clk_base = crate::clocks::clk_peri_freq();
330
331 let baud_rate_div = (8 * clk_base) / baudrate;
332 let mut baud_ibrd = baud_rate_div >> 7;
333 let mut baud_fbrd = ((baud_rate_div & 0x7f) + 1) / 2;
334
335 if baud_ibrd == 0 {
336 baud_ibrd = 1;
337 baud_fbrd = 0;
338 } else if baud_ibrd >= 65535 {
339 baud_ibrd = 65535;
340 baud_fbrd = 0;
341 }
342
343 (baud_ibrd, baud_fbrd)
344 }
345
327 fn init( 346 fn init(
328 tx: Option<PeripheralRef<'_, AnyPin>>, 347 tx: Option<PeripheralRef<'_, AnyPin>>,
329 rx: Option<PeripheralRef<'_, AnyPin>>, 348 rx: Option<PeripheralRef<'_, AnyPin>>,
@@ -350,19 +369,7 @@ impl<'d, T: Instance, M: Mode> Uart<'d, T, M> {
350 pin.pad_ctrl().write(|w| w.set_ie(true)); 369 pin.pad_ctrl().write(|w| w.set_ie(true));
351 } 370 }
352 371
353 let clk_base = crate::clocks::clk_peri_freq(); 372 let (baud_ibrd, baud_fbrd) = Uart::<T,M>::baudrate_calculations(config.baudrate);
354
355 let baud_rate_div = (8 * clk_base) / config.baudrate;
356 let mut baud_ibrd = baud_rate_div >> 7;
357 let mut baud_fbrd = ((baud_rate_div & 0x7f) + 1) / 2;
358
359 if baud_ibrd == 0 {
360 baud_ibrd = 1;
361 baud_fbrd = 0;
362 } else if baud_ibrd >= 65535 {
363 baud_ibrd = 65535;
364 baud_fbrd = 0;
365 }
366 373
367 // Load PL011's baud divisor registers 374 // Load PL011's baud divisor registers
368 r.uartibrd().write_value(pac::uart::regs::Uartibrd(baud_ibrd)); 375 r.uartibrd().write_value(pac::uart::regs::Uartibrd(baud_ibrd));
@@ -400,6 +407,21 @@ impl<'d, T: Instance, M: Mode> Uart<'d, T, M> {
400 }); 407 });
401 } 408 }
402 } 409 }
410
411 pub fn set_baudrate(&mut self, baudrate: u32) {
412
413 let r = T::regs();
414
415 let (baud_ibrd, baud_fbrd) = Self::baudrate_calculations(baudrate);
416
417 unsafe {
418
419 // Load PL011's baud divisor registers
420 r.uartibrd().write_value(pac::uart::regs::Uartibrd(baud_ibrd));
421 r.uartfbrd().write_value(pac::uart::regs::Uartfbrd(baud_fbrd));
422 }
423
424 }
403} 425}
404 426
405impl<'d, T: Instance, M: Mode> Uart<'d, T, M> { 427impl<'d, T: Instance, M: Mode> Uart<'d, T, M> {