设为首页收藏本站自媒体平台

研发设计门户网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1430|回复: 0

Microsoft .NET Micro Framework移植开发笔记2之点灯神话

[复制链接]

13

主题

16

帖子

164

积分

版主

Rank: 7Rank: 7Rank: 7

积分
164
发表于 2015-7-14 13:56:36 | 显示全部楼层 |阅读模式

高速电路PCB网,专注于嵌入式方案,信号完整性和电源完整性仿真分析,高速电路PCB设计,各种EDA工具(Cadence\Mentor\\AD\\CAM\ANSYS HFSS)交流学习。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
     写完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 下载次数:10次)

附件2: LED.zip (文件大小: 43 KB 下载次数:14次)

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

内容正在加载中,请稍候……

QQ|我的微博|小黑屋|手机版|Archiver|YanFa.Tech(gaosupcb Inc.)    

GMT+8, 2024-4-16 12:26 PM , Processed in 0.063333 second(s), 32 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表