tag 标签: mf

相关博文
  • 热度 20
    2015-2-2 18:45
    1705 次阅读|
    3 个评论
    Microsoft .NET Micro Framework移植开发笔记之移植初步 Microsoft .NET Micro Framework(简称MF)是Microsoft .net家族当中最轻量的一个,它是一个完整的嵌入式系统可以运行在ARM7、ARM9、甚至Cortex-M系等这些低成本的ARM芯片上,用来托管C#、VB.NET的代码。简单的说MF就是一个嵌入式系统,然后你可以通过Microsoft Visual Studio来写C#或VB.NET的代码让它来运行,使得开发单片机软件就像开发Windows软件一样快捷方便。也正因为MF从4.0开始,Microsoft已经把它完全的开源了,而且可以移植到STM32芯片上,越来越多的C#程序员和嵌入式工程师对它感兴趣。具体MF的简介请参照百度百科。 自从接触MF以有半年之多,对MF的了解有一定的了解。目前在MF走的最前面两个前辈,一是叶帆,原来是Microsoft的MF项目组的成员,后成立叶帆科技,算是国内研究MF的开门鼻祖,网上关于MF的相关的资料基本上就是他的博文,我在刚开始研究移植的时候,就靠看他的博文来入门的;二是大石头和他的新生命团队,C#程序大神,通过MF走向嵌入式的开发,一直致力把MF运用在工控领域,他编写的编译脚本和编译环境使得很多研究MF的人带来极大的便利,我也是正因为在网上认识他而接触MF而走向研究MF的道路。 MF移植最大程度一直是在编译环境的建立,这是移植的第一次,也是对初学者来说最难的一步。100个想折腾MF的人,99个人都死在了这里一步,从而放弃了。因为MF移植这方面的资料在网上基本上都没有多少,更没有什么系统的移植教程,导致很多人遇到很多的问题都找不到解决的答案。我当初折腾近一个月的时间才把编译环境搞定,才开始进入移植的大门。这里我根据自身的经验和跟一些同道中人遇到的问题,来写这一篇的移植教程,希望能帮助想研究的MF移植的人能顺利的跨过这一步,也希望能够吸引更多的人来研究MF。 这里以.NET MF 4.3 RTM (QFE1)移植到STM32F103为基本来开始移植,也是因为这个组合,使得MF的应用起来越广。前面说的MF是完全开源的,我们可以用网上下载到它的源码,地址为http://netmf.codeplex.com/releases/view/118283 这里我们需要下载SDK4.3(MF对应VS的开发包)和Porting Kit 4.3(RTM QFE1)(MF的源代码包)。下载得到这两个文件 ,分别解压安装。然后还需要Microsoft Visual Studio 2012(注意MF4.3.1一定是要VS2012),这软件大家都熟悉,自行百度下载安装就可以,注意要**就可以了(这些软件及后面编译环境需要的文件,我也会用网盘共享出来)。最后面需要的就是Keil MDK了,玩STM32 的自然是再熟悉不过了,理论上是任何版本都可以的,这里以MDK5.11为例。这些软件都已经安装准备好后,就可以开始建立移植环境了。 打开E盘(也有可能是其它盘),就可以看到 这个文件夹,这个就是MF4.3的源代码包,我们所有的移植都是在这里修改编译的。进入这个文件夹,找到 这个文件,点左键-编辑(我这里用的是notepad++来编辑),然后把里面的代码全删掉,改成为 @ echo off setenv_base.cmd MDK PORT %* C:\Keil_v5\ARM 注意C:\Keil_v5为你的Keil的安装路径 然后保存退出。然后再打开E:\MicroFrameworkPK_v4_3\tools\Targets,找到 这个文件,同样右建-编辑, 在相应位置加上红框内的代码。然后是 将红框内的RV31改成ARMCC然后保存退出。 接下来就是请出来大石头的编译脚本,让我们可以免去在CMD中敲指令,直接双击就可以进行编译。把 这两个脚本文件复制到E:\MicroFrameworkPK_v4_3\Solutions\STM32Stamp文件夹中,这里STM32Stamp就是官方提供的STM32F1系列的移植的基本代码,后面所有基于STM32F1的移植都是从这里开始的,但注意的是MF的要求Flash最小是256K,只有Flash大于256K的STM32F1的芯片才能运行MF,目前我都是基于STM32F103ZET来移植的,最小的试过STM32F103RD也刚好满足要求。Debug编译跟release编译差别后面再讨论,这里我们双击release编译.bat开发编译,如下图 第一次编译大概要十多分钟,具体时间因电脑配置而异。满怀期待的等待编译结果,等来的却是去编译出错 编译出错,就需要我们就修改错误,直到编译成功。MF编译最大的难点就在于没有IDE提示那里有错误,导致绝大部分的人只看到编译过程有一路飘红,却不知道怎么去定位错误,然后去修改错误。大石头的编译脚本还有个便利的地方就是会自动输出编译报告,我们可以通过编译报告来查找定位错误。找到STM32stamp文件夹下的 文件,用记事本或者Notepad++来打开它。这里用Ctrl+F的查找功能,查找error这个关键词来找到错误提示 可以找到报告最后面一个error 这里并没有指出错误的在哪里,只是说编译某个文件有错误,很多人在钻在这里,怎么也看不出什么错误,其实我们都可以忽略这个,而真正错误的提示还在前面,我们可以根据MSB3073这个错误代码来查到前面的具体的错误报告。 可以到相同的错误代码,也可以看到前一句提示的6 errors,这两句前面的提示才是真正错误的提示,继续往前翻报告就看到非常熟悉的报告,没错这正是MDK的错误报告的风格。 再看所有的error都是floating-point variable错误,浮点不支持,因为STM32F1系列(M3)的芯片是不支持浮点的,所以编译出错了。这里我们要把浮点编译关掉,编辑STM32stamp文件夹下的 文件,然后 把红框的true改成false,把1改成0,保存退出。再次双击release编译.bat开始编译,第一次编译就快多了,很快看到编译完成,这次编译就可以成功了,然后把编译后的文件复制到根目录下面的MFbin文件夹里。 我们打开E:\MFBin\STM32Stamp目录就可以看到固件文件。 下一步当然就是烧写固件到STM32 的板子上,玩STM32的人都知道怎么烧写,我这里喜欢用J-Flash来烧写bin文件到开发板,也可以用ISP下载。固件下载完成后,连接上STM32板子上UART1,打开串口调试助手,把波特率设置成115200,复位下STM32的板子就可以看到MF的开机信息了。 至此,MF已经运行起来了,完成了MF的基本的移植,后面移植就是根据我们的需求,在这个基础上不断的增加完善我们的固件。如果你可以完成到这一步,那恭喜你开始进入MF移植的大门。如果编译有问题或者是想更多的了解MF,可以加QQ群170024940随时提问。   相关的资料和软件: 1、 MF4.3的源码和SDK及编译环境脚本:http://pan.baidu.com/s/1sj4X7hN 2、 Microsoft Visual Studio 2012:http://pan.baidu.com/s/10czr4 3、 Keil MDK5.11:http://pan.baidu.com/s/1c0ANJ8W 4、 大石头的论坛:http://www.newlifex.com/ 5、 叶帆的博客:http://www.cnblogs.com/yefanqiu/archive/2010/03/02/1676844.html 6、 作者的博客: http://bbs.ednchina.com/BLOG_mzwhhwj_2002493.HTM?source=ednc_topnav
  • 热度 18
    2014-12-29 17:23
    1106 次阅读|
    0 个评论
    Microsoft .NET Micro Framework 移植开发笔记 6 之 电容触摸按键实验 好久没更新笔记了,主要最近比较忙,目前在搞 ARM9 S3C2416 的 MF 移植,就把 STM32 的暂时搁了,前两天 S3C2416 的移植有一个比较大的进展。就抽空来继 STM32 的移植。这次的移植比较有突破性,之前我移植和做的实验都是基于 MF 官方本身就支持的外设。假如官方没有支持的外设驱动怎样办,如果完全可以由自己来定义外设驱动接口,然后让 C# 代码来调用,这样的话 MF 的实用性大大提高,我们完全可以自己让 MF 来实现我们所要的外设,不再受官方的限制。 今天终于实现这一个功能,这里我移植封装了原子哥的电容触摸按键实验,完全是由自己定义的驱动接口,然后把这接口都封装成 DLL 文件,在 VS 里增加引用就可以调用这些接口。 namespace LLFeng {     public class TPAD     {         public TPAD();           public static void TIM5_CH2_Cap_Init( ushort arr, ushort psc);         public static ushort TPAD_Get_MaxVal( uint n);         public static ushort TPAD_Get_Val();         public static ushort TPAD_Init( uint systick);         public static void TPAD_Reset();         public static ushort TPAD_Scan( uint mode);     } } 先看接口函数,完全是封装了原子哥的 TPAD ,没做其它的改动。 电容触摸按键实验的原理大家都清楚,原子哥的教程中都有详细的说明。其实用 MF 的固件的话,你压根就不需要去了解底层是什么原理,你只要知道接口函数的参数值跟返回值,知道函数怎么用就可以了。 再看 C# 代码: 跟原子哥实验中的操作一样先调用 LLFen.TPAD.TPAD_Init() 函数进行初始化,然后通过判断 LLFeng.TPAD.TPAD_Scan() 函数的返回值来知道电容触摸键是否被下,按下一次, led1 的状态就取反一次。点调试,把代码部署到战舰开发板,看到红色 LED 灯在闪烁的时候,用手触摸一次触摸区域,绿色的 LED 就会亮,再触摸一次就会灭掉。           到目前为止,距上次的固件更新,这次的固件,有三个修改: 1、         MF 系统节拍的时钟已经改成用 Systick 来驱动,官方的是要占用三个定时器来驱动,改用 Systick 就可以把这三个定时空出来。 2、        封装了蜂鸣器直接底层驱动的接口,直接调用 LLFeng.Beep.beepon() 和 LLFeng.Beep.beepoff() 这两个函数就可以直接的让蜂鸣器开跟关。 3、        封装了电容触摸驱动的接口,让 MF 在战舰开发板上也可以用电容触摸。   EDN的附件上传有点问题,传不上来,固件跟C#工程文件,大家直接进开源电子论坛去下载:http://openedv.com/posts/list/44511.htm
  • 热度 20
    2014-12-28 22:15
    1403 次阅读|
    3 个评论
         最近比较忙,被公司拉去排列文艺节目,每晚很晚才回来,回来都很累,随便折腾下移植就过了。LCD早就移植好,Toucher也移植好了,只是还没有验证。回到正题上,这次实验直接就上字符显示跟汉字显示。因为这些实验用MF来实现,也实在是太简单了。之前用裸机做的,又是LCD驱动,又是字库的制作,还要用文件系统把字库从SD卡烧写到W32Q64上面。用MF来实现,你只需要把转换的字库加到VS的资源管理器那里,然后就可以调用字库来显示中英文。字库也是完全可以定制,直接用系统的字库文件通过软件跟指令来按需求转换,具体的做法,后面的章节再详细讨论,我这里已经制作好一个字库直接用就可以了。       先直接上代码,整个工程也附在附件上: using System; using Microsoft.SPOT; using Microsoft.SPOT.Hardware; using System.Threading; using MFPins; using Microsoft.SPOT.Presentation; using Microsoft.SPOT.Presentation.Controls; using Microsoft.SPOT.Presentation.Media; using Microsoft.SPOT.Input; using Microsoft.SPOT.Touch; namespace LED {     public class Program     {             public static void Main()         {            OutputPort led0 = new OutputPort(MFPins.CPU.Pins.PB5, true);            Bitmap TFT = new Bitmap(240, 320);            TFT.DrawText("Hello .NET Micro Framework!", Resources.GetFont(Resources.FontResources.STXIHEI), Colors.Green, 10, 30);            TFT.DrawText("这是战舰开发板", Resources.GetFont(Resources.FontResources.STXIHEI), Colors.Red, 50, 50);            TFT.Flush();             while (true)             {                 led0.Write(!led0.Read());                 Thread.Sleep(500);                                   }         }      } }         Bitmap TFT = new Bitmap(240, 320)这句是在内存里开辟空间给LCD显示做缓存,之后一切相关函数都是先操作缓存,直到执行TFT.Flush()函数,MF才会把缓存数据写到LCD上显示出来。   TFT.DrawText("Hello .NET Micro Framework!", Resources.GetFont(Resources.FontResources.STXIHEI), Colors.Green, 10, 30); TFT.DrawText("这是战舰开发板", Resources.GetFont(Resources.FontResources.STXIHEI), Colors.Red, 50, 50);这两句就是文本显示,第一参数就是字符串,第二个参数就是获取工程资源管理器上的字库,第三个参数自然就是显示的颜色,后两个就是显示的X,Y位置。然后执行TFT.Flush(),LCD就可以显示出来了。效果如下图       最后还附上最近固件,内容就是增加了Toucher。存在的Bug:1,部署的代码,偶尔后读取不了,要复位一两次才正常,估计跟W32Q64的底层有关,因为现在的代码都是部署到W32Q64上,每次开机的都是从它那里读出来执行。     2,LCD显示的时候有些像素点会跑偏,导致字符显示模糊。 附件1:   TinyCLR.bin (文件大小: 439 KB 下载次数:6次)     
  • 热度 13
    2014-10-15 21:56
    1100 次阅读|
    0 个评论
        紧接上文,继续来写GPIO口输入输出的输入。跟设置输出一样对按键进行初始化    InputPort key0 = new InputPort(MFPins.CPU.Pins.PE4, true,               Port.ResistorMode.PullUp);初始化的参数的含义是可以直接查InputPort的定义,在VS中转到InputPort的定义如下:        public InputPort(Cpu.Pin portId, bool glitchFilter, Port.ResistorMode resistor);         protected InputPort(Cpu.Pin portId, bool initialState, bool glitchFilter, Port.ResistorMode resistor);         protected InputPort(Cpu.Pin portId, bool glitchFilter, Port.ResistorMode resistor, Port.InterruptMode interruptMode); 这一看就明白,其实 glitchFilter是消抖滤波,我在用的时候,实际没什么效果。 把原来led1的代码改成 led1.Write(key0.Read());这样led1的电平就根据key0的电平来输出, 按F5调试,就可以实现按下按键led0就被点亮。        学嵌入式到这里都想按键要用中断来实现按钮,用C#来实现是极简单的事情。同样也是先初始化,把key0改成中断模式。这里直接贴代码: using System; using Microsoft.SPOT; using Microsoft.SPOT.Hardware; using System.Threading; using MFPins; namespace LED {     public class Program     {       static  InterruptPort key0 = new InterruptPort(MFPins.CPU.Pins.PE4, true, Port.ResistorMode.PullUp, Port.InterruptMode.InterruptEdgeLow);       static   OutputPort led1 = new OutputPort(MFPins.CPU.Pins.PE5, true);         public static void Main()         {             OutputPort led0 = new OutputPort(MFPins.CPU.Pins.PB5, true);             OutputPort led1 = new OutputPort(MFPins.CPU.Pins.PE5, true);                       key0.OnInterrupt += new NativeEventHandler(Program_OnInterrupt);             while (true)             {                 led0.Write(!led0.Read());                 Thread.Sleep(500);               //  led1.Write(key0.Read());              }         }         static void Program_OnInterrupt(uint data1, uint data2, DateTime time)         {             Thread.Sleep(20);             if (!key0.Read())             {                 led1.Write(!led1.Read());             }         }     } }  InterruptPort key0的初始化一看就明白是什么意思,这里 的一设置成  Port.ResistorMode.PullUp上拉电阻模式 ,战舰板的按键都没有外部上拉电阻,这里人吐槽下原子哥,几分钱的电阻都要省几个下来,要是遇到IO没有内部上下拉电阻的MCU,那就坑死了,哈哈。    key0.OnInterrupt += new NativeEventHandler(Program_OnInterrupt);是定义按键中断函数,可以完全自己定义,不像裸机只能是固定的 函数。其它的没什么好说,中断那里做了下消抖。按F5调试,依次按key0就可以控制到led1的亮灭。       用VS敲着代码,感觉VS的代码补齐功能太强了,MDK什么时候能做到这样,对我们来是大好的事情。
  • 热度 12
    2014-10-15 17:35
    996 次阅读|
    0 个评论
      写完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次)  
相关资源
  • 所需E币: 1
    时间: 2020-6-17 17:49
    大小: 12.84MB
    上传者: Argent
    智能时代,电子产品丰富多彩,设计方案多多。手头有些硬件、软件方面的设计资料,包括成熟的方案,分享出来仅供大家参考,欢迎下载。
  • 所需E币: 5
    时间: 2019-12-25 15:35
    大小: 443.84KB
    上传者: 二不过三
    介绍了MFRC632射频识别读写器芯片在一种专用读卡器设备中的典型应用,并详细阐明各种相关原理和关键技术.该方案充分利用了MFRC632射频识别读写器芯片的功能和MifareOne卡上的资源,拓宽了MifareOne卡的使用范围.蓝粪鎏邕羹鸶逢釜超塑唑坐塑堕型堕捌堕堕..…一基于MFRC632射频i哭另{l读写器芯片的专用读卡器设计及实现于兴晗1,李君。(1.北方工业大学机电工程学院,北京10004l;2.天津:走学电子信息工程学院,天津300072)攘嚣:穷绍了氍FRC632瓣壤识烈读写嚣芯片在一母专用读卡器设备中婶典型虚用,并详细黼明各种相关原理和关键技术。馈方案充分刺用了MF黼632射频识别读写器芯片的功能和M妇m0ne卡上的资源,拓宽了Mi俄re0ne卡的使螨范围。荚键弼:醐如reOne飞剥海甜e932:融1632鹾涵黜卡射鳆识莉利辫射频识辅技术(R蹦而F恼1uHcy聪ent遗c甜tiDn)开麓嚣书陋其饿电路发赫非接始式砬识羽嚣,与传统的接艘式Ie卡、磁卡……
  • 所需E币: 5
    时间: 2019-12-24 21:54
    大小: 435.45KB
    上传者: 238112554_qq
    MFRD700指令集用户参考手册INTEGRATEDCIRCUITSMFRD700CommandSetUser&ReferenceManualUserManualJune2005Revision3.0PhilipsSemiconductorsPhilipsSemiconductorsUserManualRev.3.0June2005CommandSetMFRD700CONTENTS1GENERALINFORMATION51.1Scope51.2Generaldescription52MFRD700COMMANDSET72.1GeneralDescriptionofserialcommunication……