.

Committer:
va009039
Date:
Sat Apr 09 15:30:12 2016 +0900
Revision:
2:ecbff7f1e453
add Nucleo-F401RE.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 2:ecbff7f1e453 1 // ROMSLOT_STM32F4.cpp 2016/4/9
va009039 2:ecbff7f1e453 2 #if defined(TARGET_STM32F4)
va009039 2:ecbff7f1e453 3 #include "ROMSLOT.h"
va009039 2:ecbff7f1e453 4
va009039 2:ecbff7f1e453 5 static const uint32_t FLASH_SECTOR_SIZE = 0x20000; // 128 Kbytes
va009039 2:ecbff7f1e453 6
va009039 2:ecbff7f1e453 7 ROMSLOT::ROMSLOT() {
va009039 2:ecbff7f1e453 8 base = 0x20000;
va009039 2:ecbff7f1e453 9 }
va009039 2:ecbff7f1e453 10
va009039 2:ecbff7f1e453 11 uint32_t ROMSLOT::New(uint32_t size) {
va009039 2:ecbff7f1e453 12 uint32_t addr = base;
va009039 2:ecbff7f1e453 13 base += (size + FLASH_SECTOR_SIZE - 1) / FLASH_SECTOR_SIZE * FLASH_SECTOR_SIZE;
va009039 2:ecbff7f1e453 14 return addr;
va009039 2:ecbff7f1e453 15 }
va009039 2:ecbff7f1e453 16
va009039 2:ecbff7f1e453 17 static bool is_base(uint32_t addr) {
va009039 2:ecbff7f1e453 18 return addr % FLASH_SECTOR_SIZE == 0;
va009039 2:ecbff7f1e453 19 }
va009039 2:ecbff7f1e453 20
va009039 2:ecbff7f1e453 21 static uint32_t sector(uint32_t addr) {
va009039 2:ecbff7f1e453 22 MBED_ASSERT(addr >= 0x20000 && addr <= 0x60000);
va009039 2:ecbff7f1e453 23 uint32_t s = (addr - 0x20000) / FLASH_SECTOR_SIZE + 5; // sector 5,6 und 7
va009039 2:ecbff7f1e453 24 return s;
va009039 2:ecbff7f1e453 25 }
va009039 2:ecbff7f1e453 26
va009039 2:ecbff7f1e453 27 bool ROMSLOT::Write(uint32_t addr, const uint8_t buf[], uint32_t size) {
va009039 2:ecbff7f1e453 28 uint32_t data;
va009039 2:ecbff7f1e453 29 MBED_ASSERT(addr % sizeof(data) == 0);
va009039 2:ecbff7f1e453 30 MBED_ASSERT(size % sizeof(data) == 0);
va009039 2:ecbff7f1e453 31 if (memcmp((uint8_t*)addr, buf, size) == 0) { // skip ?
va009039 2:ecbff7f1e453 32 return true;
va009039 2:ecbff7f1e453 33 }
va009039 2:ecbff7f1e453 34 HAL_FLASH_Unlock();
va009039 2:ecbff7f1e453 35 bool result = true;
va009039 2:ecbff7f1e453 36 for(uint32_t n = 0; n < size; n += sizeof(data)) {
va009039 2:ecbff7f1e453 37 if (is_base(addr + n)) {
va009039 2:ecbff7f1e453 38 FLASH_EraseInitTypeDef Erase;
va009039 2:ecbff7f1e453 39 Erase.TypeErase = FLASH_TYPEERASE_SECTORS;
va009039 2:ecbff7f1e453 40 Erase.VoltageRange = FLASH_VOLTAGE_RANGE_1;
va009039 2:ecbff7f1e453 41 Erase.NbSectors = 1;
va009039 2:ecbff7f1e453 42 Erase.Sector = sector(addr + n);
va009039 2:ecbff7f1e453 43 uint32_t PageError = 0;
va009039 2:ecbff7f1e453 44 HAL_StatusTypeDef status = HAL_FLASHEx_Erase(&Erase, &PageError);
va009039 2:ecbff7f1e453 45 MBED_ASSERT(status == HAL_OK);
va009039 2:ecbff7f1e453 46 if (status != HAL_OK) {
va009039 2:ecbff7f1e453 47 result = false;
va009039 2:ecbff7f1e453 48 break;
va009039 2:ecbff7f1e453 49 }
va009039 2:ecbff7f1e453 50 }
va009039 2:ecbff7f1e453 51 memcpy(&data, buf + n, sizeof(data));
va009039 2:ecbff7f1e453 52 HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr + n, data);
va009039 2:ecbff7f1e453 53 MBED_ASSERT(status == HAL_OK);
va009039 2:ecbff7f1e453 54 if (status != HAL_OK) {
va009039 2:ecbff7f1e453 55 result = false;
va009039 2:ecbff7f1e453 56 break;
va009039 2:ecbff7f1e453 57 }
va009039 2:ecbff7f1e453 58 }
va009039 2:ecbff7f1e453 59 HAL_FLASH_Lock();
va009039 2:ecbff7f1e453 60 return result;
va009039 2:ecbff7f1e453 61 }
va009039 2:ecbff7f1e453 62 #endif // TARGET_STM32F4
va009039 2:ecbff7f1e453 63