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

发布者:TranquilGaze最新更新时间:2015-08-20 来源: eefocus关键字:Arm2440  Nand  flash  启动模式 手机看文章 扫描二维码
随时随地手机看文章
断断续续的研究arm也有2个月了,现在才感觉理解了arm在Nand flash模式下的启动过程,现在来这里记录下来以表达我无比喜悦的心情。闲话少说,趁着还没有忘记学习过程中的感受,直接进入正题。

大家都知道,arm在Nand flash启动模式下启动时系统会将Nand flash中的前4KB代码拷贝到SRAM(也就是Steppingstone中),由SRAM配置中断向量表和完成Nand flash访问的必要初始化,然后将Nand flash中的全部程序代码拷贝到SDRAM中,最后由SRAM跳转到SDRAM,然后程序就正常执行了,这一过程看上去很简单,但是真正理解这一过程还是不简单的,尽管这样,还是想告诉大家仔细理解还是比较容易理解这个过程的。如果您是ADS用户,你省去了很多麻烦,但我不确定你省去的这些麻烦是否值得,这里介绍的是一种麻烦的方式,linux下的led程序。

代码Head.s

  1. .extern main  
  2. .text  
  3. .global _start  
  4. _start:  
  5.     b reset  
  6.   
  7. reset:  
  8.     ldr sp,=4096  
  9.     bl disable_watch_dog  
  10.     bl clock_init  
  11.     bl memsetup  
  12.     bl copy_steppingstone_to_sdram  
  13.     ldr pc,=on_sdram  
  14.   
  15. on_sdram:  
  16.     msr cpsr_c,#0xdf  
  17.     ldr sp,=0x34000000  
  18.     ldr lr,=halt_loop  
  19.     ldr pc,=Main  
  20.   
  21. halt_loop:  
  22.     b halt_loop  

 

我认为,最需要理解的就是这段代码了。先简单的解释下这段代码。

(1)由于arm执行reset之后pc会被清零,也就是reset中断的中断入口地址,因此,第一条指令就是b reset,跳转到reset中断处理函数。

(2)由于这里硬件配置都是C语言来完成的,而且我们的初始代码比较小,完全不会超出4KB,因此可以在SRAM使用堆栈,故将SP设置为4096,以提供C运行环境

(3)接下来的3个bl分别完成了关闭看门够定时器,配置时钟信号和存储器配置的工作,第四个bl是将SRAM的4KB空间内的代码拷贝到了SDRAM中。

(4)接下来的ldr句将pc赋值为on_sdram的地址,实现了从SRAM到SDRAM的跳转(下面会讲为什么)

(5)on_sdram中切换到了了系统模式然后分配了系统模式堆栈,将链接寄存器设置为halt_loop然后就跳转到了SDRAM中的Main

上面的解释只是大体上说明了代码的意思,但是初学者总会有个疑问就是为什么ldr pc,=on_sdram就实现了从SRAM到SDRAM的跳转呢?我被这个问题困扰了很长时间,到今天才想明白了这个问题,问题的关键就是相对跳转和绝对跳转的问题。为了说明这个问题我先解释一下bl指令跟ldr指令在执行过程中的区别。

B指令是相对跳转指令,B 指令是最简单的跳转指令。一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行。注意存储在跳转指令中的实际值是相对当前PC 值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(前后32MB 的地址空间),同样的,BL、BX都是相对跳转。

LDR伪指令是将第二操作直接赋值给第一操作数,当执行ldr pc,=Main时是将Main的绝对地址赋值给了PC。

好了,知道这两个指令的区别之后我们来看代码是如何实现的从SRAM到SDRAM的跳转,首先需要指出,2440的开发板有SRAM和SDRAM,SRAM是从地址0x00000000开始的4KB内存空间,SDRAM是从0x30000000开始的64M空间。

无论用ADS编译还是用arm-linux-gcc编译都会将代码链接到0x30000000以后(也就是SDRAM中),ADS用户可以通过查看ADS的工程配置,其中有项配置是RO起始地址是0x30000000,linux用户在链接时需要用-T指定代码的其实地址为0x30000000。

根据编译原理,在链接阶段程序中函数的地址就已经确定了,也就是说函数的实际地址都在0x30000000之后,而程序的入口函数也就是这里的_start的地址就是0x300000000,其他函数都会大于这个数。

但是由于arm上电后系统会将Nand flash的前4KB代码拷贝到SRAM中,也就是_start函数开始的4KB指令将被拷贝到SRAM中执行,根据上例,在0x00000000处执行的指令就是“b reset”,由于b是相对跳转,是在当前pc值的基础上加减某个数而跳转到将要执行的代码处,因此,pc加减该数之后将到达reset函数的位置,故reset函数不能写到4KB之外的空间中,否则arm的启动将会失败,同样的,接下来的几个bl都是执行的相对跳转,所以都相对当前pc进行的跳转,由于Nand flash总共只有64M的空间,所以相对跳转是不可能会跳转到SDRAM的,因为跳转到SDRAM至少要发生0x30000000的跳转,而这个相对位移远远大于64M。

而ldr pc,=Main是将Main函数的实际地址赋值给pc,而Main的实际地址是在0x30000000之后,这样,就从SRAM跳转到了SDRAM。

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

代码Init.s
  1. #include "2440addr.h"  
  2.   
  3. void disable_watch_dog(void);  
  4. void clock_init(void);  
  5. void memsetup(void);  
  6. void copy_steppingstone_to_sdram(void);  
  7. void inituart(void);  
  8.   
  9. void disable_watch_dog(void)  
  10. {  
  11.     rWTCON = 0;  
  12. }  
  13.   
  14. void clock_init(void)  
  15. {  
  16.     rCLKDIVN  = 0x03;  
  17.   
  18.     /*  
  19.      *如果HDIVN非0,CPU的总线模式应该从  
  20.      *“fast bus mode”变为“asynchronous   
  21.      *bus mode”  
  22.      */  
  23.     __asm__(  
  24.             "mrc    p15, 0, r1, c1, c0, 0 "  
  25.             "orr    r1, r1, #0xc0000000 "  
  26.             "mcr    p15, 0, r1, c1, c0, 0 "  
  27.            );  
  28.   
  29.     rMPLLCON = (92<<12)|(1<<4)|(2);  
  30.     //rMPLLCON =  ((0x5c<<12)|(0x01<<4)|(0x02));  
  31. }  
  32.   
  33. void memsetup(void)  
  34. {  
  35.     volatile unsigned long *p = (volatile unsigned long *)0x48000000;  
  36.   
  37.     /* 这个函数之所以这样赋值,而不是像前面的实验(比如mmu实验)那样将配置值  
  38.      * 写在数组中,是因为要生成”位置无关的代码”,使得这个函数可以在被复制到  
  39.      * SDRAM之前就可以在steppingstone中运行  
  40.      */  
  41.     /* 存储控制器13个寄存器的值 */  
  42.     p[0] = 0x22011110;     //BWSCON  
  43.     p[1] = 0x00000700;     //BANKCON0  
  44.     p[2] = 0x00000700;     //BANKCON1  
  45.     p[3] = 0x00000700;     //BANKCON2  
  46.     p[4] = 0x00000700;     //BANKCON3    
  47.     p[5] = 0x00000700;     //BANKCON4  
  48.     p[6] = 0x00000700;     //BANKCON5  
  49.     p[7] = 0x00018005;     //BANKCON6  
  50.     p[8] = 0x00018005;     //BANKCON7  
  51.   
  52.     /* REFRESH,  
  53.      * HCLK=12MHz:  0x008C07A3,  
  54.      * HCLK=100MHz: 0x008C04F4  
  55.      */   
  56.     p[9]  = 0x008C04F4;  
  57.     p[10] = 0x000000B1;     //BANKSIZE  
  58.     p[11] = 0x00000030;     //MRSRB6  
  59.     p[12] = 0x00000030;     //MRSRB7  
  60. }  
  61.   
  62. void copy_steppingstone_to_sdram(void)  
  63. {  
  64.     unsigned int *pdwSrc  = (unsigned int *)0;  
  65.     unsigned int *pdwDest = (unsigned int *)0x30000000;  
  66.   
  67.     while (pdwSrc < (unsigned int *)4096)  
  68.     {  
  69.         *pdwDest = *pdwSrc;  
  70.         pdwDest++;  
  71.         pdwSrc++;  
  72.     }  
  73. }  
注意:由于我们的代码比较小,远小于4KB,因此arm启动时自动拷贝到SRAM中的4KB代码包含我们的全部代码,因此copy操作我是将stepingstone中的4KB代码拷贝到了SDRAM中,在实际应用中代码多数是超过4KB,因此copy函数应该是将Nand flash中的全部代码拷贝到SDRAM,这样才能成功运行ARM。

 

代码Main.c:

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

链接文件led.lds如下:
  1. SECTIONS  
  2. {  
  3.     . = 0x30000000;  
  4.     .text : {*(.text)}  
  5.     .rodata ALIGN(4) : {*(.rodata)}  
  6.     .data ALIGN(4) : {*(.data)}  
  7.     .bss ALIGN(4) : {*(.bss) *(COMMON)}  
  8. }  

makefile如下:
  1. objects:=Head.o Init.o Main.o  
  2.   
  3. led.bin : $(objects)  
  4.     arm-linux-ld -Tled.lds -nostdlib -o led_elf $^  
  5.     arm-linux-objcopy -O binary -S led_elf $@  
  6.     arm-linux-objdump -D -m arm led_elf > led.dis  
  7.   
  8. %.o:%.c  
  9.     arm-linux-gcc -Wall -O2 -c -o $@ $<  
  10. %.o:%.s  
  11.     arm-linux-gcc -Wall -O2 -c -o $@ $<;  
  12.   
  13. .PYTHON:clean  
  14. clean:  
  15.     rm -f led.bin led_elf led.dis *.o  

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

 

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

关键字:Arm2440  Nand  flash  启动模式 引用地址:Arm2440——Nand flash启动模式详解(LED程序为例)

上一篇:Linux内核的Nand驱动流程分析
下一篇:S3C6410启动模式介绍

推荐阅读最新更新时间:2024-03-16 14:29

半导体人才流失中国,三星呼吁韩国政府帮忙
  根据韩国英文媒体 《The Korea Times》 的报导, 三星 副总裁权五铉 (Kwon Oh-hyun) 日前就像韩国政府喊话,要韩国政府给予半导体产业更多的支持,以解决人才荒的问题。下面就随半导体小编一起来了解一下相关内容吧。   报导中指出,目前是 三星 副总裁,也是领导 三星 显示器部门的权五铉,日前在一项公开演讲中指出,韩国的半导体产业自认为有其竞争的实力。 不过,却面临当当前半导体人才不足的问题。 权五铉进一步指出,半导体产业是第 4 次工业革命的重要基础,因此希望韩国政府能藉由科技培训的管道,持续为半导体与设备产业供应需要的人才。   至于,南韩目前面临半导体人才缺少的原因,权五铉表示,最主要是来自相关人
[半导体设计/制造]
STM32开发笔记38: 单片机内部Flash的读写
单片机型号:STM32F070F6P6 本文介绍应用C语言进行单片机内部Flash的读写技巧,将从查看文档开始,到最终完成完整的程序。 单片机型号:STM32F070F6P6 步骤如下: 1、查看文档《STM32F030x4/x6/x8/xC and STM32F070x6/xB advanced ARM®-based 32-bit MCUs》确认其Flash的内部结构。 2、查看文档确认STM32F070F6P6内部存储器地址分配。从下表中得到的主要信息是Main Flash memory的起始地址是0x08000000,长度是32KB,到0x08017FFF结束(结束值可不关心)。 3、继续
[单片机]
STM32开发笔记38: 单片机内部<font color='red'>Flash</font>的读写
东芝在闪存峰会上展示最新NAND和存储产品
东京—东芝公司 (TOKYO:6502)今天宣布,该公司在闪存峰会(Flash Memory Summit)上展示其最新的NAND闪存和存储产品。闪存峰会是全球最大的闪存讨论会,于8月5至7日在美国加州圣塔克拉拉市的圣塔克拉拉会议中心(Santa Clara Convention Center)举行。 闪存峰会的展览环节在会议的最后两天8月6日和7日举行,东芝在504号展位布展。 主要展品 企业级固态硬盘(eSSD): 企业级读密集型SSD PX03SN/HK3R系列 应用于服务器的高读取率IOPS的SSD PX03SN系列展示 消费级固态硬盘(cSSD): 高端消费级SSD HG6系列 采用TLC NAND闪存的消费级SSD
[嵌入式]
关于STM32像EPROM一样可以单字节写内部Flash的理解
都有说STM32的内部Flash可以像EPROM一样操作,单个字节单个字节的写入。根据本人的拙见,其实也就仅仅是“像”而已。原因有以下几点: 1.首先Flash这种东西,其写入数据的原理是便是将1变成0,所以你的某地址Flash一旦已经写过数据而且不为0,则当你再次需要向该地址写数据时,必须要先擦除,即把该地址先全部变成1,否则你将数据写入该地址后,基本上该地址里面的值已经不是你写入的值了。 2.STM32对内部Flash有页(1k或者2K)擦除指令,也就是STM32不能单独对某一个或者某几个字节进行擦除。而擦除操作并不需要大量内存。 3.如果要像EPROM一样操作Flash,其原理是先把该一页里面的数据全部读到一个b
[单片机]
IC Insights:存储器市场前景好,DRAM、NAND报价调升两倍
    芯片成长预估调升两倍。下面就随嵌入式小编一起来了解一下相关内容吧,   IC Insights 最新预期 2017 年全球芯片产值将成长 11%,两倍高于原先估计的 5%。IC Insights 解释原因为  DRAM 、NAND 快闪 存储器 展望明显上修。   IC Insights 现在预期今年  DRAM  销售额有望跳增 39%、NAND 快闪 存储器 有望成长 25%,随着报价走扬,未来两者都还有进一步上修的可能。   IC Insights 指出对照去年,DRAM 平均售价预估将大幅调涨 37%,NAND 快闪存储器今年也有 22% 的涨价空间。   DRAM 价格走扬,是因为供需有明显落差。据 IC In
[网络通信]
东芝停工 NAND价格恐有所波动
全球第二大储存型快闪记忆体(NAND Flash)制造商东芝半导体(TMC)旗下五座工厂日前因地震停电,导致营运中断,虽然东芝尚未公布损害情形,但日系外资与业界都研判受创不轻,预料将扭转原本市场观望心态,使得备货需求陆续进场,促使报价连跌逾八季的NAND Flash价格止跌,下半年出现反弹契机。 台湾并无生产NAND晶片的厂商,但包括群联、威刚、创见、宇瞻、十铨等记忆体相关厂商都有NAND相关应用业务,随着NAND市况有望出现转机,相关台厂也将沾光,尤其先前已宣布趁前波NAND低价大举备货的群联,受惠更大。 日系外资认为,东芝半导体在日本三重县四日市的NY2、Y3、Y4、Y5 和Y6共五座工厂生产线,上周因强震而中断
[嵌入式]
东芝停工 <font color='red'>NAND</font>价格恐有所波动
U-boot-2014.04移植到MINI2440(9) nor flash启动nand flash 启动
在mini2440上,nor flash启动和nand flash启动可以满足不同的需要,这里进行移植,nor的启动移植比较简单,因为不需要进行代码的重定向,nand的启动相对复杂,这里先从nor开始,进入正题: 一.修改支持nor flash启动 第一步:修改mini2440.h 在第27行: #define CONFIG_SYS_TEXT_BASE 0x30008000 这里将这个值改为0x0,因为从nor flash启动,直接在0地址执行就可以,不需要再拷贝到sdram中。修改为: #define CONFIG_SYS_TEXT_BASE 0x0
[单片机]
SD NAND在STM32应用上的保姆级教程
SD NAND与正点原子精英板的连接 由于正点原子精英板没有SD NAND接口,只有TF卡接口,所以SD NAND需要用到转接板来连接。 SD NAND正常运行现象 本次实验的程序是正点原子的SD卡实验例程,先用读卡器把SD NAND接到电脑上,并复制一个文件进去,再插到开发板上; 用送的数据线连接USB UART接口,下载好程序,打开电脑上的串口助手,按下KEY0,即可读取到数据, 具体实验步骤和现象可以看例程文件夹中的readme, 另外LED-DS0闪烁也表示SD NAND芯片在正常运行, SD NAND芯片用的是MK-米客方德的工业级芯片MKDV1GIL-AS;MK-米客方德家还有其他各种型号的SD NAN
[单片机]
SD <font color='red'>NAND</font>在STM32应用上的保姆级教程
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved