s3c2440学习之路-009 nor flash的简单配置

  1. 基本原理
  2. 主要寄存器说明
  3. 源码

硬件平台:jz2440
软件平台:Ubuntu16.04 arm-linux-gcc-3.4.5
源码位置: https://github.com/lian494362816/C/tree/master/2440/010_nor_flash_tacc

1.原理

1.1 Bank的划分

2440支持nand flash 和 nor flash启动, 不过nor flash启动时使用的是最保守的配置,即相关的时钟设置成最小值以保证低性能的nor flash也可以工作。nor flash启动时,CPU是从nor flahs读取指令,因为nor flash的访问速度慢导致程序执行的也慢,所以要加快nor flash的运行。这就需要修改nor flash配置相关的寄存器,让其达到最高的访问速度。

2440将内存的控制分成了8个Bank, 通过GCSn引脚来控制。nor flash接在Bank0上,通过GCS0来控制。这个控制是由2440自动来完成,当你访问的内存地址在0x0000_0000~0x0800_0000之间,2440就会自动选通GCS0,因此我们只关注寄存器配置部分即可。

在这里插入图片描述

在这里插入图片描述

1.2时序

先分析一下nor flash的时序。
Tsrw:读、写操作之间的潜伏期 大于45ns
Toeh:输出使能的保持时间 0
Tce:片选使能后过多久数据才有效 70ns之内
Toe:输出使能后过多久数据才有效 30ns之内
Taa:地址信号后过多久数据才有效 70ns之内
Trc:读取数据的周期 大于70ns
Tdf:输出使能或片选使能关闭 多久之后数据才稳定 最大30ns
Tch:片选使能的保持时间 0

通过时序图可以了解到,Toec Toe Taa Tce的时间都是包含在Trc里面的,如果同时发出 使能信号、地址信号、数据信号只要保证Trc大于70ns即可。
Tsrw 需要大于45ns, 不过nor flash的手册有备注说明只是取样所得,不是100%, 因此暂不管这个参数

Tdf 需要30ns,2440没有对应的参数可以设置,因此无法管了

在这里插入图片描述

在这里插入图片描述

2440可以设置时序的参数不多, 可以看到初始值Tacc是111b(14clock),Tacc刚好对应Nor flash 的Trc。因此保证Tacc大于70ns 即可保证Nor flash稳定工作
一开始2440是由外部的12M晶振提供时钟,此时Nor flash 的访问周期就等于14/12M = 11.67ms。当系统时钟配置好后,HCLK=100M, 此时的访问周期等于14/100M = 0.14ms=140ns。
这里我们要把Tacc配置成101b(8clock),让访问时间等于80ns,以最大限度提高nor flash
在这里插入图片描述

在这里插入图片描述

2.主要寄存器

2.1BWSCON

配置位宽,由2440上电读取引脚OM[1:0]决定,因此不用配置
在这里插入图片描述

在这里插入图片描述

2.2BANKCON0

只需要将Tacc配置成8clock即可。 (个人感觉前面讲 nor flash 的Tsrw Tdf可以通过配置Tcah来解决,不过目前没有配置程序一样也可以跑,所以没有管了)

在这里插入图片描述

在这里插入图片描述

3.源码

init.c

int bank0_tacc_set(int value)
{
    /* nor flash can change 0->1, but can't change 1->0
    so can't clear [10:8]
    */
    //BANKCON0 &= ~(0x7 << 8);
    //BANKCON0 |= (value << 8);
    BANKCON0 = value << 8;

    return 0;
}

main.c

int led_test(void)
{
    int i = 0;

    led_init();

    for (i = 4; i <= 6; i++)
    {
        led_on(i);
        delay(100000);
        led_off(i);
    }
}

int main(int argc, char *argv[])
{
    int c = 0;
    uart0_init();

    while(1)
    {
        printf("please input num[0~7]\n\r");
        c = getchar();
        putchar(c);

        if (c >= '0' && c <= '7')
        {
            bank0_tacc_set(c - '0');
            led_test();
        }
        else
        {
           printf("please input num[0~7]\n\r");
        }
    }

    return 0;
}

在main函数中,通过输入0~7来给Tacc赋值,led_test是一个流水灯程序。(程序必须以nor 启动
通过流水灯执行的快慢,来观察给Tacc赋不同值得效果。可以明显的观察到当输入5(8clock)和7(14clock)时,输入5流水灯会执行的更加快。根据测试,输入4~7都可正常工作。

这里有个问题,就是不能执行BANKCON0 &= ~(0x7 << 8), 因为Tacc被清零,此时clcok=0, nor flash就不能正常工作了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值