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 | } |