From 2b1bcf6833ffdcbb43a2fcc788f06d0010964009 Mon Sep 17 00:00:00 2001 From: ifreecoding Date: Fri, 3 Jul 2020 10:28:37 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E5=AF=B9stm32=5Fflash=5Fer?= =?UTF-8?q?ase=E5=87=BD=E6=95=B0=E5=85=A5=E5=8F=A3=E5=8F=82=E6=95=B0size?= =?UTF-8?q?=E4=B8=BA0=E7=9A=84=E6=A3=80=E6=B5=8B=E3=80=82=202.stm32=5Fflas?= =?UTF-8?q?h=5Fwrite=E5=87=BD=E6=95=B0=E6=8C=89byte=E3=80=81half=20word?= =?UTF-8?q?=E3=80=81word=E5=AF=B9=E9=BD=90=E5=86=99=E5=85=A5=EF=BC=8C?= =?UTF-8?q?=E6=8F=90=E5=8D=87=E5=86=99=E5=85=A5=E6=95=88=E7=8E=87=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HAL_Drivers/drv_flash/drv_flash_f4.c | 58 +++++++++++++++++-- 1 file changed, 52 insertions(+), 6 deletions(-) diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_flash/drv_flash_f4.c b/bsp/stm32/libraries/HAL_Drivers/drv_flash/drv_flash_f4.c index f36d5cdc69..a9ed886c32 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_flash/drv_flash_f4.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_flash/drv_flash_f4.c @@ -211,6 +211,8 @@ int stm32_flash_write(rt_uint32_t addr, const rt_uint8_t *buf, size_t size) { rt_err_t result = RT_EOK; rt_uint32_t end_addr = addr + size; + rt_uint32_t written_size = 0; + rt_uint32_t write_size = 0; if ((end_addr) > STM32_FLASH_END_ADDRESS) { @@ -227,22 +229,61 @@ int stm32_flash_write(rt_uint32_t addr, const rt_uint8_t *buf, size_t size) __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); - for (size_t i = 0; i < size; i++, addr++, buf++) + while (written_size < size) { - /* write data to flash */ - if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, addr, (rt_uint64_t)(*buf)) == HAL_OK) + if (((addr + written_size) % 4 == 0) && (size - written_size >= 4)) { - if (*(rt_uint8_t *)addr != *buf) + if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr + written_size, *((rt_uint32_t *)(buf + written_size))) == HAL_OK) + { + if (*(rt_uint32_t *)(addr + written_size) != *(rt_uint32_t *)(buf + written_size)) + { + result = -RT_ERROR; + break; + } + } + else { result = -RT_ERROR; break; } + write_size = 4; + } + else if (((addr + written_size) % 2 == 0) && (size - written_size >= 2)) + { + if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, addr + written_size, *((rt_uint16_t *)(buf + written_size))) == HAL_OK) + { + if (*(rt_uint16_t *)(addr + written_size) != *(rt_uint16_t *)(buf + written_size)) + { + result = -RT_ERROR; + break; + } + } + else + { + result = -RT_ERROR; + break; + } + write_size = 2; } else { - result = -RT_ERROR; - break; + if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, addr + written_size, *((rt_uint8_t *)(buf + written_size))) == HAL_OK) + { + if (*(rt_uint8_t *)(addr + written_size) != *(rt_uint8_t *)(buf + written_size)) + { + result = -RT_ERROR; + break; + } + } + else + { + result = -RT_ERROR; + break; + } + write_size = 1; } + + written_size += write_size; } HAL_FLASH_Lock(); @@ -277,6 +318,11 @@ int stm32_flash_erase(rt_uint32_t addr, size_t size) return -RT_EINVAL; } + if (size < 1) + { + return -RT_EINVAL; + } + /*Variable used for Erase procedure*/ FLASH_EraseInitTypeDef EraseInitStruct;