我用了一块艾讯的sbc84500的主板(Geode的cpu),用pb定制了一个wince,该主板上有一个8路数字io口,地址为0x123,还具有看门狗的功能。
我打算在我的程序中加入对数字io口的控制,和看门狗的功能。
我首先试验了控制数字io口的功能,我采用了在vc中嵌入汇编语言的方法,代码如下:
void CIOControlDlg::OnButtonSet()
{
// TODO: Add your control notification handler code here
//所有的位置1
__asm
{
mov dx,0x123
mov al,0xff
out dx,al
}
return;
}
void CIOControlDlg::OnButtonClr()
{
// TODO: Add your control notification handler code here
//所有的位清0
__asm
{
mov dx,0x123
mov al,0x0
out dx,al
}
}
经检测io口的电平,试验成功。
然后,开始试验看门狗的功能,先将主板上的看门狗跳线短接,打开看门狗功能,编写代码:
//io口输出函数
void OutPortByte(WORD addr,BYTE prnch)
{
_asm
{
push ax
push dx
mov dx,addr
mov al,prnch
out dx,al
pop dx
pop ax
}
}
//开始执行看门狗
void CWDTDlg::OnButtonEnableTimer()
{
// TODO: Add your control notification handler code here
//OUT 120H 0AH ; enter WDT function
//OUT 120H 0BH ; enable WDT function
OutPortByte(0x120,0xA);
OutPortByte(0x120,0xB);
//OUT 120 0NH ; N=1,2,3 or 4
OutPortByte(0x120,2);
//OUT 121 0MH ; M=0,1,2,…F
OutPortByte(0x121,0);
}
//复位看门狗
void CWDTDlg::OnButtonResetTimer()
{
// TODO: Add your control notification handler code here
//OUT 121 0MH ; M=0,1,2,…F
OutPortByte(0x121,0);
}
//停止看门狗
void CWDTDlg::OnButtonDisableTimer()
{
// TODO: Add your control notification handler code here
//OUT 120 00H ; Can be disable at any time
OutPortByte(0x120,0);
}
程序运行后,发现看门狗不起作用。
我怀疑是手册部分,关于看门狗编程部分的文档有问题,到网上搜索一番,到了艾讯法国的网站上看到了一个页面http://www.axiomtek.fr/faq.php,
里面有关于看门狗的叙述
Question: How to use DOS command \"Debug\" to trigger WatchDog function of SBC84600?
Answer: Firstly, please set the Jumper to RESET mode of Watchdog function. And use DOS command \"Debug\" to trigger Watchdog function as below.
-o 120 0a
-o 120 0b
-o 120 02 (N=2)
-o 121 00 (M=0)
The system will reboot after 5 seconds automatically.
Please refer SBC84600 User\'s manual, it provides the detail information about the Watchdog function.
我按照上面说的进入dos,使用debug,敲入代码,发现看门狗功能正常。
于是再次上网,到各处的wince的论坛里逛一逛,里面关于访问io端口的方法用到MmMapIoSpace,VirtualAlloc\VirtualCopy,
把io口的物理地址映射成虚拟地址,然后对虚拟地址进行操作。
于是参照该方法试一试,我用了MmMapIoSpace,发现在我的pc上,程序不能编译,加入#include <ceddk.h>,#pragma comment(lib,"ceddk.lib")
后,链接程序找不到ceddk.lib。我于是到安装pb的电脑上,找到当初我订制wince的工程目录里,搜寻一番,在" 工程目录\WINCE420\Geode\cesysgen\oak\lib"下面终于找到了ceddk.lib,
原来定制完wince后,产生的sdk好像并没有把所有的头文件和库文件都安装上。至此一切完毕,编译好程序,下载到目标机中运行,成功。
代码如下:
#include <ceddk.h>
#pragma comment(lib,"ceddk.lib")
void OutPortFun(WORD wAddr,byte bValue)
{
PHYSICAL_ADDRESS IoAddress;
IoAddress.LowPart = wAddr;//硬件地址
IoAddress.HighPart = 0;
UCHAR * gpioPtr;
gpioPtr = ( UCHAR *)MmMapIoSpace( IoAddress,1,FALSE );
WRITE_PORT_UCHAR(gpioPtr,bValue);
}
//开始执行看门狗
void CWDTDlg::OnButtonEnableTimer()
{
// TODO: Add your control notification handler code here
//OUT 120H 0AH ; enter WDT function
//OUT 120H 0BH ; enable WDT function
OutPortFun(0x120,0xA);
OutPortFun(0x120,0xB);
//OUT 120 0NH ; N=1,2,3 or 4
OutPortFun(0x120,2);
//OUT 121 0MH ; M=0,1,2,…F
OutPortFun(0x121,0);
}
//停止看门狗
void CWDTDlg::OnButtonDisableTimer()
{
// TODO: Add your control notification handler code here
//OUT 120 00H ; Can be disable at any time
OutPortFun(0x120,0);
}
//复位看门狗
void CWDTDlg::OnButtonResetTimer()
{
// TODO: Add your control notification handler code here
//OUT 121 0MH ; M=0,1,2,…F
OutPortFun(0x121,0);
}