在.Net Micro Framework中访问硬件 - part3

相关文章

在.Net Micro Framework中访问硬件 - part1

在.Net Micro Framework中访问硬件 - part2

 

在.Net Micro Framework中访问硬件 - part3

 

摘要:本文介绍了.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开发板的芯片组的名称,在你装了板子的驱动后,会在这里看到)如图:


EmbeddedFusionTAHOE开发板上输出结果为:

*** 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的实际速率和这里的SystemClock,SlowClock的关系是: f(Cpu)>f(systemclock)>f(slowclock)

 

 

三. 系统ID 

 

和在Windows CE/Windows Mobile上面一样,应用程序经常要判断当前运行的系统平台/版本等,程序员总是希望他们的程序能在各种版本的系统上都能运行。一种简单的方式是在代码里面定义一些编译符号,通过#if, #else, 和#endif来跟据不同的平台编译出不同的程序集,但是这样每次得为不同的平台都进行编译。那还有一种方式就是在运行时去检测当前系统的版本号。和.Net Compact Framework一样,.Net Micro Framework也提供了类似的功能,通过Microsoft.SPOT.Hardware.SystemID类,你可以很直观的获得系统ID等信息,为运行时针对不同的开发板执行不同的代码提供了可能。不过要注意的是这个类其实并不在Microsoft.SPOT.Hardware程序集中,而是放在Microsoft.SPOT.Native.dll中  - -!

下面的示例获取了SystemID的三个静态只读属性:

 

 

        public static void Main()
        
{
            
//产品模型号
            Debug.Print("Model: " + SystemID.Model);
            
//OEM标识
            Debug.Print("Original Equipment Manufacturer (OEM): " + SystemID.OEM);
            
//产品统一编号
            Debug.Print("Stock Keeping Unit (SKU): " + SystemID.SKU);
        }

 

 

 

在Microsoft Emulator中运行输出如下:

Model: 2
Original Equipment Manufacturer (OEM): 1

Stock Keeping Unit (SKU): 3

 

在EmbeddedFusion Tahoe开发板上运行输出如下:

Model: 0
Original Equipment Manufacturer (OEM): 255

Stock Keeping Unit (SKU): 65535

 

注意:实际上Tahoe的还并没有完全实现这些方法,这是他们的第一款产品。

 

 

总结

 

至此,我们可以发现在.Net Microframework中访问这些硬件是多么简单。利用强大的Visual Studio,利用托管代码进行比以往要轻松好几倍的嵌入式开发。

参考资料/资源:

enjoy!

 

黄季冬

 

 


 

posted on 2008-08-04 08:07  J.D Huang  阅读(2103)  评论(4编辑  收藏  举报