aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRasmus Melchior Jacobsen <[email protected]>2023-03-29 11:31:45 +0200
committerRasmus Melchior Jacobsen <[email protected]>2023-03-29 11:31:45 +0200
commitd6ce1c4325179a813d47f2f068c178fe858ac49f (patch)
tree964a66d9910cf62221fd6480fa9b801b352c555f
parente9a5b31fa83f7a261a79a810666039381553037f (diff)
Support running tests in embassy-stm32 and move impl from common back to stm32
-rw-r--r--embassy-hal-common/src/lib.rs1
-rw-r--r--embassy-hal-common/src/stm32/flash/f4.rs119
-rw-r--r--embassy-hal-common/src/stm32/flash/f7.rs67
-rw-r--r--embassy-hal-common/src/stm32/flash/mod.rs2
-rw-r--r--embassy-hal-common/src/stm32/mod.rs1
-rw-r--r--embassy-stm32/Cargo.toml6
-rw-r--r--embassy-stm32/src/flash/f4.rs116
-rw-r--r--embassy-stm32/src/flash/f7.rs64
-rw-r--r--embassy-stm32/src/flash/mod.rs7
9 files changed, 186 insertions, 197 deletions
diff --git a/embassy-hal-common/src/lib.rs b/embassy-hal-common/src/lib.rs
index 1b253719e..b2a35cd35 100644
--- a/embassy-hal-common/src/lib.rs
+++ b/embassy-hal-common/src/lib.rs
@@ -10,5 +10,4 @@ mod macros;
10mod peripheral; 10mod peripheral;
11pub mod ratio; 11pub mod ratio;
12pub mod ring_buffer; 12pub mod ring_buffer;
13pub mod stm32;
14pub use peripheral::{Peripheral, PeripheralRef}; 13pub use peripheral::{Peripheral, PeripheralRef};
diff --git a/embassy-hal-common/src/stm32/flash/f4.rs b/embassy-hal-common/src/stm32/flash/f4.rs
deleted file mode 100644
index a8069dddf..000000000
--- a/embassy-hal-common/src/stm32/flash/f4.rs
+++ /dev/null
@@ -1,119 +0,0 @@
1const FLASH_BASE: u32 = 0x0800_0000;
2pub(crate) const SMALL_SECTOR_SIZE: u32 = 16 * 1024;
3pub(crate) const MEDIUM_SECTOR_SIZE: u32 = 64 * 1024;
4pub(crate) const LARGE_SECTOR_SIZE: u32 = 128 * 1024;
5pub const SECOND_BANK_SECTOR_OFFSET: u8 = 12;
6
7#[derive(Debug, PartialEq)]
8pub struct FlashSector {
9 pub index: u8,
10 pub start: u32,
11 pub size: u32,
12}
13
14pub fn get_sector(address: u32, dual_bank: bool, flash_size: u32) -> FlashSector {
15 let offset = address - FLASH_BASE;
16 if !dual_bank {
17 get_single_bank_sector(offset)
18 } else {
19 let bank_size = flash_size / 2;
20 if offset < bank_size {
21 get_single_bank_sector(offset)
22 } else {
23 let sector = get_single_bank_sector(offset - bank_size);
24 FlashSector {
25 index: SECOND_BANK_SECTOR_OFFSET + sector.index,
26 start: sector.start + bank_size,
27 size: sector.size,
28 }
29 }
30 }
31}
32
33fn get_single_bank_sector(offset: u32) -> FlashSector {
34 // First 4 sectors are 16KB, then one 64KB, and rest are 128KB
35 match offset / LARGE_SECTOR_SIZE {
36 0 => {
37 if offset < 4 * SMALL_SECTOR_SIZE {
38 let small_sector_index = offset / SMALL_SECTOR_SIZE;
39 FlashSector {
40 index: small_sector_index as u8,
41 start: FLASH_BASE + small_sector_index * SMALL_SECTOR_SIZE,
42 size: SMALL_SECTOR_SIZE,
43 }
44 } else {
45 FlashSector {
46 index: 4,
47 start: FLASH_BASE + 4 * SMALL_SECTOR_SIZE,
48 size: MEDIUM_SECTOR_SIZE,
49 }
50 }
51 }
52 i => {
53 let large_sector_index = i - 1;
54 FlashSector {
55 index: (5 + large_sector_index) as u8,
56 start: FLASH_BASE + 4 * SMALL_SECTOR_SIZE + MEDIUM_SECTOR_SIZE + large_sector_index * LARGE_SECTOR_SIZE,
57 size: LARGE_SECTOR_SIZE,
58 }
59 }
60 }
61}
62
63#[cfg(test)]
64mod tests {
65 use super::*;
66
67 #[test]
68 fn can_get_sector_single_bank() {
69 let assert_sector = |index: u8, start: u32, size: u32, addr: u32| {
70 assert_eq!(FlashSector { index, start, size }, get_sector(addr, false, 1024 * 1024))
71 };
72
73 assert_sector(0, 0x0800_0000, SMALL_SECTOR_SIZE, 0x0800_0000);
74 assert_sector(0, 0x0800_0000, SMALL_SECTOR_SIZE, 0x0800_3FFF);
75 assert_sector(3, 0x0800_C000, SMALL_SECTOR_SIZE, 0x0800_C000);
76 assert_sector(3, 0x0800_C000, SMALL_SECTOR_SIZE, 0x0800_FFFF);
77
78 assert_sector(4, 0x0801_0000, MEDIUM_SECTOR_SIZE, 0x0801_0000);
79 assert_sector(4, 0x0801_0000, MEDIUM_SECTOR_SIZE, 0x0801_FFFF);
80
81 assert_sector(5, 0x0802_0000, LARGE_SECTOR_SIZE, 0x0802_0000);
82 assert_sector(5, 0x0802_0000, LARGE_SECTOR_SIZE, 0x0803_FFFF);
83 assert_sector(11, 0x080E_0000, LARGE_SECTOR_SIZE, 0x080E_0000);
84 assert_sector(11, 0x080E_0000, LARGE_SECTOR_SIZE, 0x080F_FFFF);
85 }
86
87 #[test]
88 fn can_get_sector_dual_bank() {
89 let assert_sector = |index: u8, start: u32, size: u32, addr: u32| {
90 assert_eq!(FlashSector { index, start, size }, get_sector(addr, true, 1024 * 1024))
91 };
92
93 assert_sector(0, 0x0800_0000, SMALL_SECTOR_SIZE, 0x0800_0000);
94 assert_sector(0, 0x0800_0000, SMALL_SECTOR_SIZE, 0x0800_3FFF);
95 assert_sector(3, 0x0800_C000, SMALL_SECTOR_SIZE, 0x0800_C000);
96 assert_sector(3, 0x0800_C000, SMALL_SECTOR_SIZE, 0x0800_FFFF);
97
98 assert_sector(4, 0x0801_0000, MEDIUM_SECTOR_SIZE, 0x0801_0000);
99 assert_sector(4, 0x0801_0000, MEDIUM_SECTOR_SIZE, 0x0801_FFFF);
100
101 assert_sector(5, 0x0802_0000, LARGE_SECTOR_SIZE, 0x0802_0000);
102 assert_sector(5, 0x0802_0000, LARGE_SECTOR_SIZE, 0x0803_FFFF);
103 assert_sector(7, 0x0806_0000, LARGE_SECTOR_SIZE, 0x0806_0000);
104 assert_sector(7, 0x0806_0000, LARGE_SECTOR_SIZE, 0x0807_FFFF);
105
106 assert_sector(12, 0x0808_0000, SMALL_SECTOR_SIZE, 0x0808_0000);
107 assert_sector(12, 0x0808_0000, SMALL_SECTOR_SIZE, 0x0808_3FFF);
108 assert_sector(15, 0x0808_C000, SMALL_SECTOR_SIZE, 0x0808_C000);
109 assert_sector(15, 0x0808_C000, SMALL_SECTOR_SIZE, 0x0808_FFFF);
110
111 assert_sector(16, 0x0809_0000, MEDIUM_SECTOR_SIZE, 0x0809_0000);
112 assert_sector(16, 0x0809_0000, MEDIUM_SECTOR_SIZE, 0x0809_FFFF);
113
114 assert_sector(17, 0x080A_0000, LARGE_SECTOR_SIZE, 0x080A_0000);
115 assert_sector(17, 0x080A_0000, LARGE_SECTOR_SIZE, 0x080B_FFFF);
116 assert_sector(19, 0x080E_0000, LARGE_SECTOR_SIZE, 0x080E_0000);
117 assert_sector(19, 0x080E_0000, LARGE_SECTOR_SIZE, 0x080F_FFFF);
118 }
119}
diff --git a/embassy-hal-common/src/stm32/flash/f7.rs b/embassy-hal-common/src/stm32/flash/f7.rs
deleted file mode 100644
index 2f586adee..000000000
--- a/embassy-hal-common/src/stm32/flash/f7.rs
+++ /dev/null
@@ -1,67 +0,0 @@
1const FLASH_BASE: u32 = 0x0800_0000;
2pub(crate) const SMALL_SECTOR_SIZE: u32 = 32 * 1024;
3pub(crate) const MEDIUM_SECTOR_SIZE: u32 = 128 * 1024;
4pub(crate) const LARGE_SECTOR_SIZE: u32 = 256 * 1024;
5
6#[derive(Debug, PartialEq)]
7pub struct FlashSector {
8 pub index: u8,
9 pub start: u32,
10 pub size: u32,
11}
12
13pub fn get_sector(address: u32) -> FlashSector {
14 // First 4 sectors are 32KB, then one 128KB, and rest are 256KB
15 let offset = address - FLASH_BASE;
16 match offset / LARGE_SECTOR_SIZE {
17 0 => {
18 if offset < 4 * SMALL_SECTOR_SIZE {
19 let small_sector_index = offset / SMALL_SECTOR_SIZE;
20 FlashSector {
21 index: small_sector_index as u8,
22 start: FLASH_BASE + small_sector_index * SMALL_SECTOR_SIZE,
23 size: SMALL_SECTOR_SIZE,
24 }
25 } else {
26 FlashSector {
27 index: 4,
28 start: FLASH_BASE + 4 * SMALL_SECTOR_SIZE,
29 size: MEDIUM_SECTOR_SIZE,
30 }
31 }
32 }
33 i => {
34 let large_sector_index = i - 1;
35 FlashSector {
36 index: (5 + large_sector_index) as u8,
37 start: FLASH_BASE + 4 * SMALL_SECTOR_SIZE + MEDIUM_SECTOR_SIZE + large_sector_index * LARGE_SECTOR_SIZE,
38 size: LARGE_SECTOR_SIZE,
39 }
40 }
41 }
42}
43
44#[cfg(test)]
45mod tests {
46 use super::*;
47
48 #[test]
49 fn can_get_sector() {
50 let assert_sector = |index: u8, start: u32, size: u32, addr: u32| {
51 assert_eq!(FlashSector { index, start, size }, get_sector(addr))
52 };
53
54 assert_sector(0, 0x0800_0000, SMALL_SECTOR_SIZE, 0x0800_0000);
55 assert_sector(0, 0x0800_0000, SMALL_SECTOR_SIZE, 0x0800_7FFF);
56 assert_sector(3, 0x0801_8000, SMALL_SECTOR_SIZE, 0x0801_8000);
57 assert_sector(3, 0x0801_8000, SMALL_SECTOR_SIZE, 0x0801_FFFF);
58
59 assert_sector(4, 0x0802_0000, MEDIUM_SECTOR_SIZE, 0x0802_0000);
60 assert_sector(4, 0x0802_0000, MEDIUM_SECTOR_SIZE, 0x0803_FFFF);
61
62 assert_sector(5, 0x0804_0000, LARGE_SECTOR_SIZE, 0x0804_0000);
63 assert_sector(5, 0x0804_0000, LARGE_SECTOR_SIZE, 0x0807_FFFF);
64 assert_sector(7, 0x080C_0000, LARGE_SECTOR_SIZE, 0x080C_0000);
65 assert_sector(7, 0x080C_0000, LARGE_SECTOR_SIZE, 0x080F_FFFF);
66 }
67}
diff --git a/embassy-hal-common/src/stm32/flash/mod.rs b/embassy-hal-common/src/stm32/flash/mod.rs
deleted file mode 100644
index 1452b491d..000000000
--- a/embassy-hal-common/src/stm32/flash/mod.rs
+++ /dev/null
@@ -1,2 +0,0 @@
1pub mod f4;
2pub mod f7;
diff --git a/embassy-hal-common/src/stm32/mod.rs b/embassy-hal-common/src/stm32/mod.rs
deleted file mode 100644
index 2e50f82b3..000000000
--- a/embassy-hal-common/src/stm32/mod.rs
+++ /dev/null
@@ -1 +0,0 @@
1pub mod flash;
diff --git a/embassy-stm32/Cargo.toml b/embassy-stm32/Cargo.toml
index b66d724d5..1dd6202d3 100644
--- a/embassy-stm32/Cargo.toml
+++ b/embassy-stm32/Cargo.toml
@@ -60,7 +60,7 @@ sdio-host = "0.5.0"
60embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "46d1b1c2ff13e31e282ec1e352421721694f126a", optional = true } 60embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "46d1b1c2ff13e31e282ec1e352421721694f126a", optional = true }
61critical-section = "1.1" 61critical-section = "1.1"
62atomic-polyfill = "1.0.1" 62atomic-polyfill = "1.0.1"
63stm32-metapac = { version = "1", features = ["rt"] } 63stm32-metapac = "1"
64vcell = "0.1.3" 64vcell = "0.1.3"
65bxcan = "0.7.0" 65bxcan = "0.7.0"
66nb = "1.0.0" 66nb = "1.0.0"
@@ -69,12 +69,16 @@ seq-macro = "0.3.0"
69cfg-if = "1.0.0" 69cfg-if = "1.0.0"
70embedded-io = { version = "0.4.0", features = ["async"], optional = true } 70embedded-io = { version = "0.4.0", features = ["async"], optional = true }
71 71
72[dev-dependencies]
73critical-section = { version = "1.1", features = ["std"] }
74
72[build-dependencies] 75[build-dependencies]
73proc-macro2 = "1.0.36" 76proc-macro2 = "1.0.36"
74quote = "1.0.15" 77quote = "1.0.15"
75stm32-metapac = { version = "1", default-features = false, features = ["metadata"]} 78stm32-metapac = { version = "1", default-features = false, features = ["metadata"]}
76 79
77[features] 80[features]
81default = ["stm32-metapac/rt"]
78defmt = ["dep:defmt", "bxcan/unstable-defmt", "embassy-sync/defmt", "embassy-executor/defmt", "embassy-embedded-hal/defmt", "embassy-hal-common/defmt", "embedded-io?/defmt", "embassy-usb-driver?/defmt", "embassy-net-driver/defmt"] 82defmt = ["dep:defmt", "bxcan/unstable-defmt", "embassy-sync/defmt", "embassy-executor/defmt", "embassy-embedded-hal/defmt", "embassy-hal-common/defmt", "embedded-io?/defmt", "embassy-usb-driver?/defmt", "embassy-net-driver/defmt"]
79memory-x = ["stm32-metapac/memory-x"] 83memory-x = ["stm32-metapac/memory-x"]
80subghz = [] 84subghz = []
diff --git a/embassy-stm32/src/flash/f4.rs b/embassy-stm32/src/flash/f4.rs
index 7428fd572..0fdfecb96 100644
--- a/embassy-stm32/src/flash/f4.rs
+++ b/embassy-stm32/src/flash/f4.rs
@@ -2,12 +2,15 @@ use core::convert::TryInto;
2use core::ptr::write_volatile; 2use core::ptr::write_volatile;
3use core::sync::atomic::{fence, Ordering}; 3use core::sync::atomic::{fence, Ordering};
4 4
5use embassy_hal_common::stm32::flash::f4::{get_sector, SECOND_BANK_SECTOR_OFFSET}; 5use super::{FlashSector, FLASH_BASE, FLASH_SIZE, WRITE_SIZE};
6
7use super::{FLASH_SIZE, WRITE_SIZE};
8use crate::flash::Error; 6use crate::flash::Error;
9use crate::pac; 7use crate::pac;
10 8
9const SMALL_SECTOR_SIZE: u32 = 16 * 1024;
10const MEDIUM_SECTOR_SIZE: u32 = 64 * 1024;
11const LARGE_SECTOR_SIZE: u32 = 128 * 1024;
12const SECOND_BANK_SECTOR_OFFSET: u8 = 12;
13
11fn is_dual_bank() -> bool { 14fn is_dual_bank() -> bool {
12 match FLASH_SIZE / 1024 { 15 match FLASH_SIZE / 1024 {
13 // 1 MB devices depend on configuration 16 // 1 MB devices depend on configuration
@@ -141,3 +144,110 @@ unsafe fn blocking_wait_ready() -> Result<(), Error> {
141 } 144 }
142 } 145 }
143} 146}
147
148fn get_sector(address: u32, dual_bank: bool, flash_size: u32) -> FlashSector {
149 let offset = address - FLASH_BASE as u32;
150 if !dual_bank {
151 get_single_bank_sector(offset)
152 } else {
153 let bank_size = flash_size / 2;
154 if offset < bank_size {
155 get_single_bank_sector(offset)
156 } else {
157 let sector = get_single_bank_sector(offset - bank_size);
158 FlashSector {
159 index: SECOND_BANK_SECTOR_OFFSET + sector.index,
160 start: sector.start + bank_size,
161 size: sector.size,
162 }
163 }
164 }
165}
166
167fn get_single_bank_sector(offset: u32) -> FlashSector {
168 // First 4 sectors are 16KB, then one 64KB, and rest are 128KB
169 match offset / LARGE_SECTOR_SIZE {
170 0 => {
171 if offset < 4 * SMALL_SECTOR_SIZE {
172 let small_sector_index = offset / SMALL_SECTOR_SIZE;
173 FlashSector {
174 index: small_sector_index as u8,
175 start: FLASH_BASE as u32 + small_sector_index * SMALL_SECTOR_SIZE,
176 size: SMALL_SECTOR_SIZE,
177 }
178 } else {
179 FlashSector {
180 index: 4,
181 start: FLASH_BASE as u32 + 4 * SMALL_SECTOR_SIZE,
182 size: MEDIUM_SECTOR_SIZE,
183 }
184 }
185 }
186 i => {
187 let large_sector_index = i - 1;
188 FlashSector {
189 index: (5 + large_sector_index) as u8,
190 start: FLASH_BASE as u32 + 4 * SMALL_SECTOR_SIZE + MEDIUM_SECTOR_SIZE + large_sector_index * LARGE_SECTOR_SIZE,
191 size: LARGE_SECTOR_SIZE,
192 }
193 }
194 }
195}
196
197#[cfg(test)]
198mod tests {
199 use super::*;
200
201 #[test]
202 fn can_get_sector_single_bank() {
203 let assert_sector = |index: u8, start: u32, size: u32, addr: u32| {
204 assert_eq!(FlashSector { index, start, size }, get_sector(addr, false, 1024 * 1024))
205 };
206
207 assert_sector(0, 0x0800_0000, SMALL_SECTOR_SIZE, 0x0800_0000);
208 assert_sector(0, 0x0800_0000, SMALL_SECTOR_SIZE, 0x0800_3FFF);
209 assert_sector(3, 0x0800_C000, SMALL_SECTOR_SIZE, 0x0800_C000);
210 assert_sector(3, 0x0800_C000, SMALL_SECTOR_SIZE, 0x0800_FFFF);
211
212 assert_sector(4, 0x0801_0000, MEDIUM_SECTOR_SIZE, 0x0801_0000);
213 assert_sector(4, 0x0801_0000, MEDIUM_SECTOR_SIZE, 0x0801_FFFF);
214
215 assert_sector(5, 0x0802_0000, LARGE_SECTOR_SIZE, 0x0802_0000);
216 assert_sector(5, 0x0802_0000, LARGE_SECTOR_SIZE, 0x0803_FFFF);
217 assert_sector(11, 0x080E_0000, LARGE_SECTOR_SIZE, 0x080E_0000);
218 assert_sector(11, 0x080E_0000, LARGE_SECTOR_SIZE, 0x080F_FFFF);
219 }
220
221 #[test]
222 fn can_get_sector_dual_bank() {
223 let assert_sector = |index: u8, start: u32, size: u32, addr: u32| {
224 assert_eq!(FlashSector { index, start, size }, get_sector(addr, true, 1024 * 1024))
225 };
226
227 assert_sector(0, 0x0800_0000, SMALL_SECTOR_SIZE, 0x0800_0000);
228 assert_sector(0, 0x0800_0000, SMALL_SECTOR_SIZE, 0x0800_3FFF);
229 assert_sector(3, 0x0800_C000, SMALL_SECTOR_SIZE, 0x0800_C000);
230 assert_sector(3, 0x0800_C000, SMALL_SECTOR_SIZE, 0x0800_FFFF);
231
232 assert_sector(4, 0x0801_0000, MEDIUM_SECTOR_SIZE, 0x0801_0000);
233 assert_sector(4, 0x0801_0000, MEDIUM_SECTOR_SIZE, 0x0801_FFFF);
234
235 assert_sector(5, 0x0802_0000, LARGE_SECTOR_SIZE, 0x0802_0000);
236 assert_sector(5, 0x0802_0000, LARGE_SECTOR_SIZE, 0x0803_FFFF);
237 assert_sector(7, 0x0806_0000, LARGE_SECTOR_SIZE, 0x0806_0000);
238 assert_sector(7, 0x0806_0000, LARGE_SECTOR_SIZE, 0x0807_FFFF);
239
240 assert_sector(12, 0x0808_0000, SMALL_SECTOR_SIZE, 0x0808_0000);
241 assert_sector(12, 0x0808_0000, SMALL_SECTOR_SIZE, 0x0808_3FFF);
242 assert_sector(15, 0x0808_C000, SMALL_SECTOR_SIZE, 0x0808_C000);
243 assert_sector(15, 0x0808_C000, SMALL_SECTOR_SIZE, 0x0808_FFFF);
244
245 assert_sector(16, 0x0809_0000, MEDIUM_SECTOR_SIZE, 0x0809_0000);
246 assert_sector(16, 0x0809_0000, MEDIUM_SECTOR_SIZE, 0x0809_FFFF);
247
248 assert_sector(17, 0x080A_0000, LARGE_SECTOR_SIZE, 0x080A_0000);
249 assert_sector(17, 0x080A_0000, LARGE_SECTOR_SIZE, 0x080B_FFFF);
250 assert_sector(19, 0x080E_0000, LARGE_SECTOR_SIZE, 0x080E_0000);
251 assert_sector(19, 0x080E_0000, LARGE_SECTOR_SIZE, 0x080F_FFFF);
252 }
253}
diff --git a/embassy-stm32/src/flash/f7.rs b/embassy-stm32/src/flash/f7.rs
index 16b684580..0d3b738c6 100644
--- a/embassy-stm32/src/flash/f7.rs
+++ b/embassy-stm32/src/flash/f7.rs
@@ -2,12 +2,14 @@ use core::convert::TryInto;
2use core::ptr::write_volatile; 2use core::ptr::write_volatile;
3use core::sync::atomic::{fence, Ordering}; 3use core::sync::atomic::{fence, Ordering};
4 4
5use embassy_hal_common::stm32::flash::f7::get_sector; 5use super::{FlashSector, FLASH_BASE, WRITE_SIZE};
6
7use super::WRITE_SIZE;
8use crate::flash::Error; 6use crate::flash::Error;
9use crate::pac; 7use crate::pac;
10 8
9const SMALL_SECTOR_SIZE: u32 = 32 * 1024;
10const MEDIUM_SECTOR_SIZE: u32 = 128 * 1024;
11const LARGE_SECTOR_SIZE: u32 = 256 * 1024;
12
11pub(crate) unsafe fn lock() { 13pub(crate) unsafe fn lock() {
12 pac::FLASH.cr().modify(|w| w.set_lock(true)); 14 pac::FLASH.cr().modify(|w| w.set_lock(true));
13} 15}
@@ -129,3 +131,59 @@ unsafe fn blocking_wait_ready() -> Result<(), Error> {
129 } 131 }
130 } 132 }
131} 133}
134
135fn get_sector(address: u32) -> FlashSector {
136 // First 4 sectors are 32KB, then one 128KB, and rest are 256KB
137 let offset = address - FLASH_BASE as u32;
138 match offset / LARGE_SECTOR_SIZE {
139 0 => {
140 if offset < 4 * SMALL_SECTOR_SIZE {
141 let small_sector_index = offset / SMALL_SECTOR_SIZE;
142 FlashSector {
143 index: small_sector_index as u8,
144 start: FLASH_BASE as u32 + small_sector_index * SMALL_SECTOR_SIZE,
145 size: SMALL_SECTOR_SIZE,
146 }
147 } else {
148 FlashSector {
149 index: 4,
150 start: FLASH_BASE as u32 + 4 * SMALL_SECTOR_SIZE,
151 size: MEDIUM_SECTOR_SIZE,
152 }
153 }
154 }
155 i => {
156 let large_sector_index = i - 1;
157 FlashSector {
158 index: (5 + large_sector_index) as u8,
159 start: FLASH_BASE as u32 + 4 * SMALL_SECTOR_SIZE + MEDIUM_SECTOR_SIZE + large_sector_index * LARGE_SECTOR_SIZE,
160 size: LARGE_SECTOR_SIZE,
161 }
162 }
163 }
164}
165
166#[cfg(test)]
167mod tests {
168 use super::*;
169
170 #[test]
171 fn can_get_sector() {
172 let assert_sector = |index: u8, start: u32, size: u32, addr: u32| {
173 assert_eq!(FlashSector { index, start, size }, get_sector(addr))
174 };
175
176 assert_sector(0, 0x0800_0000, SMALL_SECTOR_SIZE, 0x0800_0000);
177 assert_sector(0, 0x0800_0000, SMALL_SECTOR_SIZE, 0x0800_7FFF);
178 assert_sector(3, 0x0801_8000, SMALL_SECTOR_SIZE, 0x0801_8000);
179 assert_sector(3, 0x0801_8000, SMALL_SECTOR_SIZE, 0x0801_FFFF);
180
181 assert_sector(4, 0x0802_0000, MEDIUM_SECTOR_SIZE, 0x0802_0000);
182 assert_sector(4, 0x0802_0000, MEDIUM_SECTOR_SIZE, 0x0803_FFFF);
183
184 assert_sector(5, 0x0804_0000, LARGE_SECTOR_SIZE, 0x0804_0000);
185 assert_sector(5, 0x0804_0000, LARGE_SECTOR_SIZE, 0x0807_FFFF);
186 assert_sector(7, 0x080C_0000, LARGE_SECTOR_SIZE, 0x080C_0000);
187 assert_sector(7, 0x080C_0000, LARGE_SECTOR_SIZE, 0x080F_FFFF);
188 }
189}
diff --git a/embassy-stm32/src/flash/mod.rs b/embassy-stm32/src/flash/mod.rs
index 1294ace4d..6906bd09a 100644
--- a/embassy-stm32/src/flash/mod.rs
+++ b/embassy-stm32/src/flash/mod.rs
@@ -19,6 +19,13 @@ pub struct Flash<'d> {
19 _inner: PeripheralRef<'d, FLASH>, 19 _inner: PeripheralRef<'d, FLASH>,
20} 20}
21 21
22#[derive(Debug, PartialEq)]
23pub struct FlashSector {
24 pub index: u8,
25 pub start: u32,
26 pub size: u32,
27}
28
22static REGION_LOCK: Mutex<CriticalSectionRawMutex, ()> = Mutex::new(()); 29static REGION_LOCK: Mutex<CriticalSectionRawMutex, ()> = Mutex::new(());
23 30
24impl<'d> Flash<'d> { 31impl<'d> Flash<'d> {