реклама на сайте
подробности

 
 
> Flash в C8051F060 как воспользоваться ?!, HELP !!!
Tverdomer
сообщение Oct 5 2006, 12:06
Сообщение #1





Группа: Новичок
Сообщений: 2
Регистрация: 5-10-06
Пользователь №: 21 014



Как воспользоваться флэшью камня C8051F060 (или похожего)для хранения собственных настроек.
Компилятор - Keil. Нужно очень срочно (неделю назад). ПОМОГИТЕ !!! help.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Волощенко
сообщение Oct 5 2006, 13:07
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377



Я использую С8051F12x, но везде должно быть подобно.
Нужно описать в С три основные функции (они все рабочие, взяты из App, комментарии оригинальные):
//-----------------------------------------------------------------------------
void FLASH_ByteWrite (byte addr, byte b1)
{byte ps = SFRPAGE; // preserve SFRPAGE
bit EA_SAVE = EA; // preserve EA
char xdata * data pwrite; // FLASH write pointer
EA = 0; // disable interrupts
pwrite=addr;
SFRPAGE = LEGACY_PAGE;
FLSCL |= 0x01; // enable FLASH writes/erases
PSCTL |= 0x01; // PSWE = 1
PSCTL |= 0x04; // set SFLE
RSTSRC = 0x02; // enable VDDMON as reset source
*pwrite = b1; // write the byte
PSCTL &= ~0x04; // clear SFLE
PSCTL &= ~0x01; // PSWE = 0
FLSCL &= ~0x01; // disable FLASH writes/erases
SFRPAGE = ps; // restore SFRPAGE
EA = EA_SAVE; // restore interrupts
}
//-----------------------------------------------------------------------------
unsigned char FLASH_ByteRead (byte addr)
{byte ps = SFRPAGE; // preserve SFRPAGE
bit EA_SAVE = EA; // preserve EA
char code * data pread; // FLASH read pointer
byte b;
EA = 0; // disable interrupts
pread=addr;
SFRPAGE = LEGACY_PAGE;
PSCTL |= 0x04; // set SFLE
b = *pread; // read the byte
PSCTL &= ~0x04; // clear SFLE
SFRPAGE = ps; // restore SFRPAGE
EA = EA_SAVE; // restore interrupts
return b;
}
//-----------------------------------------------------------------------------
void FLASH_PageErase (byte addr)
{char SFRPAGE_SAVE = SFRPAGE; // preserve SFRPAGE
bit EA_SAVE = EA; // preserve EA
char xdata * data pwrite; // FLASH write pointer
EA = 0; // disable interrupts
SFRPAGE = LEGACY_PAGE;
pwrite=addr;
FLSCL |= 0x01; // enable FLASH writes/erases
PSCTL |= 0x03; // PSWE = 1; PSEE = 1
PSCTL |= 0x04; // set SFLE
RSTSRC = 0x02; // enable VDDMON as reset source
*pwrite = 0; // initiate page erase
PSCTL &= ~0x04; // clear SFLE
PSCTL &= ~0x03; // PSWE = 0; PSEE = 0
FLSCL &= ~0x01; // disable FLASH writes/erases
SFRPAGE = SFRPAGE_SAVE; // restore SFRPAGE
EA = EA_SAVE; // restore interrupts
}
//-----------------------------------------------------------------------------

Далее в основной программе описать константы (например. константы в 16 бит):
#define Config_Add 0x80 //Start config.array
#define w_RxCTL 0x00 //Config_RxCTL
#define w_TestCTL 0x02 //Config_TestCTL

Потом записываем из какого-то буфера Ri[...] во Flash (с предварительным стиранием):
FLASH_PageErase(Config_Add);
FLASH_ByteWrite((Config_Add+w_RxCTL+1), Ri[1]);//msb
FLASH_ByteWrite((Config_Add+w_RxCTL), Ri[2]);
FLASH_ByteWrite((Config_Add+w_TestCTL+1),Ri[3]);//msb
FLASH_ByteWrite((Config_Add+w_TestCTL), Ri[4]);

А теперь считываем из Flash константы в 16 бит ():
a=FLASH_ByteRead(Config_Add+w_RxCTL+1);w=a<<8;
a=FLASH_ByteRead(Config_Add+w_RxCTL);w+=a;
...............
a=FLASH_ByteRead(Config_Add+w_TestCTL+1);w=a<<8;
a=FLASH_ByteRead(Config_Add+w_TestCTL); w+=a;

Примеры взяты кусками из программы... В общем, удачи!
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 00:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01395 секунд с 7
ELECTRONIX ©2004-2016