.
ROMSLOT_STM32L1.cpp
- Committer:
- va009039
- Date:
- 2016-04-09
- Revision:
- 2:ecbff7f1e453
File content as of revision 2:ecbff7f1e453:
// ROMSLOT_STM32L1.cpp 2016/4/9 #if defined(TARGET_STM32L1) #include "ROMSLOT.h" ROMSLOT::ROMSLOT() { base = 0x20000; } uint32_t ROMSLOT::New(uint32_t size) { uint32_t addr = base; base += (size + FLASH_PAGE_SIZE - 1) / FLASH_PAGE_SIZE * FLASH_PAGE_SIZE; return addr; } static bool is_base(uint32_t addr) { return addr % FLASH_PAGE_SIZE == 0; } bool ROMSLOT::Write(uint32_t addr, const uint8_t buf[], uint32_t size) { uint32_t data; MBED_ASSERT(addr % sizeof(data) == 0); MBED_ASSERT(size % sizeof(data) == 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(data)) { if (is_base(addr + n)) { 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; } } memcpy(&data, buf + n, sizeof(data)); 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_STM32L1