nios ii奋斗中 —>转载PIO
2014-01-13 13:56
211 查看
通用IO口常用头文件:#include "altera_avalon_pio_regs.h" 和 #include "io.h" 其定义如下:
#ifndef __ALTERA_AVALON_PIO_REGS_H__
#define __ALTERA_AVALON_PIO_REGS_H__
#include <io.h>
//IO口读写。 数据宽度最大一次32位读写
#define IOADDR_ALTERA_AVALON_PIO_DATA(base) __IO_CALC_ADDRESS_NATIVE(base, 0)
#define IORD_ALTERA_AVALON_PIO_DATA(base) IORD(base, 0)
#define IOWR_ALTERA_AVALON_PIO_DATA(base, data) IOWR(base, 0, data)
//IO口方向控制。针对定义的双向口而言的。1为输出端口,0 为输入端口
#define IOADDR_ALTERA_AVALON_PIO_DIRECTION(base) __IO_CALC_ADDRESS_NATIVE(base, 1)
#define IORD_ALTERA_AVALON_PIO_DIRECTION(base) IORD(base, 1)
#define IOWR_ALTERA_AVALON_PIO_DIRECTION(base, data) IOWR(base, 1, data)
//IO口中断使能。按位来使能,1表示使能。
#define IOADDR_ALTERA_AVALON_PIO_IRQ_MASK(base) __IO_CALC_ADDRESS_NATIVE(base, 2)
#define IORD_ALTERA_AVALON_PIO_IRQ_MASK(base) IORD(base, 2)
#define IOWR_ALTERA_AVALON_PIO_IRQ_MASK(base, data) IOWR(base, 2, data)
//IO口边沿捕获寄存器函数
#define IOADDR_ALTERA_AVALON_PIO_EDGE_CAP(base) __IO_CALC_ADDRESS_NATIVE(base, 3)
#define IORD_ALTERA_AVALON_PIO_EDGE_CAP(base) IORD(base, 3)
#define IOWR_ALTERA_AVALON_PIO_EDGE_CAP(base, data) IOWR(base, 3, data)
#define ALTERA_AVALON_PIO_DIRECTION_INPUT 0
#define ALTERA_AVALON_PIO_DIRECTION_OUTPUT 1
#endif
#ifndef __IO_H__
#define __IO_H__
#include "alt_types.h"
#ifdef __cplusplus
extern "C"
{
#endif
#ifndef SYSTEM_BUS_WIDTH
#error SYSTEM_BUS_WIDTH undefined
#endif
#define __IO_CALC_ADDRESS_DYNAMIC(BASE, OFFSET) \
((void *)(((alt_u8*)BASE) + (OFFSET)))
#define IORD_32DIRECT(BASE, OFFSET) \
__builtin_ldwio (__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)))
#define IORD_16DIRECT(BASE, OFFSET) \
__builtin_ldhuio (__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)))
#define IORD_8DIRECT(BASE, OFFSET) \
__builtin_ldbuio (__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)))
#define IOWR_32DIRECT(BASE, OFFSET, DATA) \
__builtin_stwio (__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)), (DATA))
#define IOWR_16DIRECT(BASE, OFFSET, DATA) \
__builtin_sthio (__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)), (DATA))
#define IOWR_8DIRECT(BASE, OFFSET, DATA) \
__builtin_stbio (__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)), (DATA))
#define __IO_CALC_ADDRESS_NATIVE(BASE, REGNUM) \
((void *)(((alt_u8*)BASE) + ((REGNUM) * (SYSTEM_BUS_WIDTH/8))))
#define IORD(BASE, REGNUM) \
__builtin_ldwio (__IO_CALC_ADDRESS_NATIVE ((BASE), (REGNUM)))
#define IOWR(BASE, REGNUM, DATA) \
__builtin_stwio (__IO_CALC_ADDRESS_NATIVE ((BASE), (REGNUM)), (DATA))
#ifdef __cplusplus
}
#endif
#endif
下面以一个按健中断响应程序说明IO口中断的使用
#ifndef EX_INT_ZX_H_
#define EX_INT_ZX_H_
extern unsigned char leddata[8];
extern unsigned int cnt;
void Int0_ISR (void * context,alt_u32 id)//中断服务程序
{
cnt++;
leddata[7]=8;
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(INT0_PIO_BASE, 0);//清状态寄存器,为下次中断作准备
// IOWR_ALTERA_AVALON_PIO_IRQ_MASK(INT0_PIO_BASE,0x0);//关中断
}
void Int0_init(void) //中断初始化函数
{
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(INT0_PIO_IRQ, 0x0);//设置边沿捕获寄存器函数,用来重新设定寄存器的值,一般在读取之后会重新设定为0;
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(INT0_PIO_BASE,0x01);//中断使能函数。按位来使能,0x01表示最低位使能。
// IOWR_ALTERA_AVALON_PIO_DIRECTION(INT0_PIO_BASE,0x00);//端口方向为输入
alt_irq_register(INT0_PIO_IRQ,0,Int0_ISR); //中断注册Int0_ISR
}
#endif
每按一次键盘cnt 加1,实际可能加N次,因为这里没有进行按键去抖。
IO口使用的另一种方法
Altera 的用法:
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0xff)
或 IOWR(LED_PIO_BASE, 0, 0xff)
我们习愦的单片机用法
#define LED *(unsigned int*)LED_PIO_BASE//这样定义后就可以跟我们习愦的单片机使用IO口一样,用法如下:
LED =0xff;
这是对输出端口而言的,我也不知为什么对输入端口读取为撒行不通,还是只能用Altera 的IORD_ALTERA_AVALON_PIO_DATA(base) 或 IORD(base, 0)
#ifndef __ALTERA_AVALON_PIO_REGS_H__
#define __ALTERA_AVALON_PIO_REGS_H__
#include <io.h>
//IO口读写。 数据宽度最大一次32位读写
#define IOADDR_ALTERA_AVALON_PIO_DATA(base) __IO_CALC_ADDRESS_NATIVE(base, 0)
#define IORD_ALTERA_AVALON_PIO_DATA(base) IORD(base, 0)
#define IOWR_ALTERA_AVALON_PIO_DATA(base, data) IOWR(base, 0, data)
//IO口方向控制。针对定义的双向口而言的。1为输出端口,0 为输入端口
#define IOADDR_ALTERA_AVALON_PIO_DIRECTION(base) __IO_CALC_ADDRESS_NATIVE(base, 1)
#define IORD_ALTERA_AVALON_PIO_DIRECTION(base) IORD(base, 1)
#define IOWR_ALTERA_AVALON_PIO_DIRECTION(base, data) IOWR(base, 1, data)
//IO口中断使能。按位来使能,1表示使能。
#define IOADDR_ALTERA_AVALON_PIO_IRQ_MASK(base) __IO_CALC_ADDRESS_NATIVE(base, 2)
#define IORD_ALTERA_AVALON_PIO_IRQ_MASK(base) IORD(base, 2)
#define IOWR_ALTERA_AVALON_PIO_IRQ_MASK(base, data) IOWR(base, 2, data)
//IO口边沿捕获寄存器函数
#define IOADDR_ALTERA_AVALON_PIO_EDGE_CAP(base) __IO_CALC_ADDRESS_NATIVE(base, 3)
#define IORD_ALTERA_AVALON_PIO_EDGE_CAP(base) IORD(base, 3)
#define IOWR_ALTERA_AVALON_PIO_EDGE_CAP(base, data) IOWR(base, 3, data)
#define ALTERA_AVALON_PIO_DIRECTION_INPUT 0
#define ALTERA_AVALON_PIO_DIRECTION_OUTPUT 1
#endif
#ifndef __IO_H__
#define __IO_H__
#include "alt_types.h"
#ifdef __cplusplus
extern "C"
{
#endif
#ifndef SYSTEM_BUS_WIDTH
#error SYSTEM_BUS_WIDTH undefined
#endif
#define __IO_CALC_ADDRESS_DYNAMIC(BASE, OFFSET) \
((void *)(((alt_u8*)BASE) + (OFFSET)))
#define IORD_32DIRECT(BASE, OFFSET) \
__builtin_ldwio (__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)))
#define IORD_16DIRECT(BASE, OFFSET) \
__builtin_ldhuio (__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)))
#define IORD_8DIRECT(BASE, OFFSET) \
__builtin_ldbuio (__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)))
#define IOWR_32DIRECT(BASE, OFFSET, DATA) \
__builtin_stwio (__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)), (DATA))
#define IOWR_16DIRECT(BASE, OFFSET, DATA) \
__builtin_sthio (__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)), (DATA))
#define IOWR_8DIRECT(BASE, OFFSET, DATA) \
__builtin_stbio (__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)), (DATA))
#define __IO_CALC_ADDRESS_NATIVE(BASE, REGNUM) \
((void *)(((alt_u8*)BASE) + ((REGNUM) * (SYSTEM_BUS_WIDTH/8))))
#define IORD(BASE, REGNUM) \
__builtin_ldwio (__IO_CALC_ADDRESS_NATIVE ((BASE), (REGNUM)))
#define IOWR(BASE, REGNUM, DATA) \
__builtin_stwio (__IO_CALC_ADDRESS_NATIVE ((BASE), (REGNUM)), (DATA))
#ifdef __cplusplus
}
#endif
#endif
下面以一个按健中断响应程序说明IO口中断的使用
#ifndef EX_INT_ZX_H_
#define EX_INT_ZX_H_
extern unsigned char leddata[8];
extern unsigned int cnt;
void Int0_ISR (void * context,alt_u32 id)//中断服务程序
{
cnt++;
leddata[7]=8;
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(INT0_PIO_BASE, 0);//清状态寄存器,为下次中断作准备
// IOWR_ALTERA_AVALON_PIO_IRQ_MASK(INT0_PIO_BASE,0x0);//关中断
}
void Int0_init(void) //中断初始化函数
{
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(INT0_PIO_IRQ, 0x0);//设置边沿捕获寄存器函数,用来重新设定寄存器的值,一般在读取之后会重新设定为0;
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(INT0_PIO_BASE,0x01);//中断使能函数。按位来使能,0x01表示最低位使能。
// IOWR_ALTERA_AVALON_PIO_DIRECTION(INT0_PIO_BASE,0x00);//端口方向为输入
alt_irq_register(INT0_PIO_IRQ,0,Int0_ISR); //中断注册Int0_ISR
}
#endif
每按一次键盘cnt 加1,实际可能加N次,因为这里没有进行按键去抖。
IO口使用的另一种方法
Altera 的用法:
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0xff)
或 IOWR(LED_PIO_BASE, 0, 0xff)
我们习愦的单片机用法
#define LED *(unsigned int*)LED_PIO_BASE//这样定义后就可以跟我们习愦的单片机使用IO口一样,用法如下:
LED =0xff;
这是对输出端口而言的,我也不知为什么对输入端口读取为撒行不通,还是只能用Altera 的IORD_ALTERA_AVALON_PIO_DATA(base) 或 IORD(base, 0)
相关文章推荐
- [转载]Nios II PIO的说明与双向操作注意点
- 背包之 01背包、完全背包、多重背包详解 <转载自奋斗哥のblog>
- 母函数 ( Generating function ) 详解 <转载自奋斗哥のblog>
- 解决 spring mvc 3.0 结合 hibernate3.2 使用<tx:annotation-driven>声明式事务无法提交的问题(转载)
- <转载> JavaSript模块规范 - AMD规范与CMD规范介绍
- 首次使用Ubuntu登录设置root密码<转载>
- 终止进程的内幕<转载>
- 转载->CPU的内部架构和工作原理
- (转载)站在巨人肩上的微创新,对SDWebImage的扩展,源码分享了<1月15日再次更新>
- 转载颜色模式RGB888->RGB565
- <转载>利用dns类和WMI规范获取IP及MAC地址
- <转载>.NET:一段比较经典的多线程学习代码
- ElasticSearch 基础<转载>
- 可以让你少奋斗十年的经验(转载)
- 多人开发的基础---组件化编程,仿COM篇 <<转载>>
- DataSet和List<T> 泛型之间互相转换 (转载, 作者写的很好)
- 教你看懂邮件头信息<转载>
- 【转载】usr/bin/ld: cannot find -l<nameOfTheLibrary>
- <转载>搜索引擎设计实用教程(1)-以百度为例
- <转载:Shai Raiten(一)> DotNetNuke