写完HelloWorld后,开始进入GPIO的操作,无论是拿到任何的嵌入式的板子,第一件事情就是点亮LED。MF也是这里开始,废话不多说,直接新建VS2010的MF工程。要想点亮LED,就是要操作GPIO,要操作GPIO口就要初始,MF也是一样。在Program.cs的Main函数加入初始化 OutputPort led0 = new OutputPort((Cpu.Pin)21, false); OutputPort说明是把IO初始化成通用输出口,"(Cpu.Pin)21”说是初始化第21个IO(MF的IO是从PA0作0开始算,战舰板上的LED0是PB5,也就是16+5=21),后面的false是指初始化的电平,这里要点亮LED0,就要把电平拉低,所以是false(0)。点生成,会发现有错误,那是新建的工程里没增加定义Output的动态链接库。右键点右边的引用找到Microsoft.SPOT.Hardware,然后点确定加进去。然后在代码开头用using看它加进去,即是using Microsoft.SPOT.Hardware; 这跟我们有#include是一样的。然后可以看到错误就没有了,点调试,把代码部署到板子就,就可以看到LED0被点亮了(这也太简单了吧,用MDK写的话要点亮LED,还要一大堆的工作,大家都知道,就不说了)。
点亮了LED后,都会想怎么把它闪烁起来。要闪烁自然要用到延时,先上代码
while (true)
{
led0.Write(!led0.Read());
Thread.Sleep(500);
}
led0.Write就是直接写PB5的电平,led0.Read()是读现在PB5电平状态,连接起来就是翻转PB5的电平,达成led0的闪烁。 Thread.Sleep(500)自然就是延时函数,这里MF只提供了以ms为单位的延时(很多人就会想,如果操作GPIO需要us级的延时话,怎么办,这里MF是无能为力,目前的解决方法是在底层来操作,然后给上面接口来直接使用,其实这里也是移植最大的难度,我也还没有开始折腾,能力还有限啊)。VS也会指示 Thread.Sleep有错误,跟前面一样,在代码开头加using System.Threading;。然后调试,就可以看到led0按1HZ的频率闪烁起来了,So easy!
再看初始化,PB5为(Cpu.Pin)21,这也太难记,有什么方法把它改成PB5这种,C#这么高级语言,自然是没什么问题,像用C的宏定义一样来做就要可以了。这里我也写了一个类文件 :
amespace MFPins
{
public class CPU
{
public static class Pins
{
public const Cpu.Pin PA0 = (Cpu.Pin)0;
public const Cpu.Pin PA1 = (Cpu.Pin)1;
public const Cpu.Pin PA2 = (Cpu.Pin)2;
public const Cpu.Pin PA3 = (Cpu.Pin)3;
public const Cpu.Pin PA4 = (Cpu.Pin)4;
public const Cpu.Pin PA5 = (Cpu.Pin)5;
public const Cpu.Pin PA6 = (Cpu.Pin)6;
public const Cpu.Pin PA7 = (Cpu.Pin)7;
public const Cpu.Pin PA8 = (Cpu.Pin)8;
public const Cpu.Pin PA9 = (Cpu.Pin)9;
public const Cpu.Pin PA10 = (Cpu.Pin)10;
public const Cpu.Pin PA11 = (Cpu.Pin)11;
public const Cpu.Pin PA12 = (Cpu.Pin)12;
public const Cpu.Pin PA13 = (Cpu.Pin)13;
public const Cpu.Pin PA14 = (Cpu.Pin)14;
public const Cpu.Pin PA15 = (Cpu.Pin)15;
public const Cpu.Pin PB0 = (Cpu.Pin)16;
public const Cpu.Pin PB1 = (Cpu.Pin)17;
public const Cpu.Pin PB2 = (Cpu.Pin)18;
public const Cpu.Pin PB3 = (Cpu.Pin)19;
public const Cpu.Pin PB4 = (Cpu.Pin)20;
public const Cpu.Pin PB5 = (Cpu.Pin)21;
public const Cpu.Pin PB6 = (Cpu.Pin)22;
public const Cpu.Pin PB7 = (Cpu.Pin)23;
只贴这么多,剩下的自行补齐就可以了。那么初始化就变 OutputPort led0 = new OutputPort(MFPins.CPU.Pins.PB5, false);这样就明朗多了。然后把led1也加进去,就可以做流水灯了,这里直接贴代码整个代码:
using System;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using System.Threading;
using MFPins;
namespace LED
{
public class Program
{
public static void Main()
{
OutputPort led0 = new OutputPort(MFPins.CPU.Pins.PB5, true);
OutputPort led1 = new OutputPort(MFPins.CPU.Pins.PE5, true);
while (true)
{
led0.Write(!led0.Read());
Thread.Sleep(500);
led1.Write(!led1.Read());
}
}
}
}
按F5调试,看到led0跟led1红绿交替闪烁,心情真是太愉悦了。哈哈!后面附上整个工程,还有固件也有更新,我在写led1的时候,发现led1没闪烁,最后是找到固件那边GPIOE没有初始化(led1用到PE5,固件只初始化了A、B、C三个端口)。
附件1: TinyCLR.bin (文件大小: 244 KB 下载次数:0次)
附件2: LED.zip (文件大小: 43 KB 下载次数:0次)
文章评论(0条评论)
登录后参与讨论