天嵌2440开发板上有4个LED小灯,随机带的测试软件使用的C++开发的,但笔者比较喜欢C#语言,所以通过对TQ2440的BSP包分析,4个LED小灯,是通过GPIO口进行控制。因此,只要用C#对GPIO口进行控制,就能让LED发光。
关键代码如下:
首先要声明2个WindowCE API 函数调用
第1个 API声明,这个API声明是从C#串口通信的代码中找到,没想到还能用于GPIO口控制。(以后有时间在慢慢学习了,先把代码贴出来供大家参考)
[DllImport( "coredll.dll" )]
private static extern IntPtr CreateFile(
string lpFileName,
uint dwDesiredAccess,
int dwShareMode,
int lpSecurityAttributes,
int dwCreationDisposition,
int dwFlagsAndAttributes,
int hTemplateFile
);
第2个:设备IO控制,在Windows XP/2000下倒是常用,WinCE下也提供。
[DllImport("coredll.dll", EntryPoint = "DeviceIoControl", SetLastError = true)]
internal static extern int DeviceIoControl(
IntPtr hDevice,
int dwIoControlCode,
byte[] lpInBuffer,
int nInBufferSize,
byte[] lpOutBuffer,
int nOutBufferSize,
ref int lpBytesReturned,
IntPtr lpOverlapped);
注意:以上API如果要用在Win2000/XP...等环境下,声明要用 KERNEL32.DLL
还有其中的宏定义替换成自己的变量
private const uint GENERIC_READ = 0x80000000; private const uint GENERIC_WRITE = 0x40000000; private const int OPEN_EXISTING = 3;
API声明完了,现在来说说控制LED小灯的GPIO口:
在天嵌的 L:/TQ2440/TQ2440配套光盘_0829/TQ2440_CD/WinCE资源/WinCE源码/BSP包/TQ2440/Src/Drivers/GPIOdriver
下面可以找到GPIO驱动代码。从代码中可以找到
#define IO_CTL_GPIO_1_ON 0x01
#define IO_CTL_GPIO_2_ON 0x02
#define IO_CTL_GPIO_3_ON 0x03
#define IO_CTL_GPIO_4_ON 0x04
#define IO_CTL_GPIO_ALL_ON 0x05
#define IO_CTL_GPIO_1_OFF 0x06
#define IO_CTL_GPIO_2_OFF 0x07
#define IO_CTL_GPIO_3_OFF 0x08
#define IO_CTL_GPIO_4_OFF 0x09
#define IO_CTL_GPIO_ALL_OFF 0x0a
这些宏定义,和开发板本身带的VC++实例中的定义是一致的。
开发板带的VC++示例程序在:L:/TQ2440/TQ2440配套光盘_0829/TQ2440_CD/WinCE资源/WinCE源码/应用程序/GPIO_Test
不难看出:ON 就是LED 发光,OFF就是LED熄灭。
因此,在C#中,可以用如下的代码控制LED发光
IntPtr gpiodriver = CreateFile("GIO1:", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if (gpiodriver == (IntPtr)(-1))
{
MessageBox.Show("打开GPIO设备失败!");
}
else
{
int bytesReturned = 0;
DeviceIoControl(gpiodriver, 0x02, null, 0, null, 0, ref bytesReturned, IntPtr.Zero);
}
注:0x02就是让LED发光,如果需要让LED2熄灭,则
DeviceIoControl(gpiodriver, 0x07, null, 0, null, 0, ref bytesReturned, IntPtr.Zero);
如果要全部熄灭则:
DeviceIoControl(gpiodriver, 0x0a, null, 0, null, 0, ref bytesReturned, IntPtr.Zero);
有兴趣的朋友可以把上面的代码包装起来,就可以用去做更多的控制实验。关于上面代码的详细解说,今后再续。。。
今天先写到此为止,过几天就要考试了,得复习了。。。。待考完试后,在细细的对C#在GPIO控制进行详细说明。
转自:http://blog.csdn.net/ex_net/archive/2009/10/20/4702546.aspx