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空間。
