c#

位置:IT落伍者 >> c# >> 浏览文章

在.Net Micro Framework中访问硬件


发布日期:2024年02月07日
 
在.Net Micro Framework中访问硬件

Net Micro framework GPIO RS Embedded

GPIO

通常来说一块MCU要与周边环境进行交流使用GPIO(General Purpose Input/Output)无疑是最常用的方式一个GPIO口在被初始化之后可以被用于输入或输出的通道一个GPIO口可以由两种状态来描述 低(约为伏)和高(通常认为是伏的正向电压)

Net Micro Framework中GPIO的状态被定义为布尔型false>低 true>高

Tips这里说的低(伏)和高(伏)是指你在设置GPIO的时候实际加在GPIO口的电压而在考虑输入的时候一般v以下会被认为是逻辑低~伏通常认为是逻辑高超过的电压是如果不加保护电路通常是会损坏你的硬件的

输出

在MicrosoftSPOTHardware命名空间下你可以找到OutputPort类它继承自MicrosoftSPOTHardwarePort一个用于描述GPIO的基础类

定义OutputPort一般都会初始化一个默认值(true代表高false表示低)

OutputPort outputPort = new OutputPort(MyPinsStatusLED true);

/*第一个参数是枚举类型MicrosoftSPOTHardwareCpuPin不过为了使你的代码更灵活非常建议你使用自己封装的类来绑定CPU的管脚名称和GPIO口的编号*/

接着outputPort的Write和Read方法就可以使用了Write方法控制了管脚的电平状态Read方法用于返回当前状态也即上一次设置的状态

下面的例子用于让自定义pin的led按hz的频率闪烁(实际上是亮暗各s左右)

)thiswidth=; height=>

输入

和OutputPort相类似MicrosoftSPOTHardwareInputPort扮演了输入的功能它同样继承自MicrosoftSPOTHardwarePort下面的例子演示了如何在一个无限循环中轮询inputPort的状态

image onmousewheel=javascript:return big(this) border= alt= src=http://imgeducitycn/img_///jpg width= onload=javascript:if(thiswidth>)thiswidth=; height=>

另外还有一个可以在运行时动态改变状态地逻辑端口Tristate Port听名字似乎是三态端口不过事实上目前它只能在高和低之间切换

中断

如果你仅仅只是想等待一个按键的按下那么使用前面那种使用无限循环的方式来读取输入口的状态的办法无疑显得太耗了点我们不并希望Cpu总是处于这么忙碌的状态比如某些状况下(例如电池)我们只是希望某些外部消息和请求以中断的形式告诉CpuNet MF中我们使用InterruptPort类来实现相应地功能中断可以理解为硬件之间的事件如果MCU除了等待某个GPIO口的事件而没有其他事情做的话该处理器就可以放心的进入省电模式了当一个信号的改变发生在相应的输入管脚的时候MCU会然后相应的中断服务程序(ISR)会被执行

你可以把中断端口设置为上升沿触发或者下降沿触发或者两者都触发也可以是高低电平触发如下程序演示了如何在一个脉沖的上升沿和下降沿都引起中断中断服务程序的入口点由相应的委托OnInterrupt来指派

image onmousewheel=javascript:return big(this) border= alt= src=http://imgeducitycn/img_///jpg width= onload=javascript:if(thiswidth>)thiswidth=; height=>

下面的例子演示了电平触发的过程

image onmousewheel=javascript:return big(this) border= alt= src=http://imgeducitycn/img_///jpg width= onload=javascript:if(thiswidth>)thiswidth=; height=>

串口(RS)

尽管如今USB盛行串口设备仍然有着他们自己的生存空间比如一些测量仪器GPS接收器等等

NET Framework以及NET Compact Framework中的类型相应的Net Micro Framework中也有SerialPort类只不过它被放在了MicrosoftSPOTHardware程序集中而不是它的前辈们的SystemIOPorts下使用前需要先对SerialPortConfiguration进行配置

下面的例子演示了如何通过串口发送数据

image onmousewheel=javascript:return big(this) border= alt= src=http://imgeducitycn/img_///jpg width= onload=javascript:if(thiswidth>)thiswidth=; height=>

读数据的方法也和PC上差不多

image onmousewheel=javascript:return big(this) border= alt= src=http://imgeducitycn/img_///jpg width= onload=javascript:if(thiswidth>)thiswidth=; height=>

管脚的使用和保留

保留CPU的管脚你可以显示的控制管脚的用途避免管脚复用造成的沖突通过注册你的Hardware Provider(MicrosoftSPOTHardwareProvider)你可以约定你的管脚使用情况

串行通信不仅仅包括RS的串口还有SPI和I⊃C总线等方式HardwareProviderHardwareProvider也不只为RS提供硬件信息服务当你自定义HWP的时候你需要从HWP继承过来并重写GetICPins GetSerialPins and GetSpiPins三个虚方法中的至少一个它们在缺省状况下均返回CpuPinGPIO_NONE之后需要调用静态方法Register()来完成注册

下面是一个自定义的HardwareProvider用以设定RS串口的保留管脚它实现了GetSerialPins方法返回的是CPU的输入输出管脚号

image onmousewheel=javascript:return big(this) border= alt= src=http://imgeducitycn/img_///jpg width= onload=javascript:if(thiswidth>)thiswidth=; height=>

上一篇:详解.NET中的动态编译技术

下一篇:用FileSystemWatcher对象监控C#目录改变