ISR(Interrupt Service Routine)中断服务函数是为硬件中断服务的子程序。NIOS II处理器支持32个硬件中断,每一个使能了的硬件中断都应该有一个ISR与之对应。中断发生时,硬件中断处理器会根据检测到的有效中断级别,调用相应的ISR为其进行中断服务。

要完成硬件中断工作,我们需要做两件事:

第一, 注册中断函数ISR,它的函数原型如下所示:

int alt_irq_register(alt_u32 id, void* context, void(*handler) (void*,alt_u32));

id:中断优先级,即所注册的ISR是为哪个中断优先级的中断服务的。中断优先级在SOPC Builder中分配的,在第一节中我们提起过,不知道大家是否记得,我们来回忆一下,如下图所示,通过这一步我们来完成中断的自动分配

context,为所注册的ISR传递参数,可以是NULL;

handler,中断服务函数ISR的指针。

再来说返回值,返回值是0时,表示中断注册成功;返回为负数,表明中断注册失败。

这里面有一个需要注意的地方,如果handler不是NULL,则该优先级中断在注册成功后将自动使能,也即是说,只要我们在handler处有相应的ISR,我们就不需要再进行使能处理了。说完第一,我们来说说第二。

第二, 编写ISR函数,这个函数有我们自己来写,而不是HAL系统提供的。它跟一般的函数定义没什么区别,只是对ISR的函数原型有特定的要求:

void ISR_handler(void* context, alt_u32 id);

context: 传给ISR的形参,可以是NULL;

id: 中断优先级。

OK,只要这两步我们就可以完成中断函数的处理了。废话少说,我们来点实际的吧,跟我来。

  中断分为两种,一种是电平(Level)中断,也就是高电平/低电平中断,还有一种就是沿中断,包括上升沿、下降沿。做过单片机的人应该都很熟悉,如果你想要实现沿中断,需要把红圈1(Synchronously capture)处选中,下面包括3种方式,大家可以根据自己的要求选择。完成上面工作以后,点击Finish,完成PIO构建。

图中有一个地方需要注意,由于电平中断时,NIOS只对高电平敏感,所以如果想实现低电平敏感需要加一个非门

          

二、sopc.h程序解析

  

  我们对main.c函数进行更改,整体程序如下图所示,这个程序没有对按键进行防抖处理,只是为了展示外部中断处理的操作过程,如想作为项目中应用必须加入按键防抖处理,在此不具体说明。这个函数通过外部按键来产生中断,因为我们设置的是低电平产生中断,所以当按键按下时,就会产生了一个低电平,这时就会进入中断函数。在中断函数中,我们对key_flag进行取反。而在主函数中,我们不断地进行查询,当key_flag为1时,LED->DATA置1,也就是让外部发光二极管亮;当key_flag为0时,LED->DATA置0,这时,发光二极管不亮。

  首先编译一个初始化程序,如下图所示,一共有两条语句,我们先说红圈1处的语句,这个语句的目的是,使能中断位,上一节我已经讲过了,PIO模块对应的结构体中的INTERRUPT_MASK是中断控制寄存器的内存映射,当该位置1时,允许中断,否则,禁止中断。再说红圈2处的语句,我们前面已经见过这个语句了,用它来完成中断的注册,KEY_IRQ来自system.h,ISR_key是ISR函数。用return返回为了在主函数中判断注册是否成功,如果成功返回0,非0表示注册失败。

  下面来看看ISR_key函数,如下图所示,只有一条语句,其中,key_flag是一个全局变量,这条语句的意思,每进一次中断,就将key_flag取反。

  下面是主函数,红圈1处部分是判断初始化是否成功,如果init_key()函数返回值是0,说明注册成功,打印register successfully!\n,可以再观察栏中看到它,否则打印Error: register failure!\n。红圈2处是判断标志位key_flag,如果它为1,则对LED->DATA 置1,也就是让让对应的LED亮,否则LED不亮。

转载于:https://www.cnblogs.com/spartan/archive/2011/08/05/2128446.html

[黑金笔记三]电平中断实验相关推荐

  1. STM32工作笔记0057---外部中断实验

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152

  2. [Keil][Verilog][微机原理] 流水灯、存储器、外部中断实验_北京邮电大学计算机原理与应用课程实验报告

    计算机原理与应用实验-流水灯.存储器.外部中断实验 1 实验一 流水灯实验 1.1 实验目的 掌握ARM开发工具的使用. 掌握基本IO的使用. 1.2 实验原理及内容 电路结构图 实现流水灯的电路结构 ...

  3. 【连载】【FPGA黑金开发板】NIOS II那些事儿--外部中断实验(五)

    声明:本文为原创作品,版权归本博文作者所有,如需转载,请注明出处http://www.cnblogs.com/kingst/ 简介 这一节,我们通过来讲解一下NIOS II的硬件中断的内容,同时借助这 ...

  4. 深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening

     深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening 主成分分析与白化是在做深度学习训练时最常见的两种预处理的方法,主成分分析是一种我们用的很多的降维的一种手段,通 ...

  5. 实验三 lr分析器的设计与实现_三电平ZVS半桥的控制模型与仿真 基于PSPICE

    前言: 因为最近有研究一些三电平的东西,所以找出了15年写的TL移相桥的文章,也算是旧文新发.必须要说的,5年前水平有限哈(但是蛮认真的),如果有错误请见谅. 正文:3650字 22图  预计阅读时间 ...

  6. 一起学mini2440裸机开发(十)--mini2440外部中断实验

    我今天一整天都在试着将TQ2440的那种处理中断的方法(即安装中断向量表)移植到MDK中的mini2440,但是一直没成功,这种方法一直没成功,后来又想,还是先从最简单的开始吧,就是不利用中断向量表, ...

  7. 基于OMAPL138的字符驱动_GPIO驱动AD9833(三)之中断申请IRQ

    基于OMAPL138的字符驱动_GPIO驱动AD9833(三)之中断申请IRQ 0. 导语 学习进入到了下一个阶段,还是以AD9833为例,这次学习是向设备申请中断,实现触发,在未来很多场景,比如做用 ...

  8. 单片机原理及其应用——单片机定时器中断实验(八段数码管依次显示0~9数字)

    目录 一.实验要求 二.知识要点 (一)单片机定时器/计数器 (二)相关的特殊功能寄存器 1.工作方式寄存器TMOD 2.定时器/计数器控制寄存器TCON (三)定时器/计数器的工作方式 1.工作方式 ...

  9. 51单片机 | 外部中断实验

    文章目录 一.外部中断介绍 二.外部中断配置 三.硬件设计 四.软件设计 五.实验现象    51 单片机外部中断有 2 个,外部中断 0 和外部中断 1,它们的使用方法是一样的,所以只要学会一个即可 ...

最新文章

  1. java-2018-01-17计划
  2. 设置APP版本跟新提示
  3. 自动生成get,set方法
  4. c++怎么输入esc_绘制CAD图纸的过程中CAD快捷键失灵了怎么办?
  5. 不同文件类型输出及ContentType表
  6. 菜鸟学Linux 第031篇笔记 script,控制,while,function
  7. 云炬随笔集(2016.7~2022.1)
  8. DOS 之for循环
  9. 俩分钟认识Sketch的基础功能
  10. R语言26-Prosper 贷款数据分析2
  11. 网易云音乐api,登录出现 网络太拥挤
  12. textarea右下角有字数计算
  13. 台式机做U盘启动盘----win7旗舰版原装系统重装
  14. 512mb内存linux,linux 内存详解
  15. 龙门架式焊接机器人_龙门架式焊接机器人系统设计
  16. OMIM 表型和基因如何关联
  17. 创业基础-乐训课堂-第四章 创业风险及识别与管理-习题
  18. win7怎么共享文件
  19. GTP发送端时钟网络走向
  20. 上线一套 BI 系统真的很贵?

热门文章

  1. 关于densenet的改进:condensenet、VoVNet
  2. 21秋北京中医药大学《中药鉴定学B》平时作业6
  3. 运动规划和SLAM什么关系?
  4. 白马美的的“红利间歇期”
  5. 制作动态相册的python知识点_动感网页相册 python编写简单文件夹内图片浏览工具...
  6. 程序员如何赚取睡后收入?
  7. 图片格式有哪些?区别是什么
  8. 瓴羊QUICKBI工具帮助企业处理数据,效率提升数倍!
  9. if 我是前端团队 Leader,怎么制定前端协作规范?
  10. 【数据福利】三种冰川编目数据