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

 
 
 
Reply to this topicStart new topic
> 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
elserge
сообщение Oct 5 2006, 12:40
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 41
Регистрация: 29-04-05
Из: Брест
Пользователь №: 4 612



Правда на английском...
Прикрепленные файлы
Прикрепленный файл  AN009.pdf ( 70.27 килобайт ) Кол-во скачиваний: 79
 
Go to the top of the page
 
+Quote Post
Волощенко
сообщение Oct 5 2006, 13:07
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 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
Tverdomer
сообщение Oct 5 2006, 13:45
Сообщение #4





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



ОГРОМНОЕ спасибо!!! Получается. Все оказывается просто когда умные люди направят
Go to the top of the page
 
+Quote Post
kolyan_olvs
сообщение Mar 19 2007, 11:59
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 3-04-06
Пользователь №: 15 732



Прошу прощения, но у меня не получается, хотя делаю все как тут написано
(видимо hands.dll не той версии) ))
Есть вопрос: как надо описать переменные Ri[], a, w в этом примере? как-то по особому, или просто
например: char Ri ?
Еще вопрос - надо ли как-то настраивать карту памяти проца (имеется в виду настройки в Uvision)
диапазоны code, xdata, pdata, idata..

Ситуация у меня просто следущая: если просто в лоб создать проект и закопипастить выложенный здесь пример (ну с необходимыми добавками, конечно), то прога читает прекрасно, а вот стирать или писать не хотит...
PS^ могу выложить весь проект, если надо..
PPS^ просьба помочь как можно быстрее - сроки ужас как горят, сдать надо было вчера ))))
Go to the top of the page
 
+Quote Post
Волощенко
сообщение Mar 19 2007, 15:40
Сообщение #6


Местный
***

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



Цитата(kolyan_olvs @ Mar 19 2007, 12:59) *
Есть вопрос: как надо описать переменные Ri[], a, w в этом примере? как-то по особому, или просто
например: char Ri ?
//Здесь каждый городит по своему, я же в самом начале описал типы переменных так:
typedef unsigned char byte;
typedef unsigned int word;
//Затем все переменные определяю через эти самые типы, например:
byte a; word w; //temp
xdata byte Ri[16], Ro[60]; //Input and output array from RS-232

Цитата(kolyan_olvs @ Mar 19 2007, 12:59) *
Еще вопрос - надо ли как-то настраивать карту памяти проца (имеется в виду настройки в Uvision)
диапазоны code, xdata, pdata, idata..
Думаю, не надо, достаточно явно по тексту программы описать переменные, где их нужно разместить. Для неявного определения места размещения переменных (если это необходимо вопреки задаваемому по умолчанию), нужно задать Memory model, например small (чтобы переменные, без дополнительного определения, размещались в data или же как-то иначе), это делается в опции Project->Options for Target.

//Ниже примеры размещения переменных:
code char* code Prog_ID = {__DATE__}; //Здесь для code во Flash в виде ASCII-кода версия-дата программы
//Ro[0]=Prog_ID[4]; Ro[1]=Prog_ID[5]; //Data
//Ro[2]=Prog_ID[3];
//Ro[3]=Prog_ID[0]; Ro[4]=Prog_ID[1];Ro[5]=Prog_ID[2]; //Month
//Ro[6]=Prog_ID[6];
//Ro[7]=Prog_ID[7]; Ro[8]=Prog_ID[8]; Ro[9]=Prog_ID[9]; Ro[10]=Prog_ID[10]; //Year
//Все считывается в выходной массив Ro для последующей передачи через прерывания по RS-232

sbit S3 = P3^3; //Это биты S3, S4 порта Р3. в поле sbit
sbit S4 = P3^4; //

bdata Flags; //Это флажки-признаки в поле битов bdata, сведенные к одному байту Flags
sbit MainLoop = Flags^0; //Flag for Main loop
sbit fPcmEth0 = Flags^1; //Flag PcmEth0(0-buffer EthPcm0, 1-buffer EthPcm1,)
sbit fPcmEth1 = Flags^2; //Flag PcmEth1
sbit fEthPcm = Flags^3; //Flag PcmEth(1-Run,0-Stop)
sbit fEthPcm0 = Flags^4; //Flag PcmEth0
sbit BackPressure = Flags^5; //BackPressure
sbit K_IND_b0 = Flags^6; //K_IND current
sbit K_IND_b1 = Flags^7; //K_IND previous

*((char pdata *)Rx)=*(pEthPcm++); //Это обращение к переферийному оборудованию
// в пространстве адресов pdata, где константа Rx определена, например так:
#define Rx 0x00 //Rx for accesing for the RS Xilinx

idata byte Ar[32] //Это переменные в idata, индексной области СОЗУ.
byte rs; //В области data
xdata byte Ri[16], Ro[60]; //Block for RS-232 communication в xdata (или большой внутренней памяти)
xdata byte RiT,RoT; //
word RsI, RsO, RsN; //
byte FlagTIMER2; //

Примеры иногда предпочтительней теории...(хотя опять же это спорно...). В этом плане удачно представлен материал в http://www.onembedding.com/

Цитата(kolyan_olvs @ Mar 19 2007, 12:59) *
Ситуация у меня просто следущая: если просто в лоб создать проект и закопипастить выложенный здесь пример (ну с необходимыми добавками, конечно), то прога читает прекрасно, а вот стирать или писать не хотит...
????
Go to the top of the page
 
+Quote Post
kolyan_olvs
сообщение Mar 19 2007, 17:39
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 3-04-06
Пользователь №: 15 732



Спасибо за обстоятельный ответ
Частично проблему решил.. пишет, читает, стирает ))
Остался один ньюанс... Я не совсем понял процедуру стирания, если можно - разъясните.
Стирание происходит всего пространства или начиная с указанного адреса и до победы, или как-то еще..??
То есть собственно хочу узнать как мне стереть только N байт?
Go to the top of the page
 
+Quote Post
Волощенко
сообщение Mar 19 2007, 18:53
Сообщение #8


Местный
***

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



Цитата(kolyan_olvs @ Mar 19 2007, 18:39) *
... Я не совсем понял процедуру стирания, если можно - разъясните.
Стирание происходит всего пространства или начиная с указанного адреса и до победы, или как-то еще..??
То есть собственно хочу узнать как мне стереть только N байт?
Посмотрите описание на русском для C8051F064, что в F60-67.zip, а он находится в http://www.dito97.narod.ru/document.htm.
Там на стр.177 есть ответы на Ваши вопросы. Удачи.
Go to the top of the page
 
+Quote Post
AlHakim
сообщение Mar 20 2007, 08:14
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 7-02-05
Из: Уфа
Пользователь №: 2 474



может быть послужит темой для размышления
я так же недавно столкнулся с необходимостью писать во флеш небольшого куска данных, но поскольку кусок данных маленький, а кол-во перезаписи во флеш не слишком большие, то я организовал циклическую запись данных (опредили их структурой определенного размера + CRC) и записывал во флеш, потом по включению питания анализирую всю флеш на наличие последней достоверной записи, и так далее. несложно в реализации и запас по перезаписи увеличивается...

Сообщение отредактировал AlHakim - Mar 20 2007, 08:16
Go to the top of the page
 
+Quote Post
AndreyS
сообщение Mar 20 2007, 20:17
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276



Цитата(AlHakim @ Mar 20 2007, 08:14) *
может быть послужит темой для размышления
я так же недавно столкнулся с необходимостью писать во флеш небольшого куска данных, но поскольку кусок данных маленький, а кол-во перезаписи во флеш не слишком большие, то я организовал циклическую запись данных (опредили их структурой определенного размера + CRC) и записывал во флеш, потом по включению питания анализирую всю флеш на наличие последней достоверной записи, и так далее. несложно в реализации и запас по перезаписи увеличивается...



Добрый день.

Глупость какая. Вы же все равно очищаете сектор и его обновляете. Я понимаю если бы вы секторами писали тогда да. А если данные несколько раз укладываются в пределе одного сектора, то ничего не уменьшаете. Другое дело если это не FLASH а EEPROM.

Удачи


--------------------
Удачи.
Go to the top of the page
 
+Quote Post
AlHakim
сообщение Mar 20 2007, 22:23
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 7-02-05
Из: Уфа
Пользователь №: 2 474



Цитата(AndreyS @ Mar 20 2007, 22:17) *
Добрый день.

Глупость какая. Вы же все равно очищаете сектор и его обновляете. Я понимаю если бы вы секторами писали тогда да. А если данные несколько раз укладываются в пределе одного сектора, то ничего не уменьшаете. Другое дело если это не FLASH а EEPROM.

ну почему же сразу вот так и осуждать..
данные действительно укладывались по нескольок раз (если быть точнее то 32 раза) в перделах сектор.
Уменьшает, как я уже и сказал кол-во перезаписи флеш (равномерное заполнеине сектора, данными). хотя заявленный силабсом кол-во перезаписи 100 тыс вроде бы и не так уж и мало...
Go to the top of the page
 
+Quote Post
AndreyS
сообщение Mar 23 2007, 17:46
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276



Цитата(AlHakim @ Mar 20 2007, 22:23) *
ну почему же сразу вот так и осуждать..
данные действительно укладывались по нескольок раз (если быть точнее то 32 раза) в перделах сектор.
Уменьшает, как я уже и сказал кол-во перезаписи флеш (равномерное заполнеине сектора, данными). хотя заявленный силабсом кол-во перезаписи 100 тыс вроде бы и не так уж и мало...



Добрый день.

Т.е. (если я правильно вас понял) вы записываете данные в ОЗУ пока не достигните конца сектора и только послен этого скидываете данные во флешь. Так?? Тогда конечно сокращаете количество циклов перезаписи. Согласен. Правда возникает вопрос о потери данных в случае выключения питания, но думаю питание вы контроолируете и у вас есть запас по времени.


--------------------
Удачи.
Go to the top of the page
 
+Quote Post

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

 


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


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