首页 > 其他分享 >Nios II之PIO中断

Nios II之PIO中断

时间:2023-04-15 22:57:04浏览次数:40  
标签:Nios PIO ALTERA II BASE KEY IOWR AVALON

PIO中断应用

Quartus软件中集成了Qsys工具,用于搭建SOPC系统,其前身是SOPC Builder。在Qsys中有一个PIO核的组件,PIO在SOPC系统中用的非常多,LCD、按键、LED、数据采集等等都可以使用PIO组件。PIO可以在Qsys中设置外部中断。如图所示,设置5位按键,勾选边缘捕获,边沿类型为下降沿,中断类型设置为边沿触发。

查官方手册,如下图所示。地址偏移量为0的是数据寄存器。

IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, 0x00);	//写数据
//等同于IOWR(PIO_LED_BASE, 0, 0x00)	IOWR(base, offset, data)

向边沿捕获寄存器中写1表示清空。地址偏移量为2的寄存器是中断寄存器,当其中某一位置为1时,表示相应的端口开启中断。

//等同于IOWR(base, 3, 0x1f)
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY_BASE, 0x1f);	//清零所有的捕获位
//等同于IOWR(base, 2, 0x1f)
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_KEY_BASE, 0x1f);	//打开按键中断

按下按键led灯闪烁,按下另一个按键led熄灭。

main.c

#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include "sys/alt_irq.h"
#include "unistd.h"

alt_u8 led_en;

//按键中断函数
alt_isr_func key_isr(void)
{
	alt_u8 data;
	IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_KEY_BASE, 0x00);	//关闭按键中断
	data = IORD_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY_BASE);	//捕获下降沿
	if(data & 0x01)	//key1
	{
		usleep(50000);	//按键消除抖动
		if(data & 0x01)
			led_en = 1;
	}
	else if(data & 0x02)	//key2
	{
		usleep(50000);	
		if(data & 0x02)		
			led_en = 0;
	}
	IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY_BASE, 0x1f);	//清零所有的捕获位
	IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_KEY_BASE, 0x1f);	//开按键中断
	return 0;
}

int main(void)
{
	alt_u8 led = 0;
	alt_u32 i;
	led_en = 0;
	char *p;

    //注册中断
	alt_ic_isr_register(PIO_KEY_IRQ_INTERRUPT_CONTROLLER_ID,
						PIO_KEY_IRQ,
						key_isr,
						p,
						0);

	IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY_BASE, 0x1f);	//清零所有的捕获位 0001 1111 1:清空
	IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_KEY_BASE, 0x1f);	//打开按键中断

	while(1)
	{
		if(led_en == 1)	//led闪烁
		{
			IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, 0x00);//点亮8位LED灯
			i = 0;
			while(i<500000)	
			{
				i++;
			}
			IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, 0xff);//熄灭LED灯
			i = 0;
			while(i<500000)	
			{
				i++;
			}
		}
	}
	return 0;
}

标签:Nios,PIO,ALTERA,II,BASE,KEY,IOWR,AVALON
From: https://www.cnblogs.com/qianxiaohan/p/17322151.html

相关文章

  • 1040. 移动石子直到连续 II
    题目链接:1040.移动石子直到连续II方法:找规律解题思路参考—【图解】下跳棋代码classSolution{public:vector<int>numMovesStonesII(vector<int>&stones){sort(stones.begin(),stones.end());intn=stones.size();inte1=stones......
  • 47. 全排列 II
    给定一个可包含重复数字的序列nums,按任意顺序返回所有不重复的全排列。输入:nums=[1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]>我的解法classSolution{private:voidtraversal(vector<int>&nums,vector<bool>&used,intstartdex){if(startdex>nums......
  • 90. 子集 II
    给你一个整数数组nums,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。返回的解集中,子集可以按任意顺序排列。>我的解法classSolution{private:voidtraversal(vector<int>&nums,vector<bool>&used,intstartdex){i......
  • (动态规划)剑指 Offer 14- II. 剪绳子 II
    题目描述:给你一根长度为n的绳子,请把绳子剪成整数长度的m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1]...k[m-1]。请问k[0]*k[1]*...*k[m-1]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。答案......
  • 40. 组合总和 II
    给定一个候选人编号的集合candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。candidates中的每个数字在每个组合中只能使用一次。注意:解集不能包含重复的组合。classSolution{private:voidtraversal(vector<int>&candidates,......
  • winform-C#操作IIS_DirectoryEntry
    1、创建对象:DirectoryEntryrootfolder=newDirectoryEntry("IIS://localhost/W3SVC/1/ROOT"); //IIS://服务器的名字/要操作的Web服务器类型/站点/站点的虚拟目录 2、修改对象: 3、删除对象: 参考:   C#创建虚拟目录  C#使用DirectoryEntry操作IIS创建网站......
  • leetcode:路径总和 III
    问题描述给定一个二叉树的根节点root ,和一个整数targetSum,求该二叉树里节点值之和等于targetSum的路径的数目。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。示例1输入:root=[10,5,-3,3,2,null,11,3,-2,null,1],ta......
  • SPOJ 1825 FTOUR2 - Free tour II (树上点分治)
    题目地址:SPOJ1825树分治的题果然除了模板题就是金牌题啊。。。这题是一道论文题,想了好长时间。。。。终于过了,,,,注意一个坑点,如果权值全部为负的话,是可以不选任意一条边的,这样权值为0。。。也就是说初始值要设为0。。。具体看漆子超的论文《分治算法在树的路径问题中的应用》......
  • HDU 5016 Mart Master II (树上点分治)
    题目地址:HDU5016先两遍DFS预处理出每个点距最近的基站的距离与基站的编号。然后找重心,求出每个点距重心的距离,然后根据dis[x]+dis[y]<d[y],用二分找出当前子树中不会被占领的数量,总点数减去即是被占领的数量。这样就可以求出每个点最多占领的点的数量。然后找最大值即可。......
  • 动态规划02——45. 跳跃游戏 II
    45.跳跃游戏II给定一个长度为n的0索引整数数组nums。初始位置为nums[0]。每个元素nums[i]表示从索引i向前跳转的最大长度。换句话说,如果你在nums[i]处,你可以跳转到任意nums[i+j]处:0<=j<=nums[i] i+j<n返回到达 nums[n-1]的最小跳跃次数......