Микроконтроллеры STM32 из группы Connectivity Line, в которую входят STM32F105 и STM32F107, могут быть запрограммированы двумя основными способами: с помощью интерфейса JTAG и с помощью загрузчика, расположенного в памяти микроконтроллера.
При использовании JTAG необходимо иметь соответствующий аппаратный интерфейс. Использование загрузчика, встроенного в микроконтроллеры Connectivity Line позволяет программировать флэш-память через один из нескольких интерфейсов связи. В данной статье мы расскажем, как запрограммировать память с помощью класса USB-интерфейса DFU (Device Firmware Upgrade).
Загрузчик находится в системной памяти микроконтроллеров STM32F105 и STM32F107. Он обеспечивает три основных канала связи по которым вы можете загрузить программу во флэш-память: UART, CAN и USB — класс DFU. Загрузчик, используемый в микроконтроллерах STM32F105 и STM32F107 стандартно оснащен поддержкой DFU.
Некоторые микроконтроллеры из группы Connectivity Line имеют недостаток, который иногда препятствует использованию загрузчика. Этот дефект у микроконтроллеров из серии помеченных кодом даты производства менее 937, и влияет на работу всех каналов связи с загрузчиком.
Перед началом работы нам необходимо подключить к источнику питания линии GPIO: PA10, PB5 и PD6 (рис. 1). Вы также должны установить логическую «1» в BOOT0 и «0» в BOOT1. После выполнения этих действий и подключения источника питания микроконтроллер должен запускаться из системной памяти.
Рис. 1. Фрагмент электрической схемы устройства с микроконтроллером STM32F107, запрограммированным в режиме DFU
Программирование с использованием механизма DFU — это довольно сложная работа. Первым шагом является загрузка и установка приложения DfuSe. В каталоге приложения есть контроллер класса DFU, который должен быть установлен для того, чтобы приложение связывалось с микроконтроллером.
Для этого соедините плату с микроконтроллером с помощью кабеля USB A-B с ПК. Windows должна обнаружить новое устройство DFU и начать установку драйверов. После того, как мастер попросит автоматически найти подходящий драйвер, он должен найти соответствующий драйвер и установить его.
Во время установки вам может быть предложено указать местоположение файла STTub30.sys (вы должны указать файл в подкаталоге, соответствующем вашей версии операционной системы), а также информацию о что драйвер не был подписан цифровой подписью. Установка драйвера должна завершиться сообщением об его успешном завершении.
После установки драйвера запустите демонстрационную программу DfuSe (рис. 2). Программа должна обнаружить микроконтроллер, расположенный на плате, как устройство STM в режиме DFU. В поле DFU Mode отображаются данные, идентифицирующие устройство USB: VID, PID и номера версий.

Рис. 2. Окно демонстрационной программы DfuSe
Микроконтроллер STM32F107VBT6 имеет две программируемые области памяти:
- Internal Flash, представляющая Flash-память и
- Option Bytes, представляющие байты конфигурации.
Чтобы запрограммировать память, необходимо подготовить файл *.dfu, который, помимо данных, подлежащих программированию, также содержит данные, идентифицирующие версию приложения устройства, для которого этот файл предназначен.
Поскольку механизм DFU предназначен для обновления программного обеспечения, он обычно является дополнением к программному обеспечению, встроенному в устройство, которое использует интерфейс USB для других целей.
Используя механизм DFU для программирования памяти микроконтроллеров STM32, мы фактически не обновляем программное обеспечение, а только загружаем его «первую» версию, поэтому данные, идентифицирующие устройство и версию установленного программного обеспечения, не имеют значения.
Программа DFU File Manager используется для подготовки файлов *.dfu (рис. 3). Первое действие, которое необходимо выполнить после запуска программы, — это выбрать операцию, которую вы хотите выполнить.
Рис. 3. Окно файлового менеджера DFU
Мы можем выбрать: создание файла *.dfu из двоичных файлов или восстановление двоичных файлов из файла *.dfu. Нас интересует опция «I want to GENERATE a DFU file…». После его выбора появится окно для ввода параметров созданного файла DFU (рис. 4).
Рис. 4. Окно для ввода параметров созданного файла DFU
Идентификатор поставщика, идентификатор продукта и номера версий не имеют значения, поэтому оставьте их без изменений. Единственным важным параметром является параметр Target ID, который в случае внутренней флэш-памяти микроконтроллера равен 0.
Преимущество механизма DFU заключается в возможности помещать в один файл DFU данные для нескольких разных запоминающих устройств, включая внешние запоминающие устройства, подключенные, например, через последовательные шины. Нажав кнопку «S19 или шестнадцатеричный», укажите файл, содержащий код, подлежащий программированию для памяти микроконтроллера. После выбора файла кода нажмите кнопку «Generate» и укажите расположение и имя выходного файла *.dfu. Успешная генерация файла будет указана в соответствующем сообщении (рис. 5).
Рис. 5. Информация о правильно завершенной генерации файла DFU
После создания файла *.dfu перезапустите демонстрационную программу DfuSe, а затем загрузите ранее созданный файл *.dfu (рис. 6). После успешной загрузки файла *.dfu будет отображена информация о его содержимом. Чтобы запрограммировать флэш-память, нажмите кнопку «Upgrade».
Рис. 6. Окно демонстрационной программы DfuSe после успешной загрузки файла *.dfu
Появится сообщение, показанное на рис. 7, информирующее вас о том, что невозможно проверить, загружается ли файл *.dfu на правильное устройство. Подтвердите свою готовность продолжить процесс загрузки, нажав кнопку «Yes».
Рис. 7. Сообщение о том, что невозможно проверить, загружается ли файл *.dfu на правильное устройство
Успешная загрузка программы во флэш-память будет указана в соответствующем сообщении (рис. 8).
Рис. 8. Сообщение о правильном сохранении флэш-памяти микроконтроллера
Подготовка файла *.dfu из файла *.hex довольно громоздка и делает метод программирования памяти с использованием механизма DFU не очень полезным на этапе создания программы. Как упоминалось ранее, механизм DFU был разработан для простого обновления программного обеспечения в операционных устройствах, и его полезность на этапе производства вызывает много споров.
Программирование с использованием DFU следует рассматривать как «экстренное» решение при отсутствии памяти для программирования с другим, более удобным способом программирования памяти.
