Skip to content

Commit 2e42ad8

Browse files
authored
Merge pull request #3442 from redocCheng/master
drv_flash_f1.c support stm32f103vg
2 parents 88eafe7 + 4b46aaf commit 2e42ad8

File tree

1 file changed

+79
-3
lines changed

1 file changed

+79
-3
lines changed

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

Lines changed: 79 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
* Change Logs:
77
* Date Author Notes
88
* 2018-12-5 SummerGift first version
9+
* 2020-03-05 redoc support stm32f103vg
10+
*
911
*/
1012

1113
#include "board.h"
@@ -122,16 +124,17 @@ int stm32_flash_write(rt_uint32_t addr, const rt_uint8_t *buf, size_t size)
122124
}
123125

124126
/**
125-
* Erase data on flash.
127+
* Erase data on flash with bank.
126128
* @note This operation is irreversible.
127129
* @note This operation's units is different which on many chips.
128130
*
131+
* @param bank flash bank
129132
* @param addr flash address
130133
* @param size erase bytes size
131134
*
132135
* @return result
133136
*/
134-
int stm32_flash_erase(rt_uint32_t addr, size_t size)
137+
int stm32_flash_erase_bank(uint32_t bank, rt_uint32_t addr, size_t size)
135138
{
136139
rt_err_t result = RT_EOK;
137140
uint32_t PAGEError = 0;
@@ -151,7 +154,8 @@ int stm32_flash_erase(rt_uint32_t addr, size_t size)
151154
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
152155
EraseInitStruct.PageAddress = GetPage(addr);
153156
EraseInitStruct.NbPages = (size + FLASH_PAGE_SIZE - 1) / FLASH_PAGE_SIZE;
154-
157+
EraseInitStruct.Banks = bank;
158+
155159
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
156160
{
157161
result = -RT_ERROR;
@@ -170,6 +174,78 @@ int stm32_flash_erase(rt_uint32_t addr, size_t size)
170174
return size;
171175
}
172176

177+
/**
178+
* Erase data on flash .
179+
* @note This operation is irreversible.
180+
* @note This operation's units is different which on many chips.
181+
*
182+
* @param addr flash address
183+
* @param size erase bytes size
184+
*
185+
* @return result
186+
*/
187+
int stm32_flash_erase(rt_uint32_t addr, size_t size)
188+
{
189+
#if defined(FLASH_BANK2_END)
190+
rt_err_t result = RT_EOK;
191+
rt_uint32_t addr_bank1 = 0;
192+
rt_uint32_t size_bank1 = 0;
193+
rt_uint32_t addr_bank2 = 0;
194+
rt_uint32_t size_bank2 = 0;
195+
196+
if((addr + size) <= FLASH_BANK1_END)
197+
{
198+
addr_bank1 = addr;
199+
size_bank1 = size;
200+
size_bank2 = 0;
201+
}
202+
else if(addr > FLASH_BANK1_END)
203+
{
204+
size_bank1 = 0;
205+
addr_bank2 = addr;
206+
size_bank2 = size;
207+
}
208+
else
209+
{
210+
addr_bank1 = addr;
211+
size_bank1 = FLASH_BANK1_END + 1 - addr_bank1;
212+
addr_bank2 = FLASH_BANK1_END + 1;
213+
size_bank2 = addr + size - (FLASH_BANK1_END + 1);
214+
}
215+
216+
if(size_bank1)
217+
{
218+
LOG_D("bank1: addr (0x%p), size %d", (void *)addr_bank1, size_bank1);
219+
if(size_bank1 != stm32_flash_erase_bank(FLASH_BANK_1, addr_bank1, size_bank1))
220+
{
221+
result = -RT_ERROR;
222+
goto __exit;
223+
}
224+
}
225+
226+
if(size_bank2)
227+
{
228+
LOG_D("bank2: addr (0x%p), size %d", (void *)addr_bank2, size_bank2);
229+
if(size_bank2 != stm32_flash_erase_bank(FLASH_BANK_2, addr_bank2, size_bank2))
230+
{
231+
result = -RT_ERROR;
232+
goto __exit;
233+
}
234+
}
235+
236+
__exit:
237+
if(result != RT_EOK)
238+
{
239+
return result;
240+
}
241+
242+
return size_bank1 + size_bank2;
243+
#else
244+
return stm32_flash_erase_bank(FLASH_BANK_1, addr, size);
245+
#endif
246+
}
247+
248+
173249
#if defined(PKG_USING_FAL)
174250

175251
static int fal_flash_read(long offset, rt_uint8_t *buf, size_t size);

0 commit comments

Comments
 (0)