Главная » Статьи » Загрузчик для STM32 с поддержкой SD-карты

Загрузчик для STM32 с поддержкой SD-карты

В данной статье покажем вам, как заменить содержимое Flash памяти в микроконтроллерах STM32 с использованием носителя в виде SD-карты. Для этого необходим специальный загрузчик, приведенный далее.

Загрузчик, поддерживающий передачу данных с SD-карты во флэш-память, находится в начальных областях памяти программы. Каждый раз после сброса, микроконтроллер запускает его (когда строка BOOT0 = 0, состояние линии BOOT1 не имеет значения), независимо от того, сохранена ли правильная версия пользовательской программы или нет.

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

Загрузчик для STM32 с поддержкой SD-карты

Рис. 1. Схема, иллюстрирующая работу загрузчика

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

  • Когда флэш-память не запрограммирована, это сводится к чтению первых ячеек вектора пользовательского прерывания (указателя стека и вектора сброса) и проверке, были ли они удалены случайно. Этот простой код, конечно, не может определить, является ли приложение безошибочным, но этого достаточно, чтобы определить, находится ли приложение в памяти.
  • Когда пользователь принудительно запускает загрузчик, что проверяется состоянием одной из линий микроконтроллера GPIO (определяется WakeUp_PORT и WakeUp_PIN).
  • Когда загрузчик был вызван из пользовательского приложения. Этот метод позволяет вам разместить несколько строк кода в вашей программе, которые обеспечивают вызов загрузчика.

Внутренняя поддержка Flash

Производитель внедрил в микроконтроллеры STM32 специальный драйвер Flash Program / Erase Controller (FPEC), который можно использовать для изменения содержимого флэш-памяти. В микроконтроллерах STM32 флэш-память организована в виде страниц, размер которых составляет 1 КБ или 2 КБ, в зависимости от общего объема памяти.

Флэш-память находится в адресном пространстве процессора, начиная с адреса 0x08000000. Подробное описание того, как обрабатывать флэш-память в микроконтроллерах STM32, можно найти в документе PM0042 под названием «Программирование флэш-памяти STM32F10xxx», который доступен на веб-сайте STMicroelectronics.

После сброса микроконтроллера FPEC защищает содержимое флэш-памяти от сохранения, поэтому нет возможности случайного повреждения ее содержимого. Чтобы внести какие-либо изменения, вы должны сначала разблокировать память. Это делается путем ввода двух значений в реестр Flash_KEYR:

KEY1 = 0x45670123

а затем

KEY2 = 0xCDEF89AB

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

Рис. 2. Алгоритм программирования флэш-памяти в микроконтроллерах STM32

Запись в память производится 2 байтами. Сначала установите бит PG в реестре Flash_CR, информируя контроллер о том, что мы будем программировать. После этого действия вы можете изменить содержимое памяти, что требует ввода 2 байтов по адресу, где они должны быть размещены в памяти. Затем дождитесь окончания этой операции и убедитесь, что запись была произведена правильно, для чего необходимо прочитать записанные 2 байта и убедиться в их правильности — это можно сделать путем сравнения. Если ошибок не нет,  то вы можете записать следующие данные таким же образом. После сохранения всей страницы вы должны удалить бит PG.

Содержимое флэш-памяти в микроконтроллерах STM32 может быть удалено двумя способами: страница за страницей или все ее содержимое. В случае загрузчика память будет удаляться постранично. Постраничный алгоритм удаления показан на рис. 3.

Рис. 3. Алгоритм стирания флэш-памяти в микроконтроллерах STM32 (постраничный)

Мы начинаем стирать содержимое памяти, устанавливая бит PER, информирующий FPEC в регистре Flash_CR о том, что страница флэш-памяти будет удалена. Затем введите адрес удаляемой страницы в регистр Flash_AR и установите бит STRT в регистр Flash_CR. В этот момент начинается физическое удаление содержимого указанной страницы памяти. На следующем этапе мы ожидаем его завершения, после чего проверяем, была ли страница удалена правильно, читая и проверяя ее содержимое.

Оставить комментарий

Ваш email нигде не будет показанОбязательные для заполнения поля помечены *

*