1. 程式人生 > >s3c2440學習之路-008 nor flash的簡單配置

s3c2440學習之路-008 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就不能正常工作了。