diff options
| author | 1-rafael-1 <[email protected]> | 2025-04-26 21:54:48 +0200 |
|---|---|---|
| committer | 1-rafael-1 <[email protected]> | 2025-04-26 21:54:48 +0200 |
| commit | 713d6291d569cf44ce3a53bc93ddd7d569fb93ed (patch) | |
| tree | 845dafed9f24b5067891885c024c2644fb7416c5 /embassy-rp/src/pio_programs | |
| parent | 4ce3bdb3703e5120c7936b5e3762744ae4461e75 (diff) | |
Scale clock dividers in HD44780, rotary encoder, and stepper driver based on system clock frequency
Diffstat (limited to 'embassy-rp/src/pio_programs')
| -rw-r--r-- | embassy-rp/src/pio_programs/hd44780.rs | 15 | ||||
| -rw-r--r-- | embassy-rp/src/pio_programs/rotary_encoder.rs | 8 | ||||
| -rw-r--r-- | embassy-rp/src/pio_programs/stepper.rs | 5 |
3 files changed, 23 insertions, 5 deletions
diff --git a/embassy-rp/src/pio_programs/hd44780.rs b/embassy-rp/src/pio_programs/hd44780.rs index 5846a8027..3aa54495f 100644 --- a/embassy-rp/src/pio_programs/hd44780.rs +++ b/embassy-rp/src/pio_programs/hd44780.rs | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | //! [HD44780 display driver](https://www.sparkfun.com/datasheets/LCD/HD44780.pdf) | 1 | //! [HD44780 display driver](https://www.sparkfun.com/datasheets/LCD/HD44780.pdf) |
| 2 | 2 | ||
| 3 | use crate::clocks::clk_sys_freq; | ||
| 3 | use crate::dma::{AnyChannel, Channel}; | 4 | use crate::dma::{AnyChannel, Channel}; |
| 4 | use crate::pio::{ | 5 | use crate::pio::{ |
| 5 | Common, Config, Direction, FifoJoin, Instance, Irq, LoadedProgram, PioPin, ShiftConfig, ShiftDirection, | 6 | Common, Config, Direction, FifoJoin, Instance, Irq, LoadedProgram, PioPin, ShiftConfig, ShiftDirection, |
| @@ -134,7 +135,12 @@ impl<'l, P: Instance, const S: usize> PioHD44780<'l, P, S> { | |||
| 134 | 135 | ||
| 135 | let mut cfg = Config::default(); | 136 | let mut cfg = Config::default(); |
| 136 | cfg.use_program(&word_prg.prg, &[&e]); | 137 | cfg.use_program(&word_prg.prg, &[&e]); |
| 137 | cfg.clock_divider = 125u8.into(); | 138 | |
| 139 | // Scale the divider based on system clock frequency | ||
| 140 | // Original: 125 at 125 MHz (1 MHz PIO clock) | ||
| 141 | let word_divider = (clk_sys_freq() / 1_000_000) as u8; // Target 1 MHz PIO clock | ||
| 142 | cfg.clock_divider = word_divider.into(); | ||
| 143 | |||
| 138 | cfg.set_out_pins(&[&db4, &db5, &db6, &db7]); | 144 | cfg.set_out_pins(&[&db4, &db5, &db6, &db7]); |
| 139 | cfg.shift_out = ShiftConfig { | 145 | cfg.shift_out = ShiftConfig { |
| 140 | auto_fill: true, | 146 | auto_fill: true, |
| @@ -160,7 +166,12 @@ impl<'l, P: Instance, const S: usize> PioHD44780<'l, P, S> { | |||
| 160 | 166 | ||
| 161 | let mut cfg = Config::default(); | 167 | let mut cfg = Config::default(); |
| 162 | cfg.use_program(&seq_prg.prg, &[&e]); | 168 | cfg.use_program(&seq_prg.prg, &[&e]); |
| 163 | cfg.clock_divider = 8u8.into(); // ~64ns/insn | 169 | |
| 170 | // Original: 8 at 125 MHz (~15.6 MHz PIO clock) | ||
| 171 | // Comment says ~64ns/insn which is 1/(15.6 MHz) = ~64ns | ||
| 172 | let seq_divider = (clk_sys_freq() / 15_600_000) as u8; // Target ~15.6 MHz PIO clock (~64ns/insn) | ||
| 173 | cfg.clock_divider = seq_divider.into(); | ||
| 174 | |||
| 164 | cfg.set_jmp_pin(&db7); | 175 | cfg.set_jmp_pin(&db7); |
| 165 | cfg.set_set_pins(&[&rs, &rw]); | 176 | cfg.set_set_pins(&[&rs, &rw]); |
| 166 | cfg.set_out_pins(&[&db4, &db5, &db6, &db7]); | 177 | cfg.set_out_pins(&[&db4, &db5, &db6, &db7]); |
diff --git a/embassy-rp/src/pio_programs/rotary_encoder.rs b/embassy-rp/src/pio_programs/rotary_encoder.rs index e520da8a3..7bd463bb8 100644 --- a/embassy-rp/src/pio_programs/rotary_encoder.rs +++ b/embassy-rp/src/pio_programs/rotary_encoder.rs | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | 2 | ||
| 3 | use fixed::traits::ToFixed; | 3 | use fixed::traits::ToFixed; |
| 4 | 4 | ||
| 5 | use crate::clocks::clk_sys_freq; | ||
| 5 | use crate::gpio::Pull; | 6 | use crate::gpio::Pull; |
| 6 | use crate::pio::{ | 7 | use crate::pio::{ |
| 7 | Common, Config, Direction as PioDirection, FifoJoin, Instance, LoadedProgram, PioPin, ShiftDirection, StateMachine, | 8 | Common, Config, Direction as PioDirection, FifoJoin, Instance, LoadedProgram, PioPin, ShiftDirection, StateMachine, |
| @@ -48,7 +49,12 @@ impl<'d, T: Instance, const SM: usize> PioEncoder<'d, T, SM> { | |||
| 48 | cfg.set_in_pins(&[&pin_a, &pin_b]); | 49 | cfg.set_in_pins(&[&pin_a, &pin_b]); |
| 49 | cfg.fifo_join = FifoJoin::RxOnly; | 50 | cfg.fifo_join = FifoJoin::RxOnly; |
| 50 | cfg.shift_in.direction = ShiftDirection::Left; | 51 | cfg.shift_in.direction = ShiftDirection::Left; |
| 51 | cfg.clock_divider = 10_000.to_fixed(); | 52 | |
| 53 | // Original: 10_000 at 125 MHz (12.5 KHz PIO clock) | ||
| 54 | // Scale divider to maintain same PIO clock frequency at different system clocks | ||
| 55 | let divider = (clk_sys_freq() as f32 / 12_500.0).to_fixed(); | ||
| 56 | cfg.clock_divider = divider; | ||
| 57 | |||
| 52 | cfg.use_program(&program.prg, &[]); | 58 | cfg.use_program(&program.prg, &[]); |
| 53 | sm.set_config(&cfg); | 59 | sm.set_config(&cfg); |
| 54 | sm.set_enable(true); | 60 | sm.set_enable(true); |
diff --git a/embassy-rp/src/pio_programs/stepper.rs b/embassy-rp/src/pio_programs/stepper.rs index 495191659..6878c32f5 100644 --- a/embassy-rp/src/pio_programs/stepper.rs +++ b/embassy-rp/src/pio_programs/stepper.rs | |||
| @@ -6,6 +6,7 @@ use fixed::traits::ToFixed; | |||
| 6 | use fixed::types::extra::U8; | 6 | use fixed::types::extra::U8; |
| 7 | use fixed::FixedU32; | 7 | use fixed::FixedU32; |
| 8 | 8 | ||
| 9 | use crate::clocks::clk_sys_freq; | ||
| 9 | use crate::pio::{Common, Config, Direction, Instance, Irq, LoadedProgram, PioPin, StateMachine}; | 10 | use crate::pio::{Common, Config, Direction, Instance, Irq, LoadedProgram, PioPin, StateMachine}; |
| 10 | use crate::Peri; | 11 | use crate::Peri; |
| 11 | 12 | ||
| @@ -64,7 +65,7 @@ impl<'d, T: Instance, const SM: usize> PioStepper<'d, T, SM> { | |||
| 64 | sm.set_pin_dirs(Direction::Out, &[&pin0, &pin1, &pin2, &pin3]); | 65 | sm.set_pin_dirs(Direction::Out, &[&pin0, &pin1, &pin2, &pin3]); |
| 65 | let mut cfg = Config::default(); | 66 | let mut cfg = Config::default(); |
| 66 | cfg.set_out_pins(&[&pin0, &pin1, &pin2, &pin3]); | 67 | cfg.set_out_pins(&[&pin0, &pin1, &pin2, &pin3]); |
| 67 | cfg.clock_divider = (125_000_000 / (100 * 136)).to_fixed(); | 68 | cfg.clock_divider = (clk_sys_freq() / (100 * 136)).to_fixed(); |
| 68 | cfg.use_program(&program.prg, &[]); | 69 | cfg.use_program(&program.prg, &[]); |
| 69 | sm.set_config(&cfg); | 70 | sm.set_config(&cfg); |
| 70 | sm.set_enable(true); | 71 | sm.set_enable(true); |
| @@ -73,7 +74,7 @@ impl<'d, T: Instance, const SM: usize> PioStepper<'d, T, SM> { | |||
| 73 | 74 | ||
| 74 | /// Set pulse frequency | 75 | /// Set pulse frequency |
| 75 | pub fn set_frequency(&mut self, freq: u32) { | 76 | pub fn set_frequency(&mut self, freq: u32) { |
| 76 | let clock_divider: FixedU32<U8> = (125_000_000 / (freq * 136)).to_fixed(); | 77 | let clock_divider: FixedU32<U8> = (clk_sys_freq() / (freq * 136)).to_fixed(); |
| 77 | assert!(clock_divider <= 65536, "clkdiv must be <= 65536"); | 78 | assert!(clock_divider <= 65536, "clkdiv must be <= 65536"); |
| 78 | assert!(clock_divider >= 1, "clkdiv must be >= 1"); | 79 | assert!(clock_divider >= 1, "clkdiv must be >= 1"); |
| 79 | self.sm.set_clock_divider(clock_divider); | 80 | self.sm.set_clock_divider(clock_divider); |
