Особенности и структура flash памяти в микроконтроллерах STM32

Встроенная EEPROM память, скорее всего, хорошо известна тем, кто имеет понятие о восьмибитных контроллерах типа AVR и PIC, это очень полезная штука. В нее можно сохранить определенные данные, а потом иметь возможность их считать уже после того, как контроллер был выключен/включен. Иначе это можно назвать энергонезависимой памятью. Был удивлен, когда на контроллере STM32 просто ее не нашел. Однако есть две альтернативы. Можно воспользоваться backup доменом. Можно эксплуатировать энергонезависимое хранение данных пользователя flash память STM32, то есть память контроллера.

Особенности и структура 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

Краткая информация о работе с этой памятью 

Не секрет, что flash память STM32 обладает единым адресным пространством – интервал 0x00000000 - 0xFFFFFFFF. Собственно, это здесь – регистры, флеш память, оперативная память. Адрес флеш памяти начинается с 0x08000000. Осуществить ее чтение программно возможно, вызвав специальной функцией. 

С записью разобраться не так просто, прежде чем во флеш что-либо записать, нужно предварительно в предназначенном для этого регистре FPEC это разрешить. По любому адресу flash можно записывать, это делается по памяти 4 байта – сначала 2 младшие, потом старшие. Обратите внимание, я долго ломал голову, пока понял, нужно стереть память, прежде чем начинать запись. Свидетельством, что все стерто, будут биты, которые установлены в единицу, так как если что-то пишется в память, то им можно быть только сброшенными, но не установленными.

Особенности стирания и записи 

Есть определенное неудобство при стирании памяти, это делается не байт за байтом, а постраничным способом. То есть, чтобы сделать модификацию одного байта из 50, которые хранятся, нужно будет читать их все, затем изменять, производить стирание страницы и записывать обратно данные, которые изменены. Проблемы могут возникнуть, если в это время будут перебои с питанием - данные могут, либо пропасть, либо быть искажены. 

Итак, перед тем, как писать, или стирать в flash память STM32, необходимо убрать блокировку, после того, как все вам нужное сделано, рекомендуется обратно поставить. Чтобы это сделать последовательно в регистр FLASH_KEYR записываются два числа: 0x45670123 и 0xCDEF89AB. Чтобы контролер записи/стирания «понял», что нам нужно, пользуемся регистром FLASH_CR. Биты, которые не отмечены зеленым (остальные), нужны для настройки прерываний и для управления записи/стирания области Option bytes, я ими не пользовался.

Биты флеш памяти STM32

Кратко опишу функции ряда битов: PG – если он установлен, есть возможность писать во флеш, PER – бит, отвечающий за стирание страницы, регистр FLASH_AR определяет, какую страницу будем стирать. MER - бит стирания всех страниц. Работает самоуничтожение прошивки. STRT - запускает операцию, которую выбрали, LOCK – бит, при записи в который единицы, блокируется доступ к записи во флеш память. В регистре FLASH_SR есть бит BSY, если его показатель единичка, значит, с памятью в данное время осуществляется действие и для новой операции нужно подождать.

Надеюсь, данная информация по работе с flash памятью STM32 окажется вам полезной.

Добавить комментарий


Защитный код
Обновить

Последние комментарии

Последнии темы форума

  • Нет сообщений для показа