.

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
+