中断控制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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++);