中断控制.docx
- 文档编号:30113279
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:19
- 大小:458.21KB
中断控制.docx
《中断控制.docx》由会员分享,可在线阅读,更多相关《中断控制.docx(19页珍藏版)》请在冰豆网上搜索。
中断控制
微机原理实验报告
实验名称:
并行I/O接口实验
院系:
班级:
姓名:
学号:
一.实验目的
掌握GPIOIP核的工作原理和使用方法
掌握中断控制方式的IO接口设计原理
掌握中断程序设计方法
掌握IO接口程序控制方法
查询方式
中断方式
延时方式
二.实验环境
UltraEdit;XilinxISE。
三、实验内容
最小系统的建立,查询方式与中断方式在counse显示独立开关操作
总线连接方式
寄存器名称
偏移地址
初始值
含义
读写操作
GPIO_DATA
0x0
0
通道1数据寄存器
通道1数据
GPIO_TRI
0x4
0
通道1三态控制寄存器
写控制通道1传输方向
GPIO2_DATA
0x8
0
通道1数据寄存器
通道2数据
GPIO2_TRI
0xC
0
通道1三态控制寄存器
写控制通道1传输方向
Gpio内部框图
中断寄存器
名称
偏移地址
含义
读写操作
GIER
0x11C
全局中断屏蔽寄存器
最高位bit31控制GPIO是否输
出中断信号Irq
IPIER
0x128
中断屏蔽寄存器
控制各个通道是否允许产生中
断
bit0-通道1;bit1-通道2
IPISR
0x120
中断状态寄存器
各个通道的中断请求状态,写
1将清除相应位的中断状态
bit0-通道1;bit1-通道2
硬件电路框图
四.实验内容
1.最小系统的建立
打开XilinxPlatformstudio平台,选择相关参数,建立相关文件。
将FPGA内存改为32K,添加UART类型接口,其他选择默认配置。
修改时钟设置:
删除ExterinalPort中的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,中断控制核(AXIInterruptControllerIP)并与micorblace的中断信号线相连(刚开始我没有做这一步,结果一节课过去了,却怎么也做不出来),将Button,Dip添加为他的中断源,buttonDip设置为仅输入其他端都设置为无连接。
最后再添加相应的约束文件并保存。
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.软件设计
中断程序
voidPushBtnHandler(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);
}
//主程序
intmain()
{
Initialize();
xil_printf("\r\nRunningGpioInputInterrupt!
\r\n");
while
(1)
{
if(pshBtn)
{
xil_printf("ButtonInterruptTriggered!
!
!
Thestateis0x%X\n\r",state1);
pshBtn=0;
}
if(pshDip)
{
xil_printf("SwitchInterruptTriggered!
!
!
Thestateis0x%X\n\r",state2);
pshDip=0;
}
}
return0;
}
//时延程序
voidDelay_50ms()
{
inti;
for(i=0;i<5000000;i++);
}
//初始化代码
voidInitialize()
{
//将开关地址与程序变量绑定,并设定七为输入方式
XGpio_Initialize(&Dips,XPAR_DIP_DEVICE_ID);
XGpio_SetDataDirection(&Dips,1,0xff);
//初始化button实例,并设定其为输入方式
XGpio_Initialize(&Btns,XPAR_BUTTON_DEVICE_ID);
XGpio_SetDataDirection(&Btns,1,0xff);
//初始化intCtrl实例
XIntc_Initialize(&intCtrl,XPAR_AXI_INTC_0_DEVICE_ID);
//GPIO中断使能
XGpio_InterruptEnable(&Dips,1);
XGpio_InterruptGlobalEnable(&Dips);
XGpio_InterruptEnable(&Btns,1);
XGpio_InterruptGlobalEnable(&Btns);
//对中断控制器使能
XIntc_Enable(&intCtrl,XPAR_AXI_INTC_0_DIP_IP2INTC_IRPT_INTR);
XIntc_Enable(&intCtrl,XPAR_AXI_INTC_0_BUTTON_IP2INTC_IRPT_INTR);
//注册中断服务函数
XIntc_Connect(&intCtrl,XPAR_AXI_INTC_0_DIP_IP2INTC_IRPT_INTR,
(XInterruptHandler)SwitchHandler,(void*)0);
XIntc_Connect(&intCtrl,XPAR_AXI_INTC_0_BUTTON_IP2INTC_IRPT_INTR,
(XInterruptHandler)PushBtnHandler,(void*)0);
microblaze_enable_interrupts();//允许处理器中断处理
//注册中断控制器处理函数
microblaze_register_handler((XInterruptHandler)XIntc_InterruptHandler,(void*)&intCtrl);
XIntc_Start(&intCtrl,XIN_REAL_MODE);//启动中断控制器
}
查询程序设计
#include"xparameters.h"
#include"stdio.h"
#include"xil_io.h"
#include"xil_types.h"
//直接配置地址
//Button
#definebtn_data0x40000000//button数据寄存器地址
#definebtn_status0x40000120//控制寄存器地址
#definebtn_ctr0x40000004//数据寄存器地址
//Switch
#definesw_date0x40040000//switch数据寄存器地址
#definesw_status0x40040120//控制寄存器地址
#definesw_ctr0x40040004//数据寄存器地址
//时延函数
voidDelay_50ms();
//按键标志位
shortpshBtn,pshSw;
intmain(void)
{
shortbtn,sw;
xil_printf("\r\nRunningGpioInputInterrupt!
\r\n");
//将btn,sw分别设置为输入,并初始化
Xil_Out8(btn_ctr,0xff);
Xil_Out8(sw_ctr,0xff);
pshBtn=0x00;
pshSw=0x00;
while
(1){
pshBtn=Xil_In8(btn_status);
pshSw=Xil_In8(sw_status);
if(pshBtn){
btn=Xil_In8(btn_data);
Xil_Out8(btn_status,0x01);
xil_printf("Buttonpushed!
!
!
Thestatusis0x%X\n\r",btn);
}
if(pshSw){
sw=Xil_In8(sw_date);
Xil_Out8(sw_status,0x01);
xil_printf("Switch,pushed!
!
!
Thestatusis0x%X\n\r",sw);
}
}
return0;
}
新建一个hello_word模板工程,将源代码删除,换成新编的代码,保存,就会自动编译,如果没有问题,就在下载到板子上。
显示到console结果
Button按下过一会放开,(显示有两个中断)
实验体会
1.本次试验要求对XPS和SDK有比较深的掌握,以及C语言水平,各个寄存器的名称地址作用,还是得意义,作用。
2.在实验过程中却错误频发。
最小系统,IP核的添加主要是各个链接是否到位了,连接是否正确。
在这次试验中就出现了这个问题,但是检查时却检查了好久也没有查出来错在哪里,找老师同学也一时不知道错在哪里。
最后不得已重新做了一个最小系统,一步一步照着书来,最后做到加中断控制器要连接MircBlaze的中断时突然想起来好像之前就没有连接。
程序编写中的错误是大小写,括号等问题。
原因一方面照书抄写,你难免出错,还有就是不是自己写的,对执行过程掌握不够深刻(可以在SDK调试过程中跟踪函数变量,借此加深理解)。
3.按钮Button通过延时将上贪产生的中断屏蔽,如果按下Button过一会抬起,会发现有两次中断。
4.总的来说本次实验还是有一定的难度的;要求程序也比较水平高,要熟悉NEXY4的工作原理。
通过这次实验,我了解了NEXY4的基本结构,工作方式,简单掌握了XilC语言的编写,函数的利用。
#include
#include"platform.h"
#include"xparameters.h"
#include"xil_io.h"
#include"xil_types.h"
#include"mb_interface.h"
#include"xintc.h"
/*DefinitionsforperipheralDIP*/
#definesw_DATA_OFFECT0x00
#definesw_TRI_OFFECT0x04
#definesw_ISR_OFFECT0XO120
/*DefinitionsforperipheralLED*/
#defineled_DATA_OFFECT0x0008
#defineled_TRI_OFFECT0x000c
#defineuart_Rx_OFFECT0x00
#defineuart_Tx_OFFECT0x04
#defineuart_STAT_OFFECT0x08
#defineuart_CTRL_OFFECT0x0c
#defineintc_ISR_OFFECT0x00
#defineintc_IER_OFFECT0x08
#defineintc_IAR_OFFECT0x0C
#defineintc_MER_OFFECT0x1C
voidMy_ISR(void);
voidInitialize();
voidUartHandler();
voidDaly_50ms();
shortflag_RX;
unsignedcharrxData;
inttxTime;
intdata_Tx;
intmain(void)
{
Initialize();
xil_printf("\r\nRunningUARTTest!
\r\n");
while
(1){
if(flag_RX)
{
xil_printf("\r\nReceivedateis:
0x%x!
\r\n",rxData);
flag_RX=0;
}
Delay_50();
txTime=txTime+1;
if(txTime==1000)txTime=0x00;
intflag_Uart;
flag_Uart=Xil_In32(XPAR_UARTLITE_0_BASEADDR+uart_CTRL_OFFECT);
if(flag_Uart&0x04)
{
if(txTime&0x02)//控制发送速度
data_Tx=Xil_In32(XPAR_GPIO_0_BASEADDR+uart_STAT_OFFECT+sw_DATA_OFFECT);
Xil_Out32(XPAR_UARTLITE_0_BASEADDR+uart_Tx_OFFECT,data_Tx);
}
}
return0;
}
voidInitialize()
{
flag_RX=0x00;
rxData=0x00;
txTime=0x00;
Xil_Out8(XPAR_SW_LED_BASEADDR+sw_TRI_OFFECT,0Xff);
Xil_Out8(XPAR_SW_LED_BASEADDR+led_DATA_OFFECT,0X5A);
Xil_Out8(XPAR_SW_LED_BASEADDR+led_TRI_OFFECT,0X00);
Xil_Out32(XPAR_UARTLITE_0_BASEADDR+uart_CTRL_OFFECT,0X13);
Xil_Out32(XPAR_AXI_INTC_0_BASEADDR+intc_IAR_OFFECT,0Xffffffff);
Xil_Out32(XPAR_AXI_INTC_0_BASEADDR+intc_IER_OFFECT,0X80000000);
Xil_Out32(XPAR_AXI_INTC_0_BASEADDR+intc_MER_OFFECT,0X03);
microblaze_enable_interrupts();
}
voidMy_ISR(void)
{
intstatus;
status=Xil_In32(XPAR_INTC_0_BASEADDR+intc_ISR_OFFECT);
if(status&0x01){
UartHandler();
}
Xil_Out32(XPAR_AXI_INTC_0_BASEADDR+intc_IAR_OFFECT,status);
}
voidUartHandler()
{
intflag_Uart;
flag_Uart=Xil_In32(XPAR_UARTLITE_0_BASEADDR+uart_STAT_OFFECT);
if(flag_Uart&0x01){
flag_RX=1;
rxData=Xil_In32(XPAR_UARTLITE_0_BASEADDR+uart_Rx_OFFECT);
Xil_Out8(XPAR_SW_LED_BASEADDR+led_DATA_OFFECT,rxData);
}
Xil_Out32(XPAR_UARTLITE_1_BASEADDR+uart_CTRL_OFFECT,0x13);
}
voidDelay_50()
{
inti;
for(i=0;i<500000;i++);
}
//////////////////////////
Zd
#include"xparameters.h"
#include"stdio.h"
#include"xil_io.h"
#include"xil_types.h"
//直接配置地址
//Button
#definesw_data0x40040000//button数据寄存器地址
#definesw_status0x40040120//控制寄存器地址
#definesw_ctr0x40040004//数据寄存器地址
//Switch
#defineled_date0x40040008//switch数据寄存器地址
#defineled_status0x40040120//控制寄存器地址
#defineled_ctr0x4004000C//数据寄存器地址
#defineuart_Rx_OFFECT0x00
#defineuart_Tx_OFFECT0x04
#defineuart_STAT_OFFECT0x08
#defineuart_CTRL_OFFECT0x0c
shortflag_RX;
unsignedcharrxData;
//按键标志位
shortpshSw;
intmain(void)
{
shortbtn,sw;
xil_printf("\r\nRunning!
\r\n");
//将sw分别设置为输入,并初始化
Xil_Out8(led_ctr,0x00);
Xil_Out8(sw_ctr,0xff);
pshSw=0x00;
while
(1){
pshSw=Xil_In8(sw_status);
if(pshSw){
rxData=Xil_In32(XPAR_SW_LED_BASEADDR);
xil_printf("\r\nReceivedateis:
0x%x!
\r\n",rxData);
Xil_Out32(XPAR_UARTLITE_0_BASEADDR+uart_Tx_OFFECT,rxData);
sw=Xil_In8(sw_date);
Xil_Out8(sw_status,0x01);
xil_printf("Switch,pushed!
!
!
Thestatusis0x%X\n\r",sw);
}
}
return0;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中断 控制