Вячик13 0 9 июня, 2020 Опубликовано 9 июня, 2020 · Жалоба Имеется кристалл 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 } Заранее благодарю за любые подсказки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 9 июня, 2020 Опубликовано 9 июня, 2020 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 9 июня, 2020 Опубликовано 9 июня, 2020 · Жалоба 7 hours ago, Вячик13 said: . . . .После выключения и включения питания по адресу EEPROM произвольные значения. Такое впечатление, что на этом месте обычное ОЗУ. . . Выполнение операции записи после холодного ре-старта исключено ? (те данные в EEPROM были записаны корректно, но при холодном рестарте выполнился код записи, и в EEPROM записался мусор). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Вячик13 0 10 июня, 2020 Опубликовано 10 июня, 2020 · Жалоба 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 согласно документации производится исключительно в виде байта, а не отдельных бит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться