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之类的语句,繁琐,
初学者还不好理解。
方式二:
定义宏(定义指针)
#define IO *(volatile unsigned char *) IO_BASE
端口写操作:IO=数值
端口读操作:m=IO(m为读端口的数值)
个人觉得此方式方便。语句简单,更靠近单片机编程。
例如:定义了数码管SEG,要想给它赋值,只接写SEG=段值就OK了。
P.S:本方式在CPU等级选择时注意,针对DE0的cyclone 3,如果选择Fast型CPU需做如下设定,否则寄存器无法映射。
方式三:
定义结构体
这是altera官方手册中PIO的寄存器图。
现定义结构体如下:
注:建议采用头文件包含形式。以便成成自己的一套体系。
- #ifndef ZJB_H_
- #define ZJB_H_
- #include "system.h"
- #define _LED
- typedef struct
- {
- unsigned long int DATA;
- unsigned long int DIRECTION;
- unsigned long int INTERRUPT_MASK;
- unsigned long int EDGE_CAPTURE;
- }PIO_STR;
- #ifdef _LED
- #define LED ((PIO_STR *)LED_BASE)
- #endif
- #endif /*ZJB_H_*/
个人觉得此方式在定义像串口之类的IP,特别方便。并且能形成自己的一套头文件,编程非常方便。
操作方式:
LED->DATA = 1<<i;
这样就可以是一个简单的流水灯了,呵呵,怎么样,是不是要简单很多?
结语:
采用第二种,第三种寄存器映射方式非常方便,大家一定都要学会。
有关寄存器,请大家参阅 altera官方手册第三卷EmbeddedPeripherals