《tiny6410裸机程序》第六章:myled通过usb下载至nandflash不能运行
来源:互联网 发布:淘宝店铺装修定时发布 编辑:程序博客网 时间:2024/06/08 01:30
====================================================================================================================================
一、前期准备
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
preserve8IMPORTmain; 声明C程序中的Main()函数AREAStart,CODE,READONLY; 声明代码段StartENTRY; 标识程序入口CODE32; 声明32位ARM指令ldr r0, =0x70000000 orr r0, r0, #0x13mcr p15,0,r0,c15,c2,4 ;256M(0x70000 0000~0x7FFF FFFF)ARM协处理器相关 告诉协处理器外设寄存器的基地址和地址空间 ldr r0, =0x7E004000mov r1, #0str r1, [r0] ;关闭看门狗ldr sp, =8*1024 ;设置C堆栈bl main2.led.c
#define LED1_ON ~(1<<4) //1111 1111 1111 1111 1111 1111 1110 1111 GPKDAT31~GPKDAT0#define LED2_ON ~(1<<5)#define LED3_ON ~(1<<6)#define LED4_ON ~(1<<7)#define LED1_OFF (1<<4) //0000 0000 0000 0000 0000 0000 0001 0000#define LED2_OFF (1<<5)#define LED3_OFF (1<<6)#define LED4_OFF (1<<7)#define LEDALL_OFF (0xf<<4) //0000 0000 0000 0000 0000 0000 1111 0000typedef unsigned longu32;typedef unsigned shortu16;typedef unsigned charu8;#define rGPIOKCON0 (*(volatile u32 *)0x7f008800)#define rGPIOKDAT (*(volatile u32 *)0x7f008808)int main(void){ u32 uConValue; u32 i; uConValue = rGPIOKCON0; uConValue &= ~(0xffff<<16); //0000 0000 0000 0000 1111 1111 1111 1111 GPKCON7~GPKCON0 uConValue |= 0x1111<<16; //0001 0001 0001 0001 0000 0000 0000 0000 //0001 0001 0001 0001 1111 1111 1111 1111 rGPIOKCON0 = uConValue; rGPIOKDAT |= LEDALL_OFF; while(1){ rGPIOKDAT &= LED1_ON; for(i=0;i<3000*100;i++); rGPIOKDAT |= LEDALL_OFF; rGPIOKDAT &= LED2_ON; for(i=0;i<3000*100;i++); rGPIOKDAT |= LEDALL_OFF; rGPIOKDAT &= LED3_ON; for(i=0;i<3000*100;i++); rGPIOKDAT |= LEDALL_OFF; rGPIOKDAT &= LED4_ON; for(i=0;i<3000*100;i++); rGPIOKDAT |= LEDALL_OFF; }}3.以下是基于Window下armcc编译器的Makefile
all:armasm -o Startup.o Startup.s --debug --keep --cpu=ARM1176JZF-Sarmcc -c led.o led.c --debug --cpu=ARM1176JZF-S -O0armlink -o myled.axf Startup.o led.o --ro_base=0x50200000 --rw_base=0x50203000 --first=Startup.o(start) --entry=0x50200000fromelf -o myled.bin --bin myled.axfclean:del *.o *.axf *.bin
====================================================================================================================================
补充:
u-boot-mini6410/cpu/s3c64xx/start.S
/* * we do sys-critical inits only at reboot, * not when booting from ram! */cpu_init_crit:/* * flush v4 I/D caches */movr0, #0mcrp15, 0, r0, c7, c7, 0/* flush v3/v4 cache */mcrp15, 0, r0, c8, c7, 0/* flush v4 TLB *//* * disable MMU stuff and caches */mrcp15, 0, r0, c1, c0, 0bicr0, r0, #0x00002300@ clear bits 13, 9:8 (--V- --RS)bicr0, r0, #0x00000087@ clear bits 7, 2:0 (B--- -CAM)orrr0, r0, #0x00000002@ set bit 2 (A) Alignorrr0, r0, #0x00001000@ set bit 12 (I) I-Cachemcrp15, 0, r0, c1, c0, 0/* Peri port setup */ldrr0, =0x70000000orrr0, r0, #0x13 mcrp15,0,r0,c15,c2,4 @ 256M(0x70000000-0x7fffffff)
分析:该程序烧录至nand flash或nor flash时,其实并没有在连接器指定的0x50200000处的SDRAM中运行;而是在0x00000000处运行,整个代码也体现了PIC、ARM位置无关代码设计的思想。
- 《tiny6410裸机程序》第六章:myled通过usb下载至nandflash不能运行
- 《tiny6410裸机程序》第六章:myled通过usb下载至nandflash不能运行
- 《tiny6410裸机程序》第五章:汇编与C混合编程-LED跑马灯最终说明、myled再次精简
- 《tiny6410裸机程序》第九章:tiny6410按键控制蜂鸣器程序
- nandflash裸机程序分析
- 使用 NOR Flash 中的supervivi 下载裸机程序到NandFlash
- 使用 NOR Flash 中的supervivi 下载裸机程序到NandFlash
- 使用 NOR Flash 中的supervivi 下载裸机程序到NandFlash
- 《tiny6410裸机程序》第三章:基础汇编test1
- 《tiny6410裸机程序》第四章:汇编与C混合编程
- 《tiny6410裸机程序》第七章:S3C6410外部中断简介
- 《tiny6410裸机程序》第八章:S3C6410外部中断控制寄存器
- 《tiny6410裸机程序》第八章:S3C6410总中断控制寄存器
- tiny6410的纯裸机程序bin文件大于8K,你是怎么下载到Flash运行的。问题已解决
- mini2440裸机试炼之--myled
- tiny6410裸机实验第0章--------------开发环境的搭建(USB转串口)
- tiny6410 裸机程序烧机简单介绍
- tiny6410的led裸机程序源代码
- 动态链接库(DLL)--MFCDLL
- 窥探
- clearButton.setOnClickListener(this);
- double float类型判断无效值
- mysql 多表 update sql语句总结
- 《tiny6410裸机程序》第六章:myled通过usb下载至nandflash不能运行
- windows编程的一些基本概念-20121210
- AIX下系统sed使用详解
- 使用 Socket 通信实现 FTP 客户端程序
- 歌星大奖赛修订【大神们没有解答的,小弟只好慢慢倒腾出来了】
- Ubuntu 12.04 更改grub启动顺序的方法
- execute immediate 动态传入表名
- 在Fedora17上安装BCM4312无线网卡
- 监听的动态注册和静态注册