NIOS 寄存器的三种映射方式

http://www.ceet.hbnu.edu.cn/bbs/viewthread.php?tid=7325

alt寄存器赋值三种方式:

一、

#ifdef    CRAZY_LED_DATA
#define    LED_DATA_ADDR    (LED_DATA_BASE | (1<<31))
#define    LED_DATA    (*(volatile unsigned int*)LED_DATA_ADDR)
#endif

二、用API函数 IOWR,IORD…

三、用结构体

#ifdef    CRAZY_LCD1602
#define    LCD1602_ADDR    (LCD1602_BASE | (1<<31))
typedef struct
{
    alt_u32    LCD_EN        :    32;
    alt_u32    LCD_RW        :    32;
    alt_u32    LCD_RS        :    32;
    alt_u32    LCD_DATA    :    32;
}LCD1702_T;
#define    LCD1602    (*(LCD1602_T)LCD1602_ADDR)

 

个人推荐用第一种,比较直观整洁

 

方式一:
         传统的HAL方式,也就是使用altera的方式(暂且这样说吧)
         注:本方式需包含头文件 altera_avalon_pio_regs.h
         端口写操作:IOWR_ALTERA_AVALON_PIO_DATA(BASE,数值)
         端口读操作:IORD_ALTERA_AVALON_PIO_DATA(BASE)
           
         个人觉得此方式没有什么优点可谈,并且在程序中要写大量的IOWR_ALTERA_AVALON_PIO_DATA之类的语句,繁琐,
          初学者还不好理解。


1139054649.gif

下载 (7.58 KB)
2010-6-7 17:57


方式二:
         定义宏(定义指针)
         #define IO  *(volatile unsigned char *) IO_BASE
         端口写操作:IO=数值
         端口读操作:m=IO(m为读端口的数值)
         
         个人觉得此方式方便。语句简单,更靠近单片机编程。
         例如:定义了数码管SEG,要想给它赋值,只接写SEG=段值就OK了。
         
         P.S:本方式在CPU等级选择时注意,针对DE0的cyclone 3,如果选择Fast型CPU需做如下设定,否则寄存器无法映射。
Snap4.jpg

下载 (34.48 KB)
2010-6-6 14:49



   

1139054649.gif

下载 (7.58 KB)
2010-6-7 17:57


方式三:
          定义结构体
          4cfafddd46ff8024a4878&690.jpg

下载 (26.83 KB)
2010-6-6 14:49


          这是altera官方手册中PIO的寄存器图。
         现定义结构体如下:
         注:建议采用头文件包含形式。以便成成自己的一套体系。

  1. #ifndef ZJB_H_
  2.                  #define ZJB_H_
  3.                  #include "system.h"
  4.                 #define _LED
  5.                 typedef struct
  6.                {
  7.                 unsigned long int DATA;
  8.                 unsigned long int DIRECTION;
  9.                 unsigned long int INTERRUPT_MASK;
  10.                 unsigned long int EDGE_CAPTURE;
  11.                 }PIO_STR;
  12.                #ifdef _LED
  13.                #define LED ((PIO_STR *)LED_BASE)
  14.                #endif
  15.                #endif /*ZJB_H_*/
复制代码

         个人觉得此方式在定义像串口之类的IP,特别方便。并且能形成自己的一套头文件,编程非常方便。

         操作方式:
          LED->DATA = 1<<i;
         这样就可以是一个简单的流水灯了,呵呵,怎么样,是不是要简单很多?


1139054649.gif

下载 (7.58 KB)
2010-6-7 17:57



         结语:
               采用第二种,第三种寄存器映射方式非常方便,大家一定都要学会。
               有关寄存器,请大家参阅          altera官方手册第三卷EmbeddedPeripherals

转载于:https://www.cnblogs.com/GL-BBL/archive/2012/08/23/2651747.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值