请问寄存器控制的从外设,如何在软件中定义寄存器的地址?
- UID
- 91150
- 性别
- 男
|
很简单啊
可以直接对地址操作,也可以使用指针。具体使用方法看看excalibur.h文件就知道了 |
|
|
|
|
|
- UID
- 93933
- 性别
- 男
|
我仿照excalibur.h,生成了一个头文件,但是编译时总出错,版大能不能帮我看看啊 |
|
|
|
|
|
- UID
- 93933
- 性别
- 男
|
为了连接从外设,生成了一个自定义接口interface,avalon总线模块送出地址和数据信号。
从外设是由verilog文件设计的,当地址线指向某个控制寄存器时,cpu对其进行读写操作。
比如现在cpu要对地址为0x0080的interrupt寄存器写值,该怎么编程? |
|
|
|
|
|
- UID
- 93933
- 性别
- 男
|
excalibur.h
// The Memory Map
#define na_rom ((void *) 0x0000) // altera_avalon_onchip_memory
#define na_rom_base 0x0000
#define na_rom_end ((void *) 0x4000)
#define na_rom_size 0x4000
#define na_interface ((void *) 0x0000) // altera_avalon_user_defined_interface
#define na_interface_base 0x0000
#define na_interface_end ((void *) 0x8000)
#define na_interface_size 0x8000
#define na_cpu ((void *) 0x0000) // altera_nios
#define na_cpu_base 0x0000
#define na_ram ((void *) 0x8000) // altera_avalon_onchip_memory
#define na_ram_base 0x8000
#define na_ram_end ((void *) 0xc000)
#define na_ram_size 0x4000 …………
自己定义的头文件 interface.h
typedef volatile struct
{
int np_interfaceinterrupt; // 32bits r/w
int np_interfacechirpdata; // 16bits r/w
} np_interface;
enum
{
np_interfaceinterrupt_BUSRST_bit = 0,
np_interfaceinterrupt_SOF_bit = 1,
np_interfaceinterrupt_PSOF_bit = 2,
np_interfaceinterrupt_SUSP_bit = 3,
np_interfaceinterrupt_RSM_bit =4,
np_interfaceinterrupt_HS_STAT_bit = 5,
np_interfaceinterrupt_DMA_bit = 6,
np_interfaceinterrupt_RESERVED3_bit = 7, …………
程序example.c
#include "excalibur.h"
#include "interface.h"
int main(void)
{ na_interface->np_interfaceinterrupt=0x12345678;
na_interface->np_interfacechirpdata=0xabcd;
}
编译报错
cpu_sdk/src/example.c: In function `main':
cpu_sdk/src/example.c:13: warning: dereferencing `void *' pointer
cpu_sdk/src/example.c:13: request for member `np_interfaceinterrupt' in something not a structure or union
cpu_sdk/src/example.c:14: warning: dereferencing `void *' pointer
cpu_sdk/src/example.c:14: request for member `np_interfacechirpdata' in something not a structure or union |
|
|
|
|
|
- UID
- 93933
- 性别
- 男
|
仿照excalibur.h中pio的寄存器定义
// PIO Registers
typedef volatile struct
{
int np_piodata; // read/write, up to 32 bits
int np_piodirection; // write/readable, up to 32 bits
int np_piointerruptmask; // write/readable, up to 32 bits
int np_pioedgecapture; // read, up to 32 bits
} np_pio;
程序中的使用
na_pio->np_piodata=0x12345678;
不知道为什么自定义的就编译出错呢? |
|
|
|
|
|
- UID
- 91150
- 性别
- 男
|
你的excalibur.h文件有问题
na_interface 应该定义为((np_interface *) 0x0000), ROM,CPU和其他设备的基地址怎么都是“0000”?地址冲突。你自己修改了这个文件吧?尽量不要动这个文件
[此贴子已经被luoxf7于2004-12-29 17:03:20编辑过] |
|
|
|
|
|
- UID
- 100619
- 性别
- 男
|
|
|
|
|
|
- UID
- 93933
- 性别
- 男
|
请问寄存器控制的从外设,如何在软件中定义寄存器的地址?
使用自定义的从外设,是由映象到存储器的寄存器控制的,如何在软件编程时定义寄存器的地址?
比如说从外设中的一个寄存器interrupt,在Verilog中定义地址为0x0080。如何在编写c程序的时候定义呢? |
|
|
|
|
|
- UID
- 102101
- 性别
- 男
|
你应该在verilog中定义从外设寄存器地址信号address,根据寄存器个数定义address的位数,实际上SOPC中已为从外设确定了存储空间映射的基地址,上面的address相当于从基地址开始的偏移量。在软件中,你需要定义与寄存器一一对应的数据结构,如:typedef volatile struct
{ int ***;
int ***;
....}***;然后把excalibur.h中生成的该外设的地址指针赋给该数据结构,就可以直接访问了。 |
|
|
|
|
|
- UID
- 93933
- 性别
- 男
|
再问:
我已经将地址重新定义了
#define na_cpu ((void *) 0x0000) // altera_nios
#define na_cpu_base 0x0000
#define na_interface ((void *) 0x0000) // altera_avalon_user_defined_interface
#define na_interface_base 0x0000
#define na_interface_end ((void *) 0x0200)
#define na_interface_size 0x0200
#define na_uart ((np_uart *) 0x2000) // altera_avalon_uart
#define na_uart_base 0x2000
#define na_uart_irq 16
#define na_led_pio ((np_pio *) 0x2010) // altera_avalon_pio
#define na_led_pio_base 0x2010
#define na_timer ((np_timer *) 0x2020) // altera_avalon_timer
#define na_timer_base 0x2020
#define na_timer_irq 18
#define na_rom ((void *) 0x4000) // altera_avalon_onchip_memory
#define na_rom_base 0x4000
#define na_rom_end ((void *) 0x8000)
#define na_rom_size 0x4000
#define na_ram ((void *) 0x8000) // altera_avalon_onchip_memory
#define na_ram_base 0x8000
#define na_ram_end ((void *) 0x10000)
#define na_ram_size 0x8000
另外在reg_def.h中定义了数据结构体:
typedef volatile struct cntrl_reg
{
int D14_ADDRESS; //00H
int DUMMY_02; //02H
int D14_ENDPT_MAXPKTSIZE; //04H
int DUMMY_06; //06H
int D14_ENDPT_TYPE; //08H
} cntrl_reg;
然后在主程序中:
#include "excalibur.h"
#include "standard.h"
#include "reg_def.h"
# define cntrl_reg *((int *) (0x0000))
int main (void)
{
cntrl_reg.D14_ADDRESS=0x1234;
}
但是编译的时候仍然报错:
cpu_sdk/src/example.c: In function `main':
cpu_sdk/src/example.c:9: request for member `D14_ADDRESS' in something not a structure or union
请问到底要怎么定义才能直接对结构体中的单个寄存器赋值? |
|
|
|
|
|
- UID
- 93933
- 性别
- 男
|
还有io.h是不是只有NIOSII有啊,NIOS没有? |
|
|
|
|
|
- UID
- 111149
- 性别
- 男
|
|
|
|
|
|