摘要:本文介绍了.Net Micro Framework中对硬件的简单而独特的访问方式。结合模拟器和EmbeddedFusion Tahoe开发板,介绍了如何获取MF设备的电源供给和充电状态,如何获取处理器的特征(如速度等)以及硬件平台ID号等基本硬件信息.
Keywords:
.Net Micro framework, Power supply,Charge state, processor speed
一.电源和供电
一块MCU或者说一块开发板的工作是从上电开始的, 电源状态的改变是在嵌入式设备中我们经常要处理的问题。

在.Net Micro Framework提供了Battery类(在Microsoft.SPOT.Hardware命名空间下),该类提供了一组静态方法来帮助我们方便的获取设备的供电充电状态。有趣的是这个只包含静态方法的类在.Net MF 2.5中居然是可以是实例化的,不过在最新发布的.Net Micro Framework3.0 beta中,已经将它更改为static:
//Battery Class in .Net MF 2.5
public sealed class Battery

//Battery Class in .Net MF 3.0
public static class Battery
下面我们借助一个简单的程序来看一下如何使用这个Battery类获取电池信息:
public static void Main()

{
Debug.Print("*** Battery Info ***");
//蓄电池或者蜂窝电池的充电状态
Debug.Print("State of Charge: " + Battery.StateOfCharge() + "%");

//是否充满(对电池来说并不一定是需要到100%才认为是充满了)
//这里IsFullyCharged方法只是用来检查是否电池可以承担正常负荷
Debug.Print("Is fully charged: " +(Battery.IsFullyCharged() ? "Yes" : "No"));

//ReadVoltage方法返回供电电压单位为毫伏故要除以1000换算为伏特
float voltageVolt = Battery.ReadVoltage() / 1000.0f;
Debug.Print("Voltage: " + voltageVolt.ToString("F3") + " Volt");

//ReadTemperature方法返回当前电池温度的10倍摄氏温度
float degreesCelsius = Battery.ReadTemperature() / 10.0f;
Debug.Print("Temperature: " + degreesCelsius.ToString("F1") +
"° Celsius");

//OnCharger方法用来返回是否接入外接充电电源
Debug.Print("On Charger: " + (Battery.OnCharger() ? "Yes" : "No"));
}在Microsoft Emulator上的输出结果为:
*** Battery Info ***
State of Charge: 0%
Is fully charged: Yes
Voltage: 0.000 Volt
Temperature: 0.0° Celsius
On Charger: No
然后我们去项目属性里面将Micro Framework这一栏的Transport方式改为USB,在下拉框中选择Meridian_xxx(这个名称是TAHOE开发板的芯片组的名称,在你装了板子的驱动后,会在这里看到)如图:

在EmbeddedFusion的TAHOE开发板上输出结果为:
*** Battery Info ***
State of Charge: 75%
Is fully charged: Yes
Voltage: 3.700 Volt
Temperature: 25.0° Celsius
On Charger: Yes

和WinCE一样,你还可以在电源状态发生改变的时候获得一个notify,在MF中,是通过Battery.WaitForEvent(Timespan time)方法实现的,该方法会在给定的时间内监听充电状态,一旦充电状态改变或者超时该方法会返回给应用。
插播广告
欢迎大家积极投稿 :-)
二. 处理器信息
拿到一块开发板,或者自己搭建开发板,首先需要了解的是芯片(MCU)的一些基本信息。在.Net MF中提供了Microsoft.SPOT.Hardware.Cpu 这个类来描述一些跟处理器相关的信息。比如它包含的Pin类用于描述CPU的管脚和GPIO port的对应情况,当然,这种对应关系需要你针对不同的硬件平台自己进行配制。此外,Cpu类还包含了几个与系统Timer相关的属性,见下面的例子:
public static void Main()

{
//系统时钟频率,这里换算成兆赫
float systemClock = Cpu.SystemClock / 1000000.0f;
Debug.Print("System Clock: " + systemClock.ToString("F6") + " MHz");

//还是系统时钟频率,但是是一个较慢较准确的值
float slowClock = Cpu.SlowClock / 1000000.0f;
Debug.Print("Slow Clock: " + slowClock.ToString("F6") + " MHz");

//GlitchFilterTime主要用于界定GPIO上面的毛刺信号
string glitchFilterTimeMs = Cpu.GlitchFilterTime.Milliseconds.ToString();
Debug.Print("Glitch FilterTime: " + glitchFilterTimeMs + " ms");
}
在Microsoft Emulator上面运行输出如下:
System Clock: 27.000000 MHz
Slow Clock: 0.000000 MHz
Glitch FilterTime: 0 ms
在EmbeddedFusion Tahoe开发板上输出如下:
System Clock: 16.000000 MHz
Slow Clock: 16.000000 MHz
Glitch FilterTime: 20 ms
Note 这里的System Clock和SlowClock都是设备生产商设置的,比如这里Tahoe的开发板将两者都设置为16兆赫,一般来说Slow Clock是System clock的1/N ,如: 1/2, 1/4, 1/12, 1/14, 1/28, 1/56, 1/69, 1/127等。Cpu的实际速