CrazyBingo

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

0
阅读(2611)

本文意不在于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 ,现在重新拿起,发现不懂的越来越多

Baidu
map