niosii的奇幻漂流-chap04-pio应用(2)——外部中断

上传人:wt****50 文档编号:37622256 上传时间:2018-04-20 格式:PDF 页数:17 大小:1.28MB
返回 下载 相关 举报
niosii的奇幻漂流-chap04-pio应用(2)——外部中断_第1页
第1页 / 共17页
niosii的奇幻漂流-chap04-pio应用(2)——外部中断_第2页
第2页 / 共17页
niosii的奇幻漂流-chap04-pio应用(2)——外部中断_第3页
第3页 / 共17页
niosii的奇幻漂流-chap04-pio应用(2)——外部中断_第4页
第4页 / 共17页
niosii的奇幻漂流-chap04-pio应用(2)——外部中断_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《niosii的奇幻漂流-chap04-pio应用(2)——外部中断》由会员分享,可在线阅读,更多相关《niosii的奇幻漂流-chap04-pio应用(2)——外部中断(17页珍藏版)》请在金锄头文库上搜索。

1、 NiosII 的奇幻漂流 by VITOVITO 老虎社区 Chap.4 PIO 应用(2)外部中断 NiosII 的奇幻漂流 工具版本:Windows7 + QuartusII 12.0 + Qsys + NiosII SBT 12.0 作者:VITOVITO E-Mail: 老虎社区 版权所有 http:/ All Right Reserved 2014.5 处心积虑地让 FPGA 好学好用 PIO 应用 2外部中断 1 本章主要介绍 PIO 的应用外部中断, 通过用 PIO 连接的按键来触发 Nios II CPU 的外部中断,来点亮 LED;同时介绍了 Nios II 中断点调试的

2、使用方法。通过本章的学习,您会学习到: (1)在 Nios II 中利用 PIO 实现外部中断。 (2)按键的原理和使用方法。 (3)在 Nios II 中进行断点调试。 本章分为四个部分: 一、概述 二、硬件实现 三、软件实现 四、断点调试 五、实验总结 更多章节,请访问 http:/ 应用 2外部中断 2 上一章我们用 PIO 点亮了 LED,终于看到开发板的现象了。不过话说回来,如果 PIO 只能用来点个 LED,那也忒小看它了。接下来,我们来说说 PIO 的另一个应用:用 PIO 实现外部中断。 有道是:有人的地方就有江湖,有 CPU 的地方就有中断,Nios II CPU 自然也少不

3、了中断嘛。这一章我们就利用 PIO 来实现对 Nios II CPU 的外部中断,方法为:Nios II CPU 通过 PIO连接到某个按键上,按键按下后触发中断,CPU 响应外部中断改变 LED 的亮灭(LED 自然也是通过另一个 PIO 来控制的) ,下面就来具体介绍下实现。 小贴士 Tips:关于中断 简单来说,中断指 CPU 在执行 A 任务时,发生了某个事件(程序自身或外界)使 CPU暂停对 A 任务的处理,保留现场,去执行 B 任务;B 任务完成后,回到 A 的现场,继续执行 A 任务。中断有优先级之分,优先级高的中断可以打断优先级低的中断,同级别中断按先后顺序执行。在嵌入式系统中

4、,中断一般分为定时中断和外部中断,定时中断由程序定时产生,外部中断则由外设产生。 PIO 应用 2外部中断 3 打开 Quartus II 和 Qsys 软件,我们在上一章工程的基础上再增加一个 PIO(当然,不嫌麻烦重新再建一个工程也可以哈) 。先切换到 Qsys 软件,导入 kernel.qsys 文件后,在左侧边栏的 Library 找到 PIO 模块,双击配置 PIO,如下图,框 1 是 PIO 宽度、方向和输出初始值设置,我们把宽度设为 1,方向设为输入,因为是输入,所以输出初始值就不用管啦。框 3 是中断选项,我们勾选上 Generate IRQ(生成中断) ,中断类型(IRQ T

5、ype)有两种:电平触发中断和边沿触发中断,我们选择电平触发中断。框 2 中是边沿触发中断寄存器的一些设置,如果要设置边沿触发中断,则需要勾选上 Synchronously capture(同步捕获) ,再选择是捕获上升沿(RISING)还是下降沿(FALLING) ,因为我们在框 3 中选择的为电平触发中断,所以框2 无需设置。 点击 Finish,完成 PIO 配置,我们将得到的新 PIO 改名为 KEY,并进行连线、端口引出PIO 应用 2外部中断 4 和中断连接工作,具体步骤就不讲啦,还没掌握的同学可以回顾下前几章哈。我们得到下图,要注意红框中的地址和中断号:前面已经讲过,模块的地址区

6、间(基地址和结束地址之间的部分)不能与其它模块的地址区间重合;对于中断号,EPCS 已经设为 0,JTAG_UART 设为 1,其它模块按照顺序依次增加即可(在对中断优先级无特殊要求的情况下) ,事实上这次 Qsys 还真“人性化”了一回,我们连接上中断后它自动分配了 2,不容易啊! 当然,为了稳妥我们还是给 Qsys 自动分配下地址和中断号(别忘了保存! ) ,得到下图。 最后自然是编译了,点击 Generate,等待编译完成,休息一下吧。 编译完成后我们回到 Quartus II 主界面, 先介绍下按键的原理。在 TIGER BOARD 上面配有 6 个按键,如下图所示,按键的一端连接 F

7、PGA 的某个管脚,并通过上拉电阻接高电平;另一端接地。当该 FPGA 管脚作为输入时,按键松开时输入高电平,按下时则输入低电平。 PIO 应用 2外部中断 5 打顶层文件,我们先更新 kernel 模块,得到新生成的 key。因为 Nios II CPU 只对高电平敏感,所以要给 key 加一个非门作电平转换,添加方法与加入 kernel 模块、输入输出管脚类似,如下图所示。 接下来再添加输入管脚、连线,分配管脚,最终得到下图,大家注意下红框中的配置。 PIO 应用 2外部中断 6 保存下文件,我们开始编译 Quartus II 工程,编译成功后,硬件实现就 OK 了。PIO 应用 2外部中

8、断 7 接下来进行软件工程的实现。新建一个 Nios II 工程,命名为 int,在编写程序前先把三文件夹结构(main、inc 和 driver)搭建好,如果大家觉得在 Nios II 主界面操作太慢,这里介绍一个快捷点的方法:在我的电脑下找到原工程(即 int)所在的文件夹,在文件夹内新建上面的三个文件夹 (别忘了将 hello_world.c 改名并移到 main 文件夹中) , 回到 Nios II 中界面,在目录区右键单击选择 Refresh 即可,怎么样,这样会快点吧。 我们先打开 BSP 工程中的 system.h 文件,看看新添加的名为 KEY 的 PIO 的情况,得到下图,可

9、以看到,KEY 的基地址(框 1) 、宽度(框 4) 、方向(框 5)等信息与我们在 Qsys 中设置的一致,同时,框 2、框 3 和框 6 中关于中断的设置也与预期一致,这正是 system.h 的伟大之处啊。 接下来我们来完成 sopc.h文件的编写。 我们在sopc.h 中添加上KEY 的定义, 如下图框1、PIO 应用 2外部中断 8 框 2 所示,方法与上一章添加 LED 类似,不再详述。 我们在 main.c 中主要完成中断初始化函数和中断服务函数 (ISR,Interrupt Service Routine)的编写。 要实现中断功能,首先要注册中断。在 Nios II SBT 中

10、,中断注册函数的原型为 int alt_ic_isr_register (alt_u32 ic_id, alt_u32 irq, alt_isr_func isr, void* isr_context, void* flags) ic_id 为中断控制器标号,定义于 system.h 之中,在本例中即KEY_IRQ_INTERRUPT_CONTROLLER_ID。 irq 为设备的硬件中断号,也在 system.h 中定义,即 KEY_IRQ。 isr 为调用的中断服务函数。 isr_context 指向与设备驱动实例相关的数据结构体,一般设为 NULL。 #ifndef SOPC_H_ #d

11、efine SOPC_H_ #include “system.h“ #define _LED #define _KEY /1 typedef struct unsigned long int DATA; unsigned long int DIRECTION; unsigned long int INTERRUPT_MASK; unsigned long int EDGE_CAPTURE; PIO_STR; #ifdef _LED #define LED (PIO_STR *) LED_BASE) #endif /*_LED*/ #ifdef _KEY #define KEY (PIO_STR

12、 *) KEY_BASE) /2 #endif /*_KEY*/ #endif /*SOPC_H_*/ PIO 应用 2外部中断 9 flags 保留未用,设为 0 即可。 然后是中断服务函数了,中断服务函数是指触发中断后要执行的函数(也就是概述中的 B任务) ,其原型为 void handle_button_interrupts(void* isr_context); handle_button_interrupts 为中断服务函数名称,不固定;isr_context 为给该函数提供的输入参数。 介绍完这两个函数,我们开始编写程序,完成后得到下图。 框 2 是中断初始化函数,包括中断全能和中

13、断注册:KEY_INTERRUPT_MASK 是 PIO 的中断使能寄存器,置 1 时中断使能有效,否则无效,我们把它置 1,使中断使能有效;然后按照上面介绍的格式编写中断注册函数 alt_ic_isr_register,如果初始化成功,函数返回 1,否则返回 0。 框 1 是中断服务函数, 一旦外部中断被触发, 中断服务函数就会将 LED 置 1, 即点亮 LED。 框 3 是 main 函数。在 main 函数中,首先将 LED 置 0,再判断中断注册是否成功,如果成功,打印“register successfully!” ,否则打印“Error: register failure!” 。

14、 #include “./inc/sopc.h“ #include “system.h“ #include “sys/alt_irq.h“ #include #include void ISR_key(void * isr_context) /1 小贴士 Tips:不一样!中断注册函数的变化 接触过较早版本的 Nios II 软件的同学可能会纳闷,这个中断注册函数跟原来的不一样啊!事实正是如此,Nios II 9.1 版本后的中断注册函数发生的变化,函数名、参数都有改变,但是功能上并没什么区别。无论您是否接触过原来的中断注册函数,既然已经改版,大家就顺应历史潮流吧。 PIO 应用 2外部中断

15、10 整个软件实现就这么多, 怎么样,外部中断也不过如此吧?LED-DATA = 1; int init_key(void) KEY-INTERRUPT_MASK = 1; return alt_ic_isr_register(KEY_IRQ_INTERRUPT_CONTROLLER_ID, KEY_IRQ, /2 ISR_key, NULL, 0x0); int main() LED-DATA = 0; if(!init_key() printf(“register successfully!n“); /3 else printf(“Error: register failure!n“); return 0; PIO 应用 2外部中断 11 既然讲到了中断,那就顺便介绍下断点调试(DEBUG) 。前面我们进行实验验证的时候,都是采用的直接运行的方式,其实很多时候,我们也需要在程序中设置一些断点

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 建筑机械

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号