STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: STM32 новичку в ARM что к чему

Сообщение ut1wpr »

HHIMERA писал(а):Да не всё так просто...
А Unlock кто будет делать? :))
И даже анлок не помогеть! Вдуть, подождать завершения операции вдутия - менингит тот еще. На мой взгляд ST очень мудро поступили - вам надо долгой и хорошей памяти - их есть у нас! :) Юзайте внешнюю I2C и будет вам... И надежность, и долгие годы...
Автору вопроса для общего понимания:
http://easystm32.ru/for-beginners/38-flash-stm32
Последний раз редактировалось ut1wpr Чт июн 20, 2013 15:35:40, всего редактировалось 1 раз.
С уважением,
Виктор.
Реклама
Citizen Kane
Родился
Сообщения: 6
Зарегистрирован: Чт июн 20, 2013 03:11:09

Re: STM32 новичку в ARM что к чему

Сообщение Citizen Kane »

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

ibiza11 - спасибо за отклик! Вы правильно сказали, но мне хотелось, чтобы компоновщик сам размещал все EEPROM-переменные в своей области (с адреса 0x08080000), без необходимости явного присвоения каждой из них своего адреса.

Впрочем, ответ я нашел, это выглядит так (может, кому-нибудь пригодится):

__root __no_init uint32_t eeprom_variable @".eeprom";

либо

#pragma location=".eeprom"
__root __no_init uint32_t eeprom_variable;

оба варианта рабочие.

(в скрипте линкера при этом должно быть определение .eeprom, как я написал в пред. посте)
Реклама
Citizen Kane
Родился
Сообщения: 6
Зарегистрирован: Чт июн 20, 2013 03:11:09

Re: STM32 новичку в ARM что к чему

Сообщение Citizen Kane »

Читать можно свободно. А вот с записью не получится. Области EEPROM и FLASH имеют защиту. При обращении к памяти в этой области ее необходимо предварительно снять. Учитывая это, механизм программной инициализации не может быть выражен путем VAR = VALUE. Запись во флеш и еепром имеет механизм, отличный от ОЗУ. Причем далеко не все STM32 имеют этот самый eeprom.


Это все понятно :), в случае записи там много нюансов, но прямая запись вида переменная=значение и не требуется - нужно лишь удобное резервирование "именованных" областей памяти в EEPROM, без необходимости помнить абсолютные адреса.
kolobok0
Грызет канифоль
Сообщения: 296
Зарегистрирован: Ср дек 30, 2009 09:55:39

Re: STM32 новичку в ARM что к чему

Сообщение kolobok0 »

ut1wpr писал(а):...применяю третий, совмещенный - опрос в прерывании. :)....


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

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

надеюсь не осталось тёмных пятен?
ик
(круглый)
Реклама
Эиком - электронные компоненты и радиодетали
Citizen Kane
Родился
Сообщения: 6
Зарегистрирован: Чт июн 20, 2013 03:11:09

Re: STM32 новичку в ARM что к чему

Сообщение Citizen Kane »

ut1wpr писал(а):Автору вопроса для общего понимания:
http://easystm32.ru/for-beginners/38-flash-stm32


Спасибо за ссылку, но в статье описана работа с program flash, а не EEPROM, впрочем, вопрос был совершенно в другом, и ответ я нашел. Читать Programming manual я и сам умею, без подсказок с форума :)
Реклама
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: STM32 новичку в ARM что к чему

Сообщение ibiza11 »

Похоже, что Вы правы! Нужно сначала разблокировать область для записи.
Качайте архив отсюда 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

Добавлено: блин, прочел предыдущую страницу, а эту не заметил. тут уже столько всего понаписали))) В общем теперь и я буду знать.
Ставим плюсы: )
Реклама
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: STM32 новичку в ARM что к чему

Сообщение ut1wpr »

Citizen Kane писал(а):
ut1wpr писал(а):Автору вопроса для общего понимания:
http://easystm32.ru/for-beginners/38-flash-stm32


Спасибо за ссылку, но в статье описана работа с program flash, а не EEPROM, впрочем, вопрос был совершенно в другом, и ответ я нашел. Читать Programming manual я и сам умею, без подсказок с форума :)
Отличается только областью разблокировки. Удобнее всего работать с SPL. Проблема еще и в том, что в STM32 eeprom есть далеко не во всех линейках.

Можно использовать и флеш в качестве eeprom, не знаю, как в 32, но в 8 было однозначно сказано, что endurance при этом резко снижается. Плюс еще такая неприятная мелочь, как необходимость очистки перед записью, а очистка выполняется только постранично. Ну, это все описано в документации, просто напоминаю.
http://www.st.com/web/en/resource/technical/document/application_note/CD00165693.pdf
С уважением,
Виктор.
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: STM32 новичку в ARM что к чему

Сообщение Satyr »

ibiza11 писал(а):Но мне кажется в данном случае Вы заблуждаетесь. в STM32L EEPROM отображается в общее адресное пространство на адреса начиная с 0x08080000.
Следовательно переменную можно разместить там явно, указав ее адрес.

Если оно так, то, с придираясь к тонкой игре слов, "разместить" ее там нельзя (нельзя ж туда записать чтото просто сказав *(uint8_t *) 0x08080000 = 1 ?), можно только объяснить линкеру, что неким чудным образом переменная там есть.
в случае IAR'а:
__no_init char var1 @ 0x08080000;
__root, если переменная используется, не нужен. это инструкция линкеру не выкидывать переменную, даже если в коде ее никто не использует.
но надо понимать, что на запись переменная так работать не будет. В отличии от атмел авр студио, где несмотря на какбе си, есть механизм, схожий с плюсовым переопределенным оператором-функцией, которой записывает значение в еепром.
флеш то он тоже напрямую адресуется, только с записью те же грабли -))
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM32 новичку в ARM что к чему

Сообщение HHIMERA »

Удобнее всего работать с SPL.

Не вижу разницы!!!
Плюс еще такая неприятная мелочь, как необходимость очистки перед записью, а очистка выполняется только постранично.

Пишется EEPROM и без стирания...
__no_init char var1 @ 0x08080000;

но надо понимать, что на запись переменная так работать не будет.

Это почему??? Всё работает!!!
"Я не даю готовых решений, я заставляю думать!"(С)
Citizen Kane
Родился
Сообщения: 6
Зарегистрирован: Чт июн 20, 2013 03:11:09

Re: STM32 новичку в ARM что к чему

Сообщение Citizen Kane »

HHIMERA писал(а):Это почему??? Всё работает!!!


Все же есть нюансы (кроме необходимости разблокировки памяти): например, в 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 это реализовано следующим образом:

stm32l1xx_flash.c писал(а):

Код: Выделить всё

    if(Data != (uint8_t) 0x00)
    { 
      *(__IO uint8_t *)Address = Data;
      status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);
    }
    else
    {
      tmpaddr = Address & 0xFFFFFFFC;
      tmp = * (__IO uint32_t *) tmpaddr;
      tmpaddr = 0xFF << ((uint32_t) (0x8 * (Address & 0x3)));
      tmp &= ~tmpaddr;       
      status = DATA_EEPROM_EraseWord(Address & 0xFFFFFFFC);
      status = DATA_EEPROM_FastProgramWord((Address & 0xFFFFFFFC), tmp);
    }

Citizen Kane
Родился
Сообщения: 6
Зарегистрирован: Чт июн 20, 2013 03:11:09

Re: STM32 новичку в ARM что к чему

Сообщение Citizen Kane »

Сам SPL стараюсь не юзать, ибо смысла в ней не увидел, но изучить исходники для более быстрого ознакомления с предметной областью (а также examples оттуда же) - бывает весьма полезно.
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: STM32 новичку в ARM что к чему

Сообщение Satyr »

ut1wpr писал(а):Можно использовать и флеш в качестве eeprom, не знаю, как в 32, но в 8 было однозначно сказано, что endurance при этом резко снижается. Плюс еще такая неприятная мелочь, как необходимость очистки перед записью, а очистка выполняется только постранично. Ну, это все описано в документации, просто напоминаю.
http://www.st.com/web/en/resource/technical/document/application_note/CD00165693.pdf

Использовал эту чтуку, правда изрядно модернизированную.
Насчет ресурса - сильно зависит от алгоритма и места, выделенного под хранилища.
В пределе (при нуле оверхеда формата хранения) ресурс стремится к <ресурс страницы> * <объем памяти, выделенные под хранилище> / <объем эмулируемого eeprom>

Т.е. если надо съэмулировать EEPROM на 256 байт, а отдать под него 3 страницы по 16Кб (флеша нынче дофига) и при среднем ресурсе 100.000 как всреднем по рынку (что собсно и эквивалентно указываемом СТ гарантированном минимуме 10000 в полном диапазоне температур и напряжений), то имеем 100000 * 49152 / 256 = 19.200.000
Что даже больше, чем для настоящиз EEPROMов, у которых ресурс, как правило, 1~10 млн перезаписей.
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: STM32 новичку в ARM что к чему

Сообщение Satyr »

Citizen Kane писал(а):Сам SPL стараюсь не юзать, ибо смысла в ней не увидел

Смысл огромный - отсутствие необходимости изобретать велосипед.
Конечно, ошибок и недоделок там хватает и многое сделано чисто академически - простор для оптимизации огромный.
Однако того, от чего зависит скорость твоей программы и надо доработать напильником, чтоб достичь 99% от возможной эффективности - 1% исходников.
k000858
Открыл глаза
Сообщения: 44
Зарегистрирован: Сб июн 14, 2008 11:51:50

Re: STM32 новичку в ARM что к чему

Сообщение k000858 »

размещение во флэш переменной в кейле
const uint8_t variable[6] __attribute__((at(0x08010000))) = {0xF1,0xF0,0x82,0x02,0,0};
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: STM32 новичку в ARM что к чему

Сообщение ut1wpr »

k000858 писал(а):размещение во флэш переменной в кейле
const uint8_t variable[6] __attribute__((at(0x08010000))) = {0xF1,0xF0,0x82,0x02,0,0};

А если так:

Код: Выделить всё

const u8 variable[6] = {1,2,3,4,5,6};

Где разместит Кейл массив при такой записи? Мне кажется, тоже во флеш.
С уважением,
Виктор.
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: STM32 новичку в ARM что к чему

Сообщение menzoda »

ut1wpr писал(а):Где разместит Кейл массив при такой записи? Мне кажется, тоже во флеш.

Да, по умолчанию разместит во flash-памяти.
k000858
Открыл глаза
Сообщения: 44
Зарегистрирован: Сб июн 14, 2008 11:51:50

Re: STM32 новичку в ARM что к чему

Сообщение k000858 »

в моем случае кейл разместит переменную по четко указанному адресу во флэш
затем по этому адресу можно читать значение. удобно юзать, если используется загрузчик.
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: STM32 новичку в ARM что к чему

Сообщение ut1wpr »

menzoda писал(а):
ut1wpr писал(а):Где разместит Кейл массив при такой записи? Мне кажется, тоже во флеш.

Да, по умолчанию разместит во flash-памяти.

Так и я ж об этом... :)
Но вообще-то изначально разговор зашел про eeprom. И про то, что делать, если его нет как такового в МК. Я для себя давно принял решение. Мне было просто интересно, кто и как выкручивается.
С уважением,
Виктор.
k000858
Открыл глаза
Сообщения: 44
Зарегистрирован: Сб июн 14, 2008 11:51:50

Re: STM32 новичку в ARM что к чему

Сообщение k000858 »

ut1wpr писал(а):
menzoda писал(а):Да, по умолчанию разместит во flash-памяти.

Так и я ж об этом... :)
Но вообще-то изначально разговор зашел про eeprom. И про то, что делать, если его нет как такового в МК. Я для себя давно принял решение. Мне было просто интересно, кто и как выкручивается.

Есть апноут как сэмулировать EEPROM во флэш. оч удобно пользоваться
гуглите AN3969 (это для F4). для остальных есть тоже самое
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: STM32 новичку в ARM что к чему

Сообщение menzoda »

k000858 писал(а):Есть апноут как сэмулировать EEPROM во флэш. оч удобно пользоваться

При записи во Flash-память, ей нельзя пользоваться, что впрочем логично. Нужно отключать все прерывания на время записи, или копировать код прерываний в SRAM. Ни то ни другое мне не нравиться, поэтому я бы предпочел внешнюю FRAM, ну или EEPROM.
Ответить

Вернуться в «ARM»