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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Проблема в работе с flash-памятью меги, помогите новичку
Len_OK
сообщение Feb 15 2008, 09:10
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 50
Регистрация: 5-12-07
Пользователь №: 32 986



Ребята помогите разобраться с такой проблемкой!Мне нужно хранить во флеше данные и по мере их изменения перезаписывать.Написала процедурки, проверила размещение во флеше- всё верно, только после перезаписи подвисает
Go to the top of the page
 
+Quote Post
KRS
сообщение Feb 15 2008, 09:16
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



А eeprom не хватает?
Go to the top of the page
 
+Quote Post
Len_OK
сообщение Feb 15 2008, 09:30
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 50
Регистрация: 5-12-07
Пользователь №: 32 986



Цитата(KRS @ Feb 15 2008, 13:16) *
А eeprom не хватает?

Мне просто поставлено задание, записать во флеш!Потому что из еепром слетали данные
Go to the top of the page
 
+Quote Post
bloodden
сообщение Feb 15 2008, 09:35
Сообщение #4


Бывалый
***

Группа: Validating
Сообщений: 375
Регистрация: 19-10-05
Из: Kiev, UA
Пользователь №: 9 853



Писать во флеш можно ТОЛЬКО из области бутлоадера.


--------------------
Заходите кому надо на мой сайт
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 15 2008, 09:37
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Len_OK @ Feb 15 2008, 12:30) *
Мне просто поставлено задание, записать во флеш!Потому что из еепром слетали данные


Как часто надо обновлять данные?

Анатолий.
Go to the top of the page
 
+Quote Post
KRS
сообщение Feb 15 2008, 09:41
Сообщение #6


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Len_OK @ Feb 15 2008, 12:30) *
Мне просто поставлено задание, записать во флеш!Потому что из еепром слетали данные

Обычно это происходит если некорректно написаны функции записи (особенно если используются прерывания). Если контроллеры старые нельзя использховать 0 адрес.
А так что то мне лично не попадались случаи когда еепром слетал.
Когда флеш слетал попадались.
Go to the top of the page
 
+Quote Post
Len_OK
сообщение Feb 15 2008, 09:49
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 50
Регистрация: 5-12-07
Пользователь №: 32 986



Цитата(bloodden @ Feb 15 2008, 13:35) *
Писать во флеш можно ТОЛЬКО из области бутлоадера.

В том то и дело, что процедуры записи размещаю в бутлоадере.Во флешку данные записываются, но после я не могу ничего больше выполнить, на некоторое время МК подвисает.

Я работаю с ключами, мне нужно их считывать и запоминать.Как часто будут обновляться ключи-этого мне неизвестно.

2 KRS
Значит еепром надёжней чем флешка?


#pragma location = "loader"
void read_fash_to_temp_buf(unsigned char *temp_buf,unsigned char NumPage)
{
unsigned const char __flash *flash_adr;
unsigned char i;
flash_adr=&flash_buf_read[NumPage][0];
for(i=0;i<64;i++)
{
*temp_buf = __load_program_memory(flash_adr);
temp_buf++;
flash_adr++;
}
}


#pragma location = "loader"
void erase_flash_page(unsigned char NumPage)
{
unsigned const char __flash *flash_adr;
flash_adr=&flash_buf_read[NumPage][0];
_ENABLE_RWW_SECTION();
_WAIT_FOR_SPM();
while(EECR&(1<<1));
_PAGE_ERASE(flash_adr);
}

#pragma location = "loader"
void update_flash_page(unsigned char *temp_buf,unsigned char NumPage)

{
unsigned const char __flash *flash_adr;
unsigned char Buf_Adres = 0;
flash_adr=&flash_buf_read[NumPage][0];

do
{ fl_data=*(temp_buf+Buf_Adres+1);
fl_data<<=8;
fl_data|=*(temp_buf+Buf_Adres);
_FILL_TEMP_WORD(Buf_Adres,fl_data);
Buf_Adres+=2;
} while (Buf_Adres<64);


_WAIT_FOR_SPM();
while(EECR&(1<<1));
_PAGE_ERASE(flash_adr);
_WAIT_FOR_SPM();
_PAGE_WRITE(flash_adr);
}


Вот так я работаю с флешкой, может написано что-то криво?Просто это первый мой прект..может чего и не так пишу
Go to the top of the page
 
+Quote Post
GDI
сообщение Feb 15 2008, 09:52
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



У еепром больше циклов перезаписи 100000 против 10000 у флешь, еепром может "слететь" если производится запись и в этот момент выключается питание, но это решается включеним BOD, и еще, у атмела есть апноут на тему хранения во флеши переменных.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
KRS
сообщение Feb 15 2008, 10:08
Сообщение #9


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Len_OK @ Feb 15 2008, 12:44) *
2 KRS
Значит еепром надёжней чем флешка?

Да тут много факторов.
У Атмела флешь может слетать если супервизора на ресете нет и начнет глючить питание или помехи путсить по питанию и ресету. Бывало такое.

В еепром циклов записи намного больше.

Цитата(Len_OK @ Feb 15 2008, 12:44) *
В том то и дело, что процедуры записи размещаю в бутлоадере.Во флешку данные записываются, но после я не могу ничего больше выполнить, на некоторое время МК подвисает.

А вы не забвываете потом разрешить RWW секцию
Код
;re-enable the RWW section
ldi spmcsrval, (1<<RWWSRE) | (1<<SPMEN)
call Do_spm


Но у меня в коде бутлоадера стоит вообще в цикле пока не разрешится.
Почему я так делал не помню.
Код
; enable RWW section
Enable:
      ldi spmcrval, (1<<RWWSRE) | (1<<SPMEN)
      rcall Do_spm
#ifdef SPMCRN
      in r16, SPMCR
#else
      lds r16, SPMCSR
#endif      
      sbrc r16, RWWSB
      rjmp Enable




Цитата(Len_OK @ Feb 15 2008, 12:49) *
#pragma location = "loader"
void erase_flash_page(unsigned char NumPage)
{
unsigned const char __flash *flash_adr;
flash_adr=&flash_buf_read[NumPage][0];
_ENABLE_RWW_SECTION();
_WAIT_FOR_SPM();
while(EECR&(1<<1));
_PAGE_ERASE(flash_adr);
}

#pragma location = "loader"
void update_flash_page(unsigned char *temp_buf,unsigned char NumPage)

{
unsigned const char __flash *flash_adr;
unsigned char Buf_Adres = 0;
flash_adr=&flash_buf_read[NumPage][0];

do
{ fl_data=*(temp_buf+Buf_Adres+1);
fl_data<<=8;
fl_data|=*(temp_buf+Buf_Adres);
_FILL_TEMP_WORD(Buf_Adres,fl_data);
Buf_Adres+=2;
} while (Buf_Adres<64);
_WAIT_FOR_SPM();
while(EECR&(1<<1));
_PAGE_ERASE(flash_adr);
_WAIT_FOR_SPM();
_PAGE_WRITE(flash_adr);
}



У меня _ENABLE_RWW_SECTION();
стоит в цикле только в конце после стирания и записи

Код
PUBLIC PageWrite

PageWrite:
; page erase
      ldi spmcrval, (1<<PGERS) | (1<<SPMEN)
      rcall Do_spm

; fill page buffer
      ldi ......
      ldi ......
Fill:
      ld r0, ..........
              ld r1, ...........
      ldi spmcrval, (1<<SPMEN)
      rcall Do_spm
              ..........
      subi ...., 2
      brne Fill

; write page
              ..........
      ldi spmcrval, (1<<PGWRT) | (1<<SPMEN)
      rcall Do_spm
      
; enable RWW section
Enable:
      ldi spmcrval, (1<<RWWSRE) | (1<<SPMEN)
      rcall Do_spm
#ifdef SPMCRN
      in r16, SPMCR
#else
      lds r16, SPMCSR
#endif      
      sbrc r16, RWWSB
      rjmp Enable
      
; check porgrammed page
      .................................
      ret


Сообщение отредактировал KRS - Feb 15 2008, 10:13
Go to the top of the page
 
+Quote Post
Igor26
сообщение Feb 15 2008, 10:18
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



А на какое время подвисает? Не забывайте, что для записи блока во FLASH нужно время. Если пишите много блоков подряд, то и время "подвисания" существенно возрастет.
Go to the top of the page
 
+Quote Post
Len_OK
сообщение Feb 15 2008, 11:00
Сообщение #11


Участник
*

Группа: Новичок
Сообщений: 50
Регистрация: 5-12-07
Пользователь №: 32 986



я по времени не проверяла, но прилично, быть может даже на несколько минут, после чего я всё же вычитываю из флешки данные
Go to the top of the page
 
+Quote Post
KRS
сообщение Feb 15 2008, 11:38
Сообщение #12


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Len_OK @ Feb 15 2008, 14:00) *
я по времени не проверяла, но прилично, быть может даже на несколько минут, после чего я всё же вычитываю из флешки данные

А исходники
_PAGE_WRITE()
_WAIT_FOR_SPM()
....
Скорее всего у вас после записи страницы нет еще одного вызова _ENABLE_RWW_SECTION()
Go to the top of the page
 
+Quote Post
Igor26
сообщение Feb 15 2008, 12:28
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Цитата(Len_OK @ Feb 15 2008, 14:00) *
но прилично, быть может даже на несколько минут

Да многовато.
А как происходит возврат из секции бутлоадера? Т.е. туда ли передается управление по окончании работы подпрограмм в секции бутлоадера?

2KRS
Цитата
_PAGE_WRITE()
_WAIT_FOR_SPM()


#define _WAIT_FOR_SPM() while( SPMCR_REG & (1<<SPMEN) );

#define _PAGE_WRITE(addr) __AddrToZByteToSPMCR_SPM( (void __flash *) (addr), 0x05 )
Это ИАРовские штучки и взяты из апнота AVR109, как я понял.
Go to the top of the page
 
+Quote Post
KRS
сообщение Feb 15 2008, 13:34
Сообщение #14


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Igor26 @ Feb 15 2008, 15:28) *
2KRS
#define _WAIT_FOR_SPM() while( SPMCR_REG & (1<<SPMEN) );

#define _PAGE_WRITE(addr) __AddrToZByteToSPMCR_SPM( (void __flash *) (addr), 0x05 )
Это ИАРовские штучки и взяты из апнота AVR109, как я понял.

А ну тогда точно после записи страницы не хватает
_ENABLE_RWW_SECTION();
_WAIT_FOR_SPM();
Go to the top of the page
 
+Quote Post
Igor26
сообщение Feb 15 2008, 15:34
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Цитата(KRS @ Feb 15 2008, 16:34) *
А ну тогда точно после записи страницы не хватает
_ENABLE_RWW_SECTION();
_WAIT_FOR_SPM();

Мой фрагмент записи блока выглятит так:
//*******************************
//*Запись блока во Flash-память *
//*******************************
void SaveBlockFlash(unsigned int NumberBlock)
{
__disable_interrupt();
.
.
.
.

#pragma diag_suppress=Pe1053 // Suppress warning for conversion from long-type address to flash ptr.
_PAGE_WRITE(TempAdress);
#pragma diag_default=Pe1053 // Back to default.
_WAIT_FOR_SPM();
_ENABLE_RWW_SECTION();
__enable_interrupt();
}
всё по AVR109! Служит верой и правдой.
Go to the top of the page
 
+Quote Post

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

 


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


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