zq2002
论坛版主
论坛版主
  • 注册日期2003-12-30
  • 最后登录2018-09-26
  • 粉丝0
  • 关注0
  • 积分45分
  • 威望185点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
阅读:2392回复:7

求助!关于在wince下访问硬件寄存器的问题

楼主#
更多 发布于:2004-10-20 17:31
我想在wince的应用程序中控制gpio口,下面是部分相关程序
PHYSICAL_ADDRESS IoAddress;
IoAddress.LowPart = 0x56000050;\\这是arm9 GPFCON控制寄存器的硬件地址
IoAddress.HighPart = 0;
ULONG  * gpioPtr;
gpioPtr = ( ULONG *)MmMapIoSpace( IoAddress,40,FALSE );
WRITE_REGISTER_ULONG(gpioPtr,numDatWrite);\\写0x56000050寄存器
WRITE_REGISTER_ULONG((gpioPtr+4),numDatWrite);\\写0x56000054寄存器

然后我debug这个应用程序,发现虚拟地址映射是成功的,写0x56000050寄存器也是成功的,但是写0x56000054寄存器时,evc出错,跟硬件短开了
以下是错误代码
C Run-Time Error R6025pure virtual function call
No object has been instantiated to handle the pure virtual function call.

This error is caused by calling a virtual function in an abstract base class through a pointer which is created by a cast to the type of the derived class, but is actually a pointer to the base class. This can occur when casting from a void* to a pointer to a class when the void* was created during the construction of the base class.


但是我假如我修改上面的代码,不写0x56000050这个寄存器,而是直接写0x56000054时,不会报错,但是数值写不到寄存其中去,真是奇哉怪也啊
哪位能指点下迷津呢?

最新喜欢:

jedijiejediji...
zq2002
论坛版主
论坛版主
  • 注册日期2003-12-30
  • 最后登录2018-09-26
  • 粉丝0
  • 关注0
  • 积分45分
  • 威望185点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-10-21 14:42
哎呀,又是你啊,真是个热心人,我现在就回去试试! :D
zq2002
论坛版主
论坛版主
  • 注册日期2003-12-30
  • 最后登录2018-09-26
  • 粉丝0
  • 关注0
  • 积分45分
  • 威望185点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-10-22 08:55
哎,今天用你的方法试了一下,还是在写寄存器的时候出错被强行断开,我好迷惘啊。。。。
下面这个是我的部分代码,为了方便,把好多输出调试信息的语句都去掉了

DWORD  size=128;


PVOID pVirtualAddr;
BOOL x;
pVirtualAddr = VirtualAlloc( 0, size, MEM_RESERVE, PAGE_NOACCESS );
x=VirtualCopy(pVirtualAddr, (void *)(0xb1600000/256), size, PAGE_READWRITE | PAGE_NOCACHE | PAGE_PHYSICAL) ;
WRITE_REGISTER_ULONG((ULONG*)pVirtualAddr,0x00000000);
zq2002
论坛版主
论坛版主
  • 注册日期2003-12-30
  • 最后登录2018-09-26
  • 粉丝0
  • 关注0
  • 积分45分
  • 威望185点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-10-22 12:13
刚才终于成功了!
下面是代码,给大家参考下
相关参数的定义在2410.h中,如下
// Registers : I/O port
//

#define IOP_BASE      0xB1600000 // 0x56000000
typedef struct  {
    unsigned int  rGPACON; // 00
    unsigned int  rGPADAT;
    unsigned int  rPAD1[2];
    
    unsigned int  rGPBCON; // 10
    unsigned int  rGPBDAT;
    unsigned int  rGPBUP;
    unsigned int  rPAD2;
    
    unsigned int  rGPCCON; // 20
    unsigned int  rGPCDAT;
    unsigned int  rGPCUP;
    unsigned int  rPAD3;
    
    unsigned int  rGPDCON; // 30
    unsigned int  rGPDDAT;
    unsigned int  rGPDUP;
    unsigned int  rPAD4;
    
    unsigned int  rGPECON; // 40
    unsigned int  rGPEDAT;
    unsigned int  rGPEUP;
    unsigned int  rPAD5;
    
    unsigned int  rGPFCON; // 50
    unsigned int  rGPFDAT;
    unsigned int  rGPFUP;
    unsigned int  rPAD6;
    
    unsigned int  rGPGCON; // 60
    unsigned int  rGPGDAT;
    unsigned int  rGPGUP;
    unsigned int  rPAD7;
    
    unsigned int  rGPHCON; // 70
    unsigned int  rGPHDAT;
    unsigned int  rGPHUP;
    unsigned int  rPAD8;
    
    unsigned int  rMISCCR; // 80
    unsigned int  rDCKCON;
    unsigned int  rEXTINT0;
    unsigned int  rEXTINT1;
    unsigned int  rEXTINT2; // 90
unsigned int  rEINTFLT0;
unsigned int  rEINTFLT1;
unsigned int  rEINTFLT2;
unsigned int  rEINTFLT3; // A0
unsigned int  rEINTMASK;
unsigned int  rEINTPEND;
unsigned int  rGSTATUS0; // AC
unsigned int  rGSTATUS1; // B0
unsigned int  rGSTATUS2; // B4
unsigned int  rGSTATUS3; // B8
unsigned int  rGSTATUS4; // BC

}IOPreg;  
其实我要做的就是让把GPF0和GPF2设置成IO输出工作方式,让他们输出一个高低电平不断变换的波形
下面是部分代码
BOOL x;
int n,m;
v_pIOPRegs = (volatile IOPreg *)VirtualAlloc(0, sizeof(IOPreg), MEM_RESERVE, PAGE_NOACCESS);
x=VirtualCopy((PVOID)v_pIOPRegs, (PVOID)IOP_BASE, sizeof(IOPreg), PAGE_READWRITE|PAGE_NOCACHE);
v_pIOPRegs->rGPFCON = (v_pIOPRegs->rGPFCON & 0x00000000) | (0x11);//将GPFn配置成数据输出方式
while(1)
{



for(n=0;n<100;n++)//延时
{
m=n;
}
v_pIOPRegs->rGPFUP=(v_pIOPRegs->rGPFUP&0x0);
v_pIOPRegs->rGPFDAT=(v_pIOPRegs->rGPFDAT|0xf);\\输出高
for(n=0;n<100;n++)\\延时
{
m=n;
}
v_pIOPRegs->rGPFUP=(v_pIOPRegs->rGPFUP|0xf);
v_pIOPRegs->rGPFDAT=(v_pIOPRegs->rGPFDAT&0x0);\\输出低

}
这样,我用示波器就可以从GPF0 和GPF2上面检测到一个方波的波形了,我估计原来一直出错的原因可能是因为使用WRITE_REGISTER_ULONG这个函数造成的


[编辑 -  10/22/04 by  zq2002]
游客

返回顶部