s3c2440学习之路-004 区分nand/nor 启动

发布者:黄金大花猫最新更新时间:2021-10-18 来源: eefocus关键字:s3c2440  nor  启动 手机看文章 扫描二维码
随时随地手机看文章

硬件平台:jz2440

软件平台:Ubuntu16.04 arm-linux-gcc-3.4.5

源码位置: https://github.com/lian494362816/C/tree/master/2440/005_leds/002


1.原理分析

1.1问题的由来

前面篇文章 https://blog.csdn.net/lian494362816/article/details/84642425 提到了SP的设置,但是当使用nand flash 和 nor flash启动时,2440内部的sram位置是不同的, SP的设置也不同。使用nor flash时,内部sram起始位置为0x40000000, 而使用nand flash时,内部sram起始位置为0x00000000。为了更好的使用,需要让代码区分nand 还是nor启动。总不能准备2份代码, 一份给nor使用,一份给nand使用吧。

在这里插入图片描述

在这里插入图片描述

1.2 解决方法

编程时,可以根据nor flash的特性和2440在使用nand flash启动时的特性来区分是nor 启动还是nand启动。


如果是nor 启动, 2440会直接从nor flash 去读指令,如果是nand 启动,2440会把nand 前4K的内容拷贝到sram里面,从内部的sram去读取指令。


nor flash是可以随意读取数据的,但是如果需要往nor flash里面写数据,则需要先发送一些特殊的命令才可以,所以说nor flash是可以随意读但是不可以随意写。但是内部的sram是可以随意读写的。


2主要流程

根据前面提到的2点,可以在程序一开始往0地址写一个数据(特殊一点即可,这里写0),再读取0地址的数据。


如果是nor 启动,应该会写失败(写必须先发特定命令),所以再次读取0地址的数据不等于之前所写的数据。


如果是nand启动,因为程序是在内部的sram运行(2440自动把nand 数据拷贝到sram),所以写是会成功的,再次读取0地址的数据就等于之前所写的数据。

在这里插入图片描述

3源码

start.s


.global _start

_start:


    /* aoto switch nand or nor flash */

    /* write 0 to address[0] and read it

     * if address[0] is equal 0, it is nand

     * because nand can wirte easy, but nor need send

     * write-commond before wirte data, so write 0 to

     * nor address[0] will fail, and get nor address[0]

     * data is not equal 0

     */

    mov r1, #0

    ldr r0, [r1] /* r0=[0] store address[0] data*/

    str r1, [r1] /* 0->[0] */

    ldr r2, [r1] /* r2=[0] */

    cmp r1, r2

    ldr sp, =0x40000000 + 4096/* for nor */

    ldreq sp, =4096  /* for nand */

    streq r0, [r1] /* recover address[0] data */


    /* stop watch dog */

    ldr r0, =0x53000000

    mov r1, #0

    str r1, [r0]


    bl main


loop:

    b loop


汇编代码流程很简单

1)把R1赋值为0

2)将0地址数据保存到R0

3)往0地址写0

4)把0地址数据读到R2

5)SP先设置为0x40000000+ 4096

6)如果R2等于R1, 即R2=0,那么说明是nand启动, SP设置成4096

7)把R0的值写回0地址


这里不需要担心,万一程序一开始0地址的数据就是0,那么在往0地址写0再取出来,就会误被判定为成功。 程序最终会编译成机器码, 而机器码组成的指令有特定的格式,不会出现一条指令全是0组成。 通过反汇编可以知道,程序的第1条指令就是“ mov r1, #0”, 这条指令的机器码是e3a01000, 所以0地址的值,一开始不会等于0。

在这里插入图片描述

led_on.c


int main(void)

{

    int i = 0;

    /* clear mode */

    GPFCON &= ~((3 << 8) | (3 << 10) | (3 << 12));

    /* set to output mode */

    GPFCON |= ((1 << 8) | (1 << 10) | (1 << 12));

    /* all led off */

    GPFDAT |= (7 << 4);


    while (1)

    {

        GPFDAT |= (7 << 4);

        GPFDAT &= ~(i << 4);

        i++;


        if (8 == i)

        {

            i = 0;

        }

        delay(100000);

    }


    return 0;

}


main函数是写做一个流水灯的功能, 具体的细节不说,因为今天主要讲的是区分nand flash 和nor flash。把这份代码分别烧到nand 和 nor 都可以正常启动,并让流程灯跑起来,但是会发现流水灯的执行速度不一样。


烧到nand 会执行的更快一点, 因为使用nand时,程序是跑在内部的sram里面,而使用nor时,程序要从外部的nor flash读取数据,因此会偏慢一点。

关键字:s3c2440  nor  启动 引用地址:s3c2440学习之路-004 区分nand/nor 启动

上一篇:s3c2440学习之路-005 轮训模式读取key(按键)
下一篇:s3c2440学习之路-003 汇编给C传参数 点亮不同led灯

推荐阅读最新更新时间:2024-11-11 12:00

记录1--s3c2440 GPIO && UART的控制
一.初始化对应的UART void Uart_Init(int pclk, int baud) { if(pclk == 0) pclk = PCLK; if(UartNum==0) //判断是否使用UART0 { rGPHCON = rGPHCON & (~(0xffff)); //UART0: RXD0 == GPH3 TXD0 == GPH2 rGPHCON = rGPHCON | (0xaaa0) ; //设置GPH端口为UART口 rGPHUP = 0x0; //使能上拉功能 rUFCON0=0x0; // 不使用FIFO rUMCON
[单片机]
Mendix全球大学生应用程序挑战赛正式启动
●一年两次的Mendix大学应用程序挑战赛鼓励学生培养突破传统应用开发思维局限性 ●该挑战赛是Mendix大学计划的一部分,共有100多所大学参与这项计划,使学生能够在课堂上构建网络和移动应用程序 中国北京,2021年12月9日——企业低代码应用开发全球领导者Mendix, a Siemens business今日宣布,Mendix大学应用程序挑战赛秋季赛已开始报名。在此次比赛中,学生可以将他们在Mendix大学课程中学到的知识付诸实践,并将想法转化为可直接使用的生产力程序。Mendix为所有Mendix大学计划中的教育机构学生提供免费的低代码技术、培训和认证。学生们可以在他们未来的职业生涯中运用这些知识,成为专业开发者
[单片机]
嵌入式linux开发 (二十三) 内存管理(5) s3c2440内存管理
之前想着s3c2440内存管理应该和imx6ull 是一样的,目前看起来是不一样 JZ2440 S3C2440 ARM920T ARMv5t -内置 Steppingstone (4K-Byte SRAM) 无rom -外扩 EM63A165TS-6G:32MB/片,SDRAM,共两片 MX29LV160DBTI:2MB,并口 NOR FLASH K9F2G08U0C: 256MB,NAND FLASH 硬件对内存的管理 soc Supports various types of ROM for booting (NOR/NAND Flash, EEPROM, and others) N
[单片机]
嵌入式linux开发 (二十三) 内存管理(5) <font color='red'>s3c2440</font>内存管理
2440开发板启动代码学习
2440init.s是启动代码的主文件,包括3个头文件,option.inc,memcfg.inc,2440addr.inc。 option.inc定义了3个堆栈起始地址,总线宽度,时钟相关参数的定义等。其中这个总线宽度将作为一个IF判断量,决定了各Bank的位宽设置,参见memcfg.inc文件及datasheet。 memcfg.inc是存储器Bank的配置文件,定义了存储器相关寄存器位的值。各bank的位宽的设置定义也是在这个文件中,注意bank0的位宽没有相关的定义,因为它的位宽取决于OM 引脚,即启动方式。 2440addr.inc定义了相关寄存器地址,包括存储器控制寄存器,时钟电源管理寄存
[单片机]
S3C2440触摸屏控制总结
触摸屏控制原理,其实与ADC读取一个滑动变阻器中间触点电压的原理一样。只不过,读取触摸屏的X、Y方向上的电压需要两次,而且需要设置其工作模式以实现一个ADC读取两个通道的电压。 S3C2440的ADC控制是很简单的,与普通单片机控制ADC的方法没有多大区别。大概的操作步骤都是如下所示。 (1)设置控制寄存器ADCCON (2)启动ADC转换 (3)等待转换结束 (4)读取转换结果 但是,S3C2440的触摸屏控制有什么工作模式,如等待中断模式,分离的x/y轴坐标转换模式,自动(连续)x/y轴坐标转换模式,普通转换模式。通过官方芯片资料理解这些模式,似乎还是一头雾水。经过测试,我对这些模式有了初步的认识。 (一) ADC&TC模式分
[单片机]
s3c2440外部中断操作详解
要想正确地执行2440的外部中断,一般需要完成两个部分内容:中断初始化和中断处理函数。 在具体执行中断之前,要初始化好要用的中断。2440的外部中断引脚EINT与通用IO引脚F和G复用,要想使用中断功能,就要把相应的引脚配置成中断模式,如我们想把端口F0设置成外部中断,而其他引脚功能不变,则GPFCON=(GPFCON & ~0x3) | 0x2。配置完引脚后,还需要配置具体的中断功能。我们要打开某一中断的屏蔽,这样才能响应该中断,相对应的寄存器为INTMSK;还要设置外部中断的触发方式,如低电平、高电平、上升沿、下降沿等,相对应的寄存器为EXTINTn。另外由于EINT4到EINT7共用一个中断向量,EINT8到EINT23
[单片机]
三相电动机常用启动方式
电机在生活中无处不在,除了日常生活中用的较多的单相电动机外,工厂里用的较多的则是三相电动机,有时候由于各种问题,电动机启动可能需要采取不同的方式才行。 三相电动机的常用启动方式包括: 1. 直接启动:把电源的三相电压直接施加到电动机的三相绕组上,电机即可启动。直接启动简单、方便,但是对电网冲击较大,会产生较高的起动电流,降低电网电压,影响电网稳定性。 2. 自耦降压启动:自耦降压启动是通过自耦变压器实现的,可以减缓电机起动时的电流冲击,降低起动时的功率因数,同时不会引起电压降低。但是由于自耦降压器本身的损耗,降压幅度不能太大,对其滞留时间也有一定要求。 3. 变频启动:变频启动是利用变频器将电源交流电转换成直流电,在进行变频处
[嵌入式]
GD32 MCU启动后如何运行到main函数
GD32 MCU启动后如何运行到main函数入口?你是否也有这样的疑虑。在执行到main函数之前MCU干了哪些事情呢?下面为大家解答。 MCMCU上电后,首先会根据BOOT0和BOOT1的状态判断从主Flash/SRAM/ISP中启动,如果BOOT0为低电平,MCU将会从主Flash中启动,即主Flash中的数据会被映射到0x0000 0000地址,ARM处理器将会从0x0000 0000地址获取栈顶指针,再从0x0000 0004获取复位中断入口地址(引导代码基地址),如下图所示,我们随便打开一个bin文件,前4个字节为MSP堆栈指针,之后四个字节为复位中断入口地址,之后为中断向量表。 MCU找到堆栈指针和复位中断入口
[单片机]
GD32 MCU<font color='red'>启动</font>后如何运行到main函数
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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