找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11389|回复: 0
收起左侧

NIOS II学习之PIO口操作(一)——给PIO口赋值和读取PIO口的值

[复制链接]
ID:51025 发表于 2014-8-29 17:32 | 显示全部楼层 |阅读模式
一、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、地址方式还未实验,理论上是可以的。

上述方式只是我的初步理解,可能有错误之处。
是为记录

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表