Manually maintain memory maps instead of parsing them from cubeprogdb.
First step towards fixing #301 The cubeprogdb has turned out to be a quite bad data source. It's not granular enough (it has one entry per chip die, not per chip) so the previous code joined the data with the C headers and cubedb to fill in the gaps, essentialy "guessing" stuff. This has been quite error prone (see #301) and hard to make fixes to. Instead, we're going to manually maintain memory maps in a .rs file. This way, if something is wrong we can simply go and fix it. This commit just migrates the existing data, even if it's wrong. (it does fix a few very minor mistakes). Next steps is actually fixing the memory maps.
This commit is contained in:
parent
9d3d5c9690
commit
8e26f36a8e
@ -58,7 +58,9 @@ mod xml {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct Chip {
|
pub struct Chip {
|
||||||
|
#[allow(dead_code)]
|
||||||
flash: u32,
|
flash: u32,
|
||||||
|
#[allow(dead_code)]
|
||||||
ram: u32,
|
ram: u32,
|
||||||
group_idx: usize,
|
group_idx: usize,
|
||||||
packages: Vec<stm32_data_serde::chip::Package>,
|
packages: Vec<stm32_data_serde::chip::Package>,
|
||||||
@ -903,7 +905,6 @@ fn process_group(
|
|||||||
peripheral_to_clock: &rcc::ParsedRccs,
|
peripheral_to_clock: &rcc::ParsedRccs,
|
||||||
dma_channels: &dma::DmaChannels,
|
dma_channels: &dma::DmaChannels,
|
||||||
chips: &HashMap<String, Chip>,
|
chips: &HashMap<String, Chip>,
|
||||||
memories: &memory::Memories,
|
|
||||||
docs: &docs::Docs,
|
docs: &docs::Docs,
|
||||||
) -> Result<(), anyhow::Error> {
|
) -> Result<(), anyhow::Error> {
|
||||||
let chip_name = group.chip_names[0].clone();
|
let chip_name = group.chip_names[0].clone();
|
||||||
@ -942,7 +943,7 @@ fn process_group(
|
|||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
for chip_name in &group.chip_names {
|
for chip_name in &group.chip_names {
|
||||||
process_chip(chips, chip_name, h, memories, docs, &group, &cores)?;
|
process_chip(chips, chip_name, h, docs, &group, &cores)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -1338,159 +1339,21 @@ fn process_core(
|
|||||||
fn process_chip(
|
fn process_chip(
|
||||||
chips: &HashMap<String, Chip>,
|
chips: &HashMap<String, Chip>,
|
||||||
chip_name: &str,
|
chip_name: &str,
|
||||||
h: &header::ParsedHeader,
|
_h: &header::ParsedHeader,
|
||||||
memories: &memory::Memories,
|
|
||||||
docs: &docs::Docs,
|
docs: &docs::Docs,
|
||||||
group: &ChipGroup,
|
group: &ChipGroup,
|
||||||
cores: &[stm32_data_serde::chip::Core],
|
cores: &[stm32_data_serde::chip::Core],
|
||||||
) -> Result<(), anyhow::Error> {
|
) -> Result<(), anyhow::Error> {
|
||||||
let chip = chips.get(chip_name).unwrap();
|
let chip = chips.get(chip_name).unwrap();
|
||||||
let flash_size = chip.flash * 1024;
|
|
||||||
let ram_total = chip.ram * 1024;
|
|
||||||
let memory = memories.get(group.die.as_ref().unwrap());
|
|
||||||
let mut flash_remaining = flash_size;
|
|
||||||
let mut memory_regions = Vec::new();
|
|
||||||
let mut found = HashSet::<&str>::new();
|
|
||||||
for each in [
|
|
||||||
// We test FLASH_BANKx _before_ FLASH as we prefer their definition over the legacy one
|
|
||||||
"FLASH_BANK1",
|
|
||||||
"FLASH_BANK2",
|
|
||||||
"FLASH",
|
|
||||||
"D1_AXIFLASH",
|
|
||||||
"D1_AXIICP",
|
|
||||||
] {
|
|
||||||
if let Some(address) = h.defines.get("all").unwrap().0.get(&format!("{each}_BASE")) {
|
|
||||||
let (key, banks) = match each {
|
|
||||||
"FLASH" => (
|
|
||||||
"BANK_1",
|
|
||||||
Some([memory::FlashBank::Bank1, memory::FlashBank::Bank2].as_ref()),
|
|
||||||
),
|
|
||||||
"FLASH_BANK1" => ("BANK_1", Some([memory::FlashBank::Bank1].as_ref())),
|
|
||||||
"FLASH_BANK2" => ("BANK_2", Some([memory::FlashBank::Bank2].as_ref())),
|
|
||||||
each => (each, None),
|
|
||||||
};
|
|
||||||
|
|
||||||
if found.contains(key) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
found.insert(key);
|
|
||||||
|
|
||||||
if let Some(banks) = banks {
|
|
||||||
for bank in banks {
|
|
||||||
let bank_name = match bank {
|
|
||||||
memory::FlashBank::Bank1 => "BANK_1",
|
|
||||||
memory::FlashBank::Bank2 => "BANK_2",
|
|
||||||
};
|
|
||||||
let regions: Vec<_> = memory
|
|
||||||
.flash_regions
|
|
||||||
.iter()
|
|
||||||
.filter(|region| region.bank == *bank)
|
|
||||||
.enumerate()
|
|
||||||
.map_while(|(index, region)| {
|
|
||||||
let size = if *bank == memory::FlashBank::Bank1 || *bank == memory::FlashBank::Bank2 {
|
|
||||||
// Truncate region to the total amount of remaining chip flash
|
|
||||||
let size = std::cmp::min(region.bytes, flash_remaining);
|
|
||||||
flash_remaining -= size;
|
|
||||||
if size == 0 {
|
|
||||||
// No more regions are present on this chip
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
size
|
|
||||||
} else {
|
|
||||||
region.bytes
|
|
||||||
};
|
|
||||||
|
|
||||||
Some((index, region.address, size, region.settings.clone()))
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
let has_multiple_regions = regions.len() > 1;
|
|
||||||
for (index, address, size, settings) in regions {
|
|
||||||
let name = if has_multiple_regions {
|
|
||||||
format!("{}_REGION_{}", bank_name, index + 1)
|
|
||||||
} else {
|
|
||||||
bank_name.to_string()
|
|
||||||
};
|
|
||||||
|
|
||||||
memory_regions.push(stm32_data_serde::chip::Memory {
|
|
||||||
name,
|
|
||||||
kind: stm32_data_serde::chip::memory::Kind::Flash,
|
|
||||||
address,
|
|
||||||
size,
|
|
||||||
settings: Some(settings.clone()),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
memory_regions.push(stm32_data_serde::chip::Memory {
|
|
||||||
name: key.to_string(),
|
|
||||||
kind: stm32_data_serde::chip::memory::Kind::Flash,
|
|
||||||
address: u32::try_from(*address).unwrap(),
|
|
||||||
size: 0,
|
|
||||||
settings: None,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let mut found = HashSet::new();
|
|
||||||
for each in [
|
|
||||||
"SRAM",
|
|
||||||
"SRAM1",
|
|
||||||
"SRAM2",
|
|
||||||
"D1_AXISRAM",
|
|
||||||
"D1_ITCMRAM",
|
|
||||||
"D1_DTCMRAM",
|
|
||||||
"D1_AHBSRAM",
|
|
||||||
"D2_AXISRAM",
|
|
||||||
"D3_BKPSRAM",
|
|
||||||
"D3_SRAM",
|
|
||||||
] {
|
|
||||||
if let Some(address) = h.defines.get("all").unwrap().0.get(&format!("{each}_BASE")) {
|
|
||||||
let key = match each {
|
|
||||||
"D1_AXISRAM" => "SRAM",
|
|
||||||
"SRAM1" => "SRAM",
|
|
||||||
each => each,
|
|
||||||
};
|
|
||||||
|
|
||||||
if found.contains(key) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
found.insert(key);
|
|
||||||
|
|
||||||
let size = if key == "SRAM" {
|
|
||||||
// if memory.ram.bytes != ram_total {
|
|
||||||
// println!(
|
|
||||||
// "SRAM mismatch for chip {} with die {}: Expected {} was {}",
|
|
||||||
// chip_name,
|
|
||||||
// group.die.as_ref().unwrap(),
|
|
||||||
// ram_total,
|
|
||||||
// memory.ram.bytes,
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
std::cmp::min(memory.ram.bytes, ram_total)
|
|
||||||
} else {
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
memory_regions.push(stm32_data_serde::chip::Memory {
|
|
||||||
name: key.to_string(),
|
|
||||||
kind: stm32_data_serde::chip::memory::Kind::Ram,
|
|
||||||
address: u32::try_from(*address).unwrap(),
|
|
||||||
size,
|
|
||||||
settings: None,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
memory_regions.sort_by_key(|m| (m.address, m.name.clone()));
|
|
||||||
|
|
||||||
let docs = docs.documents_for(chip_name);
|
let docs = docs.documents_for(chip_name);
|
||||||
let chip = stm32_data_serde::Chip {
|
let chip = stm32_data_serde::Chip {
|
||||||
name: chip_name.to_string(),
|
name: chip_name.to_string(),
|
||||||
family: group.family.clone().unwrap(),
|
family: group.family.clone().unwrap(),
|
||||||
line: group.line.clone().unwrap(),
|
line: group.line.clone().unwrap(),
|
||||||
die: group.die.clone().unwrap(),
|
die: group.die.clone().unwrap(),
|
||||||
device_id: memory.device_id,
|
device_id: u16::from_str_radix(&group.die.as_ref().unwrap()[3..], 16).unwrap(),
|
||||||
packages: chip.packages.clone(),
|
packages: chip.packages.clone(),
|
||||||
memory: memory_regions,
|
memory: memory::get(chip_name),
|
||||||
docs,
|
docs,
|
||||||
cores: cores.to_vec(),
|
cores: cores.to_vec(),
|
||||||
};
|
};
|
||||||
@ -1531,7 +1394,6 @@ pub fn dump_all_chips(
|
|||||||
peripheral_to_clock: rcc::ParsedRccs,
|
peripheral_to_clock: rcc::ParsedRccs,
|
||||||
dma_channels: dma::DmaChannels,
|
dma_channels: dma::DmaChannels,
|
||||||
chips: std::collections::HashMap<String, Chip>,
|
chips: std::collections::HashMap<String, Chip>,
|
||||||
memories: memory::Memories,
|
|
||||||
docs: docs::Docs,
|
docs: docs::Docs,
|
||||||
) -> Result<(), anyhow::Error> {
|
) -> Result<(), anyhow::Error> {
|
||||||
std::fs::create_dir_all("build/data/chips")?;
|
std::fs::create_dir_all("build/data/chips")?;
|
||||||
@ -1552,7 +1414,6 @@ pub fn dump_all_chips(
|
|||||||
&peripheral_to_clock,
|
&peripheral_to_clock,
|
||||||
&dma_channels,
|
&dma_channels,
|
||||||
&chips,
|
&chips,
|
||||||
&memories,
|
|
||||||
&docs,
|
&docs,
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
@ -69,9 +69,6 @@ fn main() -> anyhow::Result<()> {
|
|||||||
let registers = registers::Registers::parse()?;
|
let registers = registers::Registers::parse()?;
|
||||||
registers.write()?;
|
registers.write()?;
|
||||||
|
|
||||||
// stopwatch.section("Parsing memories");
|
|
||||||
let memories = memory::Memories::parse()?;
|
|
||||||
|
|
||||||
// stopwatch.section("Parsing interrupts");
|
// stopwatch.section("Parsing interrupts");
|
||||||
let chip_interrupts = interrupts::ChipInterrupts::parse()?;
|
let chip_interrupts = interrupts::ChipInterrupts::parse()?;
|
||||||
|
|
||||||
@ -99,7 +96,6 @@ fn main() -> anyhow::Result<()> {
|
|||||||
peripheral_to_clock,
|
peripheral_to_clock,
|
||||||
dma_channels,
|
dma_channels,
|
||||||
chips,
|
chips,
|
||||||
memories,
|
|
||||||
docs,
|
docs,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
|
@ -1,285 +1,330 @@
|
|||||||
use std::cmp::Ordering;
|
use regex::Regex;
|
||||||
use std::collections::HashMap;
|
use stm32_data_serde::chip::memory::{self, Settings};
|
||||||
use std::fs;
|
use stm32_data_serde::chip::Memory;
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
struct Mem {
|
||||||
pub struct Memory {
|
name: &'static str,
|
||||||
pub device_id: u16,
|
address: u32,
|
||||||
pub ram: Ram,
|
size: u32,
|
||||||
pub flash_size: u32,
|
|
||||||
pub flash_regions: Vec<FlashRegion>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, PartialEq)]
|
macro_rules! mem {
|
||||||
pub struct Ram {
|
($($name:ident $addr:literal $size:literal),*) => {
|
||||||
pub address: u32,
|
&[
|
||||||
pub bytes: u32,
|
$(
|
||||||
}
|
Mem {
|
||||||
|
name: stringify!($name),
|
||||||
#[derive(Clone, Debug, PartialEq)]
|
address: $addr,
|
||||||
pub struct FlashRegion {
|
size: $size*1024,
|
||||||
pub bank: FlashBank,
|
},
|
||||||
pub address: u32,
|
)*
|
||||||
pub bytes: u32,
|
]
|
||||||
pub settings: stm32_data_serde::chip::memory::Settings,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, PartialEq)]
|
|
||||||
pub enum FlashBank {
|
|
||||||
Bank1,
|
|
||||||
Bank2,
|
|
||||||
}
|
|
||||||
|
|
||||||
mod xml {
|
|
||||||
use serde::Deserialize;
|
|
||||||
|
|
||||||
pub fn from_hex<'de, T, D>(deserializer: D) -> Result<T, D::Error>
|
|
||||||
where
|
|
||||||
D: serde::Deserializer<'de>,
|
|
||||||
T: num::Num,
|
|
||||||
T::FromStrRadixErr: std::fmt::Display,
|
|
||||||
{
|
|
||||||
use serde::de::Error;
|
|
||||||
let s: &str = Deserialize::deserialize(deserializer)?;
|
|
||||||
let s = s.trim();
|
|
||||||
let (prefix, num) = s.split_at(2);
|
|
||||||
if prefix != "0x" && prefix != "0X" {
|
|
||||||
panic!("no hex prefix");
|
|
||||||
}
|
|
||||||
T::from_str_radix(num, 16).map_err(D::Error::custom)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn opt_from_hex<'de, T, D>(deserializer: D) -> Result<Option<T>, D::Error>
|
|
||||||
where
|
|
||||||
D: serde::Deserializer<'de>,
|
|
||||||
T: num::Num,
|
|
||||||
T::FromStrRadixErr: std::fmt::Display,
|
|
||||||
{
|
|
||||||
Ok(Some(from_hex(deserializer)?))
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, PartialEq)]
|
|
||||||
pub struct Root {
|
|
||||||
#[serde(rename = "Device")]
|
|
||||||
pub device: root::Device,
|
|
||||||
}
|
|
||||||
|
|
||||||
mod root {
|
|
||||||
use serde::Deserialize;
|
|
||||||
|
|
||||||
use super::from_hex;
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, PartialEq)]
|
|
||||||
pub struct Device {
|
|
||||||
#[serde(rename = "DeviceID", deserialize_with = "from_hex")]
|
|
||||||
pub device_id: u16,
|
|
||||||
#[serde(rename = "Name")]
|
|
||||||
pub name: String,
|
|
||||||
#[serde(rename = "Peripherals")]
|
|
||||||
pub peripherals: device::Peripherals,
|
|
||||||
}
|
|
||||||
|
|
||||||
mod device {
|
|
||||||
use serde::Deserialize;
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, PartialEq)]
|
|
||||||
pub struct Peripherals {
|
|
||||||
#[serde(rename = "Peripheral")]
|
|
||||||
pub peripharal: Vec<peripherals::Peripheral>,
|
|
||||||
}
|
|
||||||
|
|
||||||
mod peripherals {
|
|
||||||
use serde::Deserialize;
|
|
||||||
|
|
||||||
use super::super::super::opt_from_hex;
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, PartialEq)]
|
|
||||||
pub struct Peripheral {
|
|
||||||
#[serde(rename = "Name")]
|
|
||||||
// pub name: peripheral::Name,
|
|
||||||
pub name: String,
|
|
||||||
#[serde(rename = "ErasedValue", deserialize_with = "opt_from_hex", default)]
|
|
||||||
pub erased_value: Option<u8>,
|
|
||||||
#[serde(rename = "Configuration", default)]
|
|
||||||
pub configuration: Vec<peripheral::Configuration>,
|
|
||||||
}
|
|
||||||
|
|
||||||
mod peripheral {
|
|
||||||
use serde::Deserialize;
|
|
||||||
|
|
||||||
use super::super::super::super::opt_from_hex;
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, PartialEq)]
|
|
||||||
pub struct Configuration {
|
|
||||||
#[serde(rename = "Parameters", default)]
|
|
||||||
pub parameters: Option<configuration::Parameters>,
|
|
||||||
#[serde(rename = "Organization", default)]
|
|
||||||
pub organization: Option<String>,
|
|
||||||
#[serde(rename = "Allignement", deserialize_with = "opt_from_hex", default)]
|
|
||||||
pub allignement: Option<u32>,
|
|
||||||
#[serde(rename = "Bank")]
|
|
||||||
pub bank: Vec<configuration::Bank>,
|
|
||||||
}
|
|
||||||
|
|
||||||
mod configuration {
|
|
||||||
use serde::Deserialize;
|
|
||||||
|
|
||||||
use super::super::super::super::super::{from_hex, opt_from_hex};
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, PartialEq)]
|
|
||||||
pub struct Parameters {
|
|
||||||
#[serde(deserialize_with = "from_hex")]
|
|
||||||
pub address: u32,
|
|
||||||
#[serde(deserialize_with = "from_hex")]
|
|
||||||
pub size: u32,
|
|
||||||
#[serde(deserialize_with = "opt_from_hex", default)]
|
|
||||||
pub occurence: Option<u32>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, PartialEq)]
|
|
||||||
pub struct Bank {
|
|
||||||
#[serde(default)]
|
|
||||||
pub name: Option<String>,
|
|
||||||
#[serde(rename = "Field", default)]
|
|
||||||
pub field: Vec<bank::Field>,
|
|
||||||
}
|
|
||||||
|
|
||||||
mod bank {
|
|
||||||
use serde::Deserialize;
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, PartialEq)]
|
|
||||||
pub struct Field {
|
|
||||||
#[serde(rename = "Parameters")]
|
|
||||||
pub parameters: super::Parameters,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pub struct Memories(HashMap<u16, Memory>);
|
|
||||||
|
|
||||||
impl Memories {
|
|
||||||
pub fn parse() -> anyhow::Result<Self> {
|
|
||||||
let mut paths: Vec<_> = glob::glob("sources/cubeprogdb/db/*.xml")
|
|
||||||
.unwrap()
|
|
||||||
.map(Result::unwrap)
|
|
||||||
.collect();
|
|
||||||
paths.sort();
|
|
||||||
|
|
||||||
let mut memories = HashMap::new();
|
|
||||||
|
|
||||||
for f in paths {
|
|
||||||
// println!("Parsing {f:?}");
|
|
||||||
let file = fs::read_to_string(f)?;
|
|
||||||
let parsed: xml::Root = quick_xml::de::from_str(&file)?;
|
|
||||||
// dbg!(&parsed);
|
|
||||||
|
|
||||||
let device_id = parsed.device.device_id;
|
|
||||||
|
|
||||||
let mut ram = None;
|
|
||||||
let mut flash_size = None;
|
|
||||||
let mut flash_regions = vec![];
|
|
||||||
|
|
||||||
for mut peripheral in parsed.device.peripherals.peripharal {
|
|
||||||
if peripheral.name == "Embedded SRAM" && ram.is_none() {
|
|
||||||
let config = peripheral.configuration.first().unwrap();
|
|
||||||
let parameters = config.parameters.as_ref().unwrap();
|
|
||||||
ram = Some(Ram {
|
|
||||||
address: parameters.address,
|
|
||||||
bytes: parameters.size,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
enum BlockKind {
|
|
||||||
Main,
|
|
||||||
}
|
|
||||||
let kind = match peripheral.name.as_str() {
|
|
||||||
"Embedded Flash" => Some(BlockKind::Main),
|
|
||||||
"OTP" => None,
|
|
||||||
_ => None,
|
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(kind) = kind {
|
#[rustfmt::skip]
|
||||||
peripheral.configuration.sort_by(|a, b| {
|
static MEMS: RegexMap<&[Mem]> = RegexMap::new(&[
|
||||||
// Prefer largest size
|
("STM32C01..4", mem!(BANK_1 0x08000000 16, SRAM 0x20000000 6)),
|
||||||
let ordering = b
|
("STM32C01..6", mem!(BANK_1 0x08000000 32, SRAM 0x20000000 6)),
|
||||||
.parameters
|
("STM32C03..4", mem!(BANK_1 0x08000000 16, SRAM 0x20000000 12)),
|
||||||
.as_ref()
|
("STM32C03..6", mem!(BANK_1 0x08000000 32, SRAM 0x20000000 12)),
|
||||||
.unwrap()
|
("STM32F0...C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 32)),
|
||||||
.size
|
("STM32F0[35]..8", mem!(BANK_1 0x08000000 64, SRAM 0x20000000 8)),
|
||||||
.partial_cmp(&a.parameters.as_ref().unwrap().size)
|
("STM32F0[47]..6", mem!(BANK_1 0x08000000 32, SRAM 0x20000000 6)),
|
||||||
.unwrap();
|
("STM32F03..4", mem!(BANK_1 0x08000000 16, SRAM 0x20000000 4)),
|
||||||
|
("STM32F03..6", mem!(BANK_1 0x08000000 32, SRAM 0x20000000 4)),
|
||||||
|
("STM32F04..4", mem!(BANK_1 0x08000000 16, SRAM 0x20000000 6)),
|
||||||
|
("STM32F05..4", mem!(BANK_1 0x08000000 16, SRAM 0x20000000 8)),
|
||||||
|
("STM32F05..6", mem!(BANK_1 0x08000000 32, SRAM 0x20000000 8)),
|
||||||
|
("STM32F07..8", mem!(BANK_1 0x08000000 64, SRAM 0x20000000 16)),
|
||||||
|
("STM32F07..B", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 16)),
|
||||||
|
("STM32F09..B", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 32)),
|
||||||
|
("STM32F1.[12].6", mem!(BANK_1 0x08000000 32, SRAM 0x20000000 6)),
|
||||||
|
("STM32F1.[12].8", mem!(BANK_1 0x08000000 64, SRAM 0x20000000 10)),
|
||||||
|
("STM32F1.[12].B", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 16)),
|
||||||
|
("STM32F1.[57].B", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 64)),
|
||||||
|
("STM32F1.[57].C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 64)),
|
||||||
|
("STM32F1.0.6", mem!(BANK_1 0x08000000 32, SRAM 0x20000000 4)),
|
||||||
|
("STM32F1.0.8", mem!(BANK_1 0x08000000 64, SRAM 0x20000000 8)),
|
||||||
|
("STM32F1.0.B", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 8)),
|
||||||
|
("STM32F1.0.C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 24)),
|
||||||
|
("STM32F1.0.D", mem!(BANK_1 0x08000000 384, SRAM 0x20000000 32)),
|
||||||
|
("STM32F1.0.E", mem!(BANK_1 0x08000000 512, SRAM 0x20000000 32)),
|
||||||
|
("STM32F1.1.C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 32)),
|
||||||
|
("STM32F1.1.D", mem!(BANK_1 0x08000000 384, SRAM 0x20000000 48)),
|
||||||
|
("STM32F1.1.E", mem!(BANK_1 0x08000000 512, SRAM 0x20000000 48)),
|
||||||
|
("STM32F1.1.F", mem!(BANK_1 0x08000000 512, BANK_2 0x08080000 256, SRAM 0x20000000 80)),
|
||||||
|
("STM32F1.1.G", mem!(BANK_1 0x08000000 512, BANK_2 0x08080000 512, SRAM 0x20000000 80)),
|
||||||
|
("STM32F1.3.6", mem!(BANK_1 0x08000000 32, SRAM 0x20000000 10)),
|
||||||
|
("STM32F1.3.8", mem!(BANK_1 0x08000000 64, SRAM 0x20000000 20)),
|
||||||
|
("STM32F1.3.B", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 20)),
|
||||||
|
("STM32F1.3.C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 48)),
|
||||||
|
("STM32F1.3.D", mem!(BANK_1 0x08000000 384, SRAM 0x20000000 64)),
|
||||||
|
("STM32F1.3.E", mem!(BANK_1 0x08000000 512, SRAM 0x20000000 64)),
|
||||||
|
("STM32F1.3.F", mem!(BANK_1 0x08000000 512, BANK_2 0x08080000 256, SRAM 0x20000000 96)),
|
||||||
|
("STM32F1.3.G", mem!(BANK_1 0x08000000 512, BANK_2 0x08080000 512, SRAM 0x20000000 96)),
|
||||||
|
("STM32F1.5.8", mem!(BANK_1 0x08000000 64, SRAM 0x20000000 64)),
|
||||||
|
("STM32F10[012].4", mem!(BANK_1 0x08000000 16, SRAM 0x20000000 4)),
|
||||||
|
("STM32F103.4", mem!(BANK_1 0x08000000 16, SRAM 0x20000000 6)),
|
||||||
|
("STM32F2...B", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 64, SRAM2 0x2001c000 0)),
|
||||||
|
("STM32F2...E", mem!(BANK_1 0x08000000 512, SRAM 0x20000000 128, SRAM2 0x2001c000 0)),
|
||||||
|
("STM32F2...F", mem!(BANK_1 0x08000000 768, SRAM 0x20000000 128, SRAM2 0x2001c000 0)),
|
||||||
|
("STM32F2...G", mem!(BANK_1 0x08000000 1024, SRAM 0x20000000 128, SRAM2 0x2001c000 0)),
|
||||||
|
("STM32F2.5.C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 96, SRAM2 0x2001c000 0)),
|
||||||
|
("STM32F2.7.C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 128, SRAM2 0x2001c000 0)),
|
||||||
|
("STM32F3...4", mem!(BANK_1 0x08000000 16, SRAM 0x20000000 12)),
|
||||||
|
("STM32F3...D", mem!(BANK_1 0x08000000 384, SRAM 0x20000000 64)),
|
||||||
|
("STM32F3...E", mem!(BANK_1 0x08000000 512, SRAM 0x20000000 64)),
|
||||||
|
("STM32F3.[12].6", mem!(BANK_1 0x08000000 32, SRAM 0x20000000 16)),
|
||||||
|
("STM32F3.[34].6", mem!(BANK_1 0x08000000 32, SRAM 0x20000000 12)),
|
||||||
|
("STM32F3([17]..8|0[12].8)", mem!(BANK_1 0x08000000 64, SRAM 0x20000000 16)),
|
||||||
|
("STM32F3([23]..8|03.8)", mem!(BANK_1 0x08000000 64, SRAM 0x20000000 12)),
|
||||||
|
("STM32F3[05]..C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 40)),
|
||||||
|
("STM32F30..B", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 32)),
|
||||||
|
("STM32F37..B", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 24)),
|
||||||
|
("STM32F37..C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 32)),
|
||||||
|
("STM32F4...8", mem!(BANK_1 0x08000000 64, SRAM 0x20000000 32)),
|
||||||
|
("STM32F4...D", mem!(BANK_1 0x08000000 384, SRAM 0x20000000 64)),
|
||||||
|
("STM32F4...H", mem!(BANK_1 0x08000000 1536, SRAM 0x20000000 320, SRAM2 0x20040000 0)),
|
||||||
|
("STM32F4.[567].E", mem!(BANK_1 0x08000000 512, SRAM 0x20000000 128, SRAM2 0x2001c000 0)),
|
||||||
|
("STM32F4.1.C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 64)),
|
||||||
|
("STM32F4.1.E", mem!(BANK_1 0x08000000 512, SRAM 0x20000000 64)),
|
||||||
|
("STM32F4.2.E", mem!(BANK_1 0x08000000 512, SRAM 0x20000000 256)),
|
||||||
|
("STM32F4.6.C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 128, SRAM2 0x2001c000 0)),
|
||||||
|
("STM32F4(1[57].G|0..G)", mem!(BANK_1 0x08000000 1024, SRAM 0x20000000 128, SRAM2 0x2001c000 0)),
|
||||||
|
("STM32F4[23]..G", mem!(BANK_1 0x08000000 1024, SRAM 0x20000000 192, SRAM2 0x2001c000 0)),
|
||||||
|
("STM32F4[23]..I", mem!(BANK_1 0x08000000 1024, BANK_2 0x08100000 1024, SRAM 0x20000000 192, SRAM2 0x2001c000 0)),
|
||||||
|
("STM32F4[67]..G", mem!(BANK_1 0x08000000 1024, SRAM 0x20000000 320, SRAM2 0x20028000 0)),
|
||||||
|
("STM32F4[67]..I", mem!(BANK_1 0x08000000 1024, BANK_2 0x08100000 1024, SRAM 0x20000000 320, SRAM2 0x20028000 0)),
|
||||||
|
("STM32F40..B", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 64)),
|
||||||
|
("STM32F41..B", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 32)),
|
||||||
|
("STM32F412.G", mem!(BANK_1 0x08000000 1024, SRAM 0x20000000 256)),
|
||||||
|
("STM32F413.G", mem!(BANK_1 0x08000000 1024, SRAM 0x20000000 320, SRAM2 0x20040000 0)),
|
||||||
|
("STM32F429.E", mem!(BANK_1 0x08000000 512, SRAM 0x20000000 192, SRAM2 0x2001c000 0)),
|
||||||
|
("STM32F469.E", mem!(BANK_1 0x08000000 512, SRAM 0x20000000 320, SRAM2 0x20028000 0)),
|
||||||
|
("STM32F7...C", mem!(BANK_1 0x08000000 256, SRAM 0x20010000 192, SRAM2 0x2003c000 0)),
|
||||||
|
("STM32F7...I", mem!(BANK_1 0x08000000 2048, SRAM 0x20020000 384, SRAM2 0x2007c000 0)),
|
||||||
|
("STM32F7[23]..E", mem!(BANK_1 0x08000000 512, SRAM 0x20010000 192, SRAM2 0x2003c000 0)),
|
||||||
|
("STM32F7[45]..G", mem!(BANK_1 0x08000000 1024, SRAM 0x20010000 320, SRAM2 0x2004c000 0)),
|
||||||
|
("STM32F73..8", mem!(BANK_1 0x08000000 64, SRAM 0x20010000 192, SRAM2 0x2003c000 0)),
|
||||||
|
("STM32F74..E", mem!(BANK_1 0x08000000 512, SRAM 0x20010000 320, SRAM2 0x2004c000 0)),
|
||||||
|
("STM32F75..8", mem!(BANK_1 0x08000000 64, SRAM 0x20010000 320, SRAM2 0x2004c000 0)),
|
||||||
|
("STM32F76..G", mem!(BANK_1 0x08000000 1024, SRAM 0x20020000 384, SRAM2 0x2007c000 0)),
|
||||||
|
("STM32G0...4", mem!(BANK_1 0x08000000 16, SRAM 0x20000000 8)),
|
||||||
|
("STM32G0...C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 128)),
|
||||||
|
("STM32G0...E", mem!(BANK_1 0x08000000 256, BANK_2 0x08040000 256, SRAM 0x20000000 128)),
|
||||||
|
("STM32G0[34]..[68]", mem!(BANK_1 0x08000000 32, SRAM 0x20000000 8)),
|
||||||
|
("STM32G0[56]..6", mem!(BANK_1 0x08000000 32, SRAM 0x20000000 16)),
|
||||||
|
("STM32G0[56]..8", mem!(BANK_1 0x08000000 64, SRAM 0x20000000 16)),
|
||||||
|
("STM32G0[78]..B", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 32)),
|
||||||
|
("STM32G07..6", mem!(BANK_1 0x08000000 32, SRAM 0x20000000 32)),
|
||||||
|
("STM32G07..8", mem!(BANK_1 0x08000000 64, SRAM 0x20000000 32)),
|
||||||
|
("STM32G0B..B", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 128)),
|
||||||
|
("STM32G4...6", mem!(BANK_1 0x08000000 32, SRAM 0x20000000 20, SRAM2 0x20004000 0)),
|
||||||
|
("STM32G4...8", mem!(BANK_1 0x08000000 64, SRAM 0x20000000 20, SRAM2 0x20004000 0)),
|
||||||
|
("STM32G4[34]..B", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 20, SRAM2 0x20004000 0)),
|
||||||
|
("STM32G4[78]..E", mem!(BANK_1 0x08000000 512, SRAM 0x20000000 96, SRAM2 0x20014000 0)),
|
||||||
|
("STM32G4[9A]..E", mem!(BANK_1 0x08000000 512, SRAM 0x20000000 32, SRAM2 0x20014000 0)),
|
||||||
|
("STM32G47..B", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 96, SRAM2 0x20014000 0)),
|
||||||
|
("STM32G47..C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 96, SRAM2 0x20014000 0)),
|
||||||
|
("STM32G49..C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 32, SRAM2 0x20014000 0)),
|
||||||
|
("STM32H5...B", mem!(BANK_1 0x08000000 64, BANK_2 0x08010000 64, SRAM 0x20000000 32, SRAM2 0x20004000 0)),
|
||||||
|
("STM32H5...G", mem!(BANK_1 0x08000000 1024, SRAM 0x20000000 256, SRAM2 0x20040000 0)),
|
||||||
|
("STM32H5...I", mem!(BANK_1 0x08000000 1024, BANK_2 0x08100000 1024, SRAM 0x20000000 256, SRAM2 0x20040000 0)),
|
||||||
|
("STM32H7...E", mem!(D1_ITCMRAM 0x00000000 0, D1_AXIFLASH 0x08000000 0, BANK_1 0x08000000 512, D1_AXIICP 0x1ff00000 0, D1_DTCMRAM 0x20000000 0, SRAM 0x24000000 128, D3_SRAM 0x38000000 0, D3_BKPSRAM 0x38800000 0)),
|
||||||
|
("STM32H7[23]..G", mem!(D1_ITCMRAM 0x00000000 0, D1_AXIFLASH 0x08000000 0, BANK_1 0x08000000 1024, D1_AXIICP 0x1ff00000 0, D1_DTCMRAM 0x20000000 0, SRAM 0x24000000 128, D3_SRAM 0x38000000 0, D3_BKPSRAM 0x38800000 0)),
|
||||||
|
("STM32H7[45]..I", mem!(D1_ITCMRAM 0x00000000 0, D1_AXIFLASH 0x08000000 0, BANK_1 0x08000000 1024, BANK_2 0x08100000 1024, D2_AXISRAM 0x10000000 0, D1_AXIICP 0x1ff00000 0, D1_DTCMRAM 0x20000000 0, SRAM 0x24000000 512, D3_SRAM 0x38000000 0, D3_BKPSRAM 0x38800000 0)),
|
||||||
|
("STM32H7[AB]..I", mem!(BANK_1 0x08000000 1024, BANK_2 0x08100000 1024, SRAM 0x24000000 1024)),
|
||||||
|
("STM32H73..B", mem!(D1_ITCMRAM 0x00000000 0, D1_AXIFLASH 0x08000000 0, BANK_1 0x08000000 128, D1_AXIICP 0x1ff00000 0, D1_DTCMRAM 0x20000000 0, SRAM 0x24000000 128, D3_SRAM 0x38000000 0, D3_BKPSRAM 0x38800000 0)),
|
||||||
|
("STM32H74..G", mem!(D1_ITCMRAM 0x00000000 0, D1_AXIFLASH 0x08000000 0, BANK_1 0x08000000 1024, D2_AXISRAM 0x10000000 0, D1_AXIICP 0x1ff00000 0, D1_DTCMRAM 0x20000000 0, SRAM 0x24000000 512, D3_SRAM 0x38000000 0, D3_BKPSRAM 0x38800000 0)),
|
||||||
|
("STM32H75..B", mem!(D1_ITCMRAM 0x00000000 0, D1_AXIFLASH 0x08000000 0, BANK_1 0x08000000 128, D2_AXISRAM 0x10000000 0, D1_AXIICP 0x1ff00000 0, D1_DTCMRAM 0x20000000 0, SRAM 0x24000000 512, D3_SRAM 0x38000000 0, D3_BKPSRAM 0x38800000 0)),
|
||||||
|
("STM32H7A..G", mem!(BANK_1 0x08000000 1024, SRAM 0x24000000 1024)),
|
||||||
|
("STM32H7B..B", mem!(BANK_1 0x08000000 128, SRAM 0x24000000 1024)),
|
||||||
|
("STM32L0...3", mem!(BANK_1 0x08000000 8, SRAM 0x20000000 2)),
|
||||||
|
("STM32L0...6", mem!(BANK_1 0x08000000 32, SRAM 0x20000000 8)),
|
||||||
|
("STM32L0...B", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 20)),
|
||||||
|
("STM32L0...Z", mem!(BANK_1 0x08000000 192, SRAM 0x20000000 20)),
|
||||||
|
("STM32L0[12]..4", mem!(BANK_1 0x08000000 16, SRAM 0x20000000 2)),
|
||||||
|
("STM32L0[156]..8", mem!(BANK_1 0x08000000 64, SRAM 0x20000000 8)),
|
||||||
|
("STM32L0[34]..4", mem!(BANK_1 0x08000000 16, SRAM 0x20000000 8)),
|
||||||
|
("STM32L0[78]..8", mem!(BANK_1 0x08000000 64, SRAM 0x20000000 20)),
|
||||||
|
("STM32L1...B", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 10)),
|
||||||
|
("STM32L1...C..", mem!(BANK_1 0x08000000 192, BANK_2 0x08030000 64, SRAM 0x20000000 32)),
|
||||||
|
("STM32L1...D..", mem!(BANK_1 0x08000000 128, BANK_2 0x08040000 256, SRAM 0x20000000 80)),
|
||||||
|
("STM32L1...D", mem!(BANK_1 0x08000000 192, BANK_2 0x08030000 192, SRAM 0x20000000 48)),
|
||||||
|
("STM32L1...E", mem!(BANK_1 0x08000000 256, BANK_2 0x08040000 256, SRAM 0x20000000 80)),
|
||||||
|
("STM32L1(6.[RV]C|5.[CRUV]C)", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 32)),
|
||||||
|
("STM32L1[56].[QZ]C", mem!(BANK_1 0x08000000 192, BANK_2 0x08030000 64, SRAM 0x20000000 32)),
|
||||||
|
("STM32L10..6..", mem!(BANK_1 0x08000000 32, SRAM 0x20000000 10)),
|
||||||
|
("STM32L10..6", mem!(BANK_1 0x08000000 32, SRAM 0x20000000 4)),
|
||||||
|
("STM32L10..8..", mem!(BANK_1 0x08000000 64, SRAM 0x20000000 10)),
|
||||||
|
("STM32L10..8", mem!(BANK_1 0x08000000 64, SRAM 0x20000000 8)),
|
||||||
|
("STM32L10..B..", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 10)),
|
||||||
|
("STM32L10..C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 16)),
|
||||||
|
("STM32L15..6..", mem!(BANK_1 0x08000000 32, SRAM 0x20000000 16)),
|
||||||
|
("STM32L15..6", mem!(BANK_1 0x08000000 32, SRAM 0x20000000 10)),
|
||||||
|
("STM32L15..8..", mem!(BANK_1 0x08000000 64, SRAM 0x20000000 16)),
|
||||||
|
("STM32L15..8", mem!(BANK_1 0x08000000 64, SRAM 0x20000000 10)),
|
||||||
|
("STM32L15..B..", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 16)),
|
||||||
|
("STM32L4...8", mem!(BANK_1 0x08000000 64, SRAM2 0x10000000 0, SRAM 0x20000000 40)),
|
||||||
|
("STM32L4...I", mem!(BANK_1 0x08000000 2048, SRAM2 0x10000000 0, SRAM 0x20000000 192)),
|
||||||
|
("STM32L4[12]..B", mem!(BANK_1 0x08000000 128, SRAM2 0x10000000 0, SRAM 0x20000000 40)),
|
||||||
|
("STM32L4[34]..C", mem!(BANK_1 0x08000000 256, SRAM2 0x10000000 0, SRAM 0x20000000 48)),
|
||||||
|
("STM32L4[56]..E", mem!(BANK_1 0x08000000 512, SRAM2 0x10000000 0, SRAM 0x20000000 128)),
|
||||||
|
("STM32L4[78]..G", mem!(BANK_1 0x08000000 512, BANK_2 0x08080000 512, SRAM2 0x10000000 0, SRAM 0x20000000 96)),
|
||||||
|
("STM32L4[9A]..G", mem!(BANK_1 0x08000000 512, BANK_2 0x08080000 512, SRAM2 0x10000000 0, SRAM 0x20000000 256)),
|
||||||
|
("STM32L4[PQR]..G", mem!(BANK_1 0x08000000 1024, SRAM2 0x10000000 0, SRAM 0x20000000 192)),
|
||||||
|
("STM32L43..B", mem!(BANK_1 0x08000000 128, SRAM2 0x10000000 0, SRAM 0x20000000 48)),
|
||||||
|
("STM32L45..C", mem!(BANK_1 0x08000000 256, SRAM2 0x10000000 0, SRAM 0x20000000 128)),
|
||||||
|
("STM32L47..C", mem!(BANK_1 0x08000000 256, SRAM2 0x10000000 0, SRAM 0x20000000 96)),
|
||||||
|
("STM32L47..E", mem!(BANK_1 0x08000000 512, SRAM2 0x10000000 0, SRAM 0x20000000 96)),
|
||||||
|
("STM32L49..E", mem!(BANK_1 0x08000000 512, SRAM2 0x10000000 0, SRAM 0x20000000 256)),
|
||||||
|
("STM32L4P..E", mem!(BANK_1 0x08000000 512, SRAM2 0x10000000 0, SRAM 0x20000000 192)),
|
||||||
|
("STM32L5...C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 256, SRAM2 0x20030000 0)),
|
||||||
|
("STM32L5...E", mem!(BANK_1 0x08000000 512, SRAM 0x20000000 256, SRAM2 0x20030000 0)),
|
||||||
|
("STM32U5...B", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 64, SRAM2 0x20030000 0)),
|
||||||
|
("STM32U5...C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 64, SRAM2 0x20030000 0)),
|
||||||
|
("STM32U5...E", mem!(BANK_1 0x08000000 512, SRAM 0x20000000 64, SRAM2 0x20030000 0)),
|
||||||
|
("STM32U5...G", mem!(BANK_1 0x08000000 1024, SRAM 0x20000000 768, SRAM2 0x20030000 0)),
|
||||||
|
("STM32U5...J", mem!(BANK_1 0x08000000 4096, SRAM 0x20000000 32, SRAM2 0x200c0000 0)),
|
||||||
|
("STM32U5[78]..I", mem!(BANK_1 0x08000000 2048, SRAM 0x20000000 768, SRAM2 0x20030000 0)),
|
||||||
|
("STM32U59..I", mem!(BANK_1 0x08000000 2048, SRAM 0x20000000 32, SRAM2 0x200c0000 0)),
|
||||||
|
("STM32WB...Y", mem!(BANK_1 0x08000000 640, SRAM 0x20000000 192)),
|
||||||
|
("STM32WB.(0C|5V)G", mem!(BANK_1 0x08000000 1024, SRAM 0x20000000 128)),
|
||||||
|
("STM32WB.(5C|5R)G", mem!(BANK_1 0x08000000 1024, SRAM 0x20000000 192)),
|
||||||
|
("STM32WB1..C", mem!(BANK_1 0x08000000 320, SRAM 0x20000000 12)),
|
||||||
|
("STM32WB3..C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 96)),
|
||||||
|
("STM32WB3..E", mem!(BANK_1 0x08000000 512, SRAM 0x20000000 96)),
|
||||||
|
("STM32WB5..C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 128)),
|
||||||
|
("STM32WB5.[CR]E", mem!(BANK_1 0x08000000 512, SRAM 0x20000000 192)),
|
||||||
|
("STM32WB5.VE", mem!(BANK_1 0x08000000 512, SRAM 0x20000000 128)),
|
||||||
|
("STM32WBA...E", mem!(BANK_1 0x08000000 512, SRAM 0x20000000 96, SRAM2 0x20010000 0)),
|
||||||
|
("STM32WBA...G", mem!(BANK_1 0x08000000 1024, SRAM 0x20000000 128, SRAM2 0x20010000 0)),
|
||||||
|
("STM32WL...8", mem!(BANK_1 0x08000000 64, SRAM 0x20000000 12, SRAM2 0x20008000 0)),
|
||||||
|
("STM32WL...B", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 12, SRAM2 0x20008000 0)),
|
||||||
|
("STM32WL...C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 12, SRAM2 0x20008000 0)),
|
||||||
|
]);
|
||||||
|
|
||||||
// ... then prefer single ordering over dual
|
struct FlashInfo {
|
||||||
if ordering == Ordering::Equal {
|
write_size: u32,
|
||||||
// Possible values are Single and Dual
|
erase_size: &'static [(u32, u32)],
|
||||||
b.organization.partial_cmp(&a.organization).unwrap()
|
erase_value: u8,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[rustfmt::skip]
|
||||||
|
static FLASH_INFO: RegexMap<FlashInfo> = RegexMap::new(&[
|
||||||
|
("STM32C0.*", FlashInfo{ erase_value: 0xFF, write_size: 8, erase_size: &[( 2*1024, 0)] }),
|
||||||
|
("STM32F030.C", FlashInfo{ erase_value: 0xFF, write_size: 4, erase_size: &[( 2*1024, 0)] }),
|
||||||
|
("STM32F070.6", FlashInfo{ erase_value: 0xFF, write_size: 4, erase_size: &[( 1*1024, 0)] }),
|
||||||
|
("STM32F0[79].*", FlashInfo{ erase_value: 0xFF, write_size: 4, erase_size: &[( 2*1024, 0)] }),
|
||||||
|
("STM32F0.*", FlashInfo{ erase_value: 0xFF, write_size: 4, erase_size: &[( 1*1024, 0)] }),
|
||||||
|
("STM32F10[0123].[468B]", FlashInfo{ erase_value: 0xFF, write_size: 4, erase_size: &[( 1*1024, 0)] }),
|
||||||
|
("STM32F1.*", FlashInfo{ erase_value: 0xFF, write_size: 4, erase_size: &[( 2*1024, 0)] }),
|
||||||
|
("STM32F2.*", FlashInfo{ erase_value: 0xFF, write_size: 4, erase_size: &[( 16*1024, 4), (64*1024, 1), ( 128*1024, 0)] }),
|
||||||
|
("STM32F3.*", FlashInfo{ erase_value: 0xFF, write_size: 8, erase_size: &[( 2*1024, 0)] }),
|
||||||
|
("STM32F4.*", FlashInfo{ erase_value: 0xFF, write_size: 4, erase_size: &[( 16*1024, 4), (64*1024, 1), ( 128*1024, 0)] }),
|
||||||
|
("STM32F7[4567].*", FlashInfo{ erase_value: 0xFF, write_size: 16, erase_size: &[( 32*1024, 4), (128*1024, 1), ( 256*1024, 0)] }),
|
||||||
|
("STM32F7.*", FlashInfo{ erase_value: 0xFF, write_size: 16, erase_size: &[( 16*1024, 4), (64*1024, 1), ( 128*1024, 0)] }),
|
||||||
|
("STM32G0.*", FlashInfo{ erase_value: 0xFF, write_size: 8, erase_size: &[( 2*1024, 0)] }),
|
||||||
|
("STM32G4[78].*", FlashInfo{ erase_value: 0xFF, write_size: 8, erase_size: &[( 4*1024, 0)] }),
|
||||||
|
("STM32G4.*", FlashInfo{ erase_value: 0xFF, write_size: 8, erase_size: &[( 2*1024, 0)] }),
|
||||||
|
("STM32H5.*", FlashInfo{ erase_value: 0xFF, write_size: 16, erase_size: &[( 8*1024, 0)] }),
|
||||||
|
("STM32H7[AB].*", FlashInfo{ erase_value: 0xFF, write_size: 32, erase_size: &[( 8*1024, 0)] }),
|
||||||
|
("STM32H7.*", FlashInfo{ erase_value: 0xFF, write_size: 32, erase_size: &[(128*1024, 0)] }),
|
||||||
|
("STM32L4[PQRS].*", FlashInfo{ erase_value: 0xFF, write_size: 8, erase_size: &[( 8*1024, 0)] }),
|
||||||
|
("STM32L4.*", FlashInfo{ erase_value: 0xFF, write_size: 8, erase_size: &[( 2*1024, 0)] }),
|
||||||
|
("STM32L0.*", FlashInfo{ erase_value: 0x00, write_size: 4, erase_size: &[( 128, 0)] }),
|
||||||
|
("STM32L1.*", FlashInfo{ erase_value: 0x00, write_size: 4, erase_size: &[( 256, 0)] }),
|
||||||
|
("STM32L5.*", FlashInfo{ erase_value: 0xFF, write_size: 8, erase_size: &[( 4*1024, 0)] }),
|
||||||
|
("STM32U5[78].*", FlashInfo{ erase_value: 0xFF, write_size: 16, erase_size: &[( 8*1024, 0)] }),
|
||||||
|
("STM32U5.*", FlashInfo{ erase_value: 0xFF, write_size: 16, erase_size: &[( 16*1024, 0)] }),
|
||||||
|
("STM32WBA.*", FlashInfo{ erase_value: 0xFF, write_size: 16, erase_size: &[( 8*1024, 0)] }),
|
||||||
|
("STM32WB1.*", FlashInfo{ erase_value: 0x00, write_size: 8, erase_size: &[( 2*1024, 0)] }),
|
||||||
|
("STM32WB.*", FlashInfo{ erase_value: 0xFF, write_size: 8, erase_size: &[( 4*1024, 0)] }),
|
||||||
|
("STM32WL.*", FlashInfo{ erase_value: 0xFF, write_size: 8, erase_size: &[( 2*1024, 0)] }),
|
||||||
|
("STM32.*", FlashInfo{ erase_value: 0xFF, write_size: 8, erase_size: &[( 2*1024, 0)] }),
|
||||||
|
]);
|
||||||
|
|
||||||
|
struct RegexMap<T: 'static> {
|
||||||
|
map: &'static [(&'static str, T)],
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: 'static> RegexMap<T> {
|
||||||
|
const fn new(map: &'static [(&'static str, T)]) -> Self {
|
||||||
|
Self { map }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get(&self, key: &str) -> Option<&T> {
|
||||||
|
for (k, v) in self.map {
|
||||||
|
if Regex::new(&format!("^{k}$")).unwrap().is_match(key) {
|
||||||
|
return Some(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get(chip: &str) -> Vec<Memory> {
|
||||||
|
let mems = *MEMS.get(chip).unwrap();
|
||||||
|
let flash = FLASH_INFO.get(chip).unwrap();
|
||||||
|
|
||||||
|
let mut res = Vec::new();
|
||||||
|
|
||||||
|
for mem in mems {
|
||||||
|
if mem.name.starts_with("BANK") {
|
||||||
|
if flash.erase_size.len() == 1 || mem.size <= flash.erase_size[0].0 * flash.erase_size[0].1 {
|
||||||
|
res.push(Memory {
|
||||||
|
name: mem.name.to_string(),
|
||||||
|
address: mem.address,
|
||||||
|
size: mem.size,
|
||||||
|
kind: memory::Kind::Flash,
|
||||||
|
settings: Some(Settings {
|
||||||
|
write_size: flash.write_size,
|
||||||
|
erase_size: flash.erase_size[0].0,
|
||||||
|
erase_value: flash.erase_value,
|
||||||
|
}),
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
ordering
|
let mut offs = 0;
|
||||||
|
for (i, &(erase_size, count)) in flash.erase_size.iter().enumerate() {
|
||||||
|
if offs >= mem.size {
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
let left = mem.size - offs;
|
||||||
|
let mut size = left;
|
||||||
|
if i != flash.erase_size.len() - 1 {
|
||||||
|
size = size.min(erase_size * count);
|
||||||
|
}
|
||||||
|
res.push(Memory {
|
||||||
|
name: format!("{}_REGION_{}", mem.name, i + 1),
|
||||||
|
address: mem.address + offs,
|
||||||
|
size: size,
|
||||||
|
kind: memory::Kind::Flash,
|
||||||
|
settings: Some(Settings {
|
||||||
|
write_size: flash.write_size,
|
||||||
|
erase_size: erase_size,
|
||||||
|
erase_value: flash.erase_value,
|
||||||
|
}),
|
||||||
});
|
});
|
||||||
let config = peripheral.configuration.first().unwrap();
|
offs += size;
|
||||||
|
|
||||||
if flash_size.is_none() {
|
|
||||||
let parameters = config.parameters.as_ref().unwrap();
|
|
||||||
|
|
||||||
flash_size = Some(parameters.size);
|
|
||||||
}
|
|
||||||
|
|
||||||
for bank in config.bank.iter() {
|
|
||||||
let flash_bank = match kind {
|
|
||||||
BlockKind::Main => match bank.name.as_deref() {
|
|
||||||
Some("Bank 1") => Some(FlashBank::Bank1),
|
|
||||||
Some("Bank 2") => Some(FlashBank::Bank2),
|
|
||||||
Some("EEPROM1") => None,
|
|
||||||
Some("EEPROM2") => None,
|
|
||||||
None => {
|
|
||||||
assert_eq!(1, config.bank.len());
|
|
||||||
Some(FlashBank::Bank1)
|
|
||||||
}
|
|
||||||
Some(other) => unimplemented!("Unsupported flash bank {}", other),
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
if let Some(flash_bank) = flash_bank {
|
|
||||||
let erase_value = peripheral.erased_value.unwrap();
|
|
||||||
let write_size = config.allignement.unwrap();
|
|
||||||
flash_regions.extend(bank.field.iter().map(|field| FlashRegion {
|
|
||||||
bank: flash_bank,
|
|
||||||
address: field.parameters.address,
|
|
||||||
bytes: field.parameters.occurence.unwrap() * field.parameters.size,
|
|
||||||
settings: stm32_data_serde::chip::memory::Settings {
|
|
||||||
erase_value,
|
|
||||||
write_size,
|
|
||||||
erase_size: field.parameters.size,
|
|
||||||
},
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
let mut kind = memory::Kind::Ram;
|
||||||
|
if mem.name.contains("FLASH") || mem.name.contains("AXIICP") {
|
||||||
|
kind = memory::Kind::Flash;
|
||||||
|
}
|
||||||
|
res.push(Memory {
|
||||||
|
name: mem.name.to_string(),
|
||||||
|
address: mem.address,
|
||||||
|
size: mem.size,
|
||||||
|
kind,
|
||||||
|
settings: None,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
memories.insert(
|
res.sort_by_key(|m| (m.address, m.name.clone()));
|
||||||
device_id,
|
|
||||||
Memory {
|
|
||||||
device_id,
|
|
||||||
ram: ram.unwrap(),
|
|
||||||
flash_size: flash_size.unwrap_or_default(),
|
|
||||||
flash_regions,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(Self(memories))
|
res
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get(&self, die: &str) -> &Memory {
|
|
||||||
assert!(die.starts_with("DIE"));
|
|
||||||
let device_id = u16::from_str_radix(&die[3..], 16).unwrap();
|
|
||||||
|
|
||||||
self.0.get(&device_id).unwrap()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user