[an error occurred while processing this directive]
Посмотреть inavr.h и (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Codavr 25 января 2005 г. 13:58
В ответ на: Народ кто по С на иаре писал свой бут лоадер подскажите с чего начать отправлено kostofey 25 января 2005 г. 12:25

#include
#include

//определения типов
typedef unsigned char BYTE;
typedef unsigned int WORD;

//МАКРОСЫ
#define BIT(x) ((BYTE)0x01 << (x))
#define SETB(addr,bits) ((addr) |= (bits))
#define CLEARB(addr,bits) ((addr) &= ~(bits))
#define INVERTB(addr,bits) ((addr) ^= (bits))
#define CHECKB(addr,bits) (((addr) & (bits))!=(BYTE)0x00)
#define _REENABLE_RWW() __DataToR0ByteToSPMCR_SPM(0x00,0x11) /* re-enable the RWW section */

//ожидаем завершения операций с EEPROM и Flash
// пока ждем, периодически разрешаем прерывания

void Wait_EESPM(void) @ NRWW_SEG
{
do{
__enable_interrupt();
__no_operation();
__no_operation();
__disable_interrupt();
}while(CHECKB(EECR, BIT(EEWE)) || CHECKB(SPMCR, BIT(SPMEN)));
}

BYTE FlashWrite(void) @ NRWW_SEG
{
BYTE i;
Wait_EESPM();
CLEARB(TIMSK, BIT(TOIE0)); //запрещаем Timer 0
_SPM_ERASE(MemoryAddr); //стираем страницу

for (i=0; i<64; i+=2){
Wait_EESPM();
_SPM_FILLTEMP(i, *(WORD*)(PageBuf+i)); //заполняем буфер
}

Wait_EESPM();
_SPM_PAGEWRITE(MemoryAddr); //записываем страницу
Wait_EESPM();
_REENABLE_RWW();
__enable_interrupt();
while(CHECKB(SPMCR, BIT(RWWSB))); //ожидаем разрешения RWW

SETB(TIMSK, BIT(TOIE0)); //разрешаем Timer 0

for (i=0; i<64; i++){
if(*(__flash BYTE*)(MemoryAddr+i) != *(PageBuf+i))
return 0x01;
}
return 0x00;
}

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru