65.9K
CodeProject 正在变化。 阅读更多。
Home

如何在 STM32F4Discovery 上运行 .Net Micro Framework 4.4

starIconstarIconstarIconstarIconstarIcon

5.00/5 (8投票s)

2016年2月20日

CPOL

11分钟阅读

viewsIcon

39113

介绍如何在 STM32F4Discovery 板上构建和运行 .Net Micro Framework 4.4。

引言

.Net Micro framework 是一项技术,它允许您使用托管代码和 Visual Studio 的强大功能为微控制器编写应用程序。它很久以前就成立了,现在它是一个大型开源项目,最近已迁移到 GitHub。但是,它尚未成为一个“开箱即用”的产品。使用 .Net micro framework 需要一定的技能。在上一篇文章中,我写了如何在 Windows 模拟器上创建和运行一个简单的“Hello world”应用程序。现在,我将重点介绍如何在 STM32F4Discovery 板上使用 .Net micro framework。本文的俄文版本在此

背景

该板非常普遍,例如可以在这里购买。从 4.4 版本开始,此板的端口已包含在 netmf-interpreter 存储库中。之前,它以一个独立项目的形式存在。

您可以在 STM32F4Discovery 板上找到一些关于启动 .Net micro framework 的资料,但它们引用的是 4.3 版本,并且它们使用已编译的程序集。我将详细介绍如何在 STM32F4Discovery 板上编译和运行 .Net micro framework 4.4 版本。这篇文章会很长,因为需要修复分发版中的一些问题,并下载和安装几个实用工具和驱动程序。

准备编译

首先,您需要获取该分发版。

您可以在此处找到存储库。可以将其下载为 zip 存档,也可以使用 git 获取。有关如何获取存储库和构建安装文件的说明,请参见此处。本文基于这些说明。与特定发行版关联的存储库版本可以从此处下载为 zip 存档。

使用以下步骤通过 git 获取存储库

  1. 使用 fork 命令在 GitHub 服务器上创建您 GitHub 帐户的存储库的公共副本。所有拉取请求都必须来自公共 GitHub 存储库。
  2. 使用 clone 命令获取存储库的本地副本。例如
git clone https://github.com/<your GitHub ID>/netmf-interpreter.git

重要:选择本地存储库路径时,至少需要有一个父文件夹。例如,D:\NETMF\repo,其中 repo 是存储库的文件夹。

  1. 将本地存储库设置为 Upstream。将官方存储库设置为本地克隆的“Upstream”存储库,使您能够将来自最新官方提交的更改拉取到您的存储库中,并在提交拉取请求之前在本地解决合并问题。设置 Upstream 远程的命令是
git remote add upstream https://github.com/NETMF/netmf-interpreter.git

 

重要:解压缩 zip 文件中的存储库时,也需要至少有一个父文件夹。例如,D:\NETMF\repo,其中 repo 是存储库的文件夹。

不幸的是,.NET Micro Framework v4.4 Release To Web (RTW) 包含一些不允许您立即从存储库构建安装文件的问题。但是,这些问题很容易修复。

在获取了您自己的存储库本地副本后,需要执行以下步骤

  1. 下载二进制工具 zip 文件。此文件包含构建安装文件和设备“端口”所需的工具。将来,计划删除这些实用工具,但它们仍然是必需的。
  2. 将 `binary tools` zip 文件的内容解压缩到存储库的父文件夹中。例如,对于路径 D:\NETMF\repo,其中 repo 是存储库文件夹,bintools 文件夹必须在 D:\NETMF 文件夹中。

  3. 重要:在文件 
<repo folder>\Framework\Tools\BuildTasksInternal\BuildSigner\BuildSignerSpotBuild.csproj

在第 37 行更改

<HintPath>$(MSBuildProgramFiles32)\Microsoft Internal\Codesign.Submitter\CODESIGN.Submitter.dll</HintPath>

to

<HintPath>$(SPOROOT)\tools\x86\CODESIGN\CODESIGN.Submitter.dll</HintPath>

这是第一个问题修复。没有此替换,存储库的构建将不会成功。此修复仅适用于 .NET Micro Framework v4.4 Release To Web (RTW)。将来,存储库将包含正确的文件。您可以在此处阅读有关此问题的信息。

  1. 您需要下载 CMSIS 库并将其放入 <repo folder>\CMSIS 文件夹。有关 CMSIS 库的版本和链接的更多信息,请参见文件 <repo folder>\CMSIS\ReadMe.md

CMSIS 是 Cortex Microcontroller Software Interface Standard 的缩写。该库不依赖于特定制造商,旨在与 Cortex-M 核心一起使用。CMSIS 由内核开发商 ARM 公司提供和支持。使用此库可以简化不同制造商的微控制器的“端口”创建。

对于 .Net Micro Framework 4.4 版本,您需要下载 CMSIS 版本 4.3 或更高版本。该库以 zip 存档 (CMSIS-SP-00300-r4p3-00rel0.zip) 的形式提供。可以在 ARM 网站下载。应将存档的内容放入 <repo folder>\СMSIS 文件夹中。

  1. 在此步骤中,您需要安装 .Net Micro Framework Cryptographic Libraries。这些库用于签名将在微控制器上执行的程序集。仅需要加密库的可执行文件来进行构建过程。但您也可以下载源代码。

库以 msi 文件的形式提供。我建议将它们安装在任何方便的文件夹中(我们将其称为 <crypto install folder>),然后将它们复制到每个存储库的根目录。例如 D:\NETMF\repoD:\NETMF\repo_master

该存储库是一个包含大量交叉引用的复杂结构。它通过一个 MSBuild 项目进行组合。项目文件看起来像 Visual Studio 的 sln 和 proj 文件,但它们的内部结构更复杂。因此,无法使用 Visual Studio 进行构建。

我将在未来的文章中讨论存储库中的组件和引用。但目前,您需要知道 STM3F4Discovery 端口位于

<repo folder>\Solutions\STM32F4DISCOVERY

并且二进制和十六进制文件可以在文件夹中找到

<repo folder>\BuildOutput

MSBuild 是 Visual Studio 的一部分。对于 .netmf interpreter 4.4 的文档,它指出支持 Visual Studio 2015 Community、Pro 和 Ultimate 版本,因此您需要安装其中一个。

接下来,您需要一个 ARM 编译器。Netmf interpreter 4.4 支持两种编译器

RealView 编译器是 Keil MDK 开发工具的一部分。免费版本对代码大小有限制,为 32 KB。但该端口的大小更大,因此请确保您获得了许可证。例如,7 天 MDK-Professional 试用许可证。您可以在此处阅读有关 Keil MDK 安装的信息。

它应该默认安装在 C:\Keil_v5 文件夹中。

GCC 是免费的,但它生成的固件比 RealView 编译器生成的固件大 10%。GCC ARM Embedded 可以作为 zip 文件下载并解压缩到任何位置。我将把 zip 文件内容所在的文件夹称为:<gcc folder>

 

使用 Arm Realview Compilation Tools 进行编译

该存储库已包含 MDK 版本 3.1、3.80a、4.12、4.13、4.54、5.04、5.05 的设置。如果您想使用其他版本,可以在文件中添加几行

<repo_dir>\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_dir>\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 - 构建类型(debug/release/rtm)

/fl - 将日志写入文件。

日志文件将位于当前文件夹(在我的示例路径中是 D:\WORKDIR\NetMf\NetMFRepo\repo\Solutions\STM32F4DISCOVERY)。如果不需要日志文件,可以删除 /fl

要查看所有选项,需要执行此命令

msbuild /t:help

对我来说,编译大约需要 10 分钟

结果是一组文件,但我们只需要这些

<repo_dir>\BuildOutput\THUMB2FP\MDK5.06\le\FLASH\release\STM32F4DISCOVERY\bin\Tinybooter.hex
<repo_dir>\BuildOutput\THUMB2FP\MDK5.06\le\FLASH\release\STM32F4DISCOVERY\bin\tinyclr.hex\ER_CONFIG
<repo_dir>\BuildOutput\THUMB2FP\MDK5.06\le\FLASH\release\STM32F4DISCOVERY\bin\tinyclr.hex\ER_FLASH​​​​​​

要在命令之前“清理”构建

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

执行命令

msbuild /t:clean

或删除文件夹

<repo_dir>\BuildOutput

 

使用 GCC ARM Embedded 进行编译

使用 GCC 可能需要另一个修复。在文件中

repo_dir>\Solutions\STM32F4DISCOVERY\STM32F4DISCOVERY.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_dir>\BuildOutput

 

因此,要构建端口,您需要打开命令提示符并导航到存储库所在的文件夹。例如

cd /d D:\WORKDIR\NetMf\NetMFRepo\repo

然后通过运行以下命令设置环境变量

setenv_gcc <gcc ver> <gcc folder>

其中 <gcc ver> - GCC 版本

<gcc folder> - GCC ARM Embedded 路径

命令可能如下所示

setenv_gcc 4.9.3 D:\WORKDIR\NetMf\gcc_4_9_3

然后转到端口所在的文件夹(<repo_dir>\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 - 构建类型(debug/release/rtm)

/fl - 将日志写入文件。

日志文件将位于当前文件夹(在我的示例路径中是 D:\WORKDIR\NetMf\NetMFRepo\repo\Solutions\STM32F4DISCOVERY)。如果不需要日志文件,可以删除 /fl

要查看所有选项,需要执行此命令

msbuild /t:help

对我来说,编译大约需要 10 分钟

结果是一组文件,但我们只需要这些

<repo_dir>\BuildOutput\THUMB2FP\GCC4.9\le\FLASH\release\STM32F4DISCOVERY\bin\Tinybooter.hex
<repo_dir>\BuildOutput\THUMB2FP\GCC4.9\le\FLASH\release\STM32F4DISCOVERY\bin\tinyclr.hex\ER_CONFIG
<repo_dir>\BuildOutput\THUMB2FP\GCC4.9\le\FLASH\release\STM32F4DISCOVERY\bin\tinyclr.hex\ER_FLASH

 

上传固件到板

我们有 3 个文件:Tinybooter.hexER_CONFIGER_FLASHTinybooter 是一个引导加载程序。它用于 CLR 上传。ER_CONFIGER_FLASH 是 CLR 本身。

您还需要额外的软件

  1. STM32 ST-LINK Utility - 用于 TinyBooter 上传的实用工具
  2. 安装了MicroFraimworkSDK.MSINetMFVS14.vsix 文件。第一个包含所需的库和实用工具,第二个包含 Visual Studio 的 .net micro fraimwork 模板项目。
  3. MicroFraimworkSDK 实用工具所需的USB 驱动程序。没有这些,驱动程序实用工具将无法识别该板。(Windows 10 不需要)。

执行以下步骤上传固件

1) 通过 **mini USB** 线将板连接到计算机

2) 运行 STM32 ST-LINK Utility 并选择菜单 Target-> Connect

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

3) 需要通过选择 Target-> Erase Sectors ... 来删除当前固件

然后单击 Select All,然后单击 Apply

微控制器闪存清理过程

清理后,STM32 ST-LINK Utility 将如下所示

4) 需要通过选择 Target-> Program & Verify ... 上传 TinyBooter.hex

然后选择 tinybooter.hex 文件并按 Start

固件上传后,STM32 ST-LINK Utility 将如下所示

5) 需要通过拔下 **mini Usb** 线或按黑色的 Reset 按钮来重启板。

6) 插入 **micro USB** 线

现在可以关闭 STM32 ST-LINK Utility。**Mini Usb** 线仅用作电源。

7) 在 Windows 10 上,驱动程序会自动安装,但对于其他版本,需要手动安装USB 驱动程序

8) 现在您需要运行 .NET Micro Framework Deployment Tool。

您可以在 MicroFrameworkSDK 中找到它

C:\Program Files (x86)\Microsoft .NET Micro Framework\v4.4\Tools\MFDeploy.exe

需要将接口从 Serial 切换到 USB

 

这将显示板的名称。您可以单击 Ping 按钮来检查 TinyBooter。控制台将显示 Pinging ... TinyBooter

9) 接下来,您需要使用 .NET Micro Framework Deployment Tool 上传剩余的两个文件 ER_CONFIG ER_FLASH 。通过单击下面的 Browse... 按钮选择它们

单击 Deploy 按钮以上传固件。

您可以再次按 Ping 按钮,确保 CLR 已在上传后部署到板上

现在板已准备好工作。

使用 Visual Studio 创建 blinky 项目

现在您可以在 Visual Studio 中构建和运行项目。我们创建一个简单的 blinky 项目来闪烁 LED。

启动 Visual Studio 并创建一个新项目

如果 SDK 和 vsix 安装正确,将有一个新的 Micro Framework 项目模板。选择 Console Application

创建解决方案后,您可以转到项目属性

在 .NET Micro Framework 项目设置选项卡中的 Transport 字段中选择 USB。之后,板的名称应出现在 Device 字段中

保存并关闭配置。

接下来,您需要添加对程序集的引用

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 Framework 是一个相当复杂的项目。目前,尤其是在处理存储库时,它仍然需要一定的技能和知识。在本文中,我特意尽可能详细地讨论了在构建端口时遇到的问题。这些信息对于为新板提供解决方案很有用。

但是,您可以通过获取已有的文件 Tinybooter.hex、ER_CONFIG ER_FLASH 来轻松地在 STM32F4Discovery 上使用 .NET Micro Framework。您可以在此处下载它们。

关注点

以下是有关 .Net Micro Framework 的一些链接

 

历史

© . All rights reserved.