中断控制

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

微机原理实验报告

实验名称:并行I/O接口实验

院系:

班级:

姓名:

学号:

一. 实验目的

掌握GPIO IP核的工作原理和使用方法

掌握中断控制方式的IO接口设计原理

掌握中断程序设计方法

掌握IO接口程序控制方法

查询方式

中断方式

延时方式

二. 实验环境

UltraEdit ; XilinxISE。

三、实验内容

最小系统的建立,查询方式与中断方式在counse显示独立开关操作总线连接方式

Gpio内部框图

中断寄存器

硬件电路框图

四.实验内容

1.最小系统的建立

打开Xilinx Platform studio平台,选择相关参数,建立相关文件。

将FPGA内存改为32K,添加UART类型接口,其他选择默认配置。

修改时钟设置:删除Exterinal Port 中的CLK_P与CLK_N并添加Clock_generator_0中的CLKIN修改名称为CLK。同时再将RS232的输入输出端口名修改RsRxRsTx。

最后再添加约束文件,约束引脚,保存。产生bit流,最小系统就建好了。

NET "CLK" LOC="E3"|IOSTANDARD="LVCMOS33";

NET "RESET" LOC="E16"|IOSTANDARD="LVCMOS33";

NET "RsRx" LOC="C4"|IOSTANDARD="LVCMOS33";

NET "RsTx" LOC="D4"|IOSTANDARD="LVCMOS33"; #OUTOUT

2.在最小系统基础上添加相应的IP核。分别是8位的Button,4位的Dip,中断

控制核(AXI Interrupt Controller IP)并与micorblace的中断信号线相连(刚开始我没有做这一步,结果一节课过去了,却怎么也做不出来),将Button,Dip添加为他的中断源,button Dip设置为仅输入其他端都设置为无连接。最后再添加相应的约束文件并保存。

NET "Dip_GPIO_IO_I_pin<0>" LOC="U9"|IOSTANDARD="LVCMOS33";

NET "Dip_GPIO_IO_I_pin<1>" LOC="U8"|IOSTANDARD="LVCMOS33";

NET "Dip_GPIO_IO_I_pin<2>" LOC="R7"|IOSTANDARD="LVCMOS33";

NET "Dip_GPIO_IO_I_pin<3>" LOC="R6"|IOSTANDARD="LVCMOS33";

NET "Dip_GPIO_IO_I_pin<4>" LOC="R5"|IOSTANDARD="LVCMOS33";

NET "Dip_GPIO_IO_I_pin<5>" LOC="V7"|IOSTANDARD="LVCMOS33";

NET "Dip_GPIO_IO_I_pin<6>" LOC="V6"|IOSTANDARD="LVCMOS33";

NET "Dip_GPIO_IO_I_pin<7>" LOC="V5"|IOSTANDARD="LVCMOS33";

NET "Button_GPIO_IO_I_pin<0>" LOC="F15"|IOSTANDARD="LVCMOS33";

NET "Button_GPIO_IO_I_pin<1>" LOC="T16"|IOSTANDARD="LVCMOS33"; NET "Button_GPIO_IO_I_pin<2>" LOC="R10"|IOSTANDARD="LVCMOS33"; NET "Button_GPIO_IO_I_pin<3>" LOC="V10"|IOSTANDARD="LVCMOS33";

最后输出bit流,进入SDK。

下图为文件位置,Microblaze_0地址IP核

进行软件设计。

3.软件设计

中断程序

void PushBtnHandler(void *CallBackRef)

{

state1=XGpio_DiscreteRead(&Btns,1);//读取按键的状态值

pshBtn=1;

XGpio_InterruptDisable(&Btns, 1);//暂时禁止button中断

Delay_50ms();//延时50ms,忽略按键弹起再次触发的中断

XGpio_InterruptClear(&Btns,1);//清除中断标志位

XGpio_InterruptEnable(&Btns, 1);//再次开放按键中断

}

//按钮中断程序

voidPushBtnHandler(void *CallBackRef)

{

state1 = XGpio_DiscreteRead(&Btns,1);//读取按钮状态

pshBtn = 1;

XGpio_InterruptDisable(&Btns,1);

//由于按钮按下去弹上来,是两个过程,这个时延把弹上来的中断屏蔽过去Delay_50ms();

XGpio_InterruptClear(&Btns,1);//清除弹上去的中断

XGpio_InterruptEnable(&Btns,1);

}

//开关中断程序

voidSwitchHandler(void *CallBackRef)

{

state2 = XGpio_DiscreteRead(&Dips,1);//读取中断开关状态

pshDip = 1;

XGpio_InterruptClear(&Dips,1);

}

//主程序

int main()

{

Initialize();

xil_printf("\r\nRunningGpioInputInterrupt!\r\n");

while(1)

{

if(pshBtn)

{

xil_printf("Button Interrupt Triggered!!! The state is 0x%X\n\r",state1);

pshBtn = 0;

}

if(pshDip)

{

xil_printf("Switch Interrupt Triggered!!! The state is 0x%X\n\r",state2);

pshDip = 0;

}

}

return 0;

}

//时延程序

void Delay_50ms()

{

inti;

for(i = 0;i<5000000;i++);

相关文档
最新文档