0,前言

使用定时器实现中断。这里通过PS端的EMIO进行使用计数器,然后再定时产生中断。本来听得很头疼,后来自己想了想,画了个图,再结合前面讲的,就觉得清楚了很多。这里分享下这张图。

1,代码分析

这里的FPGA代码很简单,C代码由于之前已经都学过了,这里只是将两个模块的函数简单修改即可。这里只贴代码。
在这之前先总结一个问题。就是我在使能EMIO的时候,只要了一个GPIO口。前面介绍过有0-53个MIO,因此EMIO是从54开始的。但是当我将55这个编号作为使能信号时,时钟信号却总是不能拉低。而将其值修改为54的时候,就可以很好地使能了。因此这里的EMIO使用是有他的顺序的。
其次就是在定义status的时候。发现有两个地址。因此返回值总是错误的。代码原本是我在main函数中定义了一个status,在初始化GPIO的时候又定义了一次。于是就出现了上述返回错误的问题。因此在代码中,我将其定义在函数之外,不在任何一个函数中定义这个变量,问题就被解决了。
代码分享
Verilog代码

module interrupt_10_50ms(input sclk,input rst,output intr10ms,output intr50ms);parameter INTR10MS_END = 24'd1999999;parameter INTR50MS_END = 24'd9999999;parameter PULER_W      = 8'd199;reg         intr10ms_flag,intr50ms_flag;reg    [31:0]     intr10ms_cnt;reg    [31:0]     intr50ms_cnt;assign intr10ms = intr10ms_flag;assign intr50ms = intr50ms_flag;always @ (posedge sclk)begin if(rst == 1'b1) beginintr10ms_cnt <=  'd0;end else if(intr10ms_cnt == INTR10MS_END)begin intr10ms_cnt <= 'd0;end else begin intr10ms_cnt <= intr10ms_cnt + 1'b1;end end always @ (posedge sclk)begin if(rst == 1'b1) beginintr50ms_cnt <=  'd0;end else if(intr50ms_cnt == INTR50MS_END)begin intr50ms_cnt <= 'd0;end else begin intr50ms_cnt <= intr50ms_cnt + 1'b1;end end always @ (posedge sclk)beginif(rst == 1'b1 )intr10ms_flag <= 1'b0;else if(intr10ms_cnt == PULER_W)intr10ms_flag <= 1'b0;else if(intr10ms_cnt == INTR10MS_END)intr10ms_flag <= 1'b1;else intr10ms_flag <= intr10ms_flag;endalways @ (posedge sclk)beginif(rst == 1'b1 )intr50ms_flag <= 1'b0;else if(intr50ms_cnt == PULER_W)intr50ms_flag <= 1'b0;else if(intr50ms_cnt == INTR50MS_END)intr50ms_flag <= 1'b1;else intr50ms_flag <= intr50ms_flag;endendmodule

C代码。代码虽然有点长,但是原理很清楚。就是

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xgpiops.h"      //import gpio
#include "xparameters.h"
#include "xscugic.h"#define GPIO_DEV_ID XPAR_PS7_GPIO_0_DEVICE_ID             //redefine device id
#define GIC_ID XPAR_PS7_SCUGIC_0_DEVICE_ID              //redefine GIC id#define F2P_INTR0_ID 61
#define GPIO0 54
XGpioPs GpioPs;//实例化一个对象,将对其进行配置
XGpioPs_Config *GpioPsCfgPtr;
static XScuGic ScuGic;
static XScuGic_Config * ScuGicCfgPtr;
int status;void f2pIntr0Handler(void * callbackref);
int initGpio();
int initHwIntr();int main()
{initGpio();//initial GPIOif(status != XST_SUCCESS){return status ;}initHwIntr();if(status != XST_SUCCESS){return status ;}XGpioPs_WritePin(&GpioPs,GPIO0,(u32)0x01);while(1){}
}
//initial gpio
int initGpio(){GpioPsCfgPtr = XGpioPs_LookupConfig(GPIO_DEV_ID);status =  XGpioPs_CfgInitialize(&GpioPs,GpioPsCfgPtr,GpioPsCfgPtr->BaseAddr);if(status != XST_SUCCESS){return status ;}XGpioPs_SetDirectionPin(&GpioPs,GPIO0,0x01);XGpioPs_SetOutputEnablePin(&GpioPs,GPIO0,0x01);return status;
}
//hw callback function id = 61
void f2pIntr0Handler(void * callbackref){printf("interrupt id = 61 success!\n\r");
}//initial gic & hardware intr
int initHwIntr(){Xil_ExceptionInit();//打开系统异常ScuGicCfgPtr = XScuGic_LookupConfig(GIC_ID);status = XScuGic_CfgInitialize(&ScuGic,ScuGicCfgPtr,ScuGicCfgPtr->CpuBaseAddress);if(status != XST_SUCCESS){return status ;}Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,&ScuGic);status = XScuGic_Connect(&ScuGic,F2P_INTR0_ID,(Xil_ExceptionHandler)f2pIntr0Handler,&ScuGic);if(status != XST_SUCCESS){return status ;}XScuGic_Enable(&ScuGic,F2P_INTR0_ID);Xil_ExceptionEnable();return XST_SUCCESS;
}

打印的结果是正确的。有时候可能会遇见一些莫名其妙的问题。不要着急,关掉再打开试试有可能问题就解决了!!!

第五课--使用定时器实现中断(1)相关推荐

  1. 第五课.Linux开发基础

    第五课目录 GCC用法参考 GCC的常用用法 make与Makefile Makefile的规则 Makefile的语法 Makefile实例 调试 GDB 设置断点 虽然已经有很多优秀的IDE可以化 ...

  2. 51单片机复习:外部中断,定时器/计数器中断

    中断: 什么是中断,就是打断,你一开始在做一件事,突然意外发生(中断源),你不得不停止手中的事,(中断响应),去处理那 件意外(中断服务),处理完意外后你继续做刚才那件事(中断返回),这就是中断,而单 ...

  3. STC89C52单片机定时器及中断系统的介绍以及代码示例

    目录 一,定时器介绍 二,STC89C52定时器资源 三,定时器框图 四,定时器工作模式 五,中断系统及其流程 六,STC89C52中断资源 七,定时器与中断系统 八,相关寄存器的认识与配置 首先是定 ...

  4. 五、RISC-V SoC内核——中断 代码讲解

    tinyriscv这个SoC工程的内核cpu部分,采用经典的三级流水线结构进行设计,即大家所熟知的:取值->译码->执行三级流水线. 另外,在最后一个章节中会上传额外添加详细注释的工程代码 ...

  5. NeHe OpenGL第三十五课:播放AVI

    NeHe OpenGL第三十五课:播放AVI 在OpenGL中播放AVI: 在OpenGL中如何播放AVI呢?利用Windows的API把每一帧作为纹理绑定到OpenGL中,虽然很慢,但它的效果不错. ...

  6. 【Linux探索之旅】第二部分第五课:用户和权限,有权就任性

    内容简单介绍 1.第二部分第五课:用户和权限,有权就任性 2.第二部分第六课预告:Nano,刚開始学习的人的文本编辑器 用户和权限.有权就任性 今天的标题也挺任性的啊,虽说小编是一个非常本分的人(真的 ...

  7. Emojify - v2 吴恩达老师深度学习第五课第二周编程作业2

    吴恩达老师深度学习第五课第二周编程作业2,包含答案! Emojify! Welcome to the second assignment of Week 2. You are going to use ...

  8. Operations on word vectors-v2 吴恩达老师深度学习课程第五课第二周编程作业1

    吴恩达老师深度学习课程第五课(RNN)第二周编程作业1, 包含答案 Operations on word vectors Welcome to your first assignment of thi ...

  9. Linux 探索之旅 | 第三部分第五课:延时执行,唯慢不破

    -- 作者 谢恩铭 转载请注明出处 内容简介 第三部分第五课:延时执行,唯慢不破 第三部分第六课预告:第三部分测验题 延时执行,唯慢不破 上一课 Linux探索之旅 | 第三部分第四课:后台运行及合并 ...

最新文章

  1. Linux常用命令学习(shell 脚本)
  2. 远程桌面连接后远程计算机注销,使用windows8.1 pro的远程桌面,当断开远程桌面时被控制端用户注销问题...
  3. matlab中图像太大,图像处理:算法在MATLAB中耗时太长
  4. CSDN markdown中实现首行缩进(空格)的两种方法(“  ”)
  5. 开工第一天,老板补发年终奖,一箱18元的冰棍
  6. 阿里2000亿,腾讯5000亿,我们究竟需要多少数据中心?
  7. uniapp生成海报
  8. 图解事件坐标screenX、clientX、pageX, offsetX的区别
  9. Python(一)为什么要学习Python
  10. ECCV 2022《Tip-Adapter: Training-free Adaption of CLIP for Few-shot Classification》
  11. (收藏)【 数字化客户体验】NPS、CSAT和CES——2020年跟踪的客户满意度指标
  12. 优秀课程案例:使用Scratch的画笔积木模块绘制模拟内摆线!
  13. Day5_HTML+CSS+JS——RGB三原色
  14. [AV1] AV1 Encoder代码流程图
  15. 混得再得意,憋在心里也别说这3种话,败事有余,背后挨刀子
  16. 软件定义网络 (SDN)技术原理详解
  17. 我来学网络——IIS中出现无效的应用程序池名称
  18. 如何委婉的发短信拒绝老师的offer
  19. 在特定时间段内显示隐藏,判断日期活动是否开启结束
  20. 给女朋友解释为什么TCP可靠而非安全,UDP非可靠而安全(聊天记录)

热门文章

  1. react-native 编译出现 ld: library not found for -lDoubleConversion 错误的解决方案
  2. 解决Winform应用程序中窗体背景闪烁的问题
  3. abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二)
  4. 解决中64位Win7系统上PLSQL无法连接ORACLE的方法(PLSQL无法识别ORACLE_HOME的配置)
  5. nginx 启动报错 “/var/run/nginx/nginx.pid“ failed” 解决方法
  6. 导致此错误的原因是什么 - “致命错误:无法找到本地咕噜声”
  7. 使用当前更改创建Git分支
  8. ros中使用boost::thread多线程boost::bind绑定参数,多线程发送topic
  9. activiti流程信号捕获事件触发signalEventReceived
  10. 四轮驱动(SSMR)移动机器人运动模型及应用分析