在EDK中,与中断控制器有关的底层文件有:xintc.c、xintc.h、xintc_g.c、xintc_i.h、xintc_intr.c、xintc_l.c、xintc_l.h、xintc_options.c以及xintc_selftest.c。所以在GPIO的用户代码中添加下列语句:
#include “xintc.h”
#include “xintc_1.h”
#include “xintc_i.h”
中断控制器的驱动函数,包含中断控制器的初始化、使能、撤销以及清除等函数。下面给出常用的中断控制器操作函数:
(1)初始化函数
XStatus XIntc_Initialize (XIntc *InstancePtr, Xuint16 DeviceId);
XIntc_Initialize用于指定中断控制模块,同时初始化中断结构域、中断向量表,撤销中断源以及中断输出使能。其中InstancePtr是Xintc的对象;DeviceId是中断模块的唯一设备ID号。返回m_XST_SUCCESS表明初始化成功,否则初始化失败。
(2)中断使能函数
XStatus XIntc_Start (XIntc *InstancePtr, Xuint8 Mode);
XIntc_Start开始中断控制。其中InstancePtr是Xintc的对象;Mode为中断模式,可使能模拟中断以及真实的硬件中断。
(3)中断撤销函数
void XIntc_Stop (XIntc *InstancePtr);
XIntc_Stop输出停止中断控制,其中InstancePtr是Xintc的对象。
(4)中断源连接函数
XStatus XIntc_Connect (XIntc *InstancePtr, Xuint8 Id, XInterruptHandler Handler
void *CallBackRef);
XIntc_Connect连接中断源的ID以及与之关联的处理程序,当中断被确认后,处理程序将运行。其中InstancePtr是Xintc的对象;Id为中断源的序号,0是最高级别的中断;Handler是中断处理程序;CallBackRef是返回参数,通常为连接驱动器的对象指针。若返回mXST_SUCCESS表明连接正确,否则则连接失败。
(5)中断源撤销函数
void XIntc_Disconnect (XIntc *InstancePtr, Xuint8 Id);
XIntc_Disconnect撤销与中断源Id关联的处理程序。其中InstancePtr是Xintc的对象;Id为中断源的序号,0是最高级别的中断。
(6)特定中断使能函数
void XIntc_Enable (XIntc *InstancePtr, Xuint8 Id);
XIntc_Enable使能由竞争ID提供的中断源,任何一个未决的特定中断条件将导致一个功能调用。其中InstancePtr是Xintc的对象;Id为中断源的序号,0是最高级别的中断。
(7)特定中断撤销函数
void XIntc_Disable (XIntc *InstancePtr, Xuint8 Id);
XIntc_Disable撤销由竞争ID提供的中断源,但中断控制器将不产生一个特定Id的中断,将继续保留该中断条件。其中InstancePtr是Xintc的对象;Id为中断源的序号,0是最高级别的中断。
(8)中断源响应函数
void XIntc_Acknowledge (XIntc *InstancePtr, Xuint8 Id);
XIntc_Acknowledge响应竞争后Id的中断源,响应中断后将清除中断条件。其中InstancePtr是Xintc的对象;Id为中断源的序号,0是最高级别的中断。
3.外部存储器控制器
外部存储器控制器基本涵盖了目前所有的外部存储器类型,包括片内BRAM、sram、sdr sdram、ddr sdram、ddr2 sdram以及Flash等器件。这里以sdr sdram控制器为例介绍其结构和底层驱动。
1)sdr sdram控制器结构
sdr sdram存储器是动态同步存储器的一种,采用单时钟,其时钟频率就是数据存储的频率,如时钟信号为100或133 MHz,则数据读写速率也为100或133MHz。但由于sdram依赖于电容的电量来区分逻辑“0”和“1”,但电容器会不断漏电,需要周期性地刷新sdram的每一个存储单元,因此读写时序比较复杂,且读写速率也达不到工作时钟的频率。sdram控制器的作用就是将sdram存储器的初始化、刷新、地址转换、数据读取等操作封装起来,让使用者将其看成系统黑盒,读数直接按地址访问,写数直接往目的地址赋值即可。Xilinx提供了sdr sdram控制器的IP Core,在XPS中,直接将其添加到OPB总线上即可。sdr sdram控制器的内部结构以及与OPB总线的接口如图9-12所示。
图9-12 sdram控制器和OPB总线的连接示意图
sdram控制器完整的信号端口列表如表9-9所列。其中C_SDRAM_DWIDTH为sdram存储器的数据宽度,C_SDRAM_AWIDTH为sdram存储器的地址宽度,C_SDRAM_BANK_ AWIDTH为存储器BANK的地址。
表9-9 sdr sdram控制器的端口信号列表
sdram控制器支持不同数据位宽的读、写模式,且不同位宽以及不同刷新模式下的读写时序和配置都是不同的。例如,突发模式下16比特数据位宽的sdram控制器读写时序如图9-13和图9-14所示。
图9-13 16比特突发模式读数据的时序逻辑图
图9-14 16比特突发模式写数据的时序逻辑图
2)sdr sdram控制器驱动
在嵌入式系统中,sdr sdram控制器对于用户来讲是透明的,即用户在功能使用上没有初始化、刷新等操作,直接用IO读写函数读写相应的地址即可。基本的IO读写函数在文件xio.h中定义,其本质就是简单的指针赋值语句,32比特位宽的读写函数如下所示。
#define XIo_In32(InputPtr) (*(volatile Xuint32 *)(InputPtr))
#define XIo_Out32(OutputPtr, Value) \
(*(volatile Xuint32 *)((OutputPtr)) = (Value))
因此在操作sdram时,只需添加下列两个头文件。其中,xio.h定义了端口操作的函数,xparameters.h文件则给出了sdram存储器的基地址。
#include " xio.h "
#include " xparameters.h "
常用的IP核以及设备驱动
页:
1
[2]