微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Arm2440——Nand flash启动模式详解(LED程序为例)

Arm2440——Nand flash启动模式详解(LED程序为例)

时间:11-28 来源:互联网 点击:

一般人来讲,理解起来确实比较困难,而且受本人水平限制,很多地方只能说是只可意会不可言传,如果误导了大家请大家谅解。当然如果看到这里还不能理解arm的启动过程可以留言讨论这个问题。下面是相关的其他代码,我附在这里,2440addr.h没有贴出,由于我也是使用arm自带示例程序中的代码,而且代码有四千多行,多数地址是没有用到的。其他的代码如下

代码Init.s

  1. #include"2440addr.h"
  2. voiddisable_watch_dog(void);
  3. voidclock_init(void);
  4. voidmemsetup(void);
  5. voidcopy_steppingstone_to_sdram(void);
  6. voidinituart(void);
  7. voiddisable_watch_dog(void)
  8. {
  9. rWTCON=0;
  10. }
  11. voidclock_init(void)
  12. {
  13. rCLKdivN=0x03;
  14. /*
  15. *如果HdivN非0,CPU的总线模式应该从
  16. *“fastbusmode”变为“asynchronous
  17. *busmode”
  18. */
  19. __asm__(
  20. "mrcp15,0,r1,c1,c0,0"
  21. "orrr1,r1,#0xc0000000"
  22. "mcrp15,0,r1,c1,c0,0"
  23. );
  24. rMPLLCON=(92<12)|(1<4)|(2);
  25. //rMPLLCON=((0x5c<12)|(0x01<4)|(0x02));
  26. }
  27. voidmemsetup(void)
  28. {
  29. volatileunsignedlong*p=(volatileunsignedlong*)0x48000000;
  30. /*这个函数之所以这样赋值,而不是像前面的实验(比如mmu实验)那样将配置值
  31. *写在数组中,是因为要生成”位置无关的代码”,使得这个函数可以在被复制到
  32. *SDRAM之前就可以在steppingstone中运行
  33. */
  34. /*存储控制器13个寄存器的值*/
  35. p[0]=0x22011110;//BWSCON
  36. p[1]=0x00000700;//BANKCON0
  37. p[2]=0x00000700;//BANKCON1
  38. p[3]=0x00000700;//BANKCON2
  39. p[4]=0x00000700;//BANKCON3
  40. p[5]=0x00000700;//BANKCON4
  41. p[6]=0x00000700;//BANKCON5
  42. p[7]=0x00018005;//BANKCON6
  43. p[8]=0x00018005;//BANKCON7
  44. /*REFRESH,
  45. *HCLK=12MHz:0x008C07A3,
  46. *HCLK=100MHz:0x008C04F4
  47. */
  48. p[9]=0x008C04F4;
  49. p[10]=0x000000B1;//BANKSIZE
  50. p[11]=0x00000030;//MRSRB6
  51. p[12]=0x00000030;//MRSRB7
  52. }
  53. voidcopy_steppingstone_to_sdram(void)
  54. {
  55. unsignedint*pdwSrc=(unsignedint*)0;
  56. unsignedint*pdwDest=(unsignedint*)0x30000000;
  57. while(pdwSrc<(unsignedint*)4096)
  58. {
  59. *pdwDest=*pdwSrc;
  60. pdwDest++;
  61. pdwSrc++;
  62. }
  63. }

注意:由于我们的代码比较小,远小于4KB,因此arm启动时自动拷贝到SRAM中的4KB代码包含我们的全部代码,因此copy操作我是将stepingstone中的4KB代码拷贝到了SDRAM中,在实际应用中代码多数是超过4KB,因此copy函数应该是将Nand flash中的全部代码拷贝到SDRAM,这样才能成功运行ARM。

代码Main.c:

  1. #include"2440addr.h"
  2. voidDelay(inti)
  3. {
  4. intm,n,p;
  5. for(m=0;m!=i;++m)
  6. {
  7. for(n=0;n!=255;++n)
  8. {
  9. for(p=0;p!=255;++p)
  10. ;
  11. }
  12. }
  13. }
  14. voidMain()
  15. {
  16. intcount;
  17. intleds[4]={0x1c0,0x1a0,0x160,0xe0};
  18. rGPBCON=0x00155555;
  19. rGPBUP=rGPBUP&0xFF00;
  20. while(1)
  21. {
  22. for(count=0;count!=4;++count)
  23. {
  24. rGPBDAT=leds[count];
  25. if(count%2)
  26. rGPBDAT+=1;
  27. Delay(2);
  28. }
  29. }
  30. }


链接文件led.lds如下:

  1. SECTIONS
  2. {
  3. .=0x30000000;
  4. .text:{*(.text)}
  5. .rodataALIGN(4):{*(.rodata)}
  6. .dataALIGN(4):{*(.data)}
  7. .bssALIGN(4):{*(.bss)*(COMMON)}
  8. }


makefile如下:

  1. objects:=Head.oInit.oMain.o
  2. led.bin:$(objects)
  3. arm-linux-ld-Tled.lds-nostdlib-oled_elf$^
  4. arm-linux-objcopy-Obinary-Sled_elf$@
  5. arm-linux-objdump-D-marmled_elf>led.dis
  6. %.o:%.c
  7. arm-linux-gcc-Wall-O2-c-o$@$
  8. %.o:%.s
  9. arm-linux-gcc-Wall-O2-c-o$@$<;
  10. .PYTHON:clean
  11. clean:
  12. rm-fled.binled_elfled.dis*.o


如上除了2440addr.h之外就都全了,另外需要指出的是2440addr.h中引用了Option.h,为了简化代码,可以将这句可以注释掉,在我们这段代码中完全用不到该文件相关功能。否则需要自行修改makefile文件完成Option.h相关的编译和链接工作。

好了,又浪费了大家这么长的时间,这里就不多说了,有什么问题求高手指出来。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top