《tiny6410裸机程序》第六章:myled通过usb下载至nandflash不能运行

  • Post author:
  • Post category:其他


====================================================================================================================================

一、前期准备

1.开发板必须在SD卡启动模式!

2.安装usb下载驱动,安装rs232 to usb驱动。

3.安装dns,并打开dns。

二、烧写

《tiny6410裸机程序》第五章:汇编与C混合编程-LED跑马灯最终说明、myled再次精简

bin至nandflash。

三、不能运行原因分析

1.之前文章分析的:

《micro2440开发》第七章:micro2440从NAND FLASH启动原理分析

因为nandflash上本身不能运行代码(因为它不像norflash是随机存储的),解决这个问题的方法是:硬件设计中选择从nandflash启动时、CPU自动会搬移nandflash前4KB至SRAM运行;其二,要访问nandflash,必须首先初始化nandflash控制器,解决方法是:上述4KB部分代码必须实现nandflash的初始化工作。

但是,本程序不存在问题;是因为本bin只有2KB<4KB,不存在代码搬移问题,也就没必要初始化nandflash控制器寄存器。

2.真正原因

ADS调试时MMU是关闭的,实际bin中MMU没有关闭。所以,加入LED相关GPIO地址映射代码即可。

四、解决方法

该bin的前4KB必须首先完成nandflash控制器寄存器的初始化功能;并且设置外设IO的基地址及地址空间、或关闭mmu和cache。

====================================================================================================================================

改编后程序(主要是在Startup.s中添加对CP15协处理器操作,设置外设IO的基地址和地址空间;因为6410的内存和IO空间是分开的):

1.Startup.s



  1. preserve8


  2. IMPORT  main        ; 声明C程序中的Main()函数

  3. AREA    Start,CODE,READONLY ; 声明代码段Start

  4. ENTRY               ; 标识程序入口

  5. CODE32              ; 声明32位ARM指令


  6. ldr r0, =0x70000000

  7. orr r0, r0, #0x13

  8. mcr p15,0,r0,c15,c2,4     ;256M(0x70000 0000~0x7FFF FFFF)ARM协处理器相关 告诉协处理器外设寄存器的基地址和地址空间


  9. ldr r0, =0x7E004000

  10. mov r1, #0

  11. str r1, [r0]              ;关闭看门狗


  12. ldr sp, =8*1024           ;设置C堆栈

  13. bl main


2.led.c



  1. #define LED1_ON   ~(1<<4)  //1111 1111 1111 1111 1111 1111 1110 1111  GPKDAT31~GPKDAT0





  2. #define LED2_ON   ~(1<<5)





  3. #define LED3_ON   ~(1<<6)





  4. #define LED4_ON   ~(1<<7)






  5. #define LED1_OFF   (1<<4) //0000 0000 0000 0000 0000 0000 0001 0000





  6. #define LED2_OFF   (1<<5)





  7. #define LED3_OFF   (1<<6)





  8. #define LED4_OFF   (1<<7)





  9. #define LEDALL_OFF (0xf<<4) //0000 0000 0000 0000 0000 0000 1111 0000






  10. typedef


    unsigned


    long


    u32;



  11. typedef


    unsigned


    short


    u16;



  12. typedef


    unsigned


    char


    u8;




  13. #define rGPIOKCON0 (*(volatile u32 *)0x7f008800)





  14. #define rGPIOKDAT (*(volatile u32 *)0x7f008808)






  15. int


    main(


    void


    ){


  16. u32 uConValue;

  17. u32 i;

  18. uConValue = rGPIOKCON0;

  19. uConValue &= ~(0xffff<<16);

    //0000 0000 0000 0000 1111 1111 1111 1111 GPKCON7~GPKCON0




  20. uConValue |= 0x1111<<16;

    //0001 0001 0001 0001 0000 0000 0000 0000 //0001 0001 0001 0001 1111 1111 1111 1111




  21. rGPIOKCON0 = uConValue;

  22. rGPIOKDAT |= LEDALL_OFF;


  23. while


    (1){


  24. rGPIOKDAT &= LED1_ON;


  25. for


    (i=0;i<3000*100;i++);


  26. rGPIOKDAT |= LEDALL_OFF;


  27. rGPIOKDAT &= LED2_ON;


  28. for


    (i=0;i<3000*100;i++);


  29. rGPIOKDAT |= LEDALL_OFF;


  30. rGPIOKDAT &= LED3_ON;


  31. for


    (i=0;i<3000*100;i++);


  32. rGPIOKDAT |= LEDALL_OFF;


  33. rGPIOKDAT &= LED4_ON;


  34. for


    (i=0;i<3000*100;i++);


  35. rGPIOKDAT |= LEDALL_OFF;

  36. }

  37. }


3.以下是基于Window下armcc编译器的Makefile



  1. all:


  2. armasm -o Startup.o Startup.s –debug –keep –cpu=ARM1176JZF-S

  3. armcc -c led.o led.c –debug –cpu=ARM1176JZF-S -O0

  4. armlink -o myled.axf Startup.o led.o –ro_base=0x50200000 –rw_base=0x50203000 –first=Startup.o(start) –entry=0x50200000

  5. fromelf -o myled.bin –bin myled.axf

  6. clean:

  7. del *.o *.axf *.bin

====================================================================================================================================

补充:

u-boot-mini6410/cpu/s3c64xx/start.S



  1. /*


  2. * we do sys-critical inits only at reboot,

  3. * not when booting from ram!

  4. */

  5. cpu_init_crit:

  6. /*

  7. * flush v4 I/D caches

  8. */

  9. mov r0, #0

  10. mcr p15, 0, r0, c7, c7, 0   /* flush v3/v4 cache */

  11. mcr p15, 0, r0, c8, c7, 0   /* flush v4 TLB */


  12. /*

  13. * disable MMU stuff and caches

  14. */

  15. mrc p15, 0, r0, c1, c0, 0

  16. bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (–V- –RS)

  17. bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B— -CAM)

  18. orr r0, r0, #0x00000002 @ set bit 2 (A) Align

  19. orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache

  20. mcr p15, 0, r0, c1, c0, 0


  21. /* Peri port setup */

  22. ldr r0, =0x70000000

  23. orr r0, r0, #0x13

  24. mcr p15,0,r0,c15,c2,4       @ 256M(0x70000000-0x7fffffff)

分析:该程序烧录至nand flash或nor flash时,其实并没有在连接器指定的0x50200000处的SDRAM中运行;而是在0x00000000处运行,整个代码也体现了PIC、

ARM位置无关代码设计

的思想。