摘要:本文介紹了.Net Micro Framework中對硬件的簡單而獨特的訪問方式。結合模擬器和EmbeddedFusion Tahoe開發板,介紹了如何獲取MF設備的電源供給和充電狀態,如何獲取處理器的特征(如速度等)以及硬件平台ID號等基本硬件信息.
一.電源和供電
一塊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的實際速率和這裡的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,利用托管代碼進行比以往要輕松好幾倍的嵌入式開發。