- PVSM.RU - https://www.pvsm.ru -
.Net Micro Framework — технология, позволяющая писать приложения для микроконтроллеров используя всю мощь управляемого кода и Visual Studio. Она существует давно и сейчас переживает второе рождение. Вокруг нее сформирован open-source проект, который не так давно переехал на GitHub. Однако пока еще это не “коробочный” продукт. Работа с .Net Micro Framework требует определенных навыков. В прошлый раз [1] я писал про то, как создать и запустить простое ”Hello world” приложение на эмуляторе для Windows. Сейчас речь пойдет о том, как поработать с .Net Micro Framework на настоящем “железе” — отладочной плате STM32F4Discovery.
Плата достаточно распространена и может быть приобретена, например, тут [2]. Начиная с версии 4.4 порт для этой платы входит в дистрибутив [3] netmf-interpreter. Ранее он существовал как отдельный проект [4].
В интернете [5] и, в частности, на хабре [6] можно найти материалы про запуск .Net Micro Framework на этой плате, но во-первых в них говорится о версии 4.3, а во-вторых там используются уже готовая сборка. Я же расскажу о том, как скомпилировать и запустить на STM32F4Discovery .Net Micro Framework версии 4.4 во всех подробностях. Статья будет длинная, так как нужно будет исправить несколько ошибок в дистрибутиве и скачать и установить несколько утилит и драйверов.
В первую очередь нужно иметь сам дистрибутив.
Репозиторий находится тут [3]. Можно скачать его как zip-архив, а можно получить, используя git. Инструкции на английском языке о том, как получить репозиторий и собрать из него установочные файлы, можно посмотреть тут [7]. На основе этих инструкций и написана статья. Версии репозитория, связанные с конкретными релизами, можно скачать в zip-архивах тут [8].
Чтобы получить репозиторий с помощью git, нужно сделать следующее:
git clone https://github.com/<your GitHub ID>/netmf-interpreter.git
D:NETMFrepo
, где repo
— папка для репозитория. Это требуется для его правильной сборки.
git remote add upstream https://github.com/NETMF/netmf-interpreter.git
Важно: Требования к локальному пути (должна быть хотя бы одна родительская папка — см. п 2 работы с git) актуальны и при распаковке репозитория из архива.
К сожалению, релиз .NET Micro Framework v4.4 Release To Web (RTW) содержит ошибки, которые не позволяют сразу собрать установочные файлы из репозитория. Однако, эти ошибки можно исправить, и далее я расскажу как это сделать.
После того, как репозиторий тем или иным способом оказался скопирован в локальную папку, нужно сделать следующее:
D:NETMFrepo
, где repo
— папка для репозитория, папки bin
и tools
должны оказаться в папке D:NETMF
.
<repo folder>FrameworkToolsBuildTasksInternalBuildSignerBuildSignerSpotBuild.csproj
<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). В дальнейшем репозиторий уже будет содержать поправленные файлы. Про эту проблему можно почитать тут [10].
<repo folder>СMSIS.
Где ее брать и какая именно версия нужна, написано в файле
<repo folder>СMSISReadMe.md.
CMSIS [11] расшифровывается как Cortex Microcontroller Software Interface Standart. Это не зависящая от конкретного производителя библиотека для работы с ядром Cortex-M, поставляемая и поддерживаемая разработчиками ядра — компанией ARM. Использование этой библиотеки позволяет существенно упростить создание “портов” на разные микроконтроллеры разных производителей.
В случае с версией .Net Micro Framework 4.4 нужно скачать CMSIS не ниже версии 4.3. Библиотека поставляется в виде zip-архива (CMSIS-SP-00300-r4p3-00rel0.zip). Ее можно скачать на сайте [11] ARM. Содержимое архива нужно положить в папку <repo folder>СMSIS
.
Библиотеки доступны в виде установочного msi файла. Я рекомендую установить их в любую удобную папку (далее будем называть ее
), а затем копировать их в корень каждого репозитория, например
<crypto install folder>
D:NETMFrepo
и D:NETMFrepo_master
.
Дистрибутив представляет собой сложную структуру с огромным количеством перекрестных ссылок. Объединено все это с помощью проекта для MSBuild [13]. Файлы проекта внешне выглядят как знакомые всем sln и proj файлы для Visual Studio, однако внутри у них более сложная структура. Именно поэтому использовать Visual Studio для сборки не получится.
Подробнее о составных частях и связях внутри дистрибутива я расскажу в следующих статьях, а сейчас нужно знать, что порт для STM3F4Discovery находится в папке
<repo folder>SolutionsSTM32F4DISCOVERY
а собранные бинарные и hex файлы появятся в папке
<repo folder>BuildOutput
MSBuild входит в состав Visual Studio. В документации [7] к .netmf interpreter 4.4 указано, что поддерживаются редакции Visual Studio 2015 Community, Pro и Ultimate, так что для успешной сборки порта нужно установить одну из них.
Далее нужен компилятор для ARM [14]. Предусмотрена работа с двумя компиляторами:
Компилятор RealView входит в состав средства разработки Keil MDK [17]. Бесплатная версия имеет ограничение [18] в 32 кб кода, однако порт имеет больший объем, поэтому обязательно нужна лицензия, например 7-Day MDK-Professional Trial License [19]. Про установку Keil MDK 5 можно прочитать тут [20].
Он должен быть установлен по умолчанию в папку
.
C:Keil_v5
GCC бесплатен, но генерируемые им прошивки имеют на 10% больший объем, чем сгенерированные компилятором RealView. GCC ARM Embedded можно скачать в виде архива [21] и распаковать содержимое в любое место. Папку с распакованным содержимым архива я буду далее называть
.
<gcc folder>
В дистрибутиве уже сделаны настройки компиляции для версий 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
После чего перейти к папке с портом (<repo folder>SolutionsSTM32F4DISCOVERY
). Например, так:
cd /d D:WORKDIRNetMfNetMFReporepoSolutionsSTM32F4DISCOVERY
Теперь можно запускать компиляцию используя, например, такую команду:
msbuild dotnetmf.proj /p:flavor=release /fl
где
— вызов запуска сборки
msbuild
— проект порта для STM32F4DISCOVERY
dotnetmf.proj
— тип сборки (debug/release/rtm)
/p:flavor=release
— запись лога сборки в файл.
/fl
файл лога будет лежать в текущей папке (в примере это
). Если лог не нужен, то
D:WORKDIRNetMfNetMFReporepoSolutionsSTM32F4DISCOVERY
можно убрать.
/fl
Чтобы посмотреть все варианты компиляции нужно выполнить
msbuild /t:help
Компиляция идет долго и занимает у меня 10 минут:
В результат появится множество файлов из которых нужны будут:
<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
Использование 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”. Подробнее можно прочитать тут [22].
Однако, эта ошибка может и не возникнуть, если использовать “чистую” сборку.
Для чистой сборки перед выполнением команды
msbuild dotnetmf.proj /p:flavor=release /fl
нужно выполнить команду
msbuild /t:clean
или удалить папку
<repo folder>BuildOutput
Итак, чтобы собрать порт нужно открыть командную строку и перейти в папку с репозиторием, например так:
cd /d D:WORKDIRNetMfNetMFReporepo
затем нужно установить переменные окружения, выполнив:
setenv_gcc <gcc ver> <gcc folder>
где
— версия gcc
<gcc ver>
— путь, где находится GCC ARM Embedded
<gcc folder>
Команда может выглядеть например так:
setenv_gcc 4.9.3 D:WORKDIRNetMfgcc_4_9_3
После чего перейти к папке с портом (
). Например так:
<repo folder>SolutionsSTM32F4DISCOVERY
cd /d D:WORKDIRNetMfNetMFReporepoSolutionsSTM32F4DISCOVERY
Компиляцию можно запустить используя, например, такую команду:
msbuild dotnetmf.proj /p:flavor=release /fl
где
— вызов запуска сборки
msbuild
— проект порта для STM32F4DISCOVERY
dotnetmf.proj
— тип сборки (debug/release/rtm)
/p:flavor=release
— запись лога сборки в файл.
/fl
файл лога будет лежать в текущей папке (в примере это
). Если лог не нужен, то
D:WORKDIRNetMfNetMFReporepoSolutionsSTM32F4DISCOVERY
можно убрать.
/fl
Чтобы посмотреть все варианты компиляции нужно выполнить
msbuild /t:help
Компиляция идет долго и занимает у меня 10 минут:
В результат появится множество файлов из которых нужны будут:
<repo folder>BuildOutputTHUMB2FPGCC4.9leFLASHreleaseSTM32F4DISCOVERYbinTinybooter.hex
<repo folder>BuildOutputTHUMB2FPGCC4.9leFLASHreleaseSTM32F4DISCOVERYbintinyclr.hexER_CONFIG
<repo folder>BuildOutputTHUMB2FPGCC4.9leFLASHreleaseSTM32F4DISCOVERYbintinyclr.hexER_FLASH
Итак, имеются 3 файла:
.
Tinybooter.hex, ER_CONFIG и ER_FLASH
— это bootloader. Они используется для прошивки CLR.
Tinybooter
и
ER_CONFIG
это сама CLR.
ER_FLASH
Для того, чтобы прошить плату нам потребуется дополнительное ПО:
Для прошивки платы нужно сделать следующее:
После соединения с платой STM32 ST-LINK Utility будет выглядеть примерно так:
И там нажать Select All а затем Apply:
Процесс очистки flash микроконтроллера:
После очистки STM32 ST-LINK Utility будет выглядеть так:
а затем выбрать файл tinybooter.hex и нажать Start:
После прошивки STM32 ST-LINK Utility будет выглядеть так:
STM32 ST-LINK Utility можно закрыть. miniUsb провод теперь будет использоваться только в качестве питания.
C:Program Files (x86)Microsoft .NET Micro Frameworkv4.4ToolsMFDeploy.exe
В ней нужно переключить интерфейс с Serial на USB:
После этого появится имя платы. Проверить правильность работы TinyBooter можно нажав кнопку Ping. В консоли будет выведено
Pinigng… TinyBooter
Для прошивки нужно нажать Deploy:
После прошивки можно нажать еще раз Ping и убедиться что CLR развернута на плате:
Все, плата готова для работы.
Теперь можно создать и запустить проект на Visual Studio. Сделаем простой blinky проект, мигающий светодиодами.
Запускаем Visual Studio и создаем новый проект:
Если установка SDK и vsix была выполнена верно, то появится новый template проекта Micro Framework. Выберем Console Application:
Создав solution, можно зайти в свойства проекта:
В настройках проекта на вкладке .NET Micro Framework в поле Transport выбираем USB. После этого название платы должно появиться в поле Device:
Сохраняем и закрываем настройки.
Далее нужно добавить Refrence на сборку по адресу:
C:Program Files (x86)Microsoft .NET Micro Frameworkv4.4AssembliesleMicrosoft.SPOT.Hardware.dll
И последним этапом нужно заменить код в
на этот:
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 Fraimwork — достаточно сложный проект. На текущий момент, он все еще требует определенных навыков и знаний, особенно при работе с репозиторием. В данной статье я специально максимально подробно рассказал о том, с чем приходится сталкиваться при компиляции портов, так как эта информация пригодится при разработке решений для собственных плат.
Однако запустить .NET Micro Fraimwork на STM32F4Discovery можно проще и быстрее, взяв уже готовые файлы Tinybooter.hex, ER_CONFIG и ER_FLASH. Скачать их можно тут [28].
В ближайшее время я подготовлю архив, содержащий исправленную версию репозитория и все необходимые инструменты для сборки и запуска порта на STM32F4Discovery с помощью GCC, и опубликую на geektimes короткую инструкцию о том, как это сделать.
Автор: AlexandrSurkov
Источник [29]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/104830
Ссылки в тексте:
[1] прошлый раз: http://geektimes.ru/post/265986/
[2] тут: http://www.chipdip.ru/product/stm32f4discovery/
[3] дистрибутив: https://github.com/NETMF/netmf-interpreter
[4] отдельный проект: http://netmf4stm32.codeplex.com/
[5] интернете: https://www.google.ru/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=STM32F4DISCOVERY+netmf
[6] хабре: http://habrahabr.ru/post/175989/
[7] тут: https://github.com/NETMF/netmf-interpreter/wiki/Getting%20Started
[8] тут: https://github.com/NETMF/netmf-interpreter/releases
[9] binary tools: http://netmf.github.io/downloads/build-tools.zip
[10] тут: https://github.com/NETMF/netmf-interpreter/issues/333
[11] CMSIS: http://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php
[12] .Net Micro Framework Cryptographic Libraries: https://github.com/NETMF/netmf-interpreter/releases/tag/NETMFCryptoLibraries
[13] MSBuild: https://ru.wikipedia.org/wiki/MSBuild
[14] ARM: https://ru.wikipedia.org/wiki/ARM_(%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0)
[15] GCC ARM Embedded: https://launchpad.net/gcc-arm-embedded
[16] ARM RealView Compilation tools: http://www.keil.com/arm/realview.asp#compiler
[17] Keil MDK: http://www2.keil.com/mdk5
[18] ограничение: http://www2.keil.com/mdk5/selector/
[19] 7-Day MDK-Professional Trial License: http://www2.keil.com/mdk5/activation/
[20] тут: http://www2.keil.com/mdk5/install/
[21] архива: https://launchpad.net/gcc-arm-embedded/4.9/4.9-2015-q3-update/+download/gcc-arm-none-eabi-4_9-2015q3-20150921-win32.zip
[22] тут: https://github.com/NETMF/netmf-interpreter/pull/341
[23] STM32 ST-LINK Utility: http://www.st.com/web/en/catalog/tools/PF258168#
[24] MicroFraimworkSDK.MSI: https://github.com/NETMF/netmf-interpreter/releases/download/v4.4-RTW-20-Oct-2015/MicroFrameworkSDK.MSI
[25] NetMFVS14.vsix: https://github.com/NETMF/netmf-interpreter/releases/download/v4.4-RTW-20-Oct-2015/NetMFVS14.vsix
[26] USB драйер: http://USB драйер
[27] USB драйвер: http://www.codeplex.com/Download?ProjectName=netmf4stm32&DownloadId=471395
[28] тут: https://drive.google.com/file/d/0B4VR_8m5Yr74Yktja1ZuZ0NDVFk/view?usp=sharing
[29] Источник: http://geektimes.ru/post/266612/
Нажмите здесь для печати.