一、PIO口赋值
在NIOSII中,给PIO口赋值有多种方法,下面依次介绍
1、利用给定的宏定义函数,函数原型如下:
IOWR_ALTERA_AVALON_PIO_DATA(base, data)
其中,base是要访问的IO口的基地址,data是所要写入的数据
2、当我们跳入到上述函数的定义时,可以发现其定义方式为
#define IOWR_ALTERA_AVALON_PIO_DATA(base,data) IOWR(base, 0, data)
因此,我们可以直接调用函数IOWR(base, 0, data)来对PIO口赋值,参数的含义同上。
3、直接对寄存器赋值
通过对PIO口的用户手册的阅读可知,一个或者一组PIO口所对应的寄存器有DATA、DIRECTION、INTERRUPT_MASK、EDGE_CAPTURE,因此可以直接对PIO的寄存器进行访问来赋值,假设PIO的基地址如下定义:
#define LED_PIO_BASE 0x11000020
则,可以定义如下结构体:
typedef struct
{
unsigned long int DATA;
unsigned long int DIRECTION;
unsigned long int INTERRUPT_MASK;
unsigned long int EDGE_CAPTURE;
}PIO_STR;
同时,将LED_PIO的基地址映射到该结构体的首地址
#ifdef _LED
#define LED((PIO_STR *)LED_PIO_BASE)
#endif
这样,可以直接对上述结构体操作,以实现对PIO口的操作,如对IO写一个数据,可以如下方式操作:
LED->DATA = 0XFF;
同时也可以对其的其他寄存器访问。
4、地址映射方式
如下所示
#defineLED_PIO_BASE 0x11000020
#defineLEDPORT *(unsigned int*)LED_PIO_BASE(先对LED_PIO_BASE强制类型转换,然后在取地址所指向的值,并用宏定义成LEDPORT)
于是,想对IO赋值,就只需要如下操作:
LEDPORT =0xff;
二、从IO口读取值
读值也有上述4中方式,只是用的函数不同。当然,前提是必须把IO口设置为input模式
1、用调用函数方式,有如下函数可以供我们使用:
keyvalue = IORD_ALTERA_AVALON_PIO_DATA(base)
base为所以读取的IO口基地址,返回的值放在keyvalue变量中
2、同时,也可以调用如下函数:
keyvalue = IORD(base, 0)
参数值同上。
3、如果是直接对寄存器访问,这和对IO口操作方式类似,只是此时的LED->DATA就是要读取的值,如下:
keyvalue= KEY->DATA;
4、地址方式还未实验,理论上是可以的。
上述方式只是我的初步理解,可能有错误之处。
是为记录
|