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
175251static int fal_flash_read (long offset , rt_uint8_t * buf , size_t size );
0 commit comments