aboutsummaryrefslogtreecommitdiff
path: root/embassy-rp/src
diff options
context:
space:
mode:
author1-rafael-1 <[email protected]>2025-04-26 21:54:48 +0200
committer1-rafael-1 <[email protected]>2025-04-26 21:54:48 +0200
commit713d6291d569cf44ce3a53bc93ddd7d569fb93ed (patch)
tree845dafed9f24b5067891885c024c2644fb7416c5 /embassy-rp/src
parent4ce3bdb3703e5120c7936b5e3762744ae4461e75 (diff)
Scale clock dividers in HD44780, rotary encoder, and stepper driver based on system clock frequency
Diffstat (limited to 'embassy-rp/src')
-rw-r--r--embassy-rp/src/pio_programs/hd44780.rs15
-rw-r--r--embassy-rp/src/pio_programs/rotary_encoder.rs8
-rw-r--r--embassy-rp/src/pio_programs/stepper.rs5
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
3use crate::clocks::clk_sys_freq;
3use crate::dma::{AnyChannel, Channel}; 4use crate::dma::{AnyChannel, Channel};
4use crate::pio::{ 5use 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
3use fixed::traits::ToFixed; 3use fixed::traits::ToFixed;
4 4
5use crate::clocks::clk_sys_freq;
5use crate::gpio::Pull; 6use crate::gpio::Pull;
6use crate::pio::{ 7use 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;
6use fixed::types::extra::U8; 6use fixed::types::extra::U8;
7use fixed::FixedU32; 7use fixed::FixedU32;
8 8
9use crate::clocks::clk_sys_freq;
9use crate::pio::{Common, Config, Direction, Instance, Irq, LoadedProgram, PioPin, StateMachine}; 10use crate::pio::{Common, Config, Direction, Instance, Irq, LoadedProgram, PioPin, StateMachine};
10use crate::Peri; 11use 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);