Я где-то читал, что во время записи в eeprom нужно отключать все прерывания, иначе, если во время операции записи в eeprom возникнет какое-либо прерывание, то возможно искажение записанной инфы. Как на самом деле?
На самом деле прерывания надо запрещать только перед вводом "магической" последовательности в регистр EECR:
сохранить флаг I
запретить прерывания (i.e. обнулить флаг I)
установить в EECR бит EEMWE (master write enable)
установить в EECR бит EEWE (write enable)
восстановить флаг I
В противном случае запись может просто не начаться.
Цитата
они есть? Я что-то не нашёл ни в справочной IAR и ни в справке по библиотеке DLIB. Где искать?
В IAR их нет, потому что IAR предоставляет возможность работать с адресным пространством eeprom как с обычной памятью:
Код
__eeprom char x;
__eeprom char y;
if (x)
{
y = x;
}
__eeprom char y;
if (x)
{
y = x;
}
следовательно можно пользоваться просто указателями
Код
typedef __eeprom char EEPROM_CHAR;
typedef EEPROM_CHAR *PEEPROM_CHAR;
typedef EEPROM_CHAR *PEEPROM_CHAR;
Пример записи 20 байт непосредственно в eeprom начиная с адреса 0x10, используя возможности IAR'a:
Код
void ee_test(void)
{
PEEPROM_CHAR pChar = (PEEPROM_CHAR)0x10;
int i;
for (i = 0; i < 20; i++)
*pChar++ = (char)i;
}
{
PEEPROM_CHAR pChar = (PEEPROM_CHAR)0x10;
int i;
for (i = 0; i < 20; i++)
*pChar++ = (char)i;
}