Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2020-окт-29 01:16

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 19 сообщений ]  На страницу 1 2 »
Автор Сообщение
СообщениеДобавлено: 2015-июл-01 15:30 
Не в сети

Зарегистрирован: 2015-мар-30 15:03
Сообщения: 15
Здравствуйте!
Вопрос о сохранении промежуточных данных во внутренней флешке микроконтроллера на время выключения питания.

Проштудировал гл.8 спецификации.
Не знаю, как определить переменную таким образом, чтобы она оказалась во флешке.

Не понятно также, как Keil распределяет память - в программе явных директив задания базовых адресов нет. Базовые адреса использует загрузчик - не так ли? Для него на страничках Project-Options for Target... можно задать указанные адреса.
А как задать их в программе? Или существует более простой способ определения переменной во флешке?

Благодарю.


Вернуться к началу
СообщениеДобавлено: 2015-июл-01 17:00 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 548
Ручками читать/писать флеш. Keil тут совершенно не поможет. Ф-ции чтения-записи флеша должны жить в ОЗУ. Пример работы с флешем есть и на форуме и в SPL.


Вернуться к началу
СообщениеДобавлено: 2015-июл-02 09:46 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 502
Цитата:
Или существует более простой способ определения переменной во флешке?
Переменная не может жить во флеше, поскольку переменная должна быть модифицируемой в любой момент времени.
Во флеше можно разместить константы(которые могут быть модифицированы с помощью дополнительных функций стирания записи).
Если нужно разместить переменную по конкретному адресу (ну очень хочется) то используйте директиву
__attribute__ (at()) Подробности в справке Кейл

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
СообщениеДобавлено: 2015-июл-03 16:16 
Не в сети

Зарегистрирован: 2015-мар-30 15:03
Сообщения: 15
Благодарю!
Наверное, плохо описал задачу.
Мне требуется сохранять данные на время, пока питание на плате будет отключено.
Данных немного (десяток)

Из рекомендованного понял, что придется для записи нескольких слов (ячеек) сначала считать содержимое целого сектора, затем изменить в ОЗУ значения нескольких ячеек и, наконец, записать этот сектор на свое место. Эти сведения известны из школы.

Неясно другое.
Как заставить Keil выделить для размещения моих данных именно определенный сектор?
Как в программе идентифицировать этот сектор?

Предложение поискать в справке Keil особенности работы с _attribute_(at) к успеху не привело - ничего подобного не нашел

Еще раз благодарю.


Вернуться к началу
СообщениеДобавлено: 2015-июл-05 17:42 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 548
Если верить "спецификации", то на борту ВЕ1 есть страница информационной памяти, см. п.10.2:
"В режиме программирования возможны следующие операции как с основной (бит IFREN = 0, регистр EEPROM_CON), так и с информационной (бит IFREN = 1)".
INFO это целых 4 сектора. Кейл про них знать ничего не знает, в том числе не умеет туда/оттуда писать/читать и тереть штатными средствами прошивки. Т.е. получается как бы внешняя флешка, но с доступом через (_!_). :)
Итого:
Руками реализуется чтение из INFO в RAM при старте и запись из RAM в INFO "по потребности". Кстати, в сектор можно дописывать (в чистые ячейки) по мере надобности, в т.ч. писать 0 в 1 в уже записанном слове. На ВЕ91/92 мы таким образом реализовывали подобие файловой системы - в голове сектора лежит битовая переменная хранящая карту записанных блоков в секторе. По исчерпанию сектора можно пользовать следующий, а использованный при желании стереть. Что полезно - отдельно сектор трётся быстрее, чем страница (4 сектора, стирание - последовательно).
Читать-писать INFO умеет фитоновский ChipProg (хм, а ВЕ1 может, что и не умеет, но можно попробовать уговорить "Фитон").
P.S. Обидно будет, если в ВЕ1 INFO таки нет :(.
P.P.S. Ещё надо помнить, что при записи флеша все прерывания должны быть запрещены. Клиническая смерть на несколько мс :(.


Вернуться к началу
СообщениеДобавлено: 2015-июл-06 08:38 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1528
Откуда: Тула
Цитата:
14.2 Регистры аварийного сохранения

Батарейный домен имеет 16 встроенных 32-разрядных регистров аварийного
сохранения. 16-тый регистр служит для хранения битов управления батарейным доменом,
оставшиеся 15 регистров могут быть использованы разработчиком программы.
...если для вас приемлема батарейка.

_________________
сочувствующий…


Вернуться к началу
СообщениеДобавлено: 2015-июл-06 11:04 
Не в сети

Зарегистрирован: 2015-мар-30 15:03
Сообщения: 15
Благодарю за советы.

О батарейном домене пока не думаю, ибо не известно, насколько долго будет отключаться питание.
Об информационной памяти - хочу сообщить результаты своих поисков.

В поставляемой фирмой Миландр библиотеке (SPL) имеется пример по работе с EEPROM.

В заготовках этого примера описаны действия:
- Стирание страницы основной памяти.
- Запись слов в эту страницу.
- Стирание страницы информационной памяти.
- Запись слов в эту страницу.

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

Однако остается ранее поставленный вопрос:

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

Другой вопрос связан с ребусом из спецификации (п.10.2.1)
Там написано:
При стирании информационной области, автоматически стирается и основная.

Это можно понять так:
после стирания страницы информационной памяти ничего не останется в основной,
т.е. информационную память вообще лучше не трогать?
В упомянутом примере об этом - ни слова.

Что же делать?
Может, лучше описано в документации по Cortex-M1 в продуктах инофирм?

Благодарю


Вернуться к началу
СообщениеДобавлено: 2015-июл-06 11:19 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 748
Откуда: г. Санкт-Петербург
В настройках проекта задайте размер Flash менее 128К


Вернуться к началу
СообщениеДобавлено: 2015-июл-06 11:27 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 502
Цитата:
Предложение поискать в справке Keil особенности работы с _attribute_(at) к успеху не привело - ничего подобного не нашел

Плохо искали
Compiler Referens Guide -> Compiler-Specific Features -> __attribute__((at(address))) variable attribute
Цитата:
Как заставить Keil выделить для размещения моих данных именно определенный сектор?
Как в программе идентифицировать этот сектор?
Про ВЕ1 не скажу, а в ВЕ91 сектор никак (поскольку шаг по сектору 0x10), только страницу целиком (4К)
#pragma arm section zidata = "non_initialized"
// данные не инициализируются
// 1024 элемента размера int - 1 страница
// _START_SAVING_ADRESS - должен быть определен и выровнен по границе 4 кБ.
unsigned int BuferForConfigsSaving [1024] __attribute__ ((at(_START_SAVING_ADRESS)));
#pragma arm section zidata	

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
СообщениеДобавлено: 2015-июл-06 11:48 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 548
Цитата:
Другой вопрос связан с ребусом из спецификации (п.10.2.1)
Там написано:
При стирании информационной области, автоматически стирается и основная.

Это можно понять так:
после стирания страницы информационной памяти ничего не останется в основной,
т.е. информационную память вообще лучше не трогать?
В упомянутом примере об этом - ни слова.

Что же делать?
Может, лучше описано в документации по Cortex-M1 в продуктах инофирм?
Сдаётся, что блоки (в смысле конструкция) Flash у ВЕ91 и ВЕ1 таки одинаковые (знающие поправят). Повторюсь, на ВЕ91 страница и сектора INFO трутся/пишутся из пользовательской программы при полной сохранности основного Flash.
Сдаётся, что документация инофирм не поможет, т.к. INFO это подарок разработчикам лично от Миландра (знающие поправят).
Партизанский способ (уже предложен vasili) выделить страницу в основном Flash такой:
В настройках указать компилятору объём Flash на страницу меньше. При желании можно указать две области - первую урезанную и вторую остаток размером со страницу.
В страницу можно разместится через _at_ (как было показано коллегой ранее). Я таким способом контрольную сумму размещаю, правда указываю область менее страницы, т.к. на запись не требуется.


Вернуться к началу
СообщениеДобавлено: 2015-июл-06 12:13 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1313
Откуда: АО "ПКК Миландр"
ЧумА писал(а):
Цитата:
Другой вопрос связан с ребусом из спецификации (п.10.2.1)
Там написано:
При стирании информационной области, автоматически стирается и основная.

Это можно понять так:
после стирания страницы информационной памяти ничего не останется в основной,
т.е. информационную память вообще лучше не трогать?
В упомянутом примере об этом - ни слова.

Что же делать?
Может, лучше описано в документации по Cortex-M1 в продуктах инофирм?
Сдаётся, что блоки (в смысле конструкция) Flash у ВЕ91 и ВЕ1 таки одинаковые (знающие поправят). Повторюсь, на ВЕ91 страница и сектора INFO трутся/пишутся из пользовательской программы при полной сохранности основного Flash.
Сдаётся, что документация инофирм не поможет, т.к. INFO это подарок разработчикам лично от Миландра (знающие поправят).
Партизанский способ (уже предложен vasili) выделить страницу в основном Flash такой:
В настройках указать компилятору объём Flash на страницу меньше. При желании можно указать две области - первую урезанную и вторую остаток размером со страницу.
В страницу можно разместится через _at_ (как было показано коллегой ранее). Я таким способом контрольную сумму размещаю, правда указываю область менее страницы, т.к. на запись не требуется.
Если ее стирать функций sector erase. Если ее стирать Mass Erase то вместе с ней сотрется и основная флеш.


Вернуться к началу
СообщениеДобавлено: 2015-июл-06 13:08 
Не в сети

Зарегистрирован: 2015-мар-30 15:03
Сообщения: 15
Огромная благодарность всем.

Остается реализовать предложения.


Вернуться к началу
СообщениеДобавлено: 2015-июл-19 14:31 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 280
Используйте страницу информационной памяти (4 КБайт) (я храню в ней калибровочные данные АЦП для измерения внешних напряжений и т.п.), Keil её не стирает даже при FullChipErase. Подпрограммы (файлы .c) работы с флеш надо хранить в оперативке - в Keil в дереве файлов правой кнопкой мыши на файле Options for File - указать местом хранения диапазон оперативки - физически код размещается в основной флеш, при старте микрокотнроллера код сам копируется в оперативку (эти инструкции дописывает сам компилятор Keil в код программы).
Открыть
Вложение:
[ attachment ]
eeprom.jpg [ 80.89 КБ | 12144 просмотра ]
Закрыть

_________________
Hack the Planet!


Вернуться к началу
СообщениеДобавлено: 2015-авг-03 13:14 
Не в сети

Зарегистрирован: 2015-мар-30 15:03
Сообщения: 15
Благодарю за предложение использовать информационную память


Вернуться к началу
СообщениеДобавлено: 2016-ноя-08 18:13 
Не в сети

Зарегистрирован: 2016-ноя-08 18:00
Сообщения: 4
Организация: ВНИИХОЛОДМАШ
R Max и всем. Прошу выложить примеры работы с информационной памятью (чтение и запись данных).
Как нужно описывать массив в ОЗУ, где эти данные будут подготавливаться (например достаточно: uint32_t buff[500])?
Если информационную память тяжело использовать, то как выделить область в основной памяти для хранения массива данных, чтобы в эту область не попала программа?


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 19 сообщений ]  На страницу 1 2 »

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB