Subversion Repositories DashDisplay

Rev

Rev 56 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 56 Rev 64
Line 8... Line 8...
8
/* Includes ------------------------------------------------------------------*/
8
/* Includes ------------------------------------------------------------------*/
9
#include "stm32l1xx_hal.h"
9
#include "stm32l1xx_hal.h"
10
 
10
 
11
#include "nvram.h"
11
#include "nvram.h"
12
 
12
 
-
 
13
nvram_info_t NVRAM_Base[NVRAM_WORDS] __attribute__((section(".NVRAM_Data"))); // set by linker 
-
 
14
 
13
void
15
static void
14
WriteUint16NVRAM (uint32_t Address, uint16_t data)
16
WriteNVRAM(nvram_info_t *Address, nvram_info_t data)
15
{
17
{
16
  HAL_FLASHEx_DATAEEPROM_Unlock ();
18
  HAL_FLASHEx_DATAEEPROM_Unlock();
17
  HAL_FLASHEx_DATAEEPROM_Erase (FLASH_TYPEERASEDATA_HALFWORD, Address);
19
  HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_WORD, (uint32_t)Address, data.u32);
18
  HAL_FLASHEx_DATAEEPROM_Program (FLASH_TYPEPROGRAMDATA_HALFWORD, Address,
20
  HAL_FLASHEx_DATAEEPROM_Lock();
-
 
21
}
-
 
22
 
19
                                  data);
23
static void
-
 
24
EraseNVRAM(nvram_info_t *Address)
-
 
25
{
-
 
26
  HAL_FLASHEx_DATAEEPROM_Unlock();
-
 
27
  HAL_FLASHEx_DATAEEPROM_Erase(FLASH_TYPEERASEDATA_WORD, (uint32_t)Address);
20
  HAL_FLASHEx_DATAEEPROM_Lock ();
28
  HAL_FLASHEx_DATAEEPROM_Lock();
-
 
29
}
-
 
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
  }
21
}
59
}
22
 
60
 
23
void
-
 
24
WriteUint32NVRAM (uint32_t Address, uint32_t data)
61
nvram_info_t *find_nvram_data(uint8_t searchTag)
25
{
62
{
26
  HAL_FLASHEx_DATAEEPROM_Unlock ();
63
  for (int ptr = 0; ptr < NVRAM_WORDS; ptr++)
-
 
64
  {
27
  HAL_FLASHEx_DATAEEPROM_Erase (FLASH_TYPEERASEDATA_WORD, Address);
65
    if (NVRAM_Base[ptr].data.tag == searchTag)
28
  HAL_FLASHEx_DATAEEPROM_Program (FLASH_TYPEPROGRAMDATA_WORD, Address, data);
66
      return &NVRAM_Base[ptr];
-
 
67
  }
29
  HAL_FLASHEx_DATAEEPROM_Lock ();
68
  return NULL;
30
}
69
}