.
Diff: ROMSLOT_STM32.cpp
- Revision:
- 1:dee9fae0c0c4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ROMSLOT_STM32.cpp Fri Apr 08 06:47:00 2016 +0900 @@ -0,0 +1,39 @@ +// ROMSLOT_STM32.cpp 2016/4/7 +#if defined(TARGET_STM) +#include "ROMSLOT.h" + +bool ROMSLOT::Write(uint32_t addr, const uint8_t buf[], uint32_t size) { + MBED_ASSERT(addr%FLASH_PAGE_SIZE == 0); + MBED_ASSERT(size%FLASH_PAGE_SIZE == 0); + if (memcmp((uint8_t*)addr, buf, size) == 0) { // skip ? + return true; + } + HAL_FLASH_Unlock(); + bool result = true; + for(uint32_t n = 0; n < size; n += sizeof(uint32_t)) { + if (n % FLASH_PAGE_SIZE == 0) { + FLASH_EraseInitTypeDef Erase; + Erase.NbPages = 1; + Erase.TypeErase = TYPEERASEDATA_BYTE; + Erase.PageAddress = addr + n; + uint32_t PageError = 0; + HAL_StatusTypeDef status = HAL_FLASHEx_Erase(&Erase, &PageError); + MBED_ASSERT(status == HAL_OK); + if (status != HAL_OK) { + result = false; + break; + } + } + uint32_t data = buf[n]|buf[n+1]<<8|buf[n+2]<<16|buf[n+3]<<24; + HAL_StatusTypeDef status = HAL_FLASH_Program(TYPEPROGRAM_WORD, addr + n, (uint64_t)data); + MBED_ASSERT(status == HAL_OK); + if (status != HAL_OK) { + result = false; + break; + } + } + HAL_FLASH_Lock(); + return result; +} +#endif // TARGET_STM +