SOPC第四课 按键中断
按键
LED控制
开发板 小梅哥AC620
软件 quartus 13.1
2个按键,当按键0按下时,LED灯开始闪烁;当按键1按下时,LED灯停止闪烁。
使用一个PIO 这个PIO设置为6位(4个LED+2个按键)
PIO设置为bidir型 位宽为6位
能够捕获边沿下降沿
能够产生中断、边沿中断
要求使能单独位的设置和清零
使能边沿捕获寄存器的单独位清零
顶层代码PL部分
module nios_pio_led(clk,rst_n,key,key_gnd,led
);input clk;input rst_n;output key_gnd;inout [1:0]key;inout [3:0]led;assign key_gnd = 0;mysystem u0 (.clk_clk (clk), // clk.clk.reset_reset_n (rst_n), // reset.reset_n.pio_led_export ({key,led}) // pio_led.export);endmodule
PS部分
#include "stdio.h"
#include "system.h"
#include "alt_types.h"
#include "altera_avalon_pio_regs.h"
#include "sys/alt_irq.h"alt_u8 led_enable=0;
alt_u32 i,data;alt_isr_func isr(void)//中断服务函数
{IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_LED_BASE, 0x00); //关闭按键中断data=IORD_ALTERA_AVALON_PIO_EDGE_CAP(PIO_LED_BASE);if(data&0x20) //这样写的原因是无法确定低4位的值led_enable=0;else if(data&0x10) //停止按键按下led_enable=1;else{led_enable=0;}IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_LED_BASE,0X30);//清除边缘捕获寄存器IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_LED_BASE,0X30);//开中断return 0;
}
int main(void)
{char *p;IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_LED_BASE, 0x0f); //设置低4位为输出,高2位为输入alt_ic_isr_register( PIO_LED_IRQ_INTERRUPT_CONTROLLER_ID, PIO_LED_IRQ, isr, p, 0);//注册中断函数IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_LED_BASE, 0x30); //清零所有的捕获位IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_LED_BASE, 0x30); //打开按键中断while(1){if(led_enable==1){while(i<=500000){i++;}IOWR_ALTERA_AVALON_PIO_CLEAR_BITS(PIO_LED_BASE,0x8);//低电平,LED4小灯点亮,i=0;while(i<=500000){i++;}i=0;IOWR_ALTERA_AVALON_PIO_SET_BITS(PIO_LED_BASE,0x8);//第3位置位,高电平,LED4小灯熄灭}else if(led_enable==0){IOWR_ALTERA_AVALON_PIO_SET_BITS(PIO_LED_BASE,0xF);//第3位置位,高电平,LED4小灯熄灭}}return 0;
}
实验效果
- 矩阵键盘说明
矩阵键盘有两组,共有8跟信号线,其中COL每一列的四个按键的一端连接起来,而ROW则将每一行的4个按键的一端连接起来,通过4行4列的8根信号线,总共能够管理16个按键。用4个IO得到了16个按键。
可看出,我们把COL0接地,按键按下为0,不按为1.(后续再继续学习如何学习电路原理图)
中断的头文件,在sys路径下面
划线定义i,要注意了,我们下面是500000,大于了u8类型,所以这也是个坑,一定要注意自己定义的数是否够用。
定义方向,这也很是个坑,我原先就没有找出是什么原因导致错误,后来弄了半天才想到,inout的方向没有设置,默认是输出的。
然后注册中断函数,每一个元素前面,不用再次声明数据类型
这里消耗时间是while,不是if判断,if是并行的选择,不是顺序
以上分别是全速运行、step into step over step return
并且可以看到变量
还可以设置断点。
另外如果出错,记得,在run configure 里面重新refresh 一下blaster
SOPC第四课 按键中断相关推荐
- esp32外部中断_玩转 ESP32 + Arduino (四) 电容按键 霍尔传感器 外部中断 延时 脉冲检测...
一. 电容输入 touchRead(pin) 及电容输入中断touchAttachInterrupt(pin, TSR , threshold) ESP32专门提供了电容触摸传感器的功能, 共有T0, ...
- 字符设备驱动(四)按键中断
目录 字符设备驱动(四)按键中断 硬件IO 程序设计 中断配置 中断关闭 中断函数 共享中断号 测试 完整的程序 title: 字符设备驱动(四)按键中断 tags: linux date: 2018 ...
- 玩转 ESP32 + Arduino (四) 电容按键 霍尔传感器 外部中断 延时 脉冲检测
一. 电容输入 touchRead(pin) 及电容输入中断touchAttachInterrupt(pin, TSR , threshold) ESP32专门提供了电容触摸传感器的功能, 共有T0, ...
- Linux 探索之旅 | 第三部分第四课:后台运行及合并多个终端
-- 作者 谢恩铭 转载请注明出处 内容简介 第三部分第四课:后台运行及合并多个终端 第三部分第五课预告:延时执行,唯慢不破 后台运行及合并多个终端 上一课 Linux探索之旅 | 第三部分第三课:监 ...
- NeHe OpenGL第二十四课:扩展
NeHe OpenGL第二十四课:扩展 扩展,剪裁和TGA图像文件的加载: 在这一课里,你将学会如何读取你显卡支持的OpenGL的扩展,并在你指定的剪裁区域把它显示出来. 这个教程有一些难度,但它 ...
- 第四课 脱壳必备知识要点及方法
第四课 脱壳必备知识要点及方法 今天所要讲的是这高级篇中最为关键,最为重要的一课,希望大家能认真学习,反复推敲,举一反三学习脱壳的各种方法,当然有的时候可能需要几种方法一起使用,今后我们也会一点一点 ...
- 【C++探索之旅】第一部分第四课:内存,变量和引用
内容简介 1.第一部分第四课:内存,变量和引用 2.第一部分第五课预告:简易计算器 内存,变量和引用 上一课<[C++探索之旅]第一部分第三课:第一个C++程序>中,我们已经学习了如何创建 ...
- 从ARM裸机看驱动之按键中断方式控制LED(一)
硬件环境:Samsung Cortex-A9 Exynos4412 BSP + JTAG ARM 仿真器 软件环境:Eclipse ================================== ...
- 第四课:如何安装树莓派系统
第一课:什么是树莓派 第二课:基于树莓派的10个经典项目 第三课:购买您的第一个树莓派 第四课:如何安装树莓派系统 第五课:树莓派C语言编程手册 第六课:树莓派led控制 第七课:树莓派按键控制 第八 ...
最新文章
- html5 drap 文件夹,带有显示ID的Html5 drap and drop问题
- 【TCP/IP 协议】 TCP/IP 基础
- Java集合篇:集合细节:为集合指定初始容量、asList的缺陷、subList的缺陷
- Linux 系统应用编程——网络编程(基础篇)
- 时区日期处理及定时 (NSDate,NSCalendar,NSTimer,NSTimeZone) -- IOS(实例)
- CV Code | 计算机视觉开源周报20191002期
- MYSQ--SHOW PROFILE Syntax and useing
- 家庭NAS存储服务器给我们带来了什么
- silverlight 3 blend3最新版本 破解方法
- 5月8号--华为正式推出新企业标识
- C++11的std::is_same和std::decay使用与源码解析
- 计算机应届生面试,计算机应届生面试技巧
- 1867最短路径问题(SPFA)
- Oracle什么时候创建索引最好
- Adaptive Personalized Federated Learning 论文解读+代码解析
- 如何对PDF文档进行数字签名
- NYNU_ACM 实验室招新月赛题解
- My_sum函数进化
- MongoDB详细介绍
- Resetting a lost Admin password