IOWR 写数据总结出郁闷的问题

本文意不在于LED的点亮操作,而在于说数据操作上的写法

(1)

#define    LED_DATA    *(volatile unsigned char*)  LED_PIO_BASE

。。。

int main()
{
    unsigned char table[]={0x00,0x01,0x02,0x03}; //2个LED
    unsigned char i;
    while(1)
    {
        for(i=0;i<4;i++)
        {
            LED_DATA = table[i];

           //printf(“why?”);
            Delay_Ms(500);
        }
    }
    return 0;
}

这是第一种写法,这样写,不能实现2个LED的闪烁,除非后面加一句printf(“”);

单步调试,发现,只有等执行了printf(“”)之后,前面的操作才有效

因此,发现,常规写法,不写printf(“”),程序能执行但是没效果

(2)

int main()
{
    unsigned char table[]={0x00,0x01,0x02,0x03};
    unsigned char i;
    while(1)
    {
        for(i=0;i<4;i++)
        {
            IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,table[i]);
            Delay_Ms(500);
        }
    }
    return 0;
}

第二种写法,用最最原始的 ALTERA IOWR操作来实现,程序很完美的执行了LED的闪烁

 

(3)

#define    LED_DATA(x)    IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,x);

int main()
{
    unsigned char table[]={0x00,0x01,0x02,0x03};
    unsigned char i;
    while(1)
    {
        for(i=0;i<4;i++)
        {
            LED_DATA(table[i]);

            Delay_Ms(500);
        }
    }
    return 0;
}

第三种写法,通过对IOWR的定义,这样只是在写法上更方便的,程序也能出来效果

 

致此,虽然我知道了怎么实现IO 的操作,但是仍然搞不懂第一种为什么不行,“知其不然也不知道所以不然!!”

曾记得,一年前学NIOS II 的时候玩过LCD,那个时候这样写的

image

真搞不懂有什么区别,如果谁知道,麻烦告诉我

 

(1)#define    LED_DATA    *(volatile unsigned char*)  LED_PIO_BASE这样定义 后面LED_DATA = 0x01;为什么没效果

(2)第一种,为什么后面加了printf()就会出来效果??

(3)NIOS II处理器输入50MHz还是输入100MHz,对

"priv/alt_busy_sleep.h" 里面的alt_busy_sleep(1)有什么影响吗??
"unistd.h" 里面的sleep(1)有什么影响吗??

输入时钟提高  是不是仅仅是 CUP的DMIPS提高了 (Nios II /f - 1.105, Nios II /s - 0.518, Nios II /e - 0.107)

(4)SDRAM 的偏移=。。。。。是不是 输入CLK变化,他的时钟偏移量就变化了,最终为了是的SDRAM Control控制器信号和SD_CLK同时到达SDRAM,这个不怎么会算

(5)一般的,大家写IOWR的时候,用哪种写法的??

(6)要精准的延时,是不是必须定时器,但是定时器又会根据CPU输入时钟的变化而变化吧。。。

(7)主函数有2种写法:

  <1>int main(){}

  <2>int main (void) __attribute__ ((weak, alias ("alt_main")));
    int alt_ main(){}

   具体什么区别呢??,一般用哪种啊??

(8)NIOS II 9.1 SP1 FLASH Programmer Download的是elf和sof(为什么是sof而不是pof),而且9.1SP1 貌似不能通过FLASH 固化FLASH,是真的吗?

(9)希望看到的呢,能给我更多的建议援助,我是一个轻浮的人,但不甘心也不想放弃,一年前学过NIOS II ,现在重新拿起,发现不懂的越来越多

 

 

看我Master给我的程序 我昏过去了,他竟然这样也可以

//*****************************************************
//寄存器映射及控制---两种方法均OK!
//*****************************************************
//方法1:---32位,地址偏移为4
/**/
#define     SPI_RST     ( *(volatile unsigned int *)(AT45DB041D_ADDR+0x00) )
#define     SPI_WP      ( *(volatile unsigned int *)(AT45DB041D_ADDR+0x04) )
#define     SPI_CS      ( *(volatile unsigned int *)(AT45DB041D_ADDR+0x08) )
#define     SPI_SCK     ( *(volatile unsigned int *)(AT45DB041D_ADDR+0x0C) )
#define     SPI_SI      ( *(volatile unsigned int *)(AT45DB041D_ADDR+0x10) )//---data  to  AT45DB041D
#define     SPI_SO      ( *(volatile unsigned int *)(AT45DB041D_ADDR+0x14) )//---data from AT45DB041D

/*
//方法2:
typedef struct

alt_u32 SPI_RST : 32;
alt_u32 SPI_WP  : 32;
alt_u32 SPI_CS  : 32;
alt_u32 SPI_SCK : 32;
alt_u32 SPI_SI  : 32;
alt_u32 SPI_SO  : 32;
}AT45DB_T;

#define     AT45DB      (*(AT45DB_T *)(AT45DB041D_ADDR) )

#define     SPI_RST     AT45DB.SPI_RST
#define     SPI_WP      AT45DB.SPI_WP
#define     SPI_CS      AT45DB.SPI_CS
#define     SPI_SCK     AT45DB.SPI_SCK
#define     SPI_SI      AT45DB.SPI_SI
#define     SPI_SO      AT45DB.SPI_SO
*/

希望看到的呢,能给我更多的建议援助,我是一个轻浮的人,但不甘心也不想放弃,一年前学过NIOS II ,现在重新拿起,发现不懂的越来越多

 

已经在http://www.cnblogs.com/crazybingo/archive/2010/11/26/1889253.html解决问题

posted on 2010-11-26 14:17  CrazyBingo  阅读(4468)  评论(0编辑  收藏  举报

导航