HHIMERA писал(а):Да не всё так просто...
А Unlock кто будет делать?
И даже анлок не помогеть! Вдуть, подождать завершения операции вдутия - менингит тот еще. На мой взгляд ST очень мудро поступили - вам надо долгой и хорошей памяти - их есть у нас! Юзайте внешнюю I2C и будет вам... И надежность, и долгие годы...
Автору вопроса для общего понимания: http://easystm32.ru/for-beginners/38-flash-stm32
Последний раз редактировалось ut1wpr Чт июн 20, 2013 15:35:40, всего редактировалось 1 раз.
Satyr - не надо грубить. Это простой вопрос, и любой компоновщик умеет размещать нужные переменные в нужных сегментах памяти, вопрос в том, что я новичок в IAR, и не знал нужных препроцессорных директив.
ibiza11 - спасибо за отклик! Вы правильно сказали, но мне хотелось, чтобы компоновщик сам размещал все EEPROM-переменные в своей области (с адреса 0x08080000), без необходимости явного присвоения каждой из них своего адреса.
Впрочем, ответ я нашел, это выглядит так (может, кому-нибудь пригодится):
Читать можно свободно. А вот с записью не получится. Области EEPROM и FLASH имеют защиту. При обращении к памяти в этой области ее необходимо предварительно снять. Учитывая это, механизм программной инициализации не может быть выражен путем VAR = VALUE. Запись во флеш и еепром имеет механизм, отличный от ОЗУ. Причем далеко не все STM32 имеют этот самый eeprom.
Это все понятно , в случае записи там много нюансов, но прямая запись вида переменная=значение и не требуется - нужно лишь удобное резервирование "именованных" областей памяти в EEPROM, без необходимости помнить абсолютные адреса.
ut1wpr писал(а):...применяю третий, совмещенный - опрос в прерывании. ....
если Вы циклите в прерывании - это в консерватории хаос. тут либо потеря времени (прощай реал тайм), либо блокировка зацикливания и повторное вхождение(это усложнение общей логики - нафига, не понятно. наверное круто ). т.е. надо иметь весские основания чтоб так делать.
если опросом называете один запрос состоянии пинов - ну дык блин, речь не про это была. это собственно и есть один из двух способов.
Спасибо за ссылку, но в статье описана работа с program flash, а не EEPROM, впрочем, вопрос был совершенно в другом, и ответ я нашел. Читать Programming manual я и сам умею, без подсказок с форума
Похоже, что Вы правы! Нужно сначала разблокировать область для записи.
Качайте архив отсюда http://www.st.com/web/catalog/tools/FM1 ... 3/PF257913
Это стандартная библиотека периферии STM32Lx. Там в файле
stsw-stm32077.zip\STM32L1xx_StdPeriph_Lib_V1.2.0\Libraries\STM32L1xx_StdPeriph_Driver\src\stm32l1xx_flash.c
ищите по тегу EEPROM
Добавлено: блин, прочел предыдущую страницу, а эту не заметил. тут уже столько всего понаписали))) В общем теперь и я буду знать.
Спасибо за ссылку, но в статье описана работа с program flash, а не EEPROM, впрочем, вопрос был совершенно в другом, и ответ я нашел. Читать Programming manual я и сам умею, без подсказок с форума
Отличается только областью разблокировки. Удобнее всего работать с SPL. Проблема еще и в том, что в STM32 eeprom есть далеко не во всех линейках.
Можно использовать и флеш в качестве eeprom, не знаю, как в 32, но в 8 было однозначно сказано, что endurance при этом резко снижается. Плюс еще такая неприятная мелочь, как необходимость очистки перед записью, а очистка выполняется только постранично. Ну, это все описано в документации, просто напоминаю. http://www.st.com/web/en/resource/techn ... 165693.pdf
ibiza11 писал(а):
Но мне кажется в данном случае Вы заблуждаетесь. в STM32L EEPROM отображается в общее адресное пространство на адреса начиная с 0x08080000.
Следовательно переменную можно разместить там явно, указав ее адрес.
Если оно так, то, с придираясь к тонкой игре слов, "разместить" ее там нельзя (нельзя ж туда записать чтото просто сказав *(uint8_t *) 0x08080000 = 1 ?), можно только объяснить линкеру, что неким чудным образом переменная там есть.
в случае IAR'а:
__no_init char var1 @ 0x08080000;
__root, если переменная используется, не нужен. это инструкция линкеру не выкидывать переменную, даже если в коде ее никто не использует.
но надо понимать, что на запись переменная так работать не будет. В отличии от атмел авр студио, где несмотря на какбе си, есть механизм, схожий с плюсовым переопределенным оператором-функцией, которой записывает значение в еепром.
флеш то он тоже напрямую адресуется, только с записью те же грабли -))
Все же есть нюансы (кроме необходимости разблокировки памяти): например, в MD-контроллерах STM32L нельзя записать нулевой байт или half-word (16 битное полуслово), иначе контроллер зависает:
STM32L152 Programming manual писал(а):The Fast Byte Write, Fast Half Word Write, Byte Write and Half Word Write can be used only to write a NON NULL byte/half word.
Сам SPL стараюсь не юзать, ибо смысла в ней не увидел, но изучить исходники для более быстрого ознакомления с предметной областью (а также examples оттуда же) - бывает весьма полезно.
ut1wpr писал(а):
Можно использовать и флеш в качестве eeprom, не знаю, как в 32, но в 8 было однозначно сказано, что endurance при этом резко снижается. Плюс еще такая неприятная мелочь, как необходимость очистки перед записью, а очистка выполняется только постранично. Ну, это все описано в документации, просто напоминаю. http://www.st.com/web/en/resource/techn ... 165693.pdf
Использовал эту чтуку, правда изрядно модернизированную.
Насчет ресурса - сильно зависит от алгоритма и места, выделенного под хранилища.
В пределе (при нуле оверхеда формата хранения) ресурс стремится к <ресурс страницы> * <объем памяти, выделенные под хранилище> / <объем эмулируемого eeprom>
Т.е. если надо съэмулировать EEPROM на 256 байт, а отдать под него 3 страницы по 16Кб (флеша нынче дофига) и при среднем ресурсе 100.000 как всреднем по рынку (что собсно и эквивалентно указываемом СТ гарантированном минимуме 10000 в полном диапазоне температур и напряжений), то имеем 100000 * 49152 / 256 = 19.200.000
Что даже больше, чем для настоящиз EEPROMов, у которых ресурс, как правило, 1~10 млн перезаписей.
Citizen Kane писал(а):Сам SPL стараюсь не юзать, ибо смысла в ней не увидел
Смысл огромный - отсутствие необходимости изобретать велосипед.
Конечно, ошибок и недоделок там хватает и многое сделано чисто академически - простор для оптимизации огромный.
Однако того, от чего зависит скорость твоей программы и надо доработать напильником, чтоб достичь 99% от возможной эффективности - 1% исходников.
в моем случае кейл разместит переменную по четко указанному адресу во флэш
затем по этому адресу можно читать значение. удобно юзать, если используется загрузчик.
ut1wpr писал(а):Где разместит Кейл массив при такой записи? Мне кажется, тоже во флеш.
Да, по умолчанию разместит во flash-памяти.
Так и я ж об этом...
Но вообще-то изначально разговор зашел про eeprom. И про то, что делать, если его нет как такового в МК. Я для себя давно принял решение. Мне было просто интересно, кто и как выкручивается.
menzoda писал(а):
Да, по умолчанию разместит во flash-памяти.
Так и я ж об этом...
Но вообще-то изначально разговор зашел про eeprom. И про то, что делать, если его нет как такового в МК. Я для себя давно принял решение. Мне было просто интересно, кто и как выкручивается.
Есть апноут как сэмулировать EEPROM во флэш. оч удобно пользоваться
гуглите AN3969 (это для F4). для остальных есть тоже самое
k000858 писал(а):Есть апноут как сэмулировать EEPROM во флэш. оч удобно пользоваться
При записи во Flash-память, ей нельзя пользоваться, что впрочем логично. Нужно отключать все прерывания на время записи, или копировать код прерываний в SRAM. Ни то ни другое мне не нравиться, поэтому я бы предпочел внешнюю FRAM, ну или EEPROM.