DSP程序nandflash固化(一)——DSP啟動過程與FLASH基礎


  DSP內部FLASH不能用於存放用戶代碼,所以為了使DSP在掉電后能夠正常運行,必須將程序存儲在外部非易失存儲器中。一般的FLASH讀取比較慢,為了使得DSP充分發揮其高速執行指令的功能,需要將程序和數據都存儲在高速內存中,一般為靜態RAM或者動態RAM。所以上電之后需要通過自引導的方式將FLASH中的代碼搬移到內部存儲器(IRAM)或者外部高速RAM(ddr等高速RAM)中運行。下面首先介紹DSP的啟動過程。
  本文只介紹DSP C6000系列的相關知識,所以啟動模式僅限於C6000系列。DSP C6000內部的FLASH固化了廠商的初始BOOT代碼,無法修改,在DSP上電后,系統首先進入復位狀態,並且保持,程序進入內部bootloader執行,首先bootloader讀取BOOTCFG寄存器,bootloader決定從哪個外設啟動,本歷程為從NANDFLASH啟動,根據TI提供的手冊,需要將BOOTCFG中的字段BOOTMODE設置成0111,相應的引腳需要在硬件上連接才能設置BOOTMODE,在硬件上還需注意的是NANDFLASH必須連接到EMIFA的CS2地址空間上,在執行完bootloader后程序跳轉到用戶代碼空間,復位結束,開始執行用戶代碼。
  網上很多資料都是講解bootloader只能搬移1KB或者64KB的程序,一般需要進行二級bootloader引導。本文不進行這一方面的介紹,而是直接使用TI固化的bootloader執行腳本命令來啟動程序,這個腳本被稱為AIS(Application Image Script),用戶代碼可以全部轉化成AIS腳本,直接燒寫在NANDFALSH上,不需要二次引導即可啟動。
為了能順利的進行NANDFLASH的固化操作,有必要對NANDFLASH進行非常詳細的了解,下面就進行一些簡單的介紹。
  提到NAND FLASH不得不也提到NOR FLASH,這兩種是主要的非易失閃存技術。NOR FLASH最大的優點就是讀取速度非常快(與NAND FLASH相比),程序可以直接在NOR FLASH中執行,不必搬移到內存中。但是其缺點也很大,它的寫入和擦除速度非常慢,存儲單元密度較低,成本較高,相比之下NANDFLASH的優勢就比較大,下面列出他們的性能比較。
NOR FLASH與NAND FLASH的比較
 比較項  NOR FLASH  NAND FLASH
 讀速度  相對快  相對慢
 寫速度  慢很多  快很多
 擦除速度  慢很多  塊很多
 擦除單元  擦除單元大,擦除電路大一些  擦除單元小,擦擦電路小一些
 容量  相對小,主要存放代碼  大,適用於存放大量數據
 成本  相對高  相對低
 壽命  擦寫10萬次  擦除100萬次
   
     接着介紹NANDFLASH的操作,首先需要了解NANDFLASH的內部結構。一個NAND FLASH有很多塊(Block)組成,塊的大小一般是128KB, 256KB, 512KB,筆者用到的是ST公司的NAND512-A,查相應的數據手冊可知快大小在8位數據總線下為16KB,每一塊又由很多頁組成,一頁由512B組成,除了可以用來存儲的空間外,NANDFLASH每一塊預留512B或256B,每一頁預留16B或8B來記錄對應塊與頁的狀態。FLASH操作的最小單位為:讀取寫入為頁,擦除操作為塊;而且要寫入數據必須先擦除一整塊。一般而言,DSP程序都比較大,選擇NANDFALSH是不錯的選擇。
     下面具體編程操作:
#include "stdio.h"
#include "evm6424.h"
#include "evm6424_nandflash.h"
 
void main( void )
{
    int FlashPages = 0;
    unsigned char data[512];
    int i = 0;
    EVM6424_init( );
 
    FlashPages = EVM6424_NANDFLASH_getTotalPages();
    printf("NANDFLASH pages:%d\n",FlashPages);
    //向第一頁寫入0~255~0
    for(i=0;i<512;i++)
    {
         data[i] = i;
    }
    EVM6424_NANDFLASH_erase(0);
    EVM6424_NANDFLASH_writePage(0,0,(Uint32)data);
    //EVM6424_NANDFLASH_readPage(0,0,(Uint32)data);
    while(1)
    {
         ;
    }
}
      程序首先進行初始化,然后讀取總共的頁數,首先初始化為0~127~-128,為了檢驗寫入是否成功,先向第一頁寫入數據,運行,然后在讀取,讀取的數據是否為前次寫入的數據。在這個過程中,為了避免程序執行的奇異,讀取之前先將數組清空為0。
#include "stdio.h"
#include "evm6424.h"
#include "evm6424_nandflash.h"
 
void main( void )
{
    int FlashPages = 0;
    unsigned char data[512];
    int i = 0;
    EVM6424_init( );
 
    FlashPages = EVM6424_NANDFLASH_getTotalPages();
    printf("NANDFLASH pages:%d\n",FlashPages);
    //向第一頁寫入0~255~0
    for(i=0;i<512;i++)
    {
         data[i] = 0;
    }
    //EVM6424_NANDFLASH_erase(0);
    //EVM6424_NANDFLASH_writePage(0,0,(Uint32)data);
    EVM6424_NANDFLASH_readPage(0,0,(Uint32)data);
    while(1)
    {
         ;
    }
}
     當在CCS上調試時運行到最后,data變量不在全為0而是0~127~-128則說明程序NANDFLASH擦除寫入讀取成功,可以接着進行下一節的學習了。
本節重點:
  • FLASH的操作單位:讀取寫入為頁,擦除為塊;
  • FLASH在寫之前必須先擦除,在電路上存儲器只能有1變為0;
  • NANDFLASH啟動的前提:BOOTMODE為0111,存儲器掛接在EMIFA的CS2空間。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM