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"
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 */
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 */
6943static 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 ;
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+ }
163105 }
164- else if ((Address < ADDR_FLASH_SECTOR_23 ) && (Address >= ADDR_FLASH_SECTOR_22 ))
165- {
166- sector = FLASH_SECTOR_22 ;
167- }
168- #else
169- else
106+ else //0:dual bank mode
170107 {
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
108+ LOG_E ("rtthread doesn't support duel bank mode yet!" );
109+ RT_ASSERT (0 );
178110 }
179- #endif
180- #else
111+ #else //no dual bank ability
181112 if ((Address < ADDR_FLASH_SECTOR_1 ) && (Address >= ADDR_FLASH_SECTOR_0 ))
182113 {
183114 sector = FLASH_SECTOR_0 ;
@@ -186,7 +117,6 @@ static rt_uint32_t GetSector(rt_uint32_t Address)
186117 {
187118 sector = FLASH_SECTOR_1 ;
188119 }
189- #if (FLASH_SECTOR_TOTAL >= 4 )
190120 else if ((Address < ADDR_FLASH_SECTOR_3 ) && (Address >= ADDR_FLASH_SECTOR_2 ))
191121 {
192122 sector = FLASH_SECTOR_2 ;
@@ -195,7 +125,6 @@ static rt_uint32_t GetSector(rt_uint32_t Address)
195125 {
196126 sector = FLASH_SECTOR_3 ;
197127 }
198- #elif (FLASH_SECTOR_TOTAL >= 8)
199128 else if ((Address < ADDR_FLASH_SECTOR_5 ) && (Address >= ADDR_FLASH_SECTOR_4 ))
200129 {
201130 sector = FLASH_SECTOR_4 ;
@@ -212,7 +141,6 @@ static rt_uint32_t GetSector(rt_uint32_t Address)
212141 {
213142 sector = FLASH_SECTOR_7 ;
214143 }
215- #elif (FLASH_SECTOR_TOTAL >= 24)
216144 else if ((Address < ADDR_FLASH_SECTOR_9 ) && (Address >= ADDR_FLASH_SECTOR_8 ))
217145 {
218146 sector = FLASH_SECTOR_8 ;
@@ -225,22 +153,15 @@ static rt_uint32_t GetSector(rt_uint32_t Address)
225153 {
226154 sector = FLASH_SECTOR_10 ;
227155 }
228- #else
229- else
156+ else
230157 {
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 )
236158 sector = FLASH_SECTOR_11 ;
237- #endif
238159 }
239- #endif
240160#endif
241161 return sector ;
242162}
243163
164+
244165/**
245166 * Read data from flash.
246167 * @note This operation's units is word.
@@ -386,6 +307,13 @@ int stm32_flash_erase(rt_uint32_t addr, size_t size)
386307}
387308
388309#if defined(PKG_USING_FAL )
310+ #define FLASH_SIZE_GRANULARITY_32K (4 * 32 * 1024)
311+ #define FLASH_SIZE_GRANULARITY_128K (128 * 1024)
312+ #define FLASH_SIZE_GRANULARITY_256K (7 * 256 *1024)
313+
314+ #define STM32_FLASH_START_ADRESS_32K (STM32_FLASH_START_ADRESS)
315+ #define STM32_FLASH_START_ADRESS_128K (STM32_FLASH_START_ADRESS_32K + FLASH_SIZE_GRANULARITY_32K)
316+ #define STM32_FLASH_START_ADRESS_256K (STM32_FLASH_START_ADRESS_128K + FLASH_SIZE_GRANULARITY_128K)
389317
390318static int fal_flash_read_32k (long offset , rt_uint8_t * buf , size_t size );
391319static int fal_flash_read_128k (long offset , rt_uint8_t * buf , size_t size );
0 commit comments