aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatous Hybl <[email protected]>2022-09-06 17:44:20 +0200
committerMatous Hybl <[email protected]>2022-11-28 21:15:24 +0100
commit2a35a0944420ecf3d33e9684b9bb5756500cb851 (patch)
tree2351c3c32b28cca861a75c1786375a667ccb8829
parentcea29d7de3169cf2212128e0386e5d57053cc12d (diff)
stm32: Fix H7 unaligned erase
-rw-r--r--embassy-stm32/src/flash/h7.rs17
1 files changed, 6 insertions, 11 deletions
diff --git a/embassy-stm32/src/flash/h7.rs b/embassy-stm32/src/flash/h7.rs
index 3f2129de8..3178b3be9 100644
--- a/embassy-stm32/src/flash/h7.rs
+++ b/embassy-stm32/src/flash/h7.rs
@@ -79,24 +79,19 @@ pub(crate) unsafe fn blocking_erase(from: u32, to: u32) -> Result<(), Error> {
79 let from = from - super::FLASH_BASE as u32; 79 let from = from - super::FLASH_BASE as u32;
80 let to = to - super::FLASH_BASE as u32; 80 let to = to - super::FLASH_BASE as u32;
81 81
82 let bank_size = (super::FLASH_SIZE / 2) as u32; 82 let (start, end) = if to <= super::FLASH_SIZE as u32 {
83
84 let (bank, start, end) = if to <= bank_size {
85 let start_sector = from / super::ERASE_SIZE as u32; 83 let start_sector = from / super::ERASE_SIZE as u32;
86 let end_sector = to / super::ERASE_SIZE as u32; 84 let end_sector = to / super::ERASE_SIZE as u32;
87 (0, start_sector, end_sector) 85 (start_sector, end_sector)
88 } else if from >= SECOND_BANK_OFFSET as u32 && to <= (SECOND_BANK_OFFSET as u32 + bank_size) {
89 let start_sector = (from - SECOND_BANK_OFFSET as u32) / super::ERASE_SIZE as u32;
90 let end_sector = (to - SECOND_BANK_OFFSET as u32) / super::ERASE_SIZE as u32;
91 (1, start_sector, end_sector)
92 } else { 86 } else {
93 error!("Attempting to write outside of defined sectors"); 87 error!("Attempting to write outside of defined sectors {:x} {:x}", from, to);
94 return Err(Error::Unaligned); 88 return Err(Error::Unaligned);
95 }; 89 };
96 90
97 trace!("Erasing bank {}, sectors from {} to {}", bank, start, end); 91 trace!("Erasing sectors from {} to {}", start, end);
98 for sector in start..end { 92 for sector in start..end {
99 let ret = erase_sector(pac::FLASH.bank(bank), sector as u8); 93 let bank = if sector >= 8 { 1 } else { 0 };
94 let ret = erase_sector(pac::FLASH.bank(bank), (sector % 8) as u8);
100 if ret.is_err() { 95 if ret.is_err() {
101 return ret; 96 return ret;
102 } 97 }