.

Revision:
2:ecbff7f1e453
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ROMSLOT_STM32L1.cpp	Sat Apr 09 15:30:12 2016 +0900
@@ -0,0 +1,54 @@
+// 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
+