介绍

使用microblaze软核搭建处理器,实现中断

其中microblaze_0为microbalze内核,外接128Kb的local memory、利用JTAG调试的mdm内核、中断管理器axi_intc以及uatr外设和GPIO外设。

GPIO中断的实现利用vio IP核实现,16位的VIO接到GPIO作为输入来模拟按键输入。

UART中断外接串口调试助手或者直接利用SDK terminal实现。

concat IP核将多个中断源合成一条总线提供给中断管理器。

实验结果

jtag调试段循环输出hello word

ILA抓取的GPIO_o实现0000——FFFF的转换

GPIO_t为0xffff,说明16个gpio全为输入,至于GPIO_o为什么会实现数据转换,这是因为此时的信号还没有经过三态门的转换,在进过三态门转换后16个gpio全为输入

利用vio改变GPIO的输入,使GPIO控制器产生中断,这时候程序进入GPIO的中断处理函数,在调试端打印“gpio interrupt”.
利用串口调试助手,输入一段16进制的数字,会看到相同数字的返回值,这是调用中断返回的值,串口调试助手发送了3个8bit的数值,产生了四个中断,其中前三个中断为接收中断,最后一个为发送中断

c程序

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xparameters.h"
#include "xgpio.h"
#include "xuartlite.h"
#include "xuartlite_l.h"
#include "xintc.h"
#include "xil_io.h"
#include "sleep.h"#define GPIO_EXAMPLE_DEVICE_ID  XPAR_GPIO_0_DEVICE_ID
#define UART_DEVICE_ID XPAR_UARTLITE_0_DEVICE_ID     //串口器件ID
#define INTC_DEVICE_ID   XPAR_INTC_0_DEVICE_ID      //中断控制器ID
#define AXI_GPIO_INTR_ID XPAR_INTC_0_GPIO_0_VEC_ID  //AXI GPIO中断ID
#define UART_INTR_ID   XPAR_INTC_0_UARTLITE_0_VEC_ID //串口中断ID
#define EXCEPTION_ID     XIL_EXCEPTION_ID_INT       //中断异常ID#define RX_NOEMPTY XUL_SR_RX_FIFO_VALID_DATA // 接收 FIFO 非空static XGpio Gpio; /* The Instance of the GPIO Driver */
static XIntc    Intc;                              //中断控制器实例
static XUartLite Uart;      //串口实例void GpioHandler(void *CallbackRef);
void uart_handler(void *CallbackRef);int main()
{init_platform();print("Hello World\n\r");
//设备初始化XGpio_Initialize(&Gpio, GPIO_EXAMPLE_DEVICE_ID);XGpio_SetDataDirection(&Gpio, 1, 0xffff);XUartLite_Initialize(&Uart , UART_DEVICE_ID);//初始化中断控制器XIntc_Initialize(&Intc, INTC_DEVICE_ID);
//关联中断ID和中断服务函数//中断服务函数是需要我们自己编写的, 用于响应和处理 AXI GPIO 中断的函数XIntc_Connect(&Intc,AXI_GPIO_INTR_ID,(Xil_ExceptionHandler)GpioHandler,&Gpio );XIntc_Connect(&Intc, UART_INTR_ID,(XInterruptHandler)uart_handler,&Uart);
//外设中断 使能//使能GPIO中断XGpio_InterruptEnable(&Gpio, 1);//使能GPIO全局中断XGpio_InterruptGlobalEnable(&Gpio);//使能串口中断XUartLite_EnableInterrupt(&Uart);
//启用外设对应的中断向量XIntc_Enable(&Intc,AXI_GPIO_INTR_ID);XIntc_Enable(&Intc,UART_INTR_ID);
//启动中断控制器XIntc_Start(&Intc, XIN_REAL_MODE);
//设置并打开中断异常处理Xil_ExceptionInit();Xil_ExceptionRegisterHandler(EXCEPTION_ID,(Xil_ExceptionHandler)XIntc_InterruptHandler,&Intc);Xil_ExceptionEnable();for(;1;){Xil_Out32(0x40000000 , 0xffff);sleep(1);Xil_Out32(0x40000000 , 0x0000);sleep(1);print("Hello\n\r");xil_printf("word\n\r");sleep(1);}cleanup_platform();return 0;
}void GpioHandler(void *CallbackRef){XGpio *GpioPtr = (XGpio *)CallbackRef;print("gpio interrupt\n\r");XGpio_InterruptDisable(GpioPtr, 1);  //关闭中断XGpio_InterruptClear(GpioPtr, 1);    //清除中断XGpio_InterruptEnable(GpioPtr, 1);   //使能中断
}void uart_handler(void *CallbackRef)//中断处理函数
{u8 Read_data;u32 isr_status;XUartLite *InstancePtr= (XUartLite *)CallbackRef;//读取状态寄存器isr_status = XUartLite_ReadReg(InstancePtr->RegBaseAddress ,XUL_STATUS_REG_OFFSET);if(isr_status & RX_NOEMPTY){ //接收 FIFO 中有数据//读取数据Read_data=XUartLite_ReadReg(InstancePtr->RegBaseAddress ,XUL_RX_FIFO_OFFSET);//发送数据XUartLite_WriteReg(InstancePtr->RegBaseAddress ,XUL_TX_FIFO_OFFSET, Read_data);xil_printf("%x\n",Read_data);print("\n\r");}print("uart interrupt\n\r");
}

git_hub 工程源文件

注:实现上述中断程序,处理器的local memory不能为默认的8kb,修改为64kb,要不然内存过小无法运行程序。

Microblaze实现串口、GPIO中断相关推荐

  1. MicroBlaze AXI总线 GPIO中断使用(On Atyls Board)

    学习硬件平台,第一件事不是GPIO就是串口,第二件事差不多就是中断了. 查了网上资料MicroBlaze中断的基本都是基于PLB总线的,毕竟PLB总线用的久. 于是就自己折腾着学习AXI的中断使用. ...

  2. STM32使用串口IDLE中断的两种接收不定长数据的方式

    现在有很多数据处理都要用到不定长数据,而单片机串口的RXNE中断一次只能接收一个字节的数据,没有缓冲区,无法接收一帧多个数据,现提供两种利用串口IDLE空闲中断的方式接收一帧数据,方法如下: 方法1: ...

  3. IMX6ULL学习笔记(18)——GPIO中断

    一.中断简介 相比 STM32 的 NVIC,IMX6ULL 的中断控制系统更复杂,它的中断管理器使用的是 GIC V2,GIC V2 的实现方式与我们熟知的 NVIC 差别较大. 1.1 GIC G ...

  4. 乐鑫Esp32学习之旅⑦ esp32上利用GPIO中断做一个按键的短按和长按的回调事件,再也无须担心触发源。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  5. 【无标题】STM32F767串口空闲中断+DMA实现不定帧长度的接收

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.配置串口与DMA 二.空闲中断服务函数 二.串口+DMA发送 三.主函数 总结 前言 提示:这里可以添加本文要记录 ...

  6. STM32使用串口空闲中断接收不定长数据帧-USART_IT_IDLE使用(不使用DMA方式)

    STM32使用串口空闲中断接收不定长数据帧-USART_IT_IDLE使用(不使用DMA方式) 前言 串口空闲中断介绍 清中断方法 串口中断处理函数 串口中断用到的全局变量定义 串口初始化(使能接收中 ...

  7. ZYNQ AXI GPIO中断实验——FPGA Vitis篇

    文章目录 1. 前言 2. Vivado工程的编写 2.1 Block Design工程设计 2.2 创建XDC管脚约束 3. Vitis工程的编写 4. 实验小结 5. 工程源码下载 1. 前言 使 ...

  8. STM32串口发送中断踩坑

    今天想测试下Modbus设备,手上暂时没有串口转485的模块,就打算用手上的stm32f042的开发板做个串口转485模块.如下所示 但是软件实际开发过程中,遇到了麻烦. 现象: 在打开串口接收中断时 ...

  9. 嵌入式裸机开发- GPIO 中断

    中断 Cortex-A7 中断系统详解 中断向量表 中断控制器 CP15 协处理器 中断使能 IRQ 和 FIQ 总中断使能 ID0~ID1019 中断使能和禁止 中断优先级设置 GICC_PMR 寄 ...

最新文章

  1. 有人买不?没人的话我待会儿再来问问 价值6.11亿美元的入侵工具无人问津
  2. Linux各发行版本之间的比较
  3. (转)Windows 批处理实现 定时打开IE 延时一段时间后 关闭IE
  4. 程序员,你得选准跑路的时间!
  5. 雷林鹏分享:PHP 变量
  6. 0基础学python有多难-对于几乎是零基础的人,直接学 Python 编程合适吗?
  7. 2022年05月系统集成项目管理工程师考试知识点分布
  8. 苹果x来电闪光灯怎么设置_免费设置来电视频彩铃,安卓苹果都适用!
  9. linux安装2870无线网卡,告诉你Ubuntu 12.04下RT5370无线网卡驱动安装的方法及命令
  10. 单例模式中饿汉模式和懒汉模式的线程安全问题
  11. Linux内核移植之DM9000网卡驱动
  12. DirectX示例翻译和解析StateManager Sample
  13. linux中ll排序命令,ll命令
  14. 【智能优化算法】基于黑寡妇优化算法求解单目标优化问题含Matlab源码
  15. 实现微信公众号微信头像上传
  16. select函数何时返回?
  17. Win10+yolov5 踩坑记录
  18. NAACL2021阅读理解论文整理
  19. diskgenius合并分区(diskgenius合并分区到c盘)
  20. Pr:Lumetri颜色面板

热门文章

  1. (C语言版)无迹卡尔曼滤波UKF和容积卡尔曼滤波CKF进行锂电池SOC估计的C语言版本实现
  2. sqlServer 2019 开发版(Developer)下载及安装
  3. 知道焊缝长度如何确定节点板尺寸_节点板厚根据什么确定
  4. 刻意学习:机器学习实战--Task03分类问题:支持向量机
  5. 测试的最高境界“教开发写代码”(提交高质量bug)
  6. 抖音链接被封杀?一行代码实现网页直接跳转抖音
  7. [第二届赣网杯]部分wp
  8. PhotoShop暂存盘已满导致无法启动的至简解决方案
  9. 防雷击浪涌保护元器件,该如何选用?
  10. 如何打开windows的服务services.msc