Загрузчик Usb-Накопителя Stm32

Известно, что ПО можно добавлять бесконечно, а всевозможные дефекты на плате полностью исправляются третьей ревизией.

И если с железом ничего не поделаешь, то для обновления прошивки придумали хороший способ обойти ограничения пространства и времени - загрузчик .

Загрузчик — это удобно и полезно, не так ли? А если загрузчик — это своя реализация, то он еще удобнее, полезнее и гибче и не стабильнее.

И конечно, очень круто! Также это прекрасная возможность углубиться и изучить особенности используемого компьютера — в нашем случае микроконтроллера STM32 с ядром ARM Cortex-M3. На самом деле загрузчик проще, чем кажется на первый взгляд. В доказательство под катом мы соберем собственный USB Mass Storage Bootloader!

Загрузчик USB-накопителя STM32



Загрузчик USB-накопителя STM32

Работать будем с самодельной платой микроконтроллера (далее МК) СТМ32F103RET .

Чтобы не перегружать публикацию лишними картинками, приведу усеченную схему этой железяки:

Загрузчик USB-накопителя STM32

При написании загрузчика я руководствовался следующими принципами:

  1. Вам действительно нужен собственный загрузчик и хватит откладывать его в список TODO, пора сесть и заняться этим;
  2. Загрузчик должен иметь удобный интерфейс для загрузки программы.

    Никаких драйверов, сторонних программ, плат-переходников или жгутов проводов МГТФ к целевому устройству.

    Что может быть проще, чем автоматически обнаруженный USB-накопитель?

  3. Для работы в режиме загрузчика микроконтроллеру требуется минимальное оборудование (фактически только USB, кварц и кнопка);
  4. Размер ботинка не главное.

    Это, конечно, важно, но мы не будем преследовать цель сжать его в пару килобайт. Без угрызений совести поднимем USB стек, поработаем с файловой системой, втыкаем печатьф() через линию и вообще ни в чем особенном себе не откажем (привет, Стандартные периферийные библиотеки !);

Пойдем

Немного о ФЛЕШЕ

Поскольку с собственной FLASH-памятью STM32 мы будем работать постоянно и часто, стоит сразу пояснить некоторые ключевые моменты, связанные с этим фактом.

Используемый МК содержит FLASH-память объемом 512 Кбайт. Он разделен на страницы по 2048 байт:

Загрузчик USB-накопителя STM32

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

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

Для этого используется регистр FLASH_AR , в котором достаточно написать любой адрес внутри нужной нам страницы — и он будет заполнен байтами 0xFF. Вам также необходимо не забыть разблокировать FLASH перед операциями стирания/записи.

Давайте виртуально разделим FLASH на несколько областей, каждая из которых будет иметь свое особое назначение:

Загрузчик USB-накопителя STM32

  • BOOT_MEM — область памяти, выделенная для загрузчика;
  • ПОЛЬЗОВАТЕЛЬ_MEM — здесь мы будем хранить (и отсюда выполнять) кастомную прошивку.

    Очевидно, что теперь у него есть ограничение в 200 Кбайт;

  • MSD_MEM — и здесь будет диск MASS STORAGE, куда вы сможете залить прошивку, используя свой компьютер и свою любимую ОС;
  • OTHER_MEM - ну давайте на всякий случай оставим еще немного места;
ПОЛЬЗОВАТЕЛЬ_MEM будет соответствовать MSD_MEM по размеру.

Это логично, ведь два противоположных случая приведут либо к нехватке памяти в ПОЛЬЗОВАТЕЛЬ_MEM , или превышение.

А теперь все то же самое, только для автомата (и удобства программатора):

   

#define FLASH_PAGE_SIZE

Теги: #stm32 #stm32f103 #usb msd #bootloader #Программирование микроконтроллера
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.