博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MicroBlaze AXI总线 GPIO中断使用(On Atyls Board)
阅读量:5134 次
发布时间:2019-06-13

本文共 2274 字,大约阅读时间需要 7 分钟。

学习硬件平台,第一件事不是GPIO就是串口,第二件事差不多就是中断了。

查了网上资料MicroBlaze中断的基本都是基于PLB总线的,毕竟PLB总线用的久。

于是就自己折腾着学习AXI的中断使用。

其实基于PLB和基于AXI中断的使用并没有什么区别,我本人也是对照着PLB总线的源代码学习的AXI中断的使用。

 

首先,需要搭建一个硬件平台,使用EDK,添加GPIO和INTC的IP,我本人使用的是Digilent Atyls Board,就直接用官方提供的一些资料了。

但其他板子其实也差不多。

 

首先,GPIO要使用中断,并将中断信号连接到INTC模块,同时INTC的信号还要连接到MicroBlaze的Interrupt,如下图:

其他步骤不再赘述,做好这些后 Export Design。

 

打开SDK,

这时我遇到一个问题,就是在编辑源代码时,我#include "xintc.h",居然提示找不到xintc这个文件,我搜索了以下ISE的安装目录,发现这个文件是有的。

而且在xparameters.h 中居然找不到和intc相关的宏定义,这就奇了大怪了。

我后来经过多方尝试,发现可以这样解决。

首先,我目前mss文件显示了一个奇怪的地方:

其他的外设驱动都显示,只有intc是空白。

尝试着点击左上角的“Modify this BSP file”,

然后如下修改:

点击 none处,选择intc,然后选择符合的版本号。点击“OK”后,SDK会自动重新编译工程。

 

此时关掉mss文件再打开会发现有如下变化

现在intc的驱动正常了,打开xparameters.h也发现和intc相关的宏都有了。

 

 

以下是代码部分,代码是参照plb总线的写的,不过我用硬件尝试过,是完全可用的。

代码可从此链接下载:(函数名较长,就没有做注释了。)

 

主要代码摘抄如下:

#include 
#include "platform.h"#include "xparameters.h"#include "xgpio.h"#include "xil_io.h"#include "mb_interface.h"#include "xintc.h"#define BTN_BASEADDR XPAR_PUSH_BUTTONS_5BITS_BASEADDR#define BTN_DEVICE_ID XPAR_PUSH_BUTTONS_5BITS_DEVICE_ID#define INTC_DEVICE_ID XPAR_AXI_INTC_0_DEVICE_ID#define BTN_IRTP_ID XPAR_AXI_INTC_0_PUSH_BUTTONS_5BITS_IP2INTC_IRPT_INTRXGpio pshBtns;XIntc intCtrl;XGpio led;char str[100];void print(char *str);void PushButtonHandle(void *pshButton);int main(){ init_platform(); print("Hello World\n\r"); XGpio_Initialize(&pshBtns, BTN_DEVICE_ID); XIntc_Initialize(&intCtrl, INTC_DEVICE_ID); XIntc_Connect(&intCtrl, BTN_IRTP_ID, PushButtonHandle, &pshBtns); XIntc_Enable(&intCtrl, BTN_IRTP_ID); microblaze_register_handler(XIntc_DeviceInterruptHandler, INTC_DEVICE_ID); microblaze_enable_interrupts(); XIntc_Start(&intCtrl, XIN_REAL_MODE); XGpio_InterruptEnable(&pshBtns, 1); XGpio_InterruptGlobalEnable(&pshBtns); XGpio_Initialize(&led, XPAR_LEDS_8BITS_DEVICE_ID); XGpio_SetDataDirection(&led, 1, 0xff); XGpio_DiscreteWrite(&led, 1, 0x01); while(1) { } return 0;}void PushButtonHandle(void *pshButton){ XGpio* PushButton = (XGpio*) pshButton; u32 btnState = XGpio_DiscreteRead(PushButton, 1); sprintf(str,"Button: %X \r\n", btnState); print(str); XGpio_InterruptClear(PushButton, 0xff);}

 

转载于:https://www.cnblogs.com/elitezhe/p/axi-atyls-Interrupt-MicroBlaze.html

你可能感兴趣的文章
Vagrant安装完lnmp后,配置linux和windows共享文件并配置虚拟主机访问项目
查看>>
C#多线程那点事——信号量(Semaphore) Semaphore 信号量
查看>>
浏览器的线程有哪些
查看>>
PyTorch 实现kmax-pooling
查看>>
数据库点滴积累——查询
查看>>
将 Excel 导入到 SharePoint 列表
查看>>
C#中的yield关键字
查看>>
PHP获取中英文混合字符串长度及截取
查看>>
uva 11584 Partitioning by Palindromes(dp)
查看>>
面试题学习总结--三
查看>>
leetcode简单题目两道(5)
查看>>
(1)数据结构——线性表(数组)实现
查看>>
Content Providers的步骤,来自官网文档
查看>>
sql语句中的 inner join 、 left join 、 right join、 full join 的区别
查看>>
手动实现枚举器、泛型集合、单链表
查看>>
java反序列化漏洞原理研习
查看>>
LeetCode Algorithm 07_Reverse Integer
查看>>
PrintWriter、PrintStream的苦头 ------缓冲区问题
查看>>
第二张 例2.4
查看>>
LeetCode Valid Parenthesis String
查看>>