Технология программирования микропроцессоров семейства STM32 с использованием ПО SimInTech и STM32CubeMX
Аннотация
ПО SimInTech включает в себя генератор СИ-кода, с помощью которого можно конвертировать проект, созданный в SimInTech в графическом виде с помощью блоков, в СИ-код. Генератор СИ-кода SimInTech использует шаблон сборки кода, в результате работы которого создается проект в IDE Keil v5 (либо в выбранном пользователем из предложенных), с помощью которого можно получить исполняемый образ программы и перенести его на микроконтроллер (МК) STM32. Шаблон сборки является алгоритмом, позволяющим упростить использование СИ-кода для выбранной целевой системы. В результате работы шаблона, полученный СИ-код может быть включен в проект в IDE для дальнейшей сборки и загрузки во флеш-память микроконтроллера. Кроме того, пользователь может сам создавать шаблоны сборки на базе существующих. Использование STM32CubeMX позволяет получить код настройки периферии МК STM32 и автоматически перенести его в секции главного файла проекта "main.c". Разработанные в ПО SimInTech библиотечные блоки обмена данными на базе библиотек HAL реализовывают обмен данными с периферией МК, а вся настройка периферии МК STM32 осуществляется с помощью инструмента STM32CubeMX от компании-разработчика МК STM32. Такое решение позволяет разрабатывать программное обеспечение для всей линейки МК STM32. Кроме того, используя библиотечные блоки пользователь может создавать свои уникальные решения (блоки) по обмену данными с устройствами ввода-вывода.
В данном руководстве демонстрируется технология программирования МК STM32F407 с использованием шаблона сборки "STM32F407VGT6_CubeMX".
Необходимое программное обеспечение
- STM32CubeMX – инструмент, который позволяет в графическом виде настраивать микроконтроллеры и микропроцессоры STM32, а также генерировать соответствующий код на языке Cи (ссылка для скачивания: https://www.st.com/en/development-tools/stm32cubemx.html).
- Keil uVision5 или иную среду разработки, используемую ПО STM32CubeMX при генерации СИ-кода (ссылка для скачивания: https://www.keil.com/demo/eval/arm.htm).
- ST-Link/V2 USB драйвер – драйвер, необходимый для корректного обнаружения компьютером платы STMicroelectronics Discovery или платы на базе процессора STM32F4xx (ссылка для скачивания: https://www.st.com/en/development-tools/stsw-link009.html).
Перед началом программирования также необходимо ознакомится с документом, расположенном в директории установки SimInTech "\SimInTech\doc\Программирование встраиваемых систем\Программирование встраиваемых систем под управлением микропроцессора\Генерация Си-кода для микропроцессоров с использованием SimInTech.pdf".
Технология программирования МК STM32 с помощью шаблона STM32F407VGT6_CubeMX


- Перейти в директорию, в которой установлен SimInTech, из директории шаблона
"\SimInTech\bin\CodeTemplates\STM32F407VGT6_CubeMX\CopyToPrt" скопировать в
рабочую директорию проекта "Rcv_Send_UART.prt" папку "src" (Рисунок 3).

Рис. 3. Окно проводника операционной системы, директория "\bin\CodeTemplates\STM32F407VGT6_CubeMX\CopyToPrt". - После чего необходимо настроить кодогенератор. Для этого в главном окне SimInTech
необходимо выбрать пункт "Кодогенератор" подпункт "Кодогенератор Си". В
открывшемся окне "Кодогенератор Си" во вкладке "Загрузка" нажать кнопку
"Добавить файлы", в открывшемся окне проводника перейти в директорию с текущим
проектом и выбрать файл "Rcv_Send_UART.prt". В результате окно будет выглядеть
согласно рисунку (Рисунок
4).

Рис. 4. Окно настройки "Кодогенератор Си", вкладка "Загрузка", с добавленным проектом. - В окне "Кодогенератор Си" во вкладке "Настройки" в пункте "Директория
исходников" указать ".\src\STM32F407VGT6_CubeMX\Core\Src\" для сохранения
исходных файлов программы, получаемых в результате работы кодогенератора, в указанную
директорию (данная директория уже содержится в скопированной на первом шаге папке
"src"), в строке "Директория шаблона кода" выбрать из выпадающего списка
"%codetemplates%STM32F407VGT6_CubeMX\" (Рисунок 5). Также
пользователь может сам создавать шаблоны кода на базе существующих и использовать их для
кодогенерации.

Рис. 5. Окно настройки "Кодогенератор Си", вкладка "Настройки", с выделенными свойствами, которые необходимо изменить. Сохранить файл настройки параметров, на вкладке "Загрузка" нажав на кнопку "Сохранить конфигурацию", в открывшемся окне проводника операционной системы сохранить файл под именем "Gen_set.alt" или задать желаемое имя файла.
Прим.:произвести настройку кодогенератора возможно путем загрузки файла конфигураций. Для этого необходимо скопировать из директории "\SimInTech\bin\CodeTemplates\STM32F407VGT6_CubeMX\CopyToPrt" файл "SimGenKod.alt" в директорию с текущим проектом. После чего на вкладке "Загрузка" окна "Кодогенератор Си" нажать кнопку "Загрузить конфигурацию", перейти в директорию с текущим проектом и выбрать файл "SimGenKod.alt". В результате загрузки файла настройки кодогенератора изменятся и будут соответствовать указанным выше (Рисунок 5). Добавить файл проекта, аналогично второму шагу. - После настройки кодогенератора для генерации кода необходимо на вкладке
"Загрузка" нажать на кнопку "Пересобрать модули и конфигурацию" (Рисунок 6). Также
сгенерировать код возможно вторым способом, выбрав в главном окне SimInTech пункт
"Инструменты" подпункт "Сгенерировать программу". Далее для генерации
кода используется только первый способ.

Рис. 6. Окно настройки "Кодогенератор Си", вкладка "Загрузка", с выделенной кнопкой "Пересобрать модули и конфигурацию". В результате в директории, определенной в настройках инструмента генерации СИ-кода (Рисунок 5), кодогенератор создаст новые файлы, содержащие исходные коды Си, соответствующие проекту "Rcv_Send_UART.prt" (Рисунок 7).
Рис. 7. Окно проводника операционной системы, директория "\src\STM32F407VGT6_CubeMX\Core\Src" с созданными кодогенератором файлами. - После этого необходимо перейти в директорию "src\STM32F407VGT6_CubeMX",
расположенную в директории с текущим проектом (Рисунок 8), и запустить
проект STM32CubeMX "STM32F407VGT6_CubeMX.ioc".

Рис. 8. Окно проводника операционной системы с выделенным файлом, который необходимо открыть. - В открывшемся проекте в ПО STM32CubeMX произвести настройку используемых в проекте
"Rcv_Send_UART.prt" контроллеров устройств ввода-вывода МК STM32. Для этого во
вкладке "Pinout & Configuration" выполнить следующие шаги:
- В выпадающем списке "System Core" в пункте "DMA" на вкладке "DMA1" выбрать строку "USART2_TX" и удалить, нажатием кнопки "Delete".
- В пункте "GPIO" на вкладках "ADC" выделить первую строку, при этом
соответствующий контакт будет мигать черным цветом на схематическом представлении на
вкладке "Pinout view". Нажатием левой кнопки мыши по этому контакту вызвать
контекстное меню и выбрать пункт "Reset_State", при этом контакт окрасится в
серый цвет. Повторить действия для контактов на всех вкладках "DAC",
"ETH", "RCC" и "USART". После чего вызвать меню контакта
"PD6" и выбрать пункт "USART2_RX", для контакта "PD5" выбрать
пункт "USART2_TX" (Рисунок 9).

Рис. 9. Окно ПО STM32CubeMX с открытым проектом "STM32F407VGT6_CubeMX.ioc" с контекстным меню контакта "PD6". - В выпадающем списке "Connectivity" в пункте "USART2" в строке
"Mode" выбрать "Asynchronous", в поле "Configuration" на
вкладке "NVIC Settings" активировать параметр "Enabled" в строке
"USART2 global interrupt" (Рисунок 10). В результате чего контакты будут подсвечивать
зеленым цветом, а в выпадающем списке "System Core" в пункте "NVIC" на
вкладках "NVIC" и "Code generation" появятся соответствующие строки
"USART2 global interrupt", которые будут активированы. После всех настроек
графическое представление контактов на вкладке "Pinout view" должно
соответствовать рисунку (Рисунок 10).

Рис. 10. Окно ПО STM32CubeMX с открытым проектом "STM32F407VGT6_CubeMX.ioc" с выделенными параметрами "USART2", которые необходимо изменить.
- После завершения настроек необходимо в ПО STM32CubeMX нажать на кнопку "GENERATE
CODE", в результате будет сгенерирован СИ-код настроек контроллеров используемой
периферии МК и этот код будет помещен в главный файл проекта "main.c" в секции
инициализации периферии. Одновременно ПО STM32CubeMX создаст проект
"STM32F407VGT6_CubeMX.uvprojx" в директории
"src\STM32F407VGT6_CubeMX\MDK-ARM" по умолчанию в IDE Keil v5 (Рисунок 11). Также в ПО
STM32CubeMX есть возможность выбрать другую IDE во вкладке "Project Manager" в
пункте "Toolchain/IDE" (Рисунок 12).

Рис. 11. Окно проводника операционной системы со сгенерированными файлами настроек МК. 
Рис. 12. Окно ПО STM32CubeMX вкладка "Project Manager". Созданный проект "STM32F407VGT6_CubeMX.uvprojx" будет включать в себя СИ-код алгоритма "Rcv_Send_UART.prt" и СИ-код настроек контроллеров периферии МК (Рисунок 13), после компиляции исполняемый образ программы может быть транслирован во флеш-память МК.
Рис. 13. Окно IDE Keil v5 с загруженным проектом "STM32F407VGT6_CubeMX.uvprojx".
Структура созданного генератором Си-кода проекта подробно описана в документе, расположенном в директории установки SimInTech"\SimInTech\doc\Программирование встраиваемых систем\Программирование встраиваемых систем под управлением микропроцессора\Генерация Си-кода для микропроцессоров с использованием SimInTech.pdf". В этом документе подробно рассматривается включение в проект СИ-кода полученного с помощью инструмента генерации СИ-кода ПО SimInTech, а также подробно описывается технология создания блоков обмена данными с контроллерами устройств ввода-вывода. Особенность рассматриваемой технологии заключается в том, что ПО STM32CubeMX помещает СИ-код настроек контроллеров периферии и не требуется самостоятельно разрабатывать библиотечные блоки инициализации контроллеров периферии, используемые библиотечные блоки будут реализовывать только обмен данными (чтение/запись).
Подключение МК STM32 к ПК и загрузка кода в МК STM32
Для компиляции программного кода проекта "STM32F407VGT6_CubeMX.uvprojx" необходимо в главном окне IDE Keil v5 нажать на кнопку "Project" и выбрать пункт "Build Target". После завершения компиляции необходимо убедиться, что она произведена успешно и ошибки отсутствуют: в окне "Build Output" будут отображаться предупреждения и ошибки или информация об их отсутствии.

- с помощью адаптера USART-USB, подключенного к STM32F407 USART2 к разъемам, выбранным на шаге 6 в ПО STM32CubeMX: P2 pin 30 (PD5: USART2_TX) и P2 pin 29 (PD6: USART2_RX);
-
используя провода для подключения виртуального COM-порта ST-LINK: разъемы U2 pin 12 (ST-LINK_TX) и U2 pin 13 (ST-LINK_RX), к STM32F407 USART2 к разъемам, выбранным на шаге 6 в ПО STM32CubeMX: P2 pin 30 (PD5: USART2_TX) и P2 pin 29 (PD6: USART2_RX).
Запуск моделирования
После завершения генерации Си-кода, подключения МК к ПК и загрузки кода во флеш-память МК, для проверки работоспособности сгенерированного кода необходимо открыть проект "Send_Rcv_signal.prt" (Рисунок 2). Данный проект предназначен для передачи и отображения данных, принимаемых по UART интерфейсу.
Перед началом моделирования необходимо в свойствах блока "RS - Асинхронный обмен" в выпадающем списке "Параметры RS подключения" изменить значение свойства "Номер последовательного порта" согласно указанному номеру COM-порта адаптера USART-USB (при соединении первым способом) в диспетчере устройств ПК.
После чего запустить проект на моделирование нажатием на кнопку "Пуск" на панели кнопок окна проекта SimInTech. При запуске проекта "Send_Rcv_signal.prt" на моделирование на персональном компьютере будут генерироваться периодически изменяющиеся сигналы, передаваться на микроконтроллер STM32 по интерфейсу UART и считываться от микроконтроллера STM32 по интерфейсу UART отправленные обратно сигналы.

Запуск проектов с разной частотой дискретизации
Выполнение проектов с разной частотой дискретизации на МК происходит в контексте прерываний таймеров общего вида. Для решения этой задачи используется библиотечный блок "STM32 TIMER SHED". Он определяет в прерывании какого таймера будет вызван на выполнение алгоритм проекта. Пример проектов с разной частотой дискретизации расположен в директории "\SimInTech\Demo\Microprocessors\Examples-STM32\TIMER_TASK".

Подготовка проектов для генерации Си-кода и структура проекта, полученного в результате генерации СИ-кода нескольких проектов, подробно описана в первой главе документа "\SimInTech\doc\Программирование встраиваемых систем\Программирование встраиваемых систем под управлением микропроцессора\Генерация Си-кода для микропроцессоров с использованием SimInTech.pdf".
Изменение библиотечных блоков
- Выбрать блок, который необходимо изменить, нажатием правой кнопки мыши вызвать
контекстное меню блока и в пункте "Действие" выбрать "Разблокировать"
(Рисунок 17).

Рис. 17. Контекстное меню блока "STM32 - I2C - Передача данных в комбинированной транзакции" с выделенным пунктом "Действия" подпунктом "Разблокировать". - Для редактирования кода необходимо двойным нажатием левой кнопки мыши по изменяемому блоку открыть окно редактора блока и отредактировать СИ-код, содержащийся в секциях "data", "code", "state". После ввода всего текста скрипта нажать на кнопку "Закрыть и применить" для принятия изменений в блоке и закрытия окна редактора.
- При разработке новых блоков и изменении существующих блоков требуется, чтобы тип
нового блока имел уникальное наименование, чтобы при новом открытии проекта не
производилась замена исправленного блока на библиотечный. Для изменения типа блока
необходимо в окне "Свойства" исправленного блока во вкладке "Общие"
изменить значение свойства "Тип элемента", например, добавив текст (Рисунок 18).

Рис. 18. Окно "Свойства" блока "STM32 - I2C - Передача данных в комбинированной транзакции" с выделенным свойством, которое необходимо изменить.