.Net Micro Framework是一项技术,使您可以使用托管代码和Visual Studio的全部功能为微控制器编写应用程序。她已经存在了很长一段时间,现在正在重生。围绕它成立了一个开源项目,该项目最近移到了GitHub。但是,这还不是“盒装”产品。使用.Net Micro Framework必须具备某些技能。在最后一次我写了一篇关于如何创建并运行一个简单的“Hello world”在模拟器上的Windows应用程序。现在,我们将讨论如何在实际硬件-STM32F4Discovery调试板上使用.Net Micro Framework。该费用很普遍,可以在这里购买。从版本4.4开始,该板的端口包含在netmf-interpreter 发行版中。以前,它作为一个单独的项目存在。在Internet上,尤其是在集线器上,可以在此板上找到有关启动.Net Micro Framework的材料,但首先,他们谈论版本4.3,其次,他们已经使用了完成的程序集。我将详细讨论如何在STM32F4Discovery .Net Micro Framework 4.4版上进行编译和运行。本文将很长,因为有必要修复分发工具包中的多个错误,并下载并安装多个实用程序和驱动程序。编译准备
分配
首先,您需要拥有发行版本身。仓库在这里。您可以将其下载为zip归档文件,也可以使用git获取。在此处可以找到有关如何获取存储库以及如何从中收集安装文件的英文说明。根据这些说明,撰写了一篇文章。可以从此处的zip存档中下载与特定发行版关联的存储库的版本。要使用git获取存储库,您需要执行以下操作:- 通过fork在GitHub服务器上的帐户上创建公共副本。所有拉取请求必须来自公共GitHub存储库。
- , clone. , :
git clone github.com/<your GitHub ID>/netmf-interpreter.git
: . , D:\NETMF\repo
, repo
— . .
- , Upstream. pull pull. Upstream :
git remote add upstream https:
重要提示:从档案库解压缩存储库时,本地路径的要求(必须至少有一个父文件夹-参见git的第2节)。不幸的是,.NET Micro Framework v4.4 Web发行版(RTW)包含一些错误,这些错误不允许您立即从资源库中收集安装文件。但是,可以更正这些错误,然后我将告诉您如何执行。将存储库以一种或另一种方式复制到本地文件夹后,需要执行以下操作:- 下载二进制工具 zip文件。该文件包含构建安装文件和设备“端口”所需的实用程序。将来计划放弃这些实用程序,但是到目前为止它们是必需的。
- binary tools zip- .
D:\NETMF\repo
, repo
— , bin
tools
D:\NETMF
. - :
<repo folder>\Framework\Tools\BuildTasksInternal\BuildSigner\BuildSignerSpotBuild.csproj
37
<HintPath>$(MSBuildProgramFiles32)\Microsoft Internal\Codesign.Submitter\CODESIGN.Submitter.dll</HintPath>
<HintPath>$(SPOROOT)\tools\x86\CODESIGN\CODESIGN.Submitter.dll</HintPath>
. . , .Net Micro Framework open source , , , . .NET Micro Framework v4.4 Release To Web (RTW). . . - CMSIS
<repo folder>\MSIS.
, <repo folder>\MSIS\ReadMe.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
. - .Net Micro Framework Cryptographic Libraries. , . . , , , .
msi . ( <crypto install folder>
), , D:\NETMF\repo
D:\NETMF\repo_master
.
分布是一个复杂的结构,具有大量的交叉引用。将所有这些与MSBuild项目结合在一起。项目文件看起来像是Visual Studio熟悉的sln和proj文件,但它们的内部结构更为复杂。这就是为什么将Visual Studio用于组装会失败的原因。在下面的文章中,我将详细介绍发行版中的组件和关系,但是现在您需要知道STM3F4Discovery的端口位于该文件夹中,<repo folder>\Solutions\STM32F4DISCOVERY
并且所收集的二进制和十六进制文件将出现在该文件夹中<repo folder>\BuildOutput
视觉工作室
MSBuild是Visual Studio的一部分。.netmf解释器4.4 的文档指出,支持Visual Studio 2015 Community,Pro和Ultimate版本,因此您需要安装其中之一才能成功构建端口。ARM编译器
接下来,您需要一个用于ARM的编译器。提供了使用两个编译器的工作:RealView编译器是Keil MDK开发工具的一部分。免费版本的代码限制为32 kb,但是端口的容量更大,因此您肯定需要一个许可证,例如7天MDK专业试用许可证。您可以在此处阅读有关安装Keil MDK 5的信息。默认情况下,应将其安装在文件夹中C:\Keil_v5
。GCC是免费的,但它生成的固件比RealView编译器生成的固件大10%。GCC ARM Embedded可以作为存档下载并解压缩到任何位置。文件夹中包含解压缩内容的文件夹,我将进一步调用<gcc folder>
。使用ARM RealView编译工具进行编译
分发工具包已经为MDK 3.1、3.80a,4.12、4.13、4.54、5.04、5.05版本进行了编译设置。如果需要使用其他版本,则可以在文件中添加几行,<repo folder>\tools\Targets\Microsoft.Spot.system.mdk.targets
我使用的是5.06版本。为此,在行之后<CC Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.05'">"$(MDK_TOOL_PATH)\ARMCC\bin\armcc.exe"</CC>
<CPP Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.05'">"$(MDK_TOOL_PATH)\ARMCC\bin\armcc.exe"</CPP>
<AS Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.05'">"$(MDK_TOOL_PATH)\ARMCC\bin\armasm.exe"</AS>
<LINK Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.05'">"$(MDK_TOOL_PATH)\ARMCC\bin\armlink.exe"</LINK>
<AR Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.05'">"$(MDK_TOOL_PATH)\ARMCC\bin\armar.exe"</AR>
<FROMELF Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.05'">"$(MDK_TOOL_PATH)\ARMCC\bin\fromelf.exe"</FROMELF>
<MdkCrtLibLinkSwitch Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.05'">$(MdkCrtLibLinkSwitch) $(SWTC)libpath $(MDK_TOOL_PATH)\ARMCC\LIB</MdkCrtLibLinkSwitch>
我加了线<CC Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.06'">"$(MDK_TOOL_PATH)\ARMCC\bin\armcc.exe"</CC>
<CPP Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.06'">"$(MDK_TOOL_PATH)\ARMCC\bin\armcc.exe"</CPP>
<AS Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.06'">"$(MDK_TOOL_PATH)\ARMCC\bin\armasm.exe"</AS>
<LINK Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.06'">"$(MDK_TOOL_PATH)\ARMCC\bin\armlink.exe"</LINK>
<AR Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.06'">"$(MDK_TOOL_PATH)\ARMCC\bin\armar.exe"</AR>
<FROMELF Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.06'">"$(MDK_TOOL_PATH)\ARMCC\bin\fromelf.exe"</FROMELF>
<MdkCrtLibLinkSwitch Condition="'$(COMPILER_TOOL_VERSION)'=='MDK5.06'">$(MdkCrtLibLinkSwitch) $(SWTC)libpath $(MDK_TOOL_PATH)\ARMCC\LIB</MdkCrtLibLinkSwitch>
现在您可以开始编译了。您需要打开命令行,然后转到包含存储库的文件夹,例如:这样:cd /d D:\WORKDIR\NetMf\NetMFRepo\repo
然后您需要执行以下操作来设置环境变量:setenv_mdk 5.06
然后转到带有端口(<repo folder>\Solutions\STM32F4DISCOVERY
)的文件夹。例如,像这样:cd /d D:\WORKDIR\NetMf\NetMFRepo\repo\Solutions\STM32F4DISCOVERY
现在,您可以使用,例如,下面的命令启动编译:msbuild dotnetmf.proj /p:flavor=release /fl
其中msbuild
-调用启动大会dotnetmf.proj
-为STM32F4DISCOVERY港口项目/p:flavor=release
-组件(调试/发布/ RTM)的类型/fl
-编写组件记录到文件中。日志文件将位于当前文件夹中(在此示例中D:\WORKDIR\NetMf\NetMFRepo\repo\Solutions\STM32F4DISCOVERY
)。如果不需要该日志,则/fl
可以将其删除。要查看所有编译选项,您需要运行。msbuild /t:help
编译需要很长时间,并且需要10分钟:
结果将产生大量您需要的文件:<repo folder>\BuildOutput\THUMB2FP\MDK5.06\le\FLASH\release\STM32F4DISCOVERY\bin\Tinybooter.hex\
<repo folder>\BuildOutput\THUMB2FP\MDK5.06\le\FLASH\release\STM32F4DISCOVERY\bin\tinyclr.hex\ER_CONFIG
<repo folder>\BuildOutput\THUMB2FP\MDK5.06\le\FLASH\release\STM32F4DISCOVERY\bin\tinyclr.hex\ER_FLASH
对于干净的构建,在执行命令之前,msbuild dotnetmf.proj /p:flavor=release /fl
您需要运行命令msbuild /t:clean
或删除文件夹<repo folder>\BuildOutput

使用GCC ARM Embedded进行编译
使用GCC可能需要另一次修订。在文件中:
您需要<repo folder>\Solutions\STM32F4DISCOVERY\STM32F4DISCOVERY.settings
在该行之后<NO_BOOTLOADER_COMPRESSION>true</NO_BOOTLOADER_COMPRESSION>
添加,<PLATFORM_EMULATED_FLOATINGPOINT Condition="'$(COMPILER_TOOL)'=='GCC'">true</PLATFORM_EMULATED_FLOATINGPOINT>
这可以修复错误“ NNNN.a使用VFP寄存器参数”。在这里阅读更多。但是,如果您使用“干净”版本,则可能不会发生此错误。为了进行干净的构建,在执行命令之前,msbuild dotnetmf.proj /p:flavor=release /fl
您需要运行命令msbuild /t:clean
或删除文件夹,<repo folder>\BuildOutput
因此,要收集端口,请打开命令行并转到包含存储库的文件夹,例如:cd /d D:\WORKDIR\NetMf\NetMFRepo\repo
这样,您需要执行以下操作来设置环境变量:setenv_gcc <gcc ver> <gcc folder>
其中<gcc ver>
gcc版本<gcc folder>
是GCC ARM所在的路径嵌入式命令可能如下所示:setenv_gcc 4.9.3 D:\WORKDIR\NetMf\gcc_4_9_3
然后转到带有端口(<repo folder>\Solutions\STM32F4DISCOVERY
)的文件夹。例如,像这样:cd /d D:\WORKDIR\NetMf\NetMFRepo\repo\Solutions\STM32F4DISCOVERY
编译可以使用开始,例如,下面的命令:msbuild dotnetmf.proj /p:flavor=release /fl
其中msbuild
-打电话开始组装dotnetmf.proj
-STM32F4DISCOVERY的端口设计/p:flavor=release
-构建类型(调试/发布/ rtm)/fl
-将程序集日志写入文件。
日志文件将位于当前文件夹中(在此示例中D:\WORKDIR\NetMf\NetMFRepo\repo\Solutions\STM32F4DISCOVERY
)。如果不需要该日志,则/fl
可以将其删除。要查看所有编译选项,您需要执行以下操作:msbuild /t:help
编译需要很长时间且需要10分钟:
结果将是需要使用大量文件:<repo folder>\BuildOutput\THUMB2FP\GCC4.9\le\FLASH\release\STM32F4DISCOVERY\bin\Tinybooter.hex
<repo folder>\BuildOutput\THUMB2FP\GCC4.9\le\FLASH\release\STM32F4DISCOVERY\bin\tinyclr.hex\ER_CONFIG
<repo folder>\BuildOutput\THUMB2FP\GCC4.9\le\FLASH\release\STM32F4DISCOVERY\bin\tinyclr.hex\ER_FLASH
主板固件
因此,有3个文件:Tinybooter.hex, ER_CONFIG ER_FLASH
。Tinybooter
是一个引导程序。它们用于CLR固件。ER_CONFIG
而ER_FLASH
这是CLR本身。为了使开发板刷新,我们需要其他软件:- STM32 ST-LINK实用程序 -刷新TinyBooter的程序员。
- 安装了MicroFraimworkSDK.MSI和NetMFVS14.vsix-第一个包含必需的库和实用程序,第二个模板项目是Visual Studio的.Net Micro Fraimwork。
- MicroFraimworkSDK的实用程序需要USB驱动程序才能看到开发板(Windows 10不需要)。
要刷新板,请执行以下操作:- 通过miniUSB线将开发板连接至计算机:

- 启动STM32 ST-LINK Utility,然后选择菜单Target-> Connect:

连接到STM32开发板后,ST-LINK Utility将如下所示:

- Target->Erase Sectors...:

Select All Apply:

flash :

STM32 ST-LINK Utility :

- TinyBooter.hex Target-> Program & Verify...:

tinybooter.hex Start:

STM32 ST-LINK Utility :

- miniUsb Reset
- microUSB :

STM32 ST-LINK Utility . miniUsb .
- Windows 10 , USB :

- .NET Micro Framework Deployment Tool.
MicroFrameworkSDK:
C:\Program Files (x86)\Microsoft .NET Micro Framework\v4.4\Tools\MFDeploy.exe
Serial USB:

. TinyBooter Ping. Pinigng… TinyBooter

- .NET Micro Framework Deployment Tool 2 ER_CONFIG ER_FLASH. Browse…

Deploy:

Ping CLR :

, .
Visual Studio
现在,您可以在Visual Studio中创建和运行项目。让我们做一个简单的,闪烁的项目,使LED闪烁。我们启动Visual Studio并创建一个新项目:
如果正确安装了SDK和vsix,将出现一个新的Micro Framework项目模板。选择控制台应用程序:
创建解决方案后,您可以转到项目属性:
在.NET Micro Framework选项卡上的项目设置中,在“传输”字段中,选择USB。之后,板的名称应出现在“设备”字段中:
保存并关闭设置。接下来,在以下位置将Refrence添加到程序集:C:\Program Files (x86)\Microsoft .NET Micro Framework\v4.4\Assemblies\le\Microsoft.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);
}
}
}
}
我们开始该项目:
几秒钟后,板上的LED开始闪烁。结论
.NET Micro Fraimwork是一个相当复杂的项目。目前,它仍然需要某些技能和知识,尤其是在使用存储库时。在本文中,我特别详细地介绍了编译端口时必须处理的内容,因为在为自己的主板开发解决方案时,这些信息将非常有用。但是,通过获取现成的Tinybooter.hex,ER_CONFIG和ER_FLASH文件,在STM32F4Discovery上运行.NET Micro Fraimwork可以更简单,更快。您可以在此处下载它们。