Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2740
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Процесс начальной загрузки

579

в SRAM, когда мы будем сбрасывать микроконтроллер из IDE (очевидно, что если мы сбрасываем плату с помощью соответствующей аппаратной кнопки на Nucleo, то мы потеряем код или, по крайней мере, он может быть поврежден).

Рисунок 3: Как подключить выводы BOOT0 и BOOT1 к VDD на плате Nucleo, чтобы микроконтроллер загружался из SRAM

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

22.2. Встроенный загрузчик

В современной цифровой электронике практически невозможно распространять электронные устройства, не выпуская последующие обновления микропрограммы. И это в особенности актуально для сложных плат с большим количеством интегральных схем и периферийных устройств. Рано или поздно всем разработчикам встраиваемых систем потребуется способ распространения обновления микропрограммы, и, что более важно, им потребуется способ, позволяющий пользователям загружать его в микроконтроллер без специального (а иногда и дорогостоящего) отладчика. Более того, часто порт отладки SWD не добавляется в конечную плату проектного решения4.

Загрузчик (bootloader) – это часть программного обеспечения, обычно запускающаяся первой при начальной загрузке микроконтроллера, которая может обновлять микропрограмму во внутренней Flash-памяти. Данная операция также известна как

4 Для тех из вас, кто интересуется, как загрузить микропрограмму на плату без порта отладки и без использования встроенного загрузчика, было бы полезно знать, что ST может поставлять вам микроконтроллеры с уже запрограммированной микропрограммой во время производства микроконтроллера. Эта возможность предлагается для довольно крупных заказов (насколько я знаю партии с более чем 10000 шт.). Спросите своего торгового представителя для получения дополнительной информации об этом.

Процесс начальной загрузки

580

внутрипрограммное программирование (In-Application Programming, IAP), которое отлича-

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

стен как внутрисистемное программирование (In-System Programming, ISP).

Загрузчики обычно разрабатываются таким образом, чтобы они принимали команды через коммуникационные периферийные устройства (USART, USB, Ethernet и т. д.), которые используются для обмена бинарного файла микропрограммы с микроконтроллером. Обычно также требуется специальная программа, предназначенная для запуска на внешнем ПК.

Все микроконтроллеры STM32 поставляются с завода с предварительно запрограммированным загрузчиком в памяти ПЗУ, называемой системной памятью, которая отображается в диапазоне адресов 0x1FFF 0000 – 0x1FFF 77FF в большинстве микроконтроллеров STM325. В зависимости от семейства микроконтроллера и используемого корпуса, этот загрузчик может взаимодействовать с внешним миром, используя:

USART

USB (DFU)

Шина CAN

I²C

SPI

Для каждого из этих коммуникационных периферийных устройств ST определила стандартизированный протокол, который позволяет:

Получать выпуск (релиз) загрузчика и поддерживаемые команды6.

Получать идентификатор (ID) микросхемы.

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

Записывать число байт в ОЗУ или Flash-память, начиная с адреса, указанного приложением хоста.

Стирать одну или несколько страниц/секторов Flash-памяти.

Переходить (Jump) к пользовательскому коду приложения, расположенному во внутренней Flash-памяти или в SRAM.

Включать/отключать защиту от чтения/записи для некоторых страниц/секторов.

Для каждого коммуникационного протокола ST предоставляет специальное руководство по применению, которое называется “PPP protocol used in STM32 bootloader” (Протокол PPP, используемый в загрузчике STM32), где PPP – это тип периферийного устройства. Например, AN31557 относится к протоколу USART.

Помимо используемого периферийного устройства, загрузчик использует несколько других аппаратных ресурсов:

HSI-генератор, который выбран в качестве источника тактового сигнала.

Таймер SysTick (не для всех коммуникационных периферийных устройств).

5На рисунке 4 в Главе 1 показана позиция системной памяти в 4ГБ адресном пространстве Cortex-M.

6Это не второстепенная функция, поскольку существуют разные версии загрузчиков STM32, и некоторые из них имеют незначительные отличия.

7http://www.st.com/content/ccc/resource/technical/document/applica-

tion_note/51/5f/03/1e/bd/9b/45/be/CD00264342.pdf/files/CD00264342.pdf/jcr:content/translations/en.CD00264342.pdf

Процесс начальной загрузки

581

Около 2 КБ памяти SRAM.

Периферийное устройство IWDG (предделитель сконфигурирован на максимальное значение, и IWDG периодически обновляется, чтобы предотвратить сброс в случае, если байт конфигурации аппаратного IWDG был ранее включен пользователем).

Кроме того, существуют некоторые ограничения в отношении управления памятью через загрузчик:

Некоторые микроконтроллеры STM32 не поддерживают операцию массового стирания. Чтобы выполнить массовое стирание с помощью загрузчика, доступно два варианта: стирать все сектора по одному с помощью команды стирания или установить уровень защиты от чтения Flash-памяти на Уровень 1, а затем установить его обратно на Уровень 0.

Микропрограмма загрузчика в серии STM32L1/L0 позволяет манипулировать EEPROM в дополнение к стандартной памяти (внутренняя Flash-память и SRAM,

байты конфигурации и системная память). Начальный адрес и размер этого типа памяти зависят от конкретного номера устройства по каталогу (P/N). EEPROM можно считывать и записывать, но нельзя стереть с помощью команды стирания. При записи в ячейку EEPROM микропрограмма загрузчика управляет операцией стирания этой ячейки перед любой записью. Запись в EEPROM должна быть выровнена по слову (адрес для записи должен быть кратным 4), а количество данных также должно быть кратным 4. Для стирания ячейки EEPROM вы можете записать нули в эту ячейку.

Микропрограмма загрузчика в серии STM32F2/F4/F7/L4 поддерживает память OTP в дополнение к стандартной памяти (внутренняя Flash-память и внутреннее

SRAM, байты конфигурации и системная память). Начальный адрес и размер этой области зависят от конкретного номера устройства по каталогу (P/N). Пожалуйста, обратитесь к справочному руководству для получения дополнительной информации. Память OTP может быть считана и записана, но не может быть стерта с помощью команды стирания. При записи в ячейку памяти OTP убедитесь, что соответствующий бит защиты не сброшен.

Для серий STM32F2/F4/F7 формат операции записи внутренней Flash-памяти зависит от диапазона напряжения. По умолчанию операции записи допускаются в однобайтовом формате (операции с полусловом, словом и двойным словом не допускаются). Чтобы увеличить скорость операций записи, пользователь должен применить соответствующий диапазон напряжения, который позволяет выполнять операции записи по полуслову, слову или двойному слову, и обновлять эту конфигурацию на лету с помощью программного обеспечения загрузчика. Некоторые виртуальные ячейки (virtual locations) зарезервированы для этой операции. Для получения дополнительной информации об этом, обратитесь к AN2606 от

ST8.

Для взаимодействия со встроенным загрузчиком по протоколу USART ST предоставляет удобный инструмент под названием STM32-FLASHER9, который представляет собой

8 http://www.st.com/content/ccc/resource/technical/document/application_note/b9/9b/16/3a/12/1e/40/0c/CD00167594.pdf/files/CD00167594.pdf/jcr:content/translations/en.CD00167594.pdf

9 http://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software- development-tools/stm32-programmers/flasher-stm32.html

Процесс начальной загрузки

582

инструмент для Windows, способный программировать микроконтроллеры STM32 с помощью загрузчика по USART. Он позволяет вам программировать вашу плату с помощью встроенного загрузчика и без необходимости в пользовательском приложении загрузки для ПК.

Если вместо этого ваша конечная печатная плата имеет порт USB-устройства, подключенный к микроконтроллеру через его предназначенные для этого выводы, вы можете подключить загрузчик микроконтроллера с помощью стандартного протокола USB об-

новления микропрограммы устройства (Device Firmware Upgrade, DFU) – независимого от производителя и устройства механизма обновления микропрограммы USB-устройств. ST предоставляет специальный набор инструментов, которые позволяют обновлять микропрограмму во Flash-памяти с использованием этого протокола. Более того, некоторые другие приложения с открытым исходным кодом, такие как инструмент dfu-util10, могут также использоваться в Windows, в Linux или MacOS. Для получения дополнительной информации о режиме DFU USB в загрузчиках STM32 см. руководство пользователя

UM041211 от ST.

22.2.1.Запуск загрузчика из встроенного программного обеспечения

Выбор выполнения встроенного загрузчика зависит от состояния выводов BOOT, которые выбираются в течение первых тактов. Тем не менее, для нескольких проектных решений вы не сможете сконфигурировать выводы BOOT при необходимости. По этой причине вы можете «перейти» в системную память из микропрограммы (например, пользователь должен будет нажимать скрытый переключатель).

Запуск выполнения загрузчика из пользовательского кода не так сложен: это просто определение указателя на функцию.

1__set_MSP(SRAM_END);

2uint32_t JumpAddress = *(volatile uint32_t*)(0x1FFF0000 + 4);

3void (*boot_loader)(void) = JumpAddress;

4 SYSCFG->MEMRMP = 0x1; // Перераспределить 0x0000 0000 на Системную память

5boot_loader();

6// Сюда никогда не приходим

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

ния памяти на системную память13.

10http://dfu-util.sourceforge.net/

11http://www.st.com/content/ccc/resource/technical/document/user_manual/3f/61/72/ff/c5/5a/4a/7b/CD00155676.pdf/files/CD00155676.pdf/jcr:content/translations/en.CD00155676.pdf

12Приведенный выше адрес 0x1FFF 0000 совпадает с начальным адресом системной памяти в микроконтроллере STM32F401RE; обратитесь к справочному руководству по вашему микроконтроллеру за точ-

ным значением.

13 Вероятно, физическое перераспределение памяти не является строго необходимым, поскольку загрузчик, кажется, делает то же самое.