新闻  |   论坛  |   博客  |   在线研讨会
基于嵌入式微处理器EP9315的二次开发技术
lj_0522 | 2008-07-22 11:25:11    阅读:580   发布文章

 EP9315在WinCE操作系统下主频达到200MHz,总线频率为100MHz,外设时钟为50MHz,硬件调试环境必须与操作系统完全吻合。而应用模块多采用74系列芯片,工作频率一般为几兆赫兹。频率不匹配造成了EP9315发出的读写及使能信号脉宽不足50ns,对由74系列芯片组成的专用模块不能实现正确的读写操作。因此,系统的存储空间采用了如图3所示的分配,应用模块地址空间为CS7:0X7000_0000-0X7FFF_FFFF。

系统的存储空间分配

  为给低速设备提供足够脉宽的总线信号,设置应用模块地址空间存储空间读写特性寄存器SMCBCR7中等待时间位WST1和WST2:

  总线读取等待时间=(WST+1)×总线时钟

  连续读取等待时间=(WST+1)×总线时钟

  调试代码如下:

//总线时钟为200MHz

 ClkSet1=0x02A4A3D7;

//设置cs7数据宽度为8,读写脉宽为150ns

 temp=SMCBCR7;

 temp=temp& 0xcfffffff;

 temp=temp | 0xffef;

 SMCBCR7=temp;

  这种设置使得SDRAM等高速外设和低速外设拥有不同的总线频率,具有很大的灵活性。

  2 系统软件

  2.1 嵌入式操作系统下的驱动程序类型

  由于Windows CE.net开发工具好学易用,没有目标设备时可以在PC上仿真测试,因此基于Windows CE.net的嵌入式开发日益普及。但要在操作系统下控制应用模块就要为应用模块编写驱动。本质上,Windows CE的设备驱动程序都是一些动态链接库(.dll文件),这些dll向内核提供了入口函数,使设备管理模块可以通过这些函数与具体的硬件设备进行通信。由于应用模块功能的不同,微软没有提供相应的驱动,所以只能自行开发测试。开发过程中采用单层驱动结构。

  2.2 驱动程序开发

  2.2.1 应用模块初始化

  应用模块的初始化在标准流接口函数DEV_Init( )中完成,在内核加载驱动时调用该函数,其中DEV为设备文件名的前缀,Windows CE使用其识别与特殊流接口驱动程序相对应的特殊设备。初始化的基本步骤为:

  (1)检查应用模块硬件信息的正确性。

  (2)用Windows CE中的API函数为应用模块驱动中用到的数据结构分配缓冲区。

  hDev=LocalAlloc(LPTR,sizeof(Dev_INFO));

  其中:pDev为包含设备必要信息的结构体指针,Dev_INFO为该结构体类型。

  (3)设置应用模块的默认参数,如应用模块在系统中分配的物理地址空间的基地址。

  PHYSICAL_ADDRESS phyAddr;//64_bit地址

  phyAddr.LowPart=hDev->dwIOBaseAddr;//32_bit物理基地址

  phyAddr.HighPart=0;//高32_bit地址

  (4)通过HalTranslateBusAddress( )和MmIoSpace( )映射I/O地址,提供直接访问设备的虚拟地址。

  if(!HalTranslateBusAddress(Isa,0,phyAddr,0,&phyAddr)) return FALSE;

  hDev->lpMappedBaseAddr=(LPBYTE)MmMapIoSpace(phyAddr,size,FALSE);

  if(!hDev->lpMappedBaseAddr) return FALSE;

  如果分配内存或映射虚拟地址失败,则返回FALSE,退出初始化程序。

  (5)初始化应用模块的读写属性和共享模式。

  2.2.2 应用模块数据接收与发送

  应用模块数据的传递在流接口函数Dev_Write( )和Dev_Read( )中完成。

  DEV_Write(<由应用程序传入的设备句柄>,<写入数据指针>,<写入数据位数>)

  {//每写1字节调用一次WRITE_PORT_UCHAR( );}

  DEV_Read(<由应用程序传入的设备句柄>,<存放数据指针>,<读入数据位数>)

  {//每读1字节调用一次READ_PORT_UCHAR( );}

  其中:WRITE_PORT_UCHAR( )和READ_PORT_UCH-

  AR( )中传递的地址为经过MmMapIoSpace( )映射过的虚拟地址。

  2.2.3 建立应用程序和设备驱动的联系

  操作系统中的应用程序与驱动中的流接口函数一一对应。其关系如图4。

操作系统中的应用程序与驱动中的流接口函数一一对应

  当应用程序准备对某个设备进行读写时,系统必须先执行CreateFile( )函数打开这个设备,得到的设备句柄即为底层设备驱动中Dev_Open( )的返回值。应用程序通过CloseHandle( )调用设备驱动中的Dev_Close( )。执行完该函数后驱动程序引用的设备将不再有效。当一个流接口驱动程序被打开后,应用程序使用ReadFile( )对这个设备进行读操作,驱动程序中Dev_Read( )响应该操作;同样应用程序使用WriteFile( )对该设备进行写操作,驱动程序中Dev_Write( )响应此操作。另外,应用程序还可以使用DeviceIOControl()通知操作系统调用流接口驱动中的DEV_IOControl( )去通知驱动程序要执行的操作。这些操作用户可用Windows CE提供的API函数CTL_CODE自定义。

 

  笔者在Windows CE.net操作系统下,已实现了基于EP9315嵌入式系统对武汉中科院岩土力学所设计的SY5声波仪的控制,设备运行稳定。与原来由51单片机搭建的SY5声波仪相比,该系统功耗降低、体积变小、稳定性增强、成本降低,更适合工业控制中的运用。

  参考文献

  1 ARM Architecture Refrence Manual[R/OL].Advanced RISC Machine Ltd.(ARM),2000

  2 刘明贵,佘诗刚,汪大国.桩基检测技术指南.北京:科学出版社,1995

  3 张晨曦.计算机体系结构.北京:高等教育出版社,2000

  4 马忠梅,徐英慧,叶勇建等.AT91系列ARM核微控制器结构与开发.北京:北京航空航天大学出版社,2003

  5 马忠梅.ARM嵌入式处理器结构与应用基础.北京:北京航空航天大学出版社,2002

  6 刘明贵.基桩与场地检测技术.武汉:湖北省科学技术出版社,1995

  7 候俊杰.****MFC.武汉:华中科技大学出版社,1998

  8 Cirrus Logic.EP9315 User′s Guide.2004

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客