Встроенная EEPROM память, скорее всего, хорошо известна тем, кто имеет понятие о восьмибитных контроллерах типа AVR и PIC, это очень полезная штука. В нее можно сохранить определенные данные, а потом иметь возможность их считать уже после того, как контроллер был выключен/включен. Иначе это можно назвать энергонезависимой памятью. Был удивлен, когда на контроллере STM32 просто ее не нашел. Однако есть две альтернативы. Можно воспользоваться backup доменом. Можно эксплуатировать энергонезависимое хранение данных пользователя flash память STM32, то есть память контроллера.
Flash память STM32 это как раз та, которая содержит прошивку, написанную вами. Ее обычно хватает и нередко без дела болтаются несколько килобайт, их можно использовать. Даташит на STM32F100RBT6B гласит о том, что, производителем гарантируется не менее 10000 циклов перезаписи. Значит, если нужно записывать информацию не чаще, чем несколько раз за день, я считаю, можно ее юзать.
Чтобы делать запись в flash память STM32 используется FPEC, проще говоря, контроллер записи и стирания flash памяти. Main memory и Information block – это два блока, которые находятся в ее составе. Main memory представляет собой непосредственно саму память, в которую происходит запись прошивки. Именно о работе с ней будет идти далее речь. Второй блок имеет два раздела: Option Bytes и System memory. В первом из них содержится информация, которая касается защиты основной памяти. Тут можно установить защиту от таких действий, как чтение и/или запись. В разделе System memory «зашит» загрузчик, дающий возможность производить прошивку контроллера через UART. От удаления или модификации он защищен. Блок основной памяти разделяется на страницы, которые «весят» один килобайт каждая.
Можно посчитать, у STM32F100RBT6B на моем компьютере памяти 128 кБайт, значит, есть 128 страниц.
Не секрет, что flash память STM32 обладает единым адресным пространством – интервал 0x00000000 — 0xFFFFFFFF. Собственно, это здесь – регистры, флеш память, оперативная память. Адрес флеш памяти начинается с 0x08000000. Осуществить ее чтение программно возможно, вызвав специальной функцией.
С записью разобраться не так просто, прежде чем во флеш что-либо записать, нужно предварительно в предназначенном для этого регистре FPEC это разрешить. По любому адресу flash можно записывать, это делается по памяти 4 байта – сначала 2 младшие, потом старшие. Обратите внимание, я долго ломал голову, пока понял, нужно стереть память, прежде чем начинать запись. Свидетельством, что все стерто, будут биты, которые установлены в единицу, так как если что-то пишется в память, то им можно быть только сброшенными, но не установленными.
Есть определенное неудобство при стирании памяти, это делается не байт за байтом, а постраничным способом. То есть, чтобы сделать модификацию одного байта из 50, которые хранятся, нужно будет читать их все, затем изменять, производить стирание страницы и записывать обратно данные, которые изменены. Проблемы могут возникнуть, если в это время будут перебои с питанием — данные могут, либо пропасть, либо быть искажены.
Итак, перед тем, как писать, или стирать в flash память STM32, необходимо убрать блокировку, после того, как все вам нужное сделано, рекомендуется обратно поставить. Чтобы это сделать последовательно в регистр FLASH_KEYR записываются два числа: 0x45670123 и 0xCDEF89AB. Чтобы контролер записи/стирания «понял», что нам нужно, пользуемся регистром FLASH_CR. Биты, которые не отмечены зеленым (остальные), нужны для настройки прерываний и для управления записи/стирания области Option bytes, я ими не пользовался.
Кратко опишу функции ряда битов: PG – если он установлен, есть возможность писать во флеш, PER – бит, отвечающий за стирание страницы, регистр FLASH_AR определяет, какую страницу будем стирать. MER — бит стирания всех страниц. Работает самоуничтожение прошивки. STRT — запускает операцию, которую выбрали, LOCK – бит, при записи в который единицы, блокируется доступ к записи во флеш память. В регистре FLASH_SR есть бит BSY, если его показатель единичка, значит, с памятью в данное время осуществляется действие и для новой операции нужно подождать.
Надеюсь, данная информация по работе с flash памятью STM32 окажется вам полезной.
Flash-память – это безмолвное периферийное устройство, которое мы используем, не особо задумываясь о нем. Как только мы убедились, что во Flash-памяти достаточно места для хранения микропрограммы, мы загружаем бинарный образ с помощью отладчика или специального загрузочного инструмента. Затем мы полностью забываем о ней.
Однако внутренняя Flash-память, предоставляемая всеми микроконтроллерами STM32, работает так же, как и другие периферийные устройства. Она может быть запрограммирована непосредственно из микропрограммы путем конфигурации определенных регистров, и это позволяет нам обновлять встроенное ПО, используя тот же встроенный код, или сохранять соответствующие данные конфигурации без использования специальных внешних аппаратных средств (внешней EEPROM на шине I²C или Flash-памяти на шине SPI).
В данной главе показано, как программировать внутреннюю Flash-память STM32 с помощью специального модуля HAL_FLASH CubeHAL. Она описывает, как Flash-память обычно организована в типовом микроконтроллере STM32, вкратце иллюстрируя различия между каждым семейством и шаги, необходимые для программирования определенных областей этой памяти непосредственно из одного и того же микроконтроллера.
Наконец, описана роль ускорителя ART™ Accelerator, а также развитие этой запатентованной технологии ST в микроконтроллерах STM32F7.
Вотличие от других встроенных архитектур1, все микроконтроллеры STM32 предоставляют выделенную Flash-память для хранения программного кода и постоянных данных.
Внастоящее время существует одиннадцать объемов памяти, от 16 КБ до 2 МБ. Последняя цифра в номере устройства по каталогу (P/N) используемого микроконтроллера STM32 определяет размер Flash-памяти, как показано в таблице 1. Например, микроконтроллер STM32F401RE имеет 512 КБ Flash-памяти.
Таблица 1: Размер Flash-памяти с учетом последней цифры в номере по каталогу STM32
Последняя цифра в P/N | Размер Flash-памяти (КБ) |
|
|
4 | 16 |
6 | 32 |
8 | 64 |
B | 128 |
Z | 192 |
C | 256 |
D | 384 |
1 Это особенно верно для микропроцессоров Cortex-A или FPGA, где энергонезависимая память предоставляется внешними Flash-памятями, подключенными к ЦПУ через специальные линии шины.
Управление Flash-памятью | 551 | ||
Таблица 1: Размер Flash-памяти с учетом последней цифры в номере по каталогу STM32 | |||
| Последняя цифра в P/N | Размер Flash-памяти (КБ) | |
|
|
|
|
| E | 512 |
|
| F | 768 |
|
| G | 1024 |
|
| I | 2048 |
|
Взависимости от семейства STM32, вида поставки и используемого корпуса Flash-память микроконтроллера STM32 может быть организована в:
•один или два банка: большинство микроконтроллеров STM32 предоставляют только один банк Flash-памяти, а самые производительные – до двух банков. Многобанковая (multi-bank) архитектура допускает двойные и одновременные операции: при программировании или стирании в одном банке, в другом возможны операции чтения. Такой подход обеспечивает большую гибкость для двойных операций, особенно для высокопроизводительных приложений. В некоторых более поздних микроконтроллерах STM32, таких как новейшие STM32F7, мультибанк – это программируемая функция, которую можно включить по желанию, а размеры банков можно сконфигурировать при необходимости.
•каждый банк в свою очередь разделен на сектора: каждый банк Flash-памяти разделен на несколько подблоков, называемых секторами. Некоторые микроконтроллеры STM32 предоставляют Flash-память, имеющую все сектора одинакового размера (обычно равного 1 КБ или 2 КБ). Некоторые другие предоставляют несколько секторов с разными размерами (обычно первые сектора имеют меньший размер, чем остальные).
•каждый сектор может быть разделен на страницы: в некоторых микроконтрол-
лерах STM32 сектор дополнительно разделен на несколько страниц меньшего размера. Иногда это происходит только для первых секторов, что позволяет стирать, а затем программировать только часть сектора.
Втаблице 22 показано, как организована Flash-память в некоторых микроконтроллерах STM32F0. Как видите, они могут обеспечить до семнадцати секторов, каждый из которых разделен на четыре страницы. Кроме того, выделенная область, называемая информационным блоком (Information Block), отображается на другой диапазон адресов: эта энергонезависимая память используется для хранения специальных регистров конфигурации (называемых байтами конфигурации, англ. Option bytes) и некоторых предварительно запрограммированных на заводе загрузчиков, которые мы изучим в следующей главе. В более мощных микроконтроллерах STM32 область информационного блока также содер-
жит однократно программируемую (One-time Programmable, OTP) память (которая может находиться в диапазоне от 512 до 1024 Байт): это энергонезависимая память, которая может использоваться для хранения соответствующих параметров конфигурации устройства.
Почему такая организация памяти? Прежде чем мы сможем ответить на этот вопрос, нам необходимо ознакомиться с некоторыми фундаментальными понятиями, касающимися технологий Flash-памяти. Не вдаваясь в детали конкретной реализации, существует два основных типа Flash-памяти: NAND и NOR.
2 Таблица взята из справочного руководства RM0360 от ST (http://www.st.com/web/en/resource/technical/document/reference_manual/DM00091010.pdf)
Управление Flash-памятью | 552 |
Таблица 2: Организация Flash-памяти в устройствах F030x4, F030x6, F070x6 и F030x8
Память NAND-Flash предлагает более компактную физическую архитектуру, позволяющую хранить больше ячеек памяти в одной и той же кремниевой области. Память NAND доступна с большей плотностью хранения и с меньшими затратами на бит, чем NORFlash (помните, что в электронике, помимо затрат на исследования и разработки, стоимость изготовления ИС зависит от размера кристалла). Памяти NAND также в 10 раз превышают срок службы NOR-Flash. NAND больше подходит для хранения больших файлов, включая видео и аудио. USB-накопители, SD-карты и MMC-карты относятся к типу NAND.
NAND-Flash не предоставляет шину внешнего адреса с произвольным доступом, поэтому данные должны считываться по блокам, где каждый блок содержит от сотен до тысяч битов, что напоминает своего рода последовательный доступ к данным. Это делает технологию NAND-Flash непригодной для встроенных микроконтроллеров, поскольку большинству микропроцессоров и микроконтроллеров требуется произвольный доступ на уровне байтов.
О технологиях Flash-памяти важно знать, что операция записи на Flash-устройстве любого типа может выполняться только на пустом или стертом устройстве. Поэтому в большинстве случаев операции записи должна предшествовать операция стирания. Хотя операция стирания довольно проста в случае устройств NAND-Flash, в NOR-Flash
Управление Flash-памятью | 553 |
обязательно, чтобы все байты в целевом блоке записывались полностью нулями, прежде чем их можно будет стирать. И наоборот, память NOR-Flash предлагает полный адрес и шины данных для произвольного доступа к любой области памяти (адресуемой для каждого байта). Это делает их пригодными для хранения кода и постоянных данных, поскольку их редко требуется обновлять.
Долговечность памяти NOR составляет от 10000 до 100000 циклов стирания. Операции стирания и записи в памяти NOR-Flash медленнее по сравнению с NAND-Flash. Это означает, что NAND-Flash имеет более быстрое время стирания и записи. Кроме того, NAND имеет меньшие единицы стирания. Поэтому требуется меньше стираний, и это делает их более подходящими для хранения файловых систем. NOR-Flash может считывать данные немного быстрее, чем NAND.
Устройства NOR-Flash делятся на стираемые единицы, также называемые блоками, страницами или секторами. Это разделение необходимо для снижения цен и преодоления физических ограничений. Запись информации в конкретный блок может быть выполнена только в том случае, если этот блок пуст/стерт, как было сказано выше. В большинстве памятей NOR-Flash после цикла стирания отдельная ячейка содержит значение «1», а операция записи позволяет изменить ее значение на «0». Это означает, что ячейка памяти слова устанавливается в 0xFFFF FFFF после стирания. Однако существуют некоторые памяти NOR-Flash, в которых значение ячейки по умолчанию после стирания равно «0», и мы можем установить его в «1» с помощью операции записи.
Разделение Flash-памяти на несколько блоков дает нам косвенное преимущество: мы можем стереть, а затем перепрограммировать только небольшие части Flash-памяти. Это особенно полезно, когда мы используем Flash-память для хранения энергонезависимых параметров конфигурации без использования выделенной и внешней памяти EEPROM3.
Чтобы полностью избежать нежелательных записей в энергонезависимую память (Non Volatile Memory, NVM), Flash-память во всех микроконтроллерах STM32 защищена от записи, и для ее отключения существует специальная последовательность разблокировки: в области байтов конфигурации предусмотрены два специальных ключ-регистра, которые позволяют отключить защиту от записи Flash-памяти, поместив в них определенное значение. В некоторых микроконтроллерах STM32 защита от записи должна быть отдельно отключена для каждого сектора. В зависимости от семейства STM32 доступ к записи является 8-, 16-, 32или 64-разрядным.
Чтобы защитить интеллектуальную собственность, Flash-память может быть защищена от чтения при внешнем доступе через интерфейс отладки (очевидно, доступ к чтению все еще разрешен ядру Cortex-M и контроллерам DMA). Это позволяет избежать сохранения содержимого Flash-памяти другими злонамеренные пользователями для дизассемблирования или копирования его на контрафактных устройствах4. Мы проанализируем эту тему позже.
В зависимости от семейства STM32, Flash-память может выполнять несколько операций программирования/стирания параллельно, что позволяет записывать больше байтов
3Несколько микроконтроллеров STM32 из серии STM32L предоставляют выделенную и настоящую память EEPROM, как и в других недорогих 8-разрядных микроконтроллерах (например, в микроконтроллерах
ATMEL AVR).
4Однако имейте в виду, что существуют компании, способные обходить защиту от чтения с использованием передовых аппаратных технологий (обычно связанных с использованием лазеров, которые перезаписывают биты защиты от чтения внутри области байтов конфигурации – это не дешево, но возможно ;-))
Задавать вопрос
спросил
Изменено 9 лет, 1 месяц назад
Просмотрено 20 тысяч раз
\$\начало группы\$
Я хочу иметь возможность сохранять значения в энергонезависимой памяти, чтобы микроконтроллер мог загрузить эти настройки при запуске. Эти настройки могут измениться во время выполнения, и для функциональности системы важно, чтобы эти настройки сохранялись.
Насколько мне известно, единственной энергонезависимой памятью на STM32F103 является flash. Можно ли сохранить значения во флэш-памяти где-нибудь во время выполнения?
У меня также есть возможность использовать SD-карту и интерфейс SDIO или SPI для хранения значений, но, если возможно, было бы лучше, если бы SD-карту можно было избежать.
Объем данных составляет не более нескольких сотен байт.
\$\конечная группа\$
2
\$\начало группы\$
Из того, что я знаю, есть два варианта:
Кстати если передвинуть одного из старших братьев (F2-F4) этой фишки то получится целое часть оперативной памяти поддерживает что-то вроде 4k, но это зависит от фактического чипа
\$\конечная группа\$
2
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Электронная почта
Требуется, но никогда не отображается
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie
спросил
Изменено 2 года, 8 месяцев назад
Просмотрено 3к раз
\$\начало группы\$
Я хочу сохранить 3 целочисленных значения во флэш-памяти микроконтроллера, чтобы эти значения не потерялись при отключении питания устройства.
Я пытаюсь понять, какой тип памяти использовать для этой цели и как именно я могу писать и читать из этого блока памяти.
Я занимаюсь хобби-проектом по использованию ЧМИ для ввода данных в ПЛК, который затем будет управлять несколькими двигателями для управления движением игрушечного квадрокоптера.
Я использую Keil uvision IDE.
Дополнительные примечания:
\$\конечная группа\$
4
\$\начало группы\$
Вы можете использовать так называемую эмуляцию EEPROM
, которая использует часть флэш-памяти для использования в качестве EEPROM.
Вы можете прочитать все об этом для STM40x/STM41x в следующем документе: stmicroelectronics.pdf
Конечно, эта память EEPROM будет меньше, чем обычная флэш-память. Потребуется назначить полную страницу (не уверен, сколько байт), но одной страницы более чем достаточно для ваших 3-х байт.
Обратите внимание, чтобы подумать о выравнивании износа, если вам нужно часто сохранять эти 3 значения (в этом случае используйте разные страницы).
Для других: Для других моделей STM32 существуют другие примечания по применению.
\$\конечная группа\$
10
\$\начало группы\$
Для хранения параметров, которое используется не слишком часто, но должно быть надежным, я рекомендую следующий подход.
Последнее примечание. Вы можете применить схему алгоритма надежности, которую я описал выше, к любой технологии энергонезависимой памяти, последовательной EEPROM, Flash, эмуляции EEPROM.