Запуск .Net Micro Framework 4.4 на STM32F4Discovery

в 6:48, , рубрики: .net, .net micro framework, internet of things, microsoft, Интернет вещей, Программирование, программирование микроконтроллеров, Разработка для интернета вещей

Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 1
.Net Micro Framework — технология, позволяющая писать приложения для микроконтроллеров используя всю мощь управляемого кода и Visual Studio. Она существует давно и сейчас переживает второе рождение. Вокруг нее сформирован open-source проект, который не так давно переехал на GitHub. Однако пока еще это не “коробочный” продукт. Работа с .Net Micro Framework требует определенных навыков. В прошлый раз я писал про то, как создать и запустить простое ”Hello world” приложение на эмуляторе для Windows. Сейчас речь пойдет о том, как поработать с .Net Micro Framework на настоящем “железе” — отладочной плате STM32F4Discovery.

Плата достаточно распространена и может быть приобретена, например, тут. Начиная с версии 4.4 порт для этой платы входит в дистрибутив netmf-interpreter. Ранее он существовал как отдельный проект.

В интернете и, в частности, на хабре можно найти материалы про запуск .Net Micro Framework на этой плате, но во-первых в них говорится о версии 4.3, а во-вторых там используются уже готовая сборка. Я же расскажу о том, как скомпилировать и запустить на STM32F4Discovery .Net Micro Framework версии 4.4 во всех подробностях. Статья будет длинная, так как нужно будет исправить несколько ошибок в дистрибутиве и скачать и установить несколько утилит и драйверов.

Подготовка к компиляции

Дистрибутив

В первую очередь нужно иметь сам дистрибутив.

Репозиторий находится тут. Можно скачать его как zip-архив, а можно получить, используя git. Инструкции на английском языке о том, как получить репозиторий и собрать из него установочные файлы, можно посмотреть тут. На основе этих инструкций и написана статья. Версии репозитория, связанные с конкретными релизами, можно скачать в zip-архивах тут.

Чтобы получить репозиторий с помощью git, нужно сделать следующее:

  1. Создать публичную копию на вашем аккаунте на серверах GitHub сделав fork. Все pull-запросы должны идти с публичного GitHub репозитория.
  2. Получить локальную копию репозитория, используя clone. Например, вот так:

    git clone https://github.com/<your GitHub ID>/netmf-interpreter.git

    Важно: При выборе пути для локального репозитория нужно обязательно сделать хотя бы одну родительскую папку. Например, D:NETMFrepo, где repo — папка для репозитория. Это требуется для его правильной сборки.
  3. Настроить локальный репозиторий, как Upstream. Это позволит получать с помощью pull изменения с последних официальных коммитов и разбирать все несоответствия при получении кода локально до выполнения запроса pull. Для настройки Upstream можно использовать следующую команду:

    git remote add upstream https://github.com/NETMF/netmf-interpreter.git

Важно: Требования к локальному пути (должна быть хотя бы одна родительская папка — см. п 2 работы с git) актуальны и при распаковке репозитория из архива.

К сожалению, релиз .NET Micro Framework v4.4 Release To Web (RTW) содержит ошибки, которые не позволяют сразу собрать установочные файлы из репозитория. Однако, эти ошибки можно исправить, и далее я расскажу как это сделать.
После того, как репозиторий тем или иным способом оказался скопирован в локальную папку, нужно сделать следующее:

  1. Скачать binary tools zip файл. Этот файл содержит утилиты, необходимые для сборки как установочных файлов, так и “портов” для устройств. В будущем планируется отказаться от этих утилит, но пока еще они нужны.
  2. Разархивировать содержимое binary tools zip-файла в родительскую папку репозитория. Например для пути D:NETMFrepo, где repo — папка для репозитория, папки bin и tools должны оказаться в папке D:NETMF.
  3. Важно: В файле

    <repo folder>FrameworkToolsBuildTasksInternalBuildSignerBuildSignerSpotBuild.csproj

    в строке 37 нужно заменить

    <HintPath>$(MSBuildProgramFiles32)Microsoft InternalCodesign.SubmitterCODESIGN.Submitter.dll</HintPath>

    на

    <HintPath>$(SPOROOT)toolsx86CODESIGNCODESIGN.Submitter.dll</HintPath>

    Это исправление первой ошибки. Без такой замены собрать репозиторий не удастся. Как было сказано выше, .Net Micro Framework это open source проект и, к сожалению, он сталкивается с теми же проблемами, что и другие открытые проекты. Это исправление необходимо только для релиза .NET Micro Framework v4.4 Release To Web (RTW). В дальнейшем репозиторий уже будет содержать поправленные файлы. Про эту проблему можно почитать тут.

  4. Нужно скачать библиотеку CMSIS и положить ее в папку
    <repo folder>СMSIS.
    Где ее брать и какая именно версия нужна, написано в файле
    <repo folder>СMSISReadMe.md.

    CMSIS расшифровывается как Cortex Microcontroller Software Interface Standart. Это не зависящая от конкретного производителя библиотека для работы с ядром Cortex-M, поставляемая и поддерживаемая разработчиками ядра — компанией ARM. Использование этой библиотеки позволяет существенно упростить создание “портов” на разные микроконтроллеры разных производителей.

    В случае с версией .Net Micro Framework 4.4 нужно скачать CMSIS не ниже версии 4.3. Библиотека поставляется в виде zip-архива (CMSIS-SP-00300-r4p3-00rel0.zip). Ее можно скачать на сайте ARM. Содержимое архива нужно положить в папку <repo folder>СMSIS.

  5. Далее нужно установить .Net Micro Framework Cryptographic Libraries. Эти библиотеки используются для подписи сборок, которые будут исполняться на микроконтроллерах. Для работы нужны только исполняемые файлы криптографической библиотеки. Но, при желании, можно узнать как она устроена, так как можно посмотреть и исходные коды.

    Библиотеки доступны в виде установочного msi файла. Я рекомендую установить их в любую удобную папку (далее будем называть ее
    <crypto install folder>
    ), а затем копировать их в корень каждого репозитория, например D:NETMFrepo и D:NETMFrepo_master.

Дистрибутив представляет собой сложную структуру с огромным количеством перекрестных ссылок. Объединено все это с помощью проекта для MSBuild. Файлы проекта внешне выглядят как знакомые всем sln и proj файлы для Visual Studio, однако внутри у них более сложная структура. Именно поэтому использовать Visual Studio для сборки не получится.

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

<repo folder>SolutionsSTM32F4DISCOVERY

а собранные бинарные и hex файлы появятся в папке

<repo folder>BuildOutput

Visual Studio

MSBuild входит в состав Visual Studio. В документации к .netmf interpreter 4.4 указано, что поддерживаются редакции Visual Studio 2015 Community, Pro и Ultimate, так что для успешной сборки порта нужно установить одну из них.

Компилятор ARM

Далее нужен компилятор для ARM. Предусмотрена работа с двумя компиляторами:

Компилятор RealView входит в состав средства разработки Keil MDK. Бесплатная версия имеет ограничение в 32 кб кода, однако порт имеет больший объем, поэтому обязательно нужна лицензия, например 7-Day MDK-Professional Trial License. Про установку Keil MDK 5 можно прочитать тут.
Он должен быть установлен по умолчанию в папку
C:Keil_v5
.

GCC бесплатен, но генерируемые им прошивки имеют на 10% больший объем, чем сгенерированные компилятором RealView. GCC ARM Embedded можно скачать в виде архива и распаковать содержимое в любое место. Папку с распакованным содержимым архива я буду далее называть
<gcc folder>
.

Компиляция с помощью ARM RealView Compilation tools

В дистрибутиве уже сделаны настройки компиляции для версий MDK 3.1, 3.80a, 4.12, 4.13, 4.54, 5.04, 5.05. Если нужно использовать другую версию, то можно добавить несколько строк в файл

<repo folder>toolsTargetsMicrosoft.Spot.system.mdk.targets

Я использовал версию 5.06. Для этого после строк


<CC Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.05'">"$(MDK_TOOL_PATH)ARMCCbinarmcc.exe"</CC>
<CPP Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.05'">"$(MDK_TOOL_PATH)ARMCCbinarmcc.exe"</CPP>
<AS Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.05'">"$(MDK_TOOL_PATH)ARMCCbinarmasm.exe"</AS>
<LINK Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.05'">"$(MDK_TOOL_PATH)ARMCCbinarmlink.exe"</LINK>
<AR Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.05'">"$(MDK_TOOL_PATH)ARMCCbinarmar.exe"</AR>
<FROMELF Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.05'">"$(MDK_TOOL_PATH)ARMCCbinfromelf.exe"</FROMELF>
<MdkCrtLibLinkSwitch Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.05'">$(MdkCrtLibLinkSwitch) $(SWTC)libpath $(MDK_TOOL_PATH)ARMCCLIB</MdkCrtLibLinkSwitch>

я добавил строки


<CC Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.06'">"$(MDK_TOOL_PATH)ARMCCbinarmcc.exe"</CC>
<CPP Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.06'">"$(MDK_TOOL_PATH)ARMCCbinarmcc.exe"</CPP>
<AS Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.06'">"$(MDK_TOOL_PATH)ARMCCbinarmasm.exe"</AS>
<LINK Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.06'">"$(MDK_TOOL_PATH)ARMCCbinarmlink.exe"</LINK>
<AR Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.06'">"$(MDK_TOOL_PATH)ARMCCbinarmar.exe"</AR>
<FROMELF Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.06'">"$(MDK_TOOL_PATH)ARMCCbinfromelf.exe"</FROMELF>
<MdkCrtLibLinkSwitch Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.06'">$(MdkCrtLibLinkSwitch) $(SWTC)libpath $(MDK_TOOL_PATH)ARMCCLIB</MdkCrtLibLinkSwitch>

Теперь можно приступать к компиляици. Нужно открыть командную строку и перейти в папку с репозиторием, например так:

cd /d D:WORKDIRNetMfNetMFReporepo

затем нужно установить переменные окружения, выполнив:

setenv_mdk 5.06

Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 2

После чего перейти к папке с портом (<repo folder>SolutionsSTM32F4DISCOVERY). Например, так:

cd /d D:WORKDIRNetMfNetMFReporepoSolutionsSTM32F4DISCOVERY

Теперь можно запускать компиляцию используя, например, такую команду:


msbuild dotnetmf.proj /p:flavor=release /fl

где

msbuild
— вызов запуска сборки

dotnetmf.proj
— проект порта для STM32F4DISCOVERY

/p:flavor=release
— тип сборки (debug/release/rtm)

/fl
— запись лога сборки в файл.

файл лога будет лежать в текущей папке (в примере это
D:WORKDIRNetMfNetMFReporepoSolutionsSTM32F4DISCOVERY
). Если лог не нужен, то
/fl
можно убрать.

Чтобы посмотреть все варианты компиляции нужно выполнить

msbuild /t:help

Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 3

Компиляция идет долго и занимает у меня 10 минут:
Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 4

В результат появится множество файлов из которых нужны будут:
<repo folder>BuildOutputTHUMB2FPMDK5.06leFLASHreleaseSTM32F4DISCOVERYbinTinybooter.hex
<repo folder>BuildOutputTHUMB2FPMDK5.06leFLASHreleaseSTM32F4DISCOVERYbintinyclr.hexER_CONFIG
<repo folder>BuildOutputTHUMB2FPMDK5.06leFLASHreleaseSTM32F4DISCOVERYbintinyclr.hexER_FLASH

Для чистой сборки перед выполнением команды

msbuild dotnetmf.proj /p:flavor=release /fl

нужно выполнить команду

msbuild /t:clean

или удалить папку

<repo folder>BuildOutput

Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 5

Компиляция с помощью GCC ARM Embedded

Использование GCC может потребовать еще одной правки. В файле:

<repo folder>SolutionsSTM32F4DISCOVERYSTM32F4DISCOVERY.settings

после строки

<NO_BOOTLOADER_COMPRESSION>true</NO_BOOTLOADER_COMPRESSION>

нужно добавить

<PLATFORM_EMULATED_FLOATINGPOINT Condition="'$(COMPILER_TOOL)'=='GCC'">true</PLATFORM_EMULATED_FLOATINGPOINT>

Это исправляет ошибку “NNNN.a uses VFP register arguments”. Подробнее можно прочитать тут.
Однако, эта ошибка может и не возникнуть, если использовать “чистую” сборку.

Для чистой сборки перед выполнением команды

msbuild dotnetmf.proj /p:flavor=release /fl

нужно выполнить команду

msbuild /t:clean

или удалить папку

<repo folder>BuildOutput

Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 6

Итак, чтобы собрать порт нужно открыть командную строку и перейти в папку с репозиторием, например так:

cd /d D:WORKDIRNetMfNetMFReporepo

затем нужно установить переменные окружения, выполнив:


setenv_gcc <gcc ver> <gcc folder>

где
<gcc ver>
— версия gcc

<gcc folder>
— путь, где находится GCC ARM Embedded

Команда может выглядеть например так:

setenv_gcc 4.9.3 D:WORKDIRNetMfgcc_4_9_3

Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 7

После чего перейти к папке с портом (
<repo folder>SolutionsSTM32F4DISCOVERY
). Например так:


cd /d D:WORKDIRNetMfNetMFReporepoSolutionsSTM32F4DISCOVERY

Компиляцию можно запустить используя, например, такую команду:


msbuild dotnetmf.proj /p:flavor=release /fl

где

msbuild
— вызов запуска сборки

dotnetmf.proj
— проект порта для STM32F4DISCOVERY

/p:flavor=release
— тип сборки (debug/release/rtm)

/fl
— запись лога сборки в файл.

файл лога будет лежать в текущей папке (в примере это
D:WORKDIRNetMfNetMFReporepoSolutionsSTM32F4DISCOVERY
). Если лог не нужен, то
/fl
можно убрать.

Чтобы посмотреть все варианты компиляции нужно выполнить

msbuild /t:help

Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 8

Компиляция идет долго и занимает у меня 10 минут:
Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 9

В результат появится множество файлов из которых нужны будут:
<repo folder>BuildOutputTHUMB2FPGCC4.9leFLASHreleaseSTM32F4DISCOVERYbinTinybooter.hex
<repo folder>BuildOutputTHUMB2FPGCC4.9leFLASHreleaseSTM32F4DISCOVERYbintinyclr.hexER_CONFIG
<repo folder>BuildOutputTHUMB2FPGCC4.9leFLASHreleaseSTM32F4DISCOVERYbintinyclr.hexER_FLASH

Прошивка платы

Итак, имеются 3 файла:

Tinybooter.hex, ER_CONFIG и ER_FLASH
.


Tinybooter
— это bootloader. Они используется для прошивки CLR.
ER_CONFIG
и
ER_FLASH
это сама CLR.

Для того, чтобы прошить плату нам потребуется дополнительное ПО:

  1. STM32 ST-LINK Utility — программатор, чтобы прошить TinyBooter.
  2. Установленные MicroFraimworkSDK.MSI и NetMFVS14.vsix — первый содержит необходимые библиотеки и утилиты, второй — template проектов .Net Micro Fraimwork для Visual Studio.
  3. USB драйер, необходимый для того, чтобы утилиты из состава MicroFraimworkSDK увидили плату (Для Windows 10 не нужен).

Для прошивки платы нужно сделать следующее:

  1. Подключить плату к компьютеру через miniUSB провод:
    Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 10

  2. Запустить STM32 ST-LINK Utility и выбирать меню Target->Connect:
    Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 11

    После соединения с платой STM32 ST-LINK Utility будет выглядеть примерно так:
    Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 12

  3. Нужно стереть текущую прошивку выбрав в меню Target->Erase Sectors...:
    Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 13

    И там нажать Select All а затем Apply:
    Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 14

    Процесс очистки flash микроконтроллера:
    Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 15

    После очистки STM32 ST-LINK Utility будет выглядеть так:
    Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 16

  4. Нужно прошить TinyBooter.hex выбрав меню Target-> Program & Verify...:
    Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 17

    а затем выбрать файл tinybooter.hex и нажать Start:
    Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 18

    После прошивки STM32 ST-LINK Utility будет выглядеть так:
    Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 19

  5. Нужно перезагрузить плату или вытащив miniUsb провод или нажав черную кнопку Reset
  6. Вставить microUSB провод:
    Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 20

    STM32 ST-LINK Utility можно закрыть. miniUsb провод теперь будет использоваться только в качестве питания.

  7. На Windows 10 драйвер устанавливается автоматически, а для других версий нужно установить USB драйвер из списка выше в режиме ручной установки:
    Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 21
  8. Теперь нужно запустить .NET Micro Framework Deployment Tool.
    Найти ее можно в MicroFrameworkSDK:

    C:Program Files (x86)Microsoft .NET Micro Frameworkv4.4ToolsMFDeploy.exe

    В ней нужно переключить интерфейс с Serial на USB:
    Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 22

    После этого появится имя платы. Проверить правильность работы TinyBooter можно нажав кнопку Ping. В консоли будет выведено
    Pinigng… TinyBooter

    Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 23

  9. Далее нужно с помощью .NET Micro Framework Deployment Tool прошить оставшиеся 2 файла ER_CONFIG и ER_FLASH. Выбрать их нужно после нажатия нижней кнопки Browse…
    Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 24

    Для прошивки нужно нажать Deploy:
    Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 25

    После прошивки можно нажать еще раз Ping и убедиться что CLR развернута на плате:
    Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 26

    Все, плата готова для работы.

Первый проект на Visual Studio

Теперь можно создать и запустить проект на Visual Studio. Сделаем простой blinky проект, мигающий светодиодами.

Запускаем Visual Studio и создаем новый проект:
Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 27

Если установка SDK и vsix была выполнена верно, то появится новый template проекта Micro Framework. Выберем Console Application:
Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 28

Создав solution, можно зайти в свойства проекта:
Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 29

В настройках проекта на вкладке .NET Micro Framework в поле Transport выбираем USB. После этого название платы должно появиться в поле Device:
Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 30

Сохраняем и закрываем настройки.

Далее нужно добавить Refrence на сборку по адресу:

C:Program Files (x86)Microsoft .NET Micro Frameworkv4.4AssembliesleMicrosoft.SPOT.Hardware.dll

Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 31

И последним этапом нужно заменить код в
program.cs
на этот:

using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;

namespace STM32F4DISC_Test
{
    public class Program
    {
        public static void Main()
        {
            OutputPort ledGreen = new OutputPort((Cpu.Pin)60, false);
            OutputPort ledYellow = new OutputPort((Cpu.Pin)61, false);
            OutputPort ledRed = new OutputPort((Cpu.Pin)62, false);
            OutputPort ledBlue = new OutputPort((Cpu.Pin)63, false);

            while (true)
            {
                ledGreen.Write(true);
                Thread.Sleep(500);
                ledYellow.Write(true);
                Thread.Sleep(500);
                ledRed.Write(true);
                Thread.Sleep(500);
                ledBlue.Write(true);
                Thread.Sleep(500);
                ledGreen.Write(false);
                ledYellow.Write(false);
                ledRed.Write(false);
                ledBlue.Write(false);
                Thread.Sleep(500);
            }
        }
    }
}

Запускаем проект:
Запуск .Net Micro Framework 4.4 на STM32F4Discovery - 32

И через несколько секунд светодиоды на плате начинают мигать.

Заключение

.NET Micro Fraimwork — достаточно сложный проект. На текущий момент, он все еще требует определенных навыков и знаний, особенно при работе с репозиторием. В данной статье я специально максимально подробно рассказал о том, с чем приходится сталкиваться при компиляции портов, так как эта информация пригодится при разработке решений для собственных плат.
Однако запустить .NET Micro Fraimwork на STM32F4Discovery можно проще и быстрее, взяв уже готовые файлы Tinybooter.hex, ER_CONFIG и ER_FLASH. Скачать их можно тут.

В ближайшее время я подготовлю архив, содержащий исправленную версию репозитория и все необходимые инструменты для сборки и запуска порта на STM32F4Discovery с помощью GCC, и опубликую на geektimes короткую инструкцию о том, как это сделать.

Автор: AlexandrSurkov

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js