aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32/src/adc/g4.rs
diff options
context:
space:
mode:
authorPiotr Esden-Tempski <[email protected]>2025-10-05 15:49:05 -0700
committerPiotr Esden-Tempski <[email protected]>2025-10-05 16:16:05 -0700
commita9727a17b593f7328f721e8905b7fc8dab9ae7ff (patch)
treecf3bf4069e41ce9ca6108be5368a05f212acf6d6 /embassy-stm32/src/adc/g4.rs
parente2a2bd3c573928208a4c85e7fcd6ad630f23f47d (diff)
stm32/ADC: Fix prescaler calculation to include max frequency.
Due to the integer rounding rules one has to subtract 1 from the numerator. For example: Let max clock be 55 and supplied clock be 110 110/55 = 2 which results in the divider being set to 4 and the clock after division ends up being 27 instead of 55 Subtracting 1 to the numerator get around the rounding issue 109/55 = 1 which results in the divider being set to 2 and the clock after division ends up being 55 which is exactly max clock
Diffstat (limited to 'embassy-stm32/src/adc/g4.rs')
-rw-r--r--embassy-stm32/src/adc/g4.rs3
1 files changed, 2 insertions, 1 deletions
diff --git a/embassy-stm32/src/adc/g4.rs b/embassy-stm32/src/adc/g4.rs
index 43498966f..ac0a6196f 100644
--- a/embassy-stm32/src/adc/g4.rs
+++ b/embassy-stm32/src/adc/g4.rs
@@ -72,7 +72,8 @@ enum Prescaler {
72 72
73impl Prescaler { 73impl Prescaler {
74 fn from_ker_ck(frequency: Hertz) -> Self { 74 fn from_ker_ck(frequency: Hertz) -> Self {
75 let raw_prescaler = frequency.0 / MAX_ADC_CLK_FREQ.0; 75 // Calculate prescaler in a way where the clock can hit MAX CLK
76 let raw_prescaler = frequency.0.saturating_sub(1) / MAX_ADC_CLK_FREQ.0;
76 match raw_prescaler { 77 match raw_prescaler {
77 0 => Self::NotDivided, 78 0 => Self::NotDivided,
78 1 => Self::DividedBy2, 79 1 => Self::DividedBy2,