Skip to content

Commit d180c16

Browse files
authored
Merge pull request #3733 from ifreecoding/debug-drv_flash_f4
1.增加对stm32_flash_erase函数入口参数size为0的检测。
2 parents 5877d97 + 2b1bcf6 commit d180c16

File tree

1 file changed

+52
-6
lines changed

1 file changed

+52
-6
lines changed

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

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,8 @@ int stm32_flash_write(rt_uint32_t addr, const rt_uint8_t *buf, size_t size)
211211
{
212212
rt_err_t result = RT_EOK;
213213
rt_uint32_t end_addr = addr + size;
214+
rt_uint32_t written_size = 0;
215+
rt_uint32_t write_size = 0;
214216

215217
if ((end_addr) > STM32_FLASH_END_ADDRESS)
216218
{
@@ -227,22 +229,61 @@ int stm32_flash_write(rt_uint32_t addr, const rt_uint8_t *buf, size_t size)
227229

228230
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
229231

230-
for (size_t i = 0; i < size; i++, addr++, buf++)
232+
while (written_size < size)
231233
{
232-
/* write data to flash */
233-
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, addr, (rt_uint64_t)(*buf)) == HAL_OK)
234+
if (((addr + written_size) % 4 == 0) && (size - written_size >= 4))
234235
{
235-
if (*(rt_uint8_t *)addr != *buf)
236+
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr + written_size, *((rt_uint32_t *)(buf + written_size))) == HAL_OK)
237+
{
238+
if (*(rt_uint32_t *)(addr + written_size) != *(rt_uint32_t *)(buf + written_size))
239+
{
240+
result = -RT_ERROR;
241+
break;
242+
}
243+
}
244+
else
236245
{
237246
result = -RT_ERROR;
238247
break;
239248
}
249+
write_size = 4;
250+
}
251+
else if (((addr + written_size) % 2 == 0) && (size - written_size >= 2))
252+
{
253+
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, addr + written_size, *((rt_uint16_t *)(buf + written_size))) == HAL_OK)
254+
{
255+
if (*(rt_uint16_t *)(addr + written_size) != *(rt_uint16_t *)(buf + written_size))
256+
{
257+
result = -RT_ERROR;
258+
break;
259+
}
260+
}
261+
else
262+
{
263+
result = -RT_ERROR;
264+
break;
265+
}
266+
write_size = 2;
240267
}
241268
else
242269
{
243-
result = -RT_ERROR;
244-
break;
270+
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, addr + written_size, *((rt_uint8_t *)(buf + written_size))) == HAL_OK)
271+
{
272+
if (*(rt_uint8_t *)(addr + written_size) != *(rt_uint8_t *)(buf + written_size))
273+
{
274+
result = -RT_ERROR;
275+
break;
276+
}
277+
}
278+
else
279+
{
280+
result = -RT_ERROR;
281+
break;
282+
}
283+
write_size = 1;
245284
}
285+
286+
written_size += write_size;
246287
}
247288

248289
HAL_FLASH_Lock();
@@ -277,6 +318,11 @@ int stm32_flash_erase(rt_uint32_t addr, size_t size)
277318
return -RT_EINVAL;
278319
}
279320

321+
if (size < 1)
322+
{
323+
return -RT_EINVAL;
324+
}
325+
280326
/*Variable used for Erase procedure*/
281327
FLASH_EraseInitTypeDef EraseInitStruct;
282328

0 commit comments

Comments
 (0)