Технология программирования микропроцессоров семейства STM32 с использованием ПО SimInTech и STM32CubeMX

Аннотация

ПО SimInTech включает в себя генератор СИ-кода, с помощью которого можно конвертировать проект, созданный в SimInTech в графическом виде с помощью блоков, в СИ-код. Генератор СИ-кода SimInTech использует шаблон сборки кода, в результате работы которого создается проект в IDE Keil v5 (либо в выбранном пользователем из предложенных), с помощью которого можно получить исполняемый образ программы и перенести его на микроконтроллер (МК) STM32. Шаблон сборки является алгоритмом, позволяющим упростить использование СИ-кода для выбранной целевой системы. В результате работы шаблона, полученный СИ-код может быть включен в проект в IDE для дальнейшей сборки и загрузки во флэш-память микроконтроллера. Кроме того, пользователь может сам создавать шаблоны сборки на базе существующих. Использование STM32CubeMX позволяет получить код настройки периферии МК STM32 и автоматически перенести его в секции главного файла проекта «main.c». Разработанные в ПО SimInTech библиотечные блоки обмена данными на базе библиотек HAL реализовывают обмен данными с периферией МК, а вся настройка периферии МК STM32 осуществляется с помощью инструмента STM32CubeMX от компании-разработчика МК STM32. Такое решение позволяет разрабатывать программное обеспечение для всей линейки МК STM32. Кроме того, используя библиотечные блоки пользователь может создавать свои уникальные решения (блоки) по обмену данными с устройствами ввода-вывода.

В данном руководстве демонстрируется технология программирования МК STM32F407 с использованием шаблона сборки «STM32F407VGT6_CubeMX».

Необходимое программное обеспечение

Для программирования микропроцессоров семейства STM32 с использованием ПО SimInTech и STM32CubeMX необходимо установить следующее программное обеспечение:
  1. STM32CubeMX – инструмент, который позволяет в графическом виде настраивать микроконтроллеры и микропроцессоры STM32, а также генерировать соответствующий код на языке Cи (ссылка для скачивания: https://www.st.com/en/development-tools/stm32cubemx.html).
  2. Keil uVision5 или иную среду разработки, используемую ПО STM32CubeMX при генерации СИ-кода (ссылка для скачивания: https://www.keil.com/demo/eval/arm.htm).
  3. 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

Для демонстрации технологии программирования МК STM32 с использованием шаблона сборки «STM32F407VGT6_CubeMX» будет использоваться проект, разработанный в ПО SimInTech, в котором демонстрируется работа с UART интерфейсом микроконтроллера семейства STM32. Данный пример расположен в директории, в которой установлен SimInTech, в директории «\SimInTech\Demo\Microprocessors\Examples-STM32\UART». Проект «Rcv_Send_UART.prt», расположенный в указанной директории, содержит алгоритм работы микроконтроллера STM32 (Рисунок 1).

Рисунок 1. Окно проекта с демо-примером «Rcv_Send_UART.prt».

Проект «Send_Rcv_signal.prt», расположенный в указанной директории, предназначен для передачи и отображения данных, принимаемых по UART интерфейсу (Рисунок 2). Для запуска примера необходимо сгенерировать представленный алгоритм работы (проект «Rcv_Send_UART.prt») в код на языке Си и загрузить его в микроконтроллер STM32. На приемник МК STM32 будут поступать сгенерированные сигналы от персонального компьютера с SimInTech по UART интерфейсу и передаваться обратно по UART интерфейсу на персональный компьютер с SimInTech.

Рисунок 2. Рабочая область окна проекта демо-примера «Send_Rcv_signal.prt».

Для генерации СИ-кода проекта «Rcv_Send_UART.prt» и автоматического создания проекта в IDE Keil v5 (или другой выбранной IDE), необходимо:
  1. Перейти в директорию, в которой установлен SimInTech, из директории шаблона «\SimInTech\bin\CodeTemplates\STM32F407VGT6_CubeMX\CopyToPrt» скопировать в рабочую директорию проекта «Rcv_Send_UART.prt» папку «src» (Рисунок 3).

    Рисунок 3. Окно проводника операционной системы, директория «\bin\CodeTemplates\STM32F407VGT6_CubeMX\CopyToPrt».

  2. После чего необходимо настроить кодогенератор. Для этого в главном окне SimInTech необходимо выбрать пункт «Кодогенератор» подпункт «Кодогенератор Си». В открывшемся окне «Кодогенератор Си» во вкладке «Загрузка» нажать кнопку «Добавить файлы», в открывшемся окне проводника перейти в директорию с текущим проектом и выбрать файл «Rcv_Send_UART.prt». В результате окно будет выглядеть согласно рисунку (Рисунок 4).

    Рисунок 4. Окно настройки «Кодогенератор Си», вкладка «Загрузка», с добавленным проектом.

  3. В окне «Кодогенератор Си» во вкладке «Настройки» в пункте «Директория исходников» указать «.\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). Добавить файл проекта, аналогично второму шагу.
  4. После настройки кодогенератора для генерации кода необходимо на вкладке «Загрузка» нажать на кнопку «Пересобрать модули и конфигурацию» (Рисунок 6). Также сгенерировать код возможно вторым способом, выбрав в главном окне SimInTech пункт «Инструменты» подпункт «Сгенерировать программу». Далее для генерации кода используется только первый способ.

    Рисунок 6. Окно настройки «Кодогенератор Си», вкладка «Загрузка», с выделенной кнопкой «Пересобрать модули и конфигурацию».

    В результате в директории, определенной в настройках инструмента генерации СИ-кода (Рисунок 5), кодогенератор создаст новые файлы, содержащие исходные коды Си, соответствующие проекту «Rcv_Send_UART.prt» (Рисунок 7).

    Рисунок 7. Окно проводника операционной системы, директория «\src\STM32F407VGT6_CubeMX\Core\Src» с созданными кодогенератором файлами.

  5. После этого необходимо перейти в директорию «src\STM32F407VGT6_CubeMX», расположенную в директории с текущим проектом (Рисунок 8), и запустить проект STM32CubeMX «STM32F407VGT6_CubeMX.ioc».

    Рисунок 8. Окно проводника операционной системы с выделенным файлом, который необходимо открыть.

  6. В открывшемся проекте в ПО 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», которые необходимо изменить.

  7. После завершения настроек необходимо в ПО 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» будут отображаться предупреждения и ошибки или информация об их отсутствии.

Если компиляция прошла успешно, то для загрузки программы во флэш-память МК необходимо подключить отладочную плату с МК STM32 к персональному компьютеру с SimInTech через USB, после обнаружения устройства необходимо в главном меню окна IDE Keil нажать на кнопку«Flash» и выбрать пункт «Download». По завершении загрузки необходимо убедиться, что программирование завершено успешно: в окне «Build Output» должны быть выведены сообщения аналогичные рисунку (Рисунок 14).

Рисунок 14. Окно IDE Keil v5 с сообщениями об успешной загрузке кода проекта «STM32F407VGT6_CubeMX.uvprojx» на МК STM32F407VGT6.

Если используется отладочная плата, в которой ST-Link поддерживает виртуальный COM-порт (VCP), но эти выводы не подключены к USART микроконтроллера STM32, то для подключения STM32 USART к VCP на ПК необходимо воспользоваться одним из способов, указанных в документации к используемой плате. Для рассматриваемой платы STM32F407VG возможны два способа соединения, указанные в документации к данной плате (ссылка на документацию: https://www.st.com/resource/en/user_manual/dm00039084-discovery-kit-with-stm32f407vg-mcu-stmicroelectronics.pdf):
  • с помощью адаптера 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 отправленные обратно сигналы.

В процессе моделирования будут строиться графики зависимости полученного сигнала от времени. Графики должны выглядеть согласно рисунку (Рисунок 15).

Рисунок 15. График зависимости выходных сигналов от времени.

Запуск проектов с разной частотой дискретизации

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

В данном проекте необходимо обратить внимание на настройку генератора СИ-кода. Для загрузки файла настроек кодогенератора необходимо в главном окне SimInTech выбрать пункт «Кодогенератор» подпункт «Кодогенератор Си», на вкладке «Загрузка» окна «Кодогенератор Си» нажать кнопку «Загрузить конфигурацию», перейти в директорию с текущим проектом и выбрать файл «Gen_Set.alt». В окне проектов добавлены три проекта: Си-функции проектов «ADC_DAC.prt», «Toggle_pin.prt» будут вызываться на исполнение при возникновении прерывания переполнения таймеров по истечении заданного периода, а Си-функция проекта «Timer_Shed.prt» – в основном цикле программы главной функции «main.c» (Рисунок 16). Для генерации кода необходимо на вкладке «Загрузка» нажать на кнопку «Пересобрать модули и конфигурацию».

Рисунок 16. Окно настройки «Кодогенератор Си» с загруженной конфигурацией «Gen_Set.alt» демо-примера «TIMER_TASK».

Подготовка проектов для генерации Си-кода и структура проекта, полученного в результате генерации СИ-кода нескольких проектов, подробно описана в первой главе документа «\SimInTech\doc\Программирование встраиваемых систем\Программирование встраиваемых систем под управлением микропроцессора\Генерация Си-кода для микропроцессоров с использованием SimInTech.pdf».

Изменение библиотечных блоков

Если необходимо модифицировать блоки, содержащиеся в библиотеке «STM32», то требуется выполнить следующие шаги:
  1. Выбрать блок, который необходимо изменить, нажатием правой кнопки мыши вызвать контекстное меню блока и в пункте «Действие» выбрать «Разблокировать» (Рисунок 17).

    Рисунок 17. Контекстное меню блока «STM32 - I2C - Передача данных в комбинированной транзакции» с выделенным пунктом «Действия» подпунктом «Разблокировать».

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

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