Перейти к содержанию
    

STM8, не пойму поведение EEPROM

Имеется кристалл low_density STM8S003F3PB, проект под IAR EW for STM8 3.11.1.

В проекте имеется подпрограмма записи в EEPROM:

__no_init union Parameter ParameterArray[PARAMETER_NUMBER+1]; //Массив для хранения параметров

__no_init unsigned char FirstEEPROMBlock[0x40] @ 0x004000;
__no_init unsigned char SecondEEPROMBlock[0x40] @ 0x004040;

  if(WriteEEPROMTables==true) { //Запись нового параметра в EEPROM
    EEPROM_WriteParam((unsigned char *)&FirstEEPROMBlock); //Запись первого блока параметров
    EEPROM_WriteParam((unsigned char *)&SecondEEPROMBlock); //Запись второго блока параметров
  }  

  WriteEEPROMTables=false;
 

void EEPROM_WriteParam(unsigned char *EEPROMBlockAddress) {
  unsigned char Index;
  unsigned char *Sorces;
  
 __disable_interrupt();
  if(FLASH_IAPSR_bit.DUL==0) {
    FLASH_DUKR=0xAE; //Разблокирование EEPROM для записи
    FLASH_DUKR=0x56;
  }
  while(FLASH_IAPSR_bit.DUL==0);
  for(Index=0,Sorces=(unsigned char *)&ParameterArray;Index<PARAMETER_NUMBER*4+2;Index++)
    *EEPROMBlockAddress++=*Sorces++;
  FLASH_IAPSR_bit.DUL=0;  //Блокирование EEPROM
 __enable_interrupt();
}

Странности:

1. Пока есть питание, всё работает. В EEPROM пишется, в отладчике видно. При "горячем" сбросе программы всё сохраняется. После выключения и включения питания по адресу EEPROM произвольные значения. Такое впечатление, что на этом месте обычное ОЗУ. Кстати, проверять бит EOP пробовал - не помогает.

2. Запись в EEPROM нормально выполняется только при отключенном IWDG. При включенном, несмотря на то, что сбрасывал IWDG после записи каждого байта в цикле записи в EEPROM, несмотря на то, что пытался выставить период на максимум (2 секунды), запись не выполняется.  Вынужден был устанавливать специальный бит и "заклинить" IWDG для принудительного программного сброса для записи в EEPROM до включения IWDG.  Настройка IWDG и его сброс ниже. 

/* Определения для независимого WDT */
#define IWDG_KEY_ACCESS           0x55
#define IWDG_KEY_RELOAD           0xAA
#define IWDG_KEY_ENABLE           0xCC

  IWDG_KR=IWDG_KEY_ACCESS; //Установка предделителя IWDG
  IWDG_PR_bit.PR=1;
  IWDG_KR=IWDG_KEY_ACCESS; //Установка регистра загрузки IWDG
  IWDG_RLR=0xFF; //Время срабатывания IWDG от 31,9 мс при 128 кГц
  IWDG_KR=IWDG_KEY_ENABLE;
 
  __enable_interrupt();

  for(;;) { //Главный бесконечный цикл

...
    IWDG_KR=IWDG_KEY_RELOAD;  //Рестарт WDT
  }
 

Заранее благодарю за любые подсказки.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 hours ago, Вячик13 said:

. . . .
(1)  IWDG_KR=IWDG_KEY_ACCESS; //Установка регистра загрузки IWDG
  IWDG_RLR=0xFF; //Время срабатывания IWDG от 31,9 мс при 128 кГц
(2)  IWDG_KR=IWDG_KEY_ENABLE;


Заранее благодарю за любые подсказки.

1. устанавливаем 2. затираем (?)

Может так и надо. Но как-то "не очень" выглядит, ни таймаутов, ни проверок.

могобыть 

2.   IWDG_KR |=IWDG_KEY_ENABLE;

 

ps пардон, ошипся, Key Register.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 hours ago, Вячик13 said:

. . . .После выключения и включения питания по адресу EEPROM произвольные значения. Такое впечатление, что на этом месте обычное ОЗУ. . . 

Выполнение операции записи после холодного ре-старта исключено ? (те данные в EEPROM были записаны корректно, но при холодном рестарте выполнился код записи, и в EEPROM записался мусор). 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 hours ago, k155la3 said:

Выполнение операции записи после холодного ре-старта исключено ? (те данные в EEPROM были записаны корректно, но при холодном рестарте выполнился код записи, и в EEPROM записался мусор). 

Исключено. При старте происходит проверка контрольных сумм каждой из копий таблицы на соответствие. При несовпадении контрольной суммы одной из копий она автоматически восстанавливается из второй целой копии. При несовпадении контрольных сумм обеих копий таблицы они прописываются по умолчанию, естественно с защитой каждой контрольной суммой.

14 hours ago, k155la3 said:

1. устанавливаем 2. затираем (?)

Может так и надо. Но как-то "не очень" выглядит, ни таймаутов, ни проверок.

могобыть 

2.   IWDG_KR |=IWDG_KEY_ENABLE;

 

ps пардон, ошипся, Key Register.

Текст настройки IWDG чистая формальность, поскольку я записываю в регистры настройки величины которые там и так устанавливаются по умолчанию после включения питания. Запись в регистр IWDG_KR согласно документации производится исключительно в виде байта, а не отдельных бит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...