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,那个时候这样写的
真搞不懂有什么区别,如果谁知道,麻烦告诉我
(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) 编辑 收藏 举报