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

 
 
> И снова самопрограммирование Mega88, Нужно хранить и переписывать параметры во флэш.
EXeGLuMATOR
сообщение Jul 22 2013, 17:39
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Итак.
Имеется проектик на CodeVisionAVR, Mega88. Достался в наследство, портировать в другую среду категорически ломает, поэтому необходимо выжать максимум из того, что есть. Имеются некоторые параметры конфигурации, которые хотелось-бы хранить во флэш. Епром не подходит, поскольку имеется высокая вероятность его "слета" - питание батарейное и пользователи совсем не парятся с аккуратностью.
Проблема в следующем - памяти впритык,осталось около 256байт, т.е. хотелось бы использовать самые верхние адреса флэш, скажем с адреса 0xFE0. Но эта область уже вроде как определена под бутлоадер.
Вопрос: можно ли из своего кода сохранить параметры в этой области? Или это не возможно в принципе?
Пробовал писать в эту область - результат - 0. Впрочем как и в любую другую, даже в области памяти программ. Код для этого должен лежать в области бутлоадера? Если так - как затолкать туда функции для работы с флэш средствами CodeVision, чтобы основной код лежал в программной области, а нужное - в буте?

Еще вопрос. Пытаюсь прочитать те самые параметры конфигурации, да в прочем любые данные из флэш вот так:
Код
base_adress = (*(( unsigned char flash*) 0x0600));
результат - какая-то фигня. Хотя по смыслу вроде правльно. Адрес выбран произвольно и там другие значения.

Разместить изначально константы во флэш по нужным адресам CodeVision не дает.
Фузы - никаких ограничений нет.

Кто что подскажет?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Jul 22 2013, 18:23
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(EXeGLuMATOR @ Jul 22 2013, 21:39) *
Имеется проектик на CodeVisionAVR, Mega88. Достался в наследство, портировать в другую среду категорически ломает, поэтому необходимо выжать максимум из того, что есть.

Тогда почему бы вам не заменить Мегу88 на Мегу168 или Мегу328? У них кортуса и цоколевки одинаковые, а памяти больше. Прошивку, конечно, придется перекомпилировать, но у вас же код на С, а не на ассемблере, значит, проблем быть не должно.

Цитата(EXeGLuMATOR @ Jul 22 2013, 21:39) *
Имеются некоторые параметры конфигурации, которые хотелось-бы хранить во флэш. Епром не подходит, поскольку имеется высокая вероятность его "слета" - питание батарейное и пользователи совсем не парятся с аккуратностью.

Слёт флэш ничуть не лучше слёта епром sm.gif. Вряд ли в таких условиях запись во флеш будет надежнее.

Цитата(EXeGLuMATOR @ Jul 22 2013, 21:39) *
Проблема в следующем - памяти впритык,осталось около 256байт, т.е. хотелось бы использовать самые верхние адреса флэш, скажем с адреса 0xFE0. Но эта область уже вроде как определена под бутлоадер.
Вопрос: можно ли из своего кода сохранить параметры в этой области? Или это не возможно в принципе?
Пробовал писать в эту область - результат - 0. Впрочем как и в любую другую, даже в области памяти программ. Код для этого должен лежать в области бутлоадера? Если так - как затолкать туда функции для работы с флэш средствами CodeVision, чтобы основной код лежал в программной области, а нужное - в буте?

Возможно. Вот только я на IARе программирую и не на Меге88, а потому про CodeVision сказать не могу, но сама в таких случаях поступаю так. Т.е. пишу функцию копирования ОЗУ в ПЗУ и размещаю ее в BOOT-области (для последнего требуется указать pragma location):
Код
#pragma location="BOOT"
void PageLoader( unsigned int flash_address, unsigned char *buffer)
{ int i;
  _WAIT_FOR_SPM();
  _SPM_ERASE( flash_address);
  _WAIT_FOR_SPM();
  _ENABLE_RWW_SECTION();
  for( i=0; i < 128; i++)  _SPM_FILLTEMP( i << 1, ((int*)buffer)[i]);
  _WAIT_FOR_SPM();
  _SPM_PAGEWRITE( flash_address);
  _WAIT_FOR_SPM();
  _ENABLE_RWW_SECTION();
}

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

Цитата(EXeGLuMATOR @ Jul 22 2013, 21:39) *
Еще вопрос. Пытаюсь прочитать те самые параметры конфигурации, да в прочем любые данные из флэш вот так:
Код
base_adress = (*(( unsigned char flash*) 0x0600));
результат - какая-то фигня. Хотя по смыслу вроде правльно. Адрес выбран произвольно и там другие значения.

Чтение флэш идет тоже по словному адресу, а не байтному. Хотя компиляторы уже потом могут вырезать нужный байт. Но это где как.
Число в адрес преобразуется напрямую:
unsigned char flash *base_adress = (unsigned char flash*)0x0600;
Только, думаю, что такого рода адрес вам вряд ли понадобится.
Go to the top of the page
 
+Quote Post



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

 


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


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