
- •4. Функции для 5-цифрового жкд
- •5. Функции для светодиода
- •6. Функция для задержки времени
- •7. Функции таймера
- •Функции для работы с простым таймером
- •Функции для стоповых таймеров
- •Функции для таймеров с обратным счетом
- •Функции для пользовательских таймеров
- •Пример 1. Демонстрация использования таймерных функций для мигания жкд через каждые 0.5 сек.
- •Использование сторожевого таймера
- •8. Использование флэш-памяти контроллера I-7188ead
- •9. Функции для сохранения данных в eeprom
- •10. Функции для сохранения данных в nvram
- •8. Служебные функции
Использование сторожевого таймера
Сторожевой таймер контроллера I-7188 активизирован и процедура обработки прерывания системного таймера его обнуляет. Сторожевой таймер по умолчанию установлен на 1.6 секунд.
Когда пользовательская программа вызывает функцию EnableWDT, ПОП системного таймера перестает обнулять сторожевой таймер и пользовательская программа должна вызывать функцию RefreashWDT, до того пока таймер не досчитал до 1.6 секунд. В противном случае операционная система контроллера будет автоматически перезагружаться.
После вызова функции DisableWDT, процедура обработки прерывания системного таймера опять начинает обнулять сторожевой таймер и поэтому, пользовательская программа уже может не вызывать функцию RefreashWDT.
Функция IsResetByWatchDogTimer используется для проверки, модуль 7188 перезагружен или нет с помощью сторожевого таймера. Эта функция должна применяться в начале программы.
Пример.
main( )
{
if (IsResetByWatchDogTimer( ))
{
//Здесь код для контроля системы
}
int quit =0;
EnableWDT( );
while (!quit)
{
RefreachWDT( );
User_function( );
}
DisableWDT( );
}
8. Использование флэш-памяти контроллера I-7188ead
Контроллер I-7188EAD имеет 512 Кб флэш-памяти, который используется как жесткий диск. Здесь содержится мини BIOS, MiniOS7 и пользовательские программы. MiniOS7 использует последние 64 Кб, а остальная часть памяти используется для сохранения пользовательских программ и данных.
Подготовка к записи в флэш-память
Пользовательская программа также может записывать данных в флэш-память. Флэш-память может быть записан, только путем изменения бита от 1 на 0, и не может, записан путем изменения бита от 0 на 1. Единственный способ изменения бита от 0 на 1 является стирание флэш-памяти вызовом функции
int FlashErase(unsigned seg)
При этом на все ячейки памяти сектора будут записаны числа 0хFF (все биты равны 1). Параметр seg может принимать значения
0x8000, 0x9000, 0xA000, 0xB000, 0xC000, 0xD000, 0xE000
Сегмент 0хF000 используется операционной системой, при указании этого сегмента при вызове функции FlashErase стирание этого сегмента не будет происходить.
Запись данных в флэш-память
Для записи данных во флэш-память, пользователь должен вызывать функцию int FlashWrite(unsigned int seg,
unsigned int offset, char data);
Входные параметры функции:
seg – указывает сектор флзш-памяти и может принимать такие же значения, что и функция FlashErase .
offset - задает смещение внутри сектора. Может принимать значения от 0 до 65535.
data – определяет записываемый байт (от 0 до 255).
При успешной записи функция возвращает 0.
Как было сказано, значение бита флэш-памяти может быть изменен только от 1 на 0. Таким образом, если значение байта равен 0xFF, то можно записать в этот байт любые данные. Однако, если значение байт а равен 0х01, то вы можете изменить его только на 0х00.
Функция FlashWrite не контролирует запись. Но если вы изменяете бит от 0 на 1, то эта функция возвращает ошибку TimeOut (-5). После вызова функции FlashErase вы опять можете записывать любые данные.
Чтение данных из флэш-памяти
Для чтения данных из флэш-памяти следует вызывать функцию:
int FlashRead(unsigned int seg, unsigned int offset)
Первый параметр указывает номер сегмента, а второй параметр смещение внутри сегмента. Функция возвращает значение указанного байта.
Для прямой адресации байта (Сегмент:Смещение) можно использовать дальний указатель адреса ячейки памяти. Для этого следует использовать макроподстановку MK_FP. Например,
char far *ByteData, databyte; int far *IntData, dataint; long far *LongData, datalong; ByteData=(char far *)MK_FP(segment, offset); databyte=*ByteData;
IntData=(int far *)MK_FP(segment, offset); dataint=*IntData;
LongData=(long far *)MK_FP(segment, offset); datalong=*LongData;
Пример. Запись числа типа integer на флэш-память на сегмент D000 со смещением 0х1234.
int data = 0xAA55, data2;
char *dataptr;
int *dataptr2;
dataptr = (char*) &data;
//Записываем побайтно
FlashWrite(0xd000, 0x1234, *dataptr++);
FlashWrite(0xd000, 0х1235, *dataptr);
//Чтение данных из флэш памяти
dataptr = (char*) &data2;
*dataptr = FlashRead (0xd000, 0x1234);
*(dataptr+1) = FlashRead(0xd000, 0x1235);
//Чтение данных путем прямой адресации
dataptr2 = (int far*) _MK_FP(0xd000, 01234);
data2 = *dataptr2;