Move to auto-generated based system.
This commit is contained in:
parent
c99c4a01a9
commit
e99ef49611
@ -430,6 +430,8 @@ fn main() {
|
|||||||
|
|
||||||
let mut clock_names = BTreeSet::new();
|
let mut clock_names = BTreeSet::new();
|
||||||
|
|
||||||
|
let mut rcc_cfgr_regs = BTreeMap::new();
|
||||||
|
|
||||||
for p in METADATA.peripherals {
|
for p in METADATA.peripherals {
|
||||||
if !singletons.contains(&p.name.to_string()) {
|
if !singletons.contains(&p.name.to_string()) {
|
||||||
continue;
|
continue;
|
||||||
@ -508,6 +510,16 @@ fn main() {
|
|||||||
let field_name = format_ident!("{}", field_name);
|
let field_name = format_ident!("{}", field_name);
|
||||||
let enum_name = format_ident!("{}", enum_name);
|
let enum_name = format_ident!("{}", enum_name);
|
||||||
|
|
||||||
|
if !rcc_cfgr_regs.contains_key(mux.register) {
|
||||||
|
rcc_cfgr_regs.insert(mux.register, Vec::new());
|
||||||
|
}
|
||||||
|
|
||||||
|
rcc_cfgr_regs.get_mut(mux.register).unwrap().push((
|
||||||
|
fieldset_name.clone(),
|
||||||
|
field_name.clone(),
|
||||||
|
enum_name.clone(),
|
||||||
|
));
|
||||||
|
|
||||||
let match_arms: TokenStream = enumm
|
let match_arms: TokenStream = enumm
|
||||||
.variants
|
.variants
|
||||||
.iter()
|
.iter()
|
||||||
@ -590,6 +602,63 @@ fn main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (rcc_cfgr_reg, fields) in rcc_cfgr_regs {
|
||||||
|
println!("cargo:rustc-cfg={}", rcc_cfgr_reg.to_ascii_lowercase());
|
||||||
|
|
||||||
|
let struct_fields: Vec<_> = fields
|
||||||
|
.iter()
|
||||||
|
.map(|(_fieldset, fieldname, enum_name)| {
|
||||||
|
quote! {
|
||||||
|
pub #fieldname: Option<crate::pac::rcc::vals::#enum_name>
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let field_names: Vec<_> = fields
|
||||||
|
.iter()
|
||||||
|
.map(|(_fieldset, fieldname, _enum_name)| fieldname)
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let inits: Vec<_> = fields
|
||||||
|
.iter()
|
||||||
|
.map(|(fieldset, fieldname, _enum_name)| {
|
||||||
|
let setter = format_ident!("set_{}", fieldname);
|
||||||
|
quote! {
|
||||||
|
match self.#fieldname {
|
||||||
|
None => {}
|
||||||
|
Some(val) => {
|
||||||
|
crate::pac::RCC.#fieldset()
|
||||||
|
.modify(|w| w.#setter(val));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let cfgr_reg = format_ident!("{}", rcc_cfgr_reg);
|
||||||
|
|
||||||
|
g.extend(quote! {
|
||||||
|
#[derive(Clone, Copy)]
|
||||||
|
pub struct #cfgr_reg {
|
||||||
|
#( #struct_fields, )*
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for #cfgr_reg {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
#( #field_names: None, )*
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl #cfgr_reg {
|
||||||
|
pub fn init(self) {
|
||||||
|
#( #inits )*
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Generate RCC
|
// Generate RCC
|
||||||
clock_names.insert("sys".to_string());
|
clock_names.insert("sys".to_string());
|
||||||
clock_names.insert("rtc".to_string());
|
clock_names.insert("rtc".to_string());
|
||||||
|
|||||||
@ -74,116 +74,6 @@ pub enum HrtimClockSource {
|
|||||||
PllClk,
|
PllClk,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(stm32f3, not(rcc_f37)))]
|
|
||||||
#[derive(Clone, Copy, PartialEq, Eq)]
|
|
||||||
pub enum TimClockSource {
|
|
||||||
PClk2,
|
|
||||||
PllClk,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(all(stm32f3, not(rcc_f37)))]
|
|
||||||
#[derive(Clone, Copy)]
|
|
||||||
pub struct TimClockSources {
|
|
||||||
pub tim1: TimClockSource,
|
|
||||||
#[cfg(any(
|
|
||||||
all(stm32f303, any(package_D, package_E)),
|
|
||||||
all(stm32f302, any(package_D, package_E)),
|
|
||||||
stm32f398
|
|
||||||
))]
|
|
||||||
pub tim2: TimClockSource,
|
|
||||||
#[cfg(any(
|
|
||||||
all(stm32f303, any(package_D, package_E)),
|
|
||||||
all(stm32f302, any(package_D, package_E)),
|
|
||||||
stm32f398
|
|
||||||
))]
|
|
||||||
pub tim34: TimClockSource,
|
|
||||||
#[cfg(any(
|
|
||||||
all(stm32f303, any(package_B, package_C, package_D, package_E)),
|
|
||||||
stm32f358,
|
|
||||||
stm32f398
|
|
||||||
))]
|
|
||||||
pub tim8: TimClockSource,
|
|
||||||
#[cfg(any(
|
|
||||||
all(stm32f303, any(package_D, package_E)),
|
|
||||||
stm32f301,
|
|
||||||
stm32f318,
|
|
||||||
all(stm32f302, any(package_6, package_8)),
|
|
||||||
stm32f398
|
|
||||||
))]
|
|
||||||
pub tim15: TimClockSource,
|
|
||||||
#[cfg(any(
|
|
||||||
all(stm32f303, any(package_D, package_E)),
|
|
||||||
stm32f301,
|
|
||||||
stm32f318,
|
|
||||||
all(stm32f302, any(package_6, package_8)),
|
|
||||||
stm32f398
|
|
||||||
))]
|
|
||||||
pub tim16: TimClockSource,
|
|
||||||
#[cfg(any(
|
|
||||||
all(stm32f303, any(package_D, package_E)),
|
|
||||||
stm32f301,
|
|
||||||
stm32f318,
|
|
||||||
all(stm32f302, any(package_6, package_8)),
|
|
||||||
stm32f398
|
|
||||||
))]
|
|
||||||
pub tim17: TimClockSource,
|
|
||||||
#[cfg(any(all(stm32f303, any(package_D, package_E))))]
|
|
||||||
pub tim20: TimClockSource,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(all(stm32f3, not(rcc_f37)))]
|
|
||||||
impl Default for TimClockSources {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self {
|
|
||||||
tim1: TimClockSource::PClk2,
|
|
||||||
#[cfg(any(
|
|
||||||
all(stm32f303, any(package_D, package_E)),
|
|
||||||
all(stm32f302, any(package_D, package_E)),
|
|
||||||
stm32f398
|
|
||||||
))]
|
|
||||||
tim2: TimClockSource::PClk2,
|
|
||||||
#[cfg(any(
|
|
||||||
all(stm32f303, any(package_D, package_E)),
|
|
||||||
all(stm32f302, any(package_D, package_E)),
|
|
||||||
stm32f398
|
|
||||||
))]
|
|
||||||
tim34: TimClockSource::PClk2,
|
|
||||||
#[cfg(any(
|
|
||||||
all(stm32f303, any(package_B, package_C, package_D, package_E)),
|
|
||||||
stm32f358,
|
|
||||||
stm32f398
|
|
||||||
))]
|
|
||||||
tim8: TimClockSource::PClk2,
|
|
||||||
#[cfg(any(
|
|
||||||
all(stm32f303, any(package_D, package_E)),
|
|
||||||
stm32f301,
|
|
||||||
stm32f318,
|
|
||||||
all(stm32f302, any(package_6, package_8)),
|
|
||||||
stm32f398
|
|
||||||
))]
|
|
||||||
tim15: TimClockSource::PClk2,
|
|
||||||
#[cfg(any(
|
|
||||||
all(stm32f303, any(package_D, package_E)),
|
|
||||||
stm32f301,
|
|
||||||
stm32f318,
|
|
||||||
all(stm32f302, any(package_6, package_8)),
|
|
||||||
stm32f398
|
|
||||||
))]
|
|
||||||
tim16: TimClockSource::PClk2,
|
|
||||||
#[cfg(any(
|
|
||||||
all(stm32f303, any(package_D, package_E)),
|
|
||||||
stm32f301,
|
|
||||||
stm32f318,
|
|
||||||
all(stm32f302, any(package_6, package_8)),
|
|
||||||
stm32f398
|
|
||||||
))]
|
|
||||||
tim17: TimClockSource::PClk2,
|
|
||||||
#[cfg(any(all(stm32f303, any(package_D, package_E))))]
|
|
||||||
tim20: TimClockSource::PClk2,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Clocks configutation
|
/// Clocks configutation
|
||||||
#[non_exhaustive]
|
#[non_exhaustive]
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
@ -209,8 +99,8 @@ pub struct Config {
|
|||||||
pub adc34: AdcClockSource,
|
pub adc34: AdcClockSource,
|
||||||
#[cfg(stm32f334)]
|
#[cfg(stm32f334)]
|
||||||
pub hrtim: HrtimClockSource,
|
pub hrtim: HrtimClockSource,
|
||||||
#[cfg(all(stm32f3, not(rcc_f37)))]
|
#[cfg(cfgr3)]
|
||||||
pub tim: TimClockSources,
|
pub cfgr3: crate::_generated::CFGR3,
|
||||||
|
|
||||||
pub ls: super::LsConfig,
|
pub ls: super::LsConfig,
|
||||||
}
|
}
|
||||||
@ -240,8 +130,8 @@ impl Default for Config {
|
|||||||
adc34: AdcClockSource::Hclk(AdcHclkPrescaler::Div1),
|
adc34: AdcClockSource::Hclk(AdcHclkPrescaler::Div1),
|
||||||
#[cfg(stm32f334)]
|
#[cfg(stm32f334)]
|
||||||
hrtim: HrtimClockSource::BusClk,
|
hrtim: HrtimClockSource::BusClk,
|
||||||
#[cfg(all(stm32f3, not(rcc_f37)))]
|
#[cfg(cfgr3)]
|
||||||
tim: Default::default(),
|
cfgr3: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -477,107 +367,8 @@ pub(crate) unsafe fn init(config: Config) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(all(stm32f3, not(rcc_f37)))]
|
#[cfg(cfgr3)]
|
||||||
match config.tim.tim1 {
|
config.cfgr3.init();
|
||||||
TimClockSource::PClk2 => {}
|
|
||||||
TimClockSource::PllClk => {
|
|
||||||
RCC.cfgr3()
|
|
||||||
.modify(|w| w.set_tim1sw(crate::pac::rcc::vals::Timsw::PLL1_P));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#[cfg(any(
|
|
||||||
all(stm32f303, any(package_D, package_E)),
|
|
||||||
all(stm32f302, any(package_D, package_E)),
|
|
||||||
stm32f398
|
|
||||||
))]
|
|
||||||
match config.tim.tim2 {
|
|
||||||
TimClockSource::PClk2 => {}
|
|
||||||
TimClockSource::PllClk => {
|
|
||||||
RCC.cfgr3()
|
|
||||||
.modify(|w| w.set_tim2sw(crate::pac::rcc::vals::Tim2sw::PLL1_P));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#[cfg(any(
|
|
||||||
all(stm32f303, any(package_D, package_E)),
|
|
||||||
all(stm32f302, any(package_D, package_E)),
|
|
||||||
stm32f398
|
|
||||||
))]
|
|
||||||
match config.tim.tim34 {
|
|
||||||
TimClockSource::PClk2 => {}
|
|
||||||
TimClockSource::PllClk => {
|
|
||||||
RCC.cfgr3()
|
|
||||||
.modify(|w| w.set_tim34sw(crate::pac::rcc::vals::Timsw::PLL1_P));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#[cfg(any(
|
|
||||||
all(stm32f303, any(package_B, package_C, package_D, package_E)),
|
|
||||||
stm32f358,
|
|
||||||
stm32f398
|
|
||||||
))]
|
|
||||||
match config.tim.tim8 {
|
|
||||||
TimClockSource::PClk2 => {}
|
|
||||||
TimClockSource::PllClk => {
|
|
||||||
RCC.cfgr3()
|
|
||||||
.modify(|w| w.set_tim8sw(crate::pac::rcc::vals::Timsw::PLL1_P));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#[cfg(any(
|
|
||||||
all(stm32f303, any(package_D, package_E)),
|
|
||||||
stm32f301,
|
|
||||||
stm32f318,
|
|
||||||
all(stm32f302, any(package_6, package_8)),
|
|
||||||
stm32f398
|
|
||||||
))]
|
|
||||||
match config.tim.tim15 {
|
|
||||||
TimClockSource::PClk2 => {}
|
|
||||||
TimClockSource::PllClk => {
|
|
||||||
RCC.cfgr3()
|
|
||||||
.modify(|w| w.set_tim15sw(crate::pac::rcc::vals::Timsw::PLL1_P));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#[cfg(any(
|
|
||||||
all(stm32f303, any(package_D, package_E)),
|
|
||||||
stm32f301,
|
|
||||||
stm32f318,
|
|
||||||
all(stm32f302, any(package_6, package_8)),
|
|
||||||
stm32f398
|
|
||||||
))]
|
|
||||||
match config.tim.tim16 {
|
|
||||||
TimClockSource::PClk2 => {}
|
|
||||||
TimClockSource::PllClk => {
|
|
||||||
RCC.cfgr3()
|
|
||||||
.modify(|w| w.set_tim16sw(crate::pac::rcc::vals::Timsw::PLL1_P));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#[cfg(any(
|
|
||||||
all(stm32f303, any(package_D, package_E)),
|
|
||||||
stm32f301,
|
|
||||||
stm32f318,
|
|
||||||
all(stm32f302, any(package_6, package_8)),
|
|
||||||
stm32f398
|
|
||||||
))]
|
|
||||||
match config.tim.tim17 {
|
|
||||||
TimClockSource::PClk2 => {}
|
|
||||||
TimClockSource::PllClk => {
|
|
||||||
RCC.cfgr3()
|
|
||||||
.modify(|w| w.set_tim17sw(crate::pac::rcc::vals::Timsw::PLL1_P));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(any(all(stm32f303, any(package_D, package_E))))]
|
|
||||||
match config.tim.tim20 {
|
|
||||||
TimClockSource::PClk2 => {}
|
|
||||||
TimClockSource::PllClk => {
|
|
||||||
RCC.cfgr3()
|
|
||||||
.modify(|w| w.set_tim20sw(crate::pac::rcc::vals::Timsw::PLL1_P));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
set_clocks!(
|
set_clocks!(
|
||||||
hsi: hsi,
|
hsi: hsi,
|
||||||
|
|||||||
@ -17,7 +17,9 @@ bind_interrupts!(struct Irqs {
|
|||||||
|
|
||||||
#[embassy_executor::main]
|
#[embassy_executor::main]
|
||||||
async fn main(_spawner: Spawner) {
|
async fn main(_spawner: Spawner) {
|
||||||
let p = embassy_stm32::init(Default::default());
|
let mut init_config = embassy_stm32::Config::default();
|
||||||
|
init_config.rcc.cfgr3.usart1sw = Some(embassy_stm32::pac::rcc::vals::Usart1sw::HSI);
|
||||||
|
let p = embassy_stm32::init(init_config);
|
||||||
info!("Hello World!");
|
info!("Hello World!");
|
||||||
|
|
||||||
let config = Config::default();
|
let config = Config::default();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user