Skip to content

Commit 516702d

Browse files
committed
drv_flash_f7.c support single bank mode
1 parent 500b549 commit 516702d

File tree

1 file changed

+123
-196
lines changed

1 file changed

+123
-196
lines changed

bsp/stm32/libraries/HAL_Drivers/drv_flash/drv_flash_f7.c

Lines changed: 123 additions & 196 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
* Date Author Notes
88
* 2018-12-5 SummerGift first version
99
* 2019-3-2 jinsheng add Macro judgment
10+
* 2020-1-6 duminmin support single bank mode
1011
*/
1112

1213
#include "board.h"
@@ -22,32 +23,6 @@
2223
//#define DRV_DEBUG
2324
#define LOG_TAG "drv.flash"
2425
#include <drv_log.h>
25-
#if defined (FLASH_OPTCR_nDBANK)
26-
#define ADDR_FLASH_SECTOR_0 ((rt_uint32_t)0x08000000) /* Base address of Sector 0, 16 Kbytes */
27-
#define ADDR_FLASH_SECTOR_1 ((rt_uint32_t)0x08004000) /* Base address of Sector 1, 16 Kbytes */
28-
#define ADDR_FLASH_SECTOR_2 ((rt_uint32_t)0x08008000) /* Base address of Sector 2, 16 Kbytes */
29-
#define ADDR_FLASH_SECTOR_3 ((rt_uint32_t)0x0800C000) /* Base address of Sector 3, 16 Kbytes */
30-
#define ADDR_FLASH_SECTOR_4 ((rt_uint32_t)0x08010000) /* Base address of Sector 4, 64 Kbytes */
31-
#define ADDR_FLASH_SECTOR_5 ((rt_uint32_t)0x08020000) /* Base address of Sector 5, 128 Kbytes */
32-
#define ADDR_FLASH_SECTOR_6 ((rt_uint32_t)0x08040000) /* Base address of Sector 6, 128 Kbytes */
33-
#define ADDR_FLASH_SECTOR_7 ((rt_uint32_t)0x08060000) /* Base address of Sector 7, 128 Kbytes */
34-
#define ADDR_FLASH_SECTOR_8 ((rt_uint32_t)0x08080000) /* Base address of Sector 8, 128 Kbytes */
35-
#define ADDR_FLASH_SECTOR_9 ((rt_uint32_t)0x080A0000) /* Base address of Sector 9, 128 Kbytes */
36-
#define ADDR_FLASH_SECTOR_10 ((rt_uint32_t)0x080C0000) /* Base address of Sector 10, 128 Kbytes */
37-
#define ADDR_FLASH_SECTOR_11 ((rt_uint32_t)0x080E0000) /* Base address of Sector 11, 128 Kbytes */
38-
#define ADDR_FLASH_SECTOR_12 ((rt_uint32_t)0x08100000) /* Base address of Sector 12, 16 Kbytes */
39-
#define ADDR_FLASH_SECTOR_13 ((rt_uint32_t)0x08104000) /* Base address of Sector 13, 16 Kbytes */
40-
#define ADDR_FLASH_SECTOR_14 ((rt_uint32_t)0x08108000) /* Base address of Sector 14, 16 Kbytes */
41-
#define ADDR_FLASH_SECTOR_15 ((rt_uint32_t)0x0810C000) /* Base address of Sector 15, 16 Kbytes */
42-
#define ADDR_FLASH_SECTOR_16 ((rt_uint32_t)0x08110000) /* Base address of Sector 16, 64 Kbytes */
43-
#define ADDR_FLASH_SECTOR_17 ((rt_uint32_t)0x08120000) /* Base address of Sector 17, 128 Kbytes */
44-
#define ADDR_FLASH_SECTOR_18 ((rt_uint32_t)0x08140000) /* Base address of Sector 18, 128 Kbytes */
45-
#define ADDR_FLASH_SECTOR_19 ((rt_uint32_t)0x08160000) /* Base address of Sector 19, 128 Kbytes */
46-
#define ADDR_FLASH_SECTOR_20 ((rt_uint32_t)0x08180000) /* Base address of Sector 20, 128 Kbytes */
47-
#define ADDR_FLASH_SECTOR_21 ((rt_uint32_t)0x081A0000) /* Base address of Sector 21, 128 Kbytes */
48-
#define ADDR_FLASH_SECTOR_22 ((rt_uint32_t)0x081C0000) /* Base address of Sector 22, 128 Kbytes */
49-
#define ADDR_FLASH_SECTOR_23 ((rt_uint32_t)0x081E0000) /* Base address of Sector 23, 128 Kbytes */
50-
#else
5126
#define ADDR_FLASH_SECTOR_0 ((rt_uint32_t)0x08000000) /* Base address of Sector 0, 32 Kbytes */
5227
#define ADDR_FLASH_SECTOR_1 ((rt_uint32_t)0x08008000) /* Base address of Sector 1, 32 Kbytes */
5328
#define ADDR_FLASH_SECTOR_2 ((rt_uint32_t)0x08010000) /* Base address of Sector 2, 32 Kbytes */
@@ -60,187 +35,132 @@
6035
#define ADDR_FLASH_SECTOR_9 ((rt_uint32_t)0x08140000) /* Base address of Sector 9, 256 Kbytes */
6136
#define ADDR_FLASH_SECTOR_10 ((rt_uint32_t)0x08180000) /* Base address of Sector 10, 256 Kbytes */
6237
#define ADDR_FLASH_SECTOR_11 ((rt_uint32_t)0x081C0000) /* Base address of Sector 11, 256 Kbytes */
63-
#endif
6438
/**
6539
* @brief Gets the sector of a given address
6640
* @param None
6741
* @retval The sector of a given address
6842
*/
6943
static rt_uint32_t GetSector(rt_uint32_t Address)
7044
{
71-
rt_uint32_t sector = 0;
45+
uint32_t sector = 0;
46+
7247
#if defined (FLASH_OPTCR_nDBANK)
73-
if ((Address < ADDR_FLASH_SECTOR_1) && (Address >= ADDR_FLASH_SECTOR_0))
74-
{
75-
sector = FLASH_SECTOR_0;
76-
}
77-
else if ((Address < ADDR_FLASH_SECTOR_2) && (Address >= ADDR_FLASH_SECTOR_1))
78-
{
79-
sector = FLASH_SECTOR_1;
80-
}
81-
#if (FLASH_SECTOR_TOTAL >= 4)
82-
else if ((Address < ADDR_FLASH_SECTOR_3) && (Address >= ADDR_FLASH_SECTOR_2))
83-
{
84-
sector = FLASH_SECTOR_2;
85-
}
86-
else if ((Address < ADDR_FLASH_SECTOR_4) && (Address >= ADDR_FLASH_SECTOR_3))
87-
{
88-
sector = FLASH_SECTOR_3;
89-
}
90-
#elif (FLASH_SECTOR_TOTAL >= 8)
91-
else if ((Address < ADDR_FLASH_SECTOR_5) && (Address >= ADDR_FLASH_SECTOR_4))
92-
{
93-
sector = FLASH_SECTOR_4;
94-
}
95-
else if ((Address < ADDR_FLASH_SECTOR_6) && (Address >= ADDR_FLASH_SECTOR_5))
96-
{
97-
sector = FLASH_SECTOR_5;
98-
}
99-
else if ((Address < ADDR_FLASH_SECTOR_7) && (Address >= ADDR_FLASH_SECTOR_6))
100-
{
101-
sector = FLASH_SECTOR_6;
102-
}
103-
else if ((Address < ADDR_FLASH_SECTOR_8) && (Address >= ADDR_FLASH_SECTOR_7))
104-
{
105-
sector = FLASH_SECTOR_7;
106-
}
107-
#elif (FLASH_SECTOR_TOTAL >= 24)
108-
else if ((Address < ADDR_FLASH_SECTOR_9) && (Address >= ADDR_FLASH_SECTOR_8))
109-
{
110-
sector = FLASH_SECTOR_8;
111-
}
112-
else if ((Address < ADDR_FLASH_SECTOR_10) && (Address >= ADDR_FLASH_SECTOR_9))
113-
{
114-
sector = FLASH_SECTOR_9;
115-
}
116-
else if ((Address < ADDR_FLASH_SECTOR_11) && (Address >= ADDR_FLASH_SECTOR_10))
117-
{
118-
sector = FLASH_SECTOR_10;
119-
}
120-
else if ((Address < ADDR_FLASH_SECTOR_12) && (Address >= ADDR_FLASH_SECTOR_11))
121-
{
122-
sector = FLASH_SECTOR_11;
123-
}
124-
else if ((Address < ADDR_FLASH_SECTOR_13) && (Address >= ADDR_FLASH_SECTOR_12))
125-
{
126-
sector = FLASH_SECTOR_12;
127-
}
128-
else if ((Address < ADDR_FLASH_SECTOR_14) && (Address >= ADDR_FLASH_SECTOR_13))
129-
{
130-
sector = FLASH_SECTOR_13;
131-
}
132-
else if ((Address < ADDR_FLASH_SECTOR_15) && (Address >= ADDR_FLASH_SECTOR_14))
133-
{
134-
sector = FLASH_SECTOR_14;
135-
}
136-
else if ((Address < ADDR_FLASH_SECTOR_16) && (Address >= ADDR_FLASH_SECTOR_15))
137-
{
138-
sector = FLASH_SECTOR_15;
139-
}
140-
else if ((Address < ADDR_FLASH_SECTOR_17) && (Address >= ADDR_FLASH_SECTOR_16))
141-
{
142-
sector = FLASH_SECTOR_16;
143-
}
144-
else if ((Address < ADDR_FLASH_SECTOR_18) && (Address >= ADDR_FLASH_SECTOR_17))
145-
{
146-
sector = FLASH_SECTOR_17;
147-
}
148-
else if ((Address < ADDR_FLASH_SECTOR_19) && (Address >= ADDR_FLASH_SECTOR_18))
149-
{
150-
sector = FLASH_SECTOR_18;
151-
}
152-
else if ((Address < ADDR_FLASH_SECTOR_20) && (Address >= ADDR_FLASH_SECTOR_19))
153-
{
154-
sector = FLASH_SECTOR_19;
155-
}
156-
else if ((Address < ADDR_FLASH_SECTOR_21) && (Address >= ADDR_FLASH_SECTOR_20))
157-
{
158-
sector = FLASH_SECTOR_20;
159-
}
160-
else if ((Address < ADDR_FLASH_SECTOR_22) && (Address >= ADDR_FLASH_SECTOR_21))
161-
{
162-
sector = FLASH_SECTOR_21;
163-
}
164-
else if ((Address < ADDR_FLASH_SECTOR_23) && (Address >= ADDR_FLASH_SECTOR_22))
165-
{
166-
sector = FLASH_SECTOR_22;
167-
}
168-
#else
169-
else
170-
{
171-
#if (FLASH_SECTOR_TOTAL == 4)
172-
sector = FLASH_SECTOR_4;
173-
#elif (FLASH_SECTOR_TOTAL == 8)
174-
sector = FLASH_SECTOR_8;
175-
#elif (FLASH_SECTOR_TOTAL == 24)
176-
sector = FLASH_SECTOR_23;
177-
#endif
178-
}
179-
#endif
180-
#else
181-
if ((Address < ADDR_FLASH_SECTOR_1) && (Address >= ADDR_FLASH_SECTOR_0))
182-
{
183-
sector = FLASH_SECTOR_0;
184-
}
185-
else if ((Address < ADDR_FLASH_SECTOR_2) && (Address >= ADDR_FLASH_SECTOR_1))
186-
{
187-
sector = FLASH_SECTOR_1;
188-
}
189-
#if (FLASH_SECTOR_TOTAL >= 4)
190-
else if ((Address < ADDR_FLASH_SECTOR_3) && (Address >= ADDR_FLASH_SECTOR_2))
191-
{
192-
sector = FLASH_SECTOR_2;
193-
}
194-
else if ((Address < ADDR_FLASH_SECTOR_4) && (Address >= ADDR_FLASH_SECTOR_3))
195-
{
196-
sector = FLASH_SECTOR_3;
197-
}
198-
#elif (FLASH_SECTOR_TOTAL >= 8)
199-
else if ((Address < ADDR_FLASH_SECTOR_5) && (Address >= ADDR_FLASH_SECTOR_4))
200-
{
201-
sector = FLASH_SECTOR_4;
202-
}
203-
else if ((Address < ADDR_FLASH_SECTOR_6) && (Address >= ADDR_FLASH_SECTOR_5))
204-
{
205-
sector = FLASH_SECTOR_5;
206-
}
207-
else if ((Address < ADDR_FLASH_SECTOR_7) && (Address >= ADDR_FLASH_SECTOR_6))
208-
{
209-
sector = FLASH_SECTOR_6;
210-
}
211-
else if ((Address < ADDR_FLASH_SECTOR_8) && (Address >= ADDR_FLASH_SECTOR_7))
212-
{
213-
sector = FLASH_SECTOR_7;
214-
}
215-
#elif (FLASH_SECTOR_TOTAL >= 24)
216-
else if ((Address < ADDR_FLASH_SECTOR_9) && (Address >= ADDR_FLASH_SECTOR_8))
217-
{
218-
sector = FLASH_SECTOR_8;
219-
}
220-
else if ((Address < ADDR_FLASH_SECTOR_10) && (Address >= ADDR_FLASH_SECTOR_9))
221-
{
222-
sector = FLASH_SECTOR_9;
223-
}
224-
else if ((Address < ADDR_FLASH_SECTOR_11) && (Address >= ADDR_FLASH_SECTOR_10))
225-
{
226-
sector = FLASH_SECTOR_10;
227-
}
228-
#else
229-
else
230-
{
231-
#if (FLASH_SECTOR_TOTAL == 4)
232-
sector = FLASH_SECTOR_4;
233-
#elif (FLASH_SECTOR_TOTAL == 8)
234-
sector = FLASH_SECTOR_8;
235-
#elif (FLASH_SECTOR_TOTAL == 24)
236-
sector = FLASH_SECTOR_11;
237-
#endif
238-
}
239-
#endif
48+
FLASH_OBProgramInitTypeDef OBInit;
49+
uint32_t nbank = 0;
50+
51+
//get duel bank ability:nDBANK(Bit29)
52+
HAL_FLASHEx_OBGetConfig(&OBInit);
53+
nbank = ((OBInit.USERConfig & 0x20000000U) >> 29);
54+
//1:single bank mode
55+
if(1 == nbank)
56+
{
57+
if((Address < ADDR_FLASH_SECTOR_1) && (Address >= ADDR_FLASH_SECTOR_0))
58+
{
59+
sector = FLASH_SECTOR_0;
60+
}
61+
else if((Address < ADDR_FLASH_SECTOR_2) && (Address >= ADDR_FLASH_SECTOR_1))
62+
{
63+
sector = FLASH_SECTOR_1;
64+
}
65+
else if((Address < ADDR_FLASH_SECTOR_3) && (Address >= ADDR_FLASH_SECTOR_2))
66+
{
67+
sector = FLASH_SECTOR_2;
68+
}
69+
else if((Address < ADDR_FLASH_SECTOR_4) && (Address >= ADDR_FLASH_SECTOR_3))
70+
{
71+
sector = FLASH_SECTOR_3;
72+
}
73+
else if((Address < ADDR_FLASH_SECTOR_5) && (Address >= ADDR_FLASH_SECTOR_4))
74+
{
75+
sector = FLASH_SECTOR_4;
76+
}
77+
else if((Address < ADDR_FLASH_SECTOR_6) && (Address >= ADDR_FLASH_SECTOR_5))
78+
{
79+
sector = FLASH_SECTOR_5;
80+
}
81+
else if((Address < ADDR_FLASH_SECTOR_7) && (Address >= ADDR_FLASH_SECTOR_6))
82+
{
83+
sector = FLASH_SECTOR_6;
84+
}
85+
else if((Address < ADDR_FLASH_SECTOR_8) && (Address >= ADDR_FLASH_SECTOR_7))
86+
{
87+
sector = FLASH_SECTOR_7;
88+
}
89+
else if((Address < ADDR_FLASH_SECTOR_9) && (Address >= ADDR_FLASH_SECTOR_8))
90+
{
91+
sector = FLASH_SECTOR_8;
92+
}
93+
else if((Address < ADDR_FLASH_SECTOR_10) && (Address >= ADDR_FLASH_SECTOR_9))
94+
{
95+
sector = FLASH_SECTOR_9;
96+
}
97+
else if((Address < ADDR_FLASH_SECTOR_11) && (Address >= ADDR_FLASH_SECTOR_10))
98+
{
99+
sector = FLASH_SECTOR_10;
100+
}
101+
else
102+
{
103+
sector = FLASH_SECTOR_11;
104+
}
105+
}
106+
else //0:dual bank mode
107+
{
108+
RT_ASSERT("rtthread doesn't support duel bank mode yet!");
109+
}
110+
#else //no dual bank ability
111+
if((Address < ADDR_FLASH_SECTOR_1) && (Address >= ADDR_FLASH_SECTOR_0))
112+
{
113+
sector = FLASH_SECTOR_0;
114+
}
115+
else if((Address < ADDR_FLASH_SECTOR_2) && (Address >= ADDR_FLASH_SECTOR_1))
116+
{
117+
sector = FLASH_SECTOR_1;
118+
}
119+
else if((Address < ADDR_FLASH_SECTOR_3) && (Address >= ADDR_FLASH_SECTOR_2))
120+
{
121+
sector = FLASH_SECTOR_2;
122+
}
123+
else if((Address < ADDR_FLASH_SECTOR_4) && (Address >= ADDR_FLASH_SECTOR_3))
124+
{
125+
sector = FLASH_SECTOR_3;
126+
}
127+
else if((Address < ADDR_FLASH_SECTOR_5) && (Address >= ADDR_FLASH_SECTOR_4))
128+
{
129+
sector = FLASH_SECTOR_4;
130+
}
131+
else if((Address < ADDR_FLASH_SECTOR_6) && (Address >= ADDR_FLASH_SECTOR_5))
132+
{
133+
sector = FLASH_SECTOR_5;
134+
}
135+
else if((Address < ADDR_FLASH_SECTOR_7) && (Address >= ADDR_FLASH_SECTOR_6))
136+
{
137+
sector = FLASH_SECTOR_6;
138+
}
139+
else if((Address < ADDR_FLASH_SECTOR_8) && (Address >= ADDR_FLASH_SECTOR_7))
140+
{
141+
sector = FLASH_SECTOR_7;
142+
}
143+
else if((Address < ADDR_FLASH_SECTOR_9) && (Address >= ADDR_FLASH_SECTOR_8))
144+
{
145+
sector = FLASH_SECTOR_8;
146+
}
147+
else if((Address < ADDR_FLASH_SECTOR_10) && (Address >= ADDR_FLASH_SECTOR_9))
148+
{
149+
sector = FLASH_SECTOR_9;
150+
}
151+
else if((Address < ADDR_FLASH_SECTOR_11) && (Address >= ADDR_FLASH_SECTOR_10))
152+
{
153+
sector = FLASH_SECTOR_10;
154+
}
155+
else
156+
{
157+
sector = FLASH_SECTOR_11;
158+
}
240159
#endif
241-
return sector;
160+
return sector;
242161
}
243162

163+
244164
/**
245165
* Read data from flash.
246166
* @note This operation's units is word.
@@ -386,6 +306,13 @@ int stm32_flash_erase(rt_uint32_t addr, size_t size)
386306
}
387307

388308
#if defined(PKG_USING_FAL)
309+
#define FLASH_SIZE_GRANULARITY_32K 4 * 32 * 1024
310+
#define FLASH_SIZE_GRANULARITY_128K 128 * 1024
311+
#define FLASH_SIZE_GRANULARITY_256K 7 * 256 *1024
312+
313+
#define STM32_FLASH_START_ADRESS_32K STM32_FLASH_START_ADRESS
314+
#define STM32_FLASH_START_ADRESS_128K STM32_FLASH_START_ADRESS_32K + FLASH_SIZE_GRANULARITY_32K
315+
#define STM32_FLASH_START_ADRESS_256K STM32_FLASH_START_ADRESS_128K + FLASH_SIZE_GRANULARITY_128K
389316

390317
static int fal_flash_read_32k(long offset, rt_uint8_t *buf, size_t size);
391318
static int fal_flash_read_128k(long offset, rt_uint8_t *buf, size_t size);

0 commit comments

Comments
 (0)