nios2 c 语言编程方法--Nios2 系列教程 2
nios2 的C 语言和 X86 或者单片机 C语言很相似,上层的标准 C 库函数都是一样的,区别在于与底层硬件相
关的各个外设寄存器的结构
不同。如果我们把访问底层硬件寄存器的函数封装起来供上层调用,平台之间的移植就显得很容易了。
下面我总结了一些外设的寄存器结构以及用于访问寄存器的函数。
1.可编程输入、输出口 PIO
//Defined in pio_struct.h
// PIO Peripheral
// PIO Registers
typedef volatile struct
{
int np_piodata; // read/write, up to 32 bits
int np_piodirection; // write/readable, up to 32 bits, 1->output bit
int np_piointerruptmask; // write/readable, up to 32 bits, 1->enable interrupt
int np_pioedgecapture; // read, up to 32 bits, cleared by any write
} np_pio;
#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)
#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)
#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)
#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)
2。可编程定时器
// Timer Peripheral
// Timer Registers
typedef volatile struct
{
int np_timerstatus; // read only, 2 bits (any write to clear TO)
int np_timercontrol; // write/readable, 4 bits
int np_timerperiodl; // write/readable, 16 bits
int np_timerperiodh; // write/readable, 16 bits
int np_timersnapl; // read only, 16 bits
int np_timersnaph; // read only, 16 bits
} np_timer;
// Timer Register Bits
enum
{
np_