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

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

一、前期准备

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

[plain]  view plain copy
  1. preserve8  
  2. IMPORT  main        ; 声明C程序中的Main()函数  
  3. AREA    Start,CODE,READONLY ; 声明代码段Start  
  4. ENTRY               ; 标识程序入口  
  5. CODE32              ; 声明32位ARM指令  
  6.   
  7. ldr r0, =0x70000000        
  8. orr r0, r0, #0x13  
  9. mcr p15,0,r0,c15,c2,4     ;256M(0x70000 0000~0x7FFF FFFF)ARM协处理器相关 告诉协处理器外设寄存器的基地址和地址空间  
  10.    
  11. ldr r0, =0x7E004000  
  12. mov r1, #0  
  13. str r1, [r0]              ;关闭看门狗  
  14.   
  15. ldr sp, =8*1024           ;设置C堆栈  
  16. bl main  
2.led.c

[cpp]  view plain copy
  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.   
  6. #define LED1_OFF   (1<<4) //0000 0000 0000 0000 0000 0000 0001 0000  
  7. #define LED2_OFF   (1<<5)  
  8. #define LED3_OFF   (1<<6)  
  9. #define LED4_OFF   (1<<7)  
  10. #define LEDALL_OFF (0xf<<4) //0000 0000 0000 0000 0000 0000 1111 0000  
  11.   
  12. typedef unsigned long       u32;  
  13. typedef unsigned short      u16;  
  14. typedef unsigned char       u8;  
  15.   
  16. #define rGPIOKCON0 (*(volatile u32 *)0x7f008800)  
  17. #define rGPIOKDAT (*(volatile u32 *)0x7f008808)  
  18.   
  19. int main(void){   
  20.   u32 uConValue;  
  21.   u32 i;  
  22.   uConValue = rGPIOKCON0;  
  23.   uConValue &= ~(0xffff<<16); //0000 0000 0000 0000 1111 1111 1111 1111 GPKCON7~GPKCON0  
  24.   uConValue |= 0x1111<<16;    //0001 0001 0001 0001 0000 0000 0000 0000 //0001 0001 0001 0001 1111 1111 1111 1111  
  25.   rGPIOKCON0 = uConValue;  
  26.   rGPIOKDAT |= LEDALL_OFF;  
  27.   while(1){        
  28.     rGPIOKDAT &= LED1_ON;  
  29.     for(i=0;i<3000*100;i++);  
  30.     rGPIOKDAT |= LEDALL_OFF;  
  31.   
  32.     rGPIOKDAT &= LED2_ON;  
  33.     for(i=0;i<3000*100;i++);  
  34.     rGPIOKDAT |= LEDALL_OFF;  
  35.   
  36.     rGPIOKDAT &= LED3_ON;  
  37.     for(i=0;i<3000*100;i++);  
  38.     rGPIOKDAT |= LEDALL_OFF;  
  39.   
  40.     rGPIOKDAT &= LED4_ON;  
  41.     for(i=0;i<3000*100;i++);  
  42.     rGPIOKDAT |= LEDALL_OFF;  
  43.   }  
  44. }  
3.以下是基于Window下armcc编译器的Makefile

[plain]  view plain copy
  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

[plain]  view plain copy
  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.     /*  
  14.      * disable MMU stuff and caches  
  15.      */  
  16.     mrc p15, 0, r0, c1, c0, 0  
  17.     bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)  
  18.     bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)  
  19.     orr r0, r0, #0x00000002 @ set bit 2 (A) Align  
  20.     orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache  
  21.     mcr p15, 0, r0, c1, c0, 0  
  22.   
  23.     /* Peri port setup */  
  24.     ldr r0, =0x70000000  
  25.     orr r0, r0, #0x13  
  26.         mcr p15,0,r0,c15,c2,4       @ 256M(0x70000000-0x7fffffff)  

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值