Board logo

标题: 请问寄存器控制的从外设,如何在软件中定义寄存器的地址? [打印本页]

作者: luoxf7    时间: 2004-12-23 14:54     标题: 很简单啊

可以直接对地址操作,也可以使用指针。具体使用方法看看excalibur.h文件就知道了
作者: bluemelodyer    时间: 2004-12-23 16:16

我仿照excalibur.h,生成了一个头文件,但是编译时总出错,版大能不能帮我看看啊
作者: bluemelodyer    时间: 2004-12-23 16:23

为了连接从外设,生成了一个自定义接口interface,avalon总线模块送出地址和数据信号。
从外设是由verilog文件设计的,当地址线指向某个控制寄存器时,cpu对其进行读写操作。
比如现在cpu要对地址为0x0080的interrupt寄存器写值,该怎么编程?
作者: bluemelodyer    时间: 2004-12-23 16:38

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
作者: bluemelodyer    时间: 2004-12-23 16:41

仿照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;

不知道为什么自定义的就编译出错呢?
作者: luoxf7    时间: 2004-12-29 17:03     标题: 你的excalibur.h文件有问题

na_interface 应该定义为((np_interface *) 0x0000), ROM,CPU和其他设备的基地址怎么都是“0000”?地址冲突。你自己修改了这个文件吧?尽量不要动这个文件


[此贴子已经被luoxf7于2004-12-29 17:03:20编辑过]


作者: Simon.Embed    时间: 2005-1-11 12:47

我想你是不是在SOPC中没有分配好地址!
作者: bluemelodyer    时间: 2005-1-13 09:30     标题: 请问寄存器控制的从外设,如何在软件中定义寄存器的地址?

使用自定义的从外设,是由映象到存储器的寄存器控制的,如何在软件编程时定义寄存器的地址?
比如说从外设中的一个寄存器interrupt,在Verilog中定义地址为0x0080。如何在编写c程序的时候定义呢?
作者: cyanchen    时间: 2005-1-13 09:30

你应该在verilog中定义从外设寄存器地址信号address,根据寄存器个数定义address的位数,实际上SOPC中已为从外设确定了存储空间映射的基地址,上面的address相当于从基地址开始的偏移量。在软件中,你需要定义与寄存器一一对应的数据结构,如:typedef volatile struct
{ int ***;
int ***;
....}***;然后把excalibur.h中生成的该外设的地址指针赋给该数据结构,就可以直接访问了。
作者: bluemelodyer    时间: 2005-4-19 10:48

再问:
我已经将地址重新定义了
#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

请问到底要怎么定义才能直接对结构体中的单个寄存器赋值?
作者: bluemelodyer    时间: 2005-4-20 11:11

还有io.h是不是只有NIOSII有啊,NIOS没有?
作者: yaozy    时间: 2005-5-9 14:26

好呀。。给我




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0