semf
stm32f4flash.cpp
Go to the documentation of this file.
1
12
13#if defined(STM32F4)
14#include <stm32f4xx_hal_def.h>
15#define ADDR_SECTOR_0 ((uint32_t)0x08000000)
16#define ADDR_SECTOR_1 ((uint32_t)0x08004000)
17#define ADDR_SECTOR_2 ((uint32_t)0x08008000)
18#define ADDR_SECTOR_3 ((uint32_t)0x0800C000)
19#define ADDR_SECTOR_4 ((uint32_t)0x08010000)
20#define ADDR_SECTOR_5 ((uint32_t)0x08020000)
21#define ADDR_SECTOR_6 ((uint32_t)0x08040000)
22#define ADDR_SECTOR_7 ((uint32_t)0x08060000)
23#define ADDR_SECTOR_8 ((uint32_t)0x08080000)
24#define ADDR_SECTOR_9 ((uint32_t)0x080A0000)
25#define ADDR_SECTOR_10 ((uint32_t)0x080C0000)
26#define ADDR_SECTOR_11 ((uint32_t)0x080E0000)
27#define ADDR_SECTOR_12 ((uint32_t)0x08100000)
28#define ADDR_SECTOR_13 ((uint32_t)0x08104000)
29#define ADDR_SECTOR_14 ((uint32_t)0x08108000)
30#define ADDR_SECTOR_15 ((uint32_t)0x0810C000)
31#define ADDR_SECTOR_16 ((uint32_t)0x08110000)
32#define ADDR_SECTOR_17 ((uint32_t)0x08120000)
33#define ADDR_SECTOR_18 ((uint32_t)0x08140000)
34#define ADDR_SECTOR_19 ((uint32_t)0x08160000)
35#define ADDR_SECTOR_20 ((uint32_t)0x08180000)
36#define ADDR_SECTOR_21 ((uint32_t)0x081A0000)
37#define ADDR_SECTOR_22 ((uint32_t)0x081C0000)
38#define ADDR_SECTOR_23 ((uint32_t)0x081E0000)
39#define ADDR_SECTOR_END ((uint32_t)0x08200000)
40
41namespace semf
42{
43size_t Stm32F4Flash::sector(uint32_t address) const
44{
45 if ((address >= ADDR_SECTOR_8 && size() <= 512) ||
46 (address >= ADDR_SECTOR_12 && size() <= 1024) ||
47 (address >= ADDR_SECTOR_END))
48 {
49 SEMF_ERROR("invalid address %u", address);
50 return 0;
51 }
52 else if (address < ADDR_SECTOR_6)
53 {
54 if (address < ADDR_SECTOR_3)
55 {
56 if (address < ADDR_SECTOR_1)
57 return 0;
58 else if (address < ADDR_SECTOR_2)
59 return 1;
60 else
61 return 2;
62 }
63 else
64 {
65 if (address < ADDR_SECTOR_4)
66 return 3;
67 else if (address < ADDR_SECTOR_5)
68 return 4;
69 else
70 return 5;
71 }
72 }
73 else if (address < ADDR_SECTOR_12)
74 {
75 if (address < ADDR_SECTOR_9)
76 {
77 if (address < ADDR_SECTOR_7)
78 return 6;
79 else if (address < ADDR_SECTOR_8)
80 return 7;
81 else
82 return 8;
83 }
84 else
85 {
86 if (address < ADDR_SECTOR_10)
87 return 9;
88 else if (address < ADDR_SECTOR_11)
89 return 10;
90 else
91 return 11;
92 }
93 }
94 else if (address < ADDR_SECTOR_18)
95 {
96 if (address < ADDR_SECTOR_15)
97 {
98 if (address < ADDR_SECTOR_13)
99 return 12;
100 else if (address < ADDR_SECTOR_14)
101 return 13;
102 else
103 return 14;
104 }
105 else
106 {
107 if (address < ADDR_SECTOR_16)
108 return 15;
109 else if (address < ADDR_SECTOR_17)
110 return 16;
111 else
112 return 17;
113 }
114 }
115 else
116 {
117 if (address < ADDR_SECTOR_21)
118 {
119 if (address < ADDR_SECTOR_19)
120 return 18;
121 else if (address < ADDR_SECTOR_20)
122 return 19;
123 else
124 return 20;
125 }
126 else
127 {
128 if (address < ADDR_SECTOR_22)
129 return 21;
130 else if (address < ADDR_SECTOR_23)
131 return 22;
132 else
133 return 23;
134 }
135 }
136}
137
138uint32_t Stm32F4Flash::address(size_t sector) const
139{
140 switch(sector)
141 {
142 case 0: return ADDR_SECTOR_0;
143 case 1: return ADDR_SECTOR_1;
144 case 2: return ADDR_SECTOR_2;
145 case 3: return ADDR_SECTOR_3;
146 case 4: return ADDR_SECTOR_4;
147 case 5: return ADDR_SECTOR_5;
148 case 6: return ADDR_SECTOR_6;
149 case 7: return ADDR_SECTOR_7;
150 case 8: return ADDR_SECTOR_8;
151 case 9: return ADDR_SECTOR_9;
152 case 10: return ADDR_SECTOR_10;
153 case 11: return ADDR_SECTOR_11;
154 case 12: return ADDR_SECTOR_12;
155 case 13: return ADDR_SECTOR_13;
156 case 14: return ADDR_SECTOR_14;
157 case 15: return ADDR_SECTOR_15;
158 case 16: return ADDR_SECTOR_16;
159 case 17: return ADDR_SECTOR_17;
160 case 18: return ADDR_SECTOR_18;
161 case 19: return ADDR_SECTOR_19;
162 case 20: return ADDR_SECTOR_20;
163 case 21: return ADDR_SECTOR_21;
164 case 22: return ADDR_SECTOR_22;
165 case 23: return ADDR_SECTOR_23;
166 default:
167 SEMF_ERROR("invalid sector %u", sector);
168 return 0;
169 }
170}
171
172size_t Stm32F4Flash::sectorSize(size_t sector) const
173{
174 if (sector <= 3)
175 return 16 * 1024;
176 else if (sector == 4)
177 return 64 * 1024;
178 else if (sector <= 11)
179 return 128 * 1024;
180 else if (sector <= 15)
181 return 16 * 1024;
182 else if (sector == 16)
183 return 64 * 1024;
184 else if (sector <= 23)
185 return 128 * 1024;
186 else
187 {
188 SEMF_ERROR("invalid sector %u", sector);
189 return 0;
190 }
191}
192
193size_t Stm32F4Flash::numberOfSectors() const
194{
195 switch (size())
196 {
197 case 512:
198 return 8;
199 case 1024:
200 return 12;
201 case 2048:
202 return 24;
203 default:
204 return 0;
205 }
206}
207} /* namespace semf */
208#endif
#define SEMF_ERROR(...)
Definition: debug.h:39