Rev 56 | Details | Compare with Previous | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 30 | mjames | 1 | /* |
| 2 | * nvram.c |
||
| 3 | * |
||
| 4 | * Created on: 4 Jun 2017 |
||
| 5 | * Author: Mike |
||
| 6 | */ |
||
| 7 | |||
| 8 | /* Includes ------------------------------------------------------------------*/ |
||
| 9 | #include "stm32l1xx_hal.h" |
||
| 10 | |||
| 11 | #include "nvram.h" |
||
| 12 | |||
| 64 | mjames | 13 | nvram_info_t NVRAM_Base[NVRAM_WORDS] __attribute__((section(".NVRAM_Data"))); // set by linker |
| 14 | |||
| 15 | static void |
||
| 16 | WriteNVRAM(nvram_info_t *Address, nvram_info_t data) |
||
| 30 | mjames | 17 | { |
| 64 | mjames | 18 | HAL_FLASHEx_DATAEEPROM_Unlock(); |
| 19 | HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_WORD, (uint32_t)Address, data.u32); |
||
| 20 | HAL_FLASHEx_DATAEEPROM_Lock(); |
||
| 56 | mjames | 21 | } |
| 30 | mjames | 22 | |
| 64 | mjames | 23 | static void |
| 24 | EraseNVRAM(nvram_info_t *Address) |
||
| 56 | mjames | 25 | { |
| 64 | mjames | 26 | HAL_FLASHEx_DATAEEPROM_Unlock(); |
| 27 | HAL_FLASHEx_DATAEEPROM_Erase(FLASH_TYPEERASEDATA_WORD, (uint32_t)Address); |
||
| 28 | HAL_FLASHEx_DATAEEPROM_Lock(); |
||
| 30 | mjames | 29 | } |
| 64 | mjames | 30 | |
| 31 | void write_nvram_data(nvram_info_t data) |
||
| 32 | { |
||
| 33 | |||
| 34 | /* search blank */ |
||
| 35 | for (int ptr = 0; ptr < NVRAM_WORDS; ptr++) |
||
| 36 | { |
||
| 37 | |||
| 38 | // erase the entry just found |
||
| 39 | if (NVRAM_Base[ptr].data.tag == data.data.tag) |
||
| 40 | { |
||
| 41 | nvram_info_t dat; |
||
| 42 | dat.u32 = ~0; |
||
| 43 | // erase previous data, leave as 0xFF |
||
| 44 | WriteNVRAM(&NVRAM_Base[ptr], dat); |
||
| 45 | // search forward for next erased or empty element, use it |
||
| 46 | for (int offset = 1; offset < NVRAM_WORDS+1; offset++) |
||
| 47 | { |
||
| 48 | int index = (ptr + offset) % NVRAM_WORDS; |
||
| 49 | if (NVRAM_Base[index].u32 == ~0 || NVRAM_Base[index].u32 == 0) |
||
| 50 | { |
||
| 51 | if (NVRAM_Base[index].u32 != 0) |
||
| 52 | EraseNVRAM(&NVRAM_Base[ptr]); |
||
| 53 | WriteNVRAM(&NVRAM_Base[ptr], data); |
||
| 54 | return; |
||
| 55 | } |
||
| 56 | } |
||
| 57 | } |
||
| 58 | } |
||
| 59 | } |
||
| 60 | |||
| 61 | nvram_info_t *find_nvram_data(uint8_t searchTag) |
||
| 62 | { |
||
| 63 | for (int ptr = 0; ptr < NVRAM_WORDS; ptr++) |
||
| 64 | { |
||
| 65 | if (NVRAM_Base[ptr].data.tag == searchTag) |
||
| 66 | return &NVRAM_Base[ptr]; |
||
| 67 | } |
||
| 68 | return NULL; |
||
| 69 | } |