506: Clock cleaning r=Dirbaio a=lulf

Different STM32 RCC peripherals have different capabilities and register values. Define types for each RCC types inside each module to ensure full range of capabilities for each family can be used

Co-authored-by: Ulf Lilleengen <ulf.lilleengen@gmail.com>
This commit is contained in:
bors[bot] 2021-11-28 19:41:16 +00:00 committed by GitHub
commit 2a2911221d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 250 additions and 102 deletions

2
ci.sh
View File

@ -5,7 +5,7 @@ set -euo pipefail
export CARGO_TARGET_DIR=$PWD/target_ci export CARGO_TARGET_DIR=$PWD/target_ci
export RUSTFLAGS=-Dwarnings export RUSTFLAGS=-Dwarnings
find -name '*.rs' -not -path '*target*' -not -path '*stm32-metapac-gen/out/*' | xargs rustfmt --check --skip-children --unstable-features --edition 2018 find . -name '*.rs' -not -path '*target*' -not -path '*stm32-metapac-gen/out/*' | xargs rustfmt --check --skip-children --unstable-features --edition 2018
# Generate stm32-metapac # Generate stm32-metapac
# for some reason Cargo stomps the cache if we don't specify --target. # for some reason Cargo stomps the cache if we don't specify --target.

View File

@ -1,4 +1,3 @@
pub use super::types::*;
use crate::pac; use crate::pac;
use crate::peripherals::{self, RCC}; use crate::peripherals::{self, RCC};
use crate::rcc::{get_freqs, set_freqs, Clocks}; use crate::rcc::{get_freqs, set_freqs, Clocks};
@ -49,6 +48,30 @@ impl Into<u8> for HSI16Prescaler {
} }
} }
/// AHB prescaler
#[derive(Clone, Copy, PartialEq)]
pub enum AHBPrescaler {
NotDivided,
Div2,
Div4,
Div8,
Div16,
Div64,
Div128,
Div256,
Div512,
}
/// APB prescaler
#[derive(Clone, Copy)]
pub enum APBPrescaler {
NotDivided,
Div2,
Div4,
Div8,
Div16,
}
impl Into<u8> for APBPrescaler { impl Into<u8> for APBPrescaler {
fn into(self) -> u8 { fn into(self) -> u8 {
match self { match self {

View File

@ -1,4 +1,3 @@
pub use super::types::*;
use crate::pac; use crate::pac;
use crate::peripherals::{self, RCC}; use crate::peripherals::{self, RCC};
use crate::rcc::{get_freqs, set_freqs, Clocks}; use crate::rcc::{get_freqs, set_freqs, Clocks};
@ -21,6 +20,30 @@ pub enum ClockSrc {
HSI16, HSI16,
} }
/// AHB prescaler
#[derive(Clone, Copy, PartialEq)]
pub enum AHBPrescaler {
NotDivided,
Div2,
Div4,
Div8,
Div16,
Div64,
Div128,
Div256,
Div512,
}
/// APB prescaler
#[derive(Clone, Copy)]
pub enum APBPrescaler {
NotDivided,
Div2,
Div4,
Div8,
Div16,
}
impl Into<u8> for APBPrescaler { impl Into<u8> for APBPrescaler {
fn into(self) -> u8 { fn into(self) -> u8 {
match self { match self {

View File

@ -1,4 +1,3 @@
pub use super::types::*;
use crate::pac; use crate::pac;
use crate::peripherals::{self, CRS, RCC, SYSCFG}; use crate::peripherals::{self, CRS, RCC, SYSCFG};
use crate::rcc::{get_freqs, set_freqs, Clocks}; use crate::rcc::{get_freqs, set_freqs, Clocks};
@ -24,6 +23,87 @@ pub enum ClockSrc {
HSI16, HSI16,
} }
/// MSI Clock Range
///
/// These ranges control the frequency of the MSI. Internally, these ranges map
/// to the `MSIRANGE` bits in the `RCC_ICSCR` register.
#[derive(Clone, Copy)]
pub enum MSIRange {
/// Around 65.536 kHz
Range0,
/// Around 131.072 kHz
Range1,
/// Around 262.144 kHz
Range2,
/// Around 524.288 kHz
Range3,
/// Around 1.048 MHz
Range4,
/// Around 2.097 MHz (reset value)
Range5,
/// Around 4.194 MHz
Range6,
}
impl Default for MSIRange {
fn default() -> MSIRange {
MSIRange::Range5
}
}
/// PLL divider
#[derive(Clone, Copy)]
pub enum PLLDiv {
Div2,
Div3,
Div4,
}
/// PLL multiplier
#[derive(Clone, Copy)]
pub enum PLLMul {
Mul3,
Mul4,
Mul6,
Mul8,
Mul12,
Mul16,
Mul24,
Mul32,
Mul48,
}
/// AHB prescaler
#[derive(Clone, Copy, PartialEq)]
pub enum AHBPrescaler {
NotDivided,
Div2,
Div4,
Div8,
Div16,
Div64,
Div128,
Div256,
Div512,
}
/// APB prescaler
#[derive(Clone, Copy)]
pub enum APBPrescaler {
NotDivided,
Div2,
Div4,
Div8,
Div16,
}
/// PLL clock input source
#[derive(Clone, Copy)]
pub enum PLLSource {
HSI16,
HSE(Hertz),
}
impl Into<Pllmul> for PLLMul { impl Into<Pllmul> for PLLMul {
fn into(self) -> Pllmul { fn into(self) -> Pllmul {
match self { match self {

View File

@ -1,4 +1,3 @@
pub use super::types::*;
use crate::pac; use crate::pac;
use crate::peripherals::{self, RCC}; use crate::peripherals::{self, RCC};
use crate::rcc::{get_freqs, set_freqs, Clocks}; use crate::rcc::{get_freqs, set_freqs, Clocks};
@ -21,6 +20,58 @@ pub enum ClockSrc {
HSI, HSI,
} }
/// MSI Clock Range
///
/// These ranges control the frequency of the MSI. Internally, these ranges map
/// to the `MSIRANGE` bits in the `RCC_ICSCR` register.
#[derive(Clone, Copy)]
pub enum MSIRange {
/// Around 65.536 kHz
Range0,
/// Around 131.072 kHz
Range1,
/// Around 262.144 kHz
Range2,
/// Around 524.288 kHz
Range3,
/// Around 1.048 MHz
Range4,
/// Around 2.097 MHz (reset value)
Range5,
/// Around 4.194 MHz
Range6,
}
impl Default for MSIRange {
fn default() -> MSIRange {
MSIRange::Range5
}
}
/// AHB prescaler
#[derive(Clone, Copy, PartialEq)]
pub enum AHBPrescaler {
NotDivided,
Div2,
Div4,
Div8,
Div16,
Div64,
Div128,
Div256,
Div512,
}
/// APB prescaler
#[derive(Clone, Copy)]
pub enum APBPrescaler {
NotDivided,
Div2,
Div4,
Div8,
Div16,
}
type Ppre = u8; type Ppre = u8;
impl Into<Ppre> for APBPrescaler { impl Into<Ppre> for APBPrescaler {
fn into(self) -> Ppre { fn into(self) -> Ppre {

View File

@ -3,7 +3,6 @@
use crate::peripherals; use crate::peripherals;
use crate::time::Hertz; use crate::time::Hertz;
use core::mem::MaybeUninit; use core::mem::MaybeUninit;
mod types;
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
pub struct Clocks { pub struct Clocks {

View File

@ -1,94 +0,0 @@
#![allow(dead_code)]
/// Most of clock setup is copied from stm32l0xx-hal, and adopted to the generated PAC,
/// and with the addition of the init function to configure a system clock.
use crate::time::Hertz;
/// System clock mux source
#[derive(Clone, Copy)]
pub enum ClockSrc {
MSI(MSIRange),
PLL(PLLSource, PLLMul, PLLDiv),
HSE(Hertz),
HSI16,
}
/// MSI Clock Range
///
/// These ranges control the frequency of the MSI. Internally, these ranges map
/// to the `MSIRANGE` bits in the `RCC_ICSCR` register.
#[derive(Clone, Copy)]
pub enum MSIRange {
/// Around 65.536 kHz
Range0,
/// Around 131.072 kHz
Range1,
/// Around 262.144 kHz
Range2,
/// Around 524.288 kHz
Range3,
/// Around 1.048 MHz
Range4,
/// Around 2.097 MHz (reset value)
Range5,
/// Around 4.194 MHz
Range6,
}
impl Default for MSIRange {
fn default() -> MSIRange {
MSIRange::Range5
}
}
/// PLL divider
#[derive(Clone, Copy)]
pub enum PLLDiv {
Div2,
Div3,
Div4,
}
/// PLL multiplier
#[derive(Clone, Copy)]
pub enum PLLMul {
Mul3,
Mul4,
Mul6,
Mul8,
Mul12,
Mul16,
Mul24,
Mul32,
Mul48,
}
/// AHB prescaler
#[derive(Clone, Copy, PartialEq)]
pub enum AHBPrescaler {
NotDivided,
Div2,
Div4,
Div8,
Div16,
Div64,
Div128,
Div256,
Div512,
}
/// APB prescaler
#[derive(Clone, Copy)]
pub enum APBPrescaler {
NotDivided,
Div2,
Div4,
Div8,
Div16,
}
/// PLL clock input source
#[derive(Clone, Copy)]
pub enum PLLSource {
HSI16,
HSE(Hertz),
}

View File

@ -1,4 +1,3 @@
pub use super::types::*;
use crate::pac; use crate::pac;
use crate::peripherals::{self, RCC}; use crate::peripherals::{self, RCC};
use crate::rcc::{get_freqs, set_freqs, Clocks}; use crate::rcc::{get_freqs, set_freqs, Clocks};
@ -23,6 +22,35 @@ pub enum ClockSrc {
HSI16, HSI16,
} }
/// AHB prescaler
#[derive(Clone, Copy, PartialEq)]
pub enum AHBPrescaler {
NotDivided,
Div2,
Div3,
Div4,
Div5,
Div6,
Div8,
Div10,
Div16,
Div32,
Div64,
Div128,
Div256,
Div512,
}
/// APB prescaler
#[derive(Clone, Copy)]
pub enum APBPrescaler {
NotDivided,
Div2,
Div4,
Div8,
Div16,
}
impl Into<u8> for APBPrescaler { impl Into<u8> for APBPrescaler {
fn into(self) -> u8 { fn into(self) -> u8 {
match self { match self {
@ -40,9 +68,14 @@ impl Into<u8> for AHBPrescaler {
match self { match self {
AHBPrescaler::NotDivided => 1, AHBPrescaler::NotDivided => 1,
AHBPrescaler::Div2 => 0x08, AHBPrescaler::Div2 => 0x08,
AHBPrescaler::Div3 => 0x01,
AHBPrescaler::Div4 => 0x09, AHBPrescaler::Div4 => 0x09,
AHBPrescaler::Div5 => 0x02,
AHBPrescaler::Div6 => 0x05,
AHBPrescaler::Div8 => 0x0a, AHBPrescaler::Div8 => 0x0a,
AHBPrescaler::Div10 => 0x06,
AHBPrescaler::Div16 => 0x0b, AHBPrescaler::Div16 => 0x0b,
AHBPrescaler::Div32 => 0x07,
AHBPrescaler::Div64 => 0x0c, AHBPrescaler::Div64 => 0x0c,
AHBPrescaler::Div128 => 0x0d, AHBPrescaler::Div128 => 0x0d,
AHBPrescaler::Div256 => 0x0e, AHBPrescaler::Div256 => 0x0e,

View File

@ -1,4 +1,3 @@
pub use super::types::*;
use crate::pac; use crate::pac;
use crate::peripherals::{self, RCC}; use crate::peripherals::{self, RCC};
use crate::rcc::{get_freqs, set_freqs, Clocks}; use crate::rcc::{get_freqs, set_freqs, Clocks};
@ -24,6 +23,35 @@ pub enum ClockSrc {
HSI16, HSI16,
} }
/// AHB prescaler
#[derive(Clone, Copy, PartialEq)]
pub enum AHBPrescaler {
NotDivided,
Div2,
Div3,
Div4,
Div5,
Div6,
Div8,
Div10,
Div16,
Div32,
Div64,
Div128,
Div256,
Div512,
}
/// APB prescaler
#[derive(Clone, Copy)]
pub enum APBPrescaler {
NotDivided,
Div2,
Div4,
Div8,
Div16,
}
impl Into<u8> for APBPrescaler { impl Into<u8> for APBPrescaler {
fn into(self) -> u8 { fn into(self) -> u8 {
match self { match self {
@ -41,9 +69,14 @@ impl Into<u8> for AHBPrescaler {
match self { match self {
AHBPrescaler::NotDivided => 1, AHBPrescaler::NotDivided => 1,
AHBPrescaler::Div2 => 0x08, AHBPrescaler::Div2 => 0x08,
AHBPrescaler::Div3 => 0x01,
AHBPrescaler::Div4 => 0x09, AHBPrescaler::Div4 => 0x09,
AHBPrescaler::Div5 => 0x02,
AHBPrescaler::Div6 => 0x05,
AHBPrescaler::Div8 => 0x0a, AHBPrescaler::Div8 => 0x0a,
AHBPrescaler::Div10 => 0x06,
AHBPrescaler::Div16 => 0x0b, AHBPrescaler::Div16 => 0x0b,
AHBPrescaler::Div32 => 0x07,
AHBPrescaler::Div64 => 0x0c, AHBPrescaler::Div64 => 0x0c,
AHBPrescaler::Div128 => 0x0d, AHBPrescaler::Div128 => 0x0d,
AHBPrescaler::Div256 => 0x0e, AHBPrescaler::Div256 => 0x0e,