1. 程式人生 > >【DSP開發】TMS320C66x DSP SPI Nor Flash的程式燒寫

【DSP開發】TMS320C66x DSP SPI Nor Flash的程式燒寫

經過一段時間的研究終於把TMS320C6657單核和雙核的SPI Nor Flash的程式燒寫調通了。工具都是前輩的工作,有需要的可以留下郵箱,我有空可以發。

原理參考錢豐的《TI c66x 系列DSP 多核BOOT 的研究》論文。

通過Nor flash 燒寫載入程式的全部流程:(在no-boot模式下)


一、首先講講工具鏈:


hex6x 配合.rmd檔案(有幾個.out檔案就需要幾個.rmd檔案,描述輸出控制、引導選項、儲存器選項等內容)生成片上引導載入器載入程式所需的引導表,輸出檔案為*.btbl

mergebtbl將*.btbl按照一定的順序連結起來

b2i2c 將*.btbl轉換成i2c/spi格式,把boot表劃分成0x80位元組塊並附加長度(length)和校驗碼(checksum)

b2ccs將*.btbl.i2c轉換成.i2c.ccs,CCSV5 IDE接收的.dat格式,載入到DDR3中去。手動i2crom.ccs中的第951改為00

romparse 合併boot表和boot引數表,引數配置表文件*.map作為輸入。

byteswapccs將.dat轉換成ROM Bootloader程式碼能夠識別的大端模式

二、將工具鏈寫成批處理檔案

1.單核.dat檔案生成

hex6x simple.rmd

b2i2c simple.btbl simple.btbl.i2c

b2ccs simple.btbl.i2c simple.i2c.ccs

romparse nysh.spi.map

pause       //暫停時,將i2crom.ccs中的第951改為00

byteswapccs i2crom.ccs spirom_le.dat

2.雙核.dat檔案生成

hex6x core0.rmd

hex6x core1.rmd

mergebtbl core0.btblcore1.btbl multi_core.btbl

b2i2c multi_core.btbl simple.btbl.i2c

b2ccs simple.btbl.i2c simple.i2c.ccs

romparse nysh.spi.map

pause      //暫停時,將i2crom.ccs中的第

951改為00

byteswapccs i2crom.ccs spirom_le.dat

藍色與單核.dat檔案生成不同,其他相同。

三、*.dat燒寫過程


1. 2個led測試工程,成功編譯並生成2個.out檔案,生成.out 檔案必須命名為core0.out 、core1.out

2. 將2個.out檔案拷貝到SPI_Bootloader工具鏈路徑下,雙擊spibootMulticore.bat批處理檔案,開始生成檔案,得到spirom_le.dat

3. 將evm板調成no-boot 模式,撥碼開關對應 SW3~SW5 1000  0000 0000  0000 (0 對應on  1對應off)

4. 開啟MCSDK自帶的nor-writer工程,將工程bin資料夾下的nor_writer_input.txt 開啟,修改輸入檔名為spirom_le.dat 並將spirom_le.dat拷貝到mcsdk_xxxx\tools\writer\nor\evmc667xl\bin路徑下

5. 連結工程,等PC指標停在main函式入口,開啟view--memory browser,輸入0x80000000,load memory 選擇spirom_le.dat,(自動)勾上Use the header... 再次確認start address 為0x80000000,length為spirom_le.dat的長度(單位是word) 開始往DDR裡灌數。

6. 燒寫工程run,注意console輸出  顯示與length長度大小相同的檔案燒入flash,則燒寫成功,此時單位是位元組。

7. 最後撥碼開關撥到ROM SPI boot模式下,SW3~SW5 1011 0000 0010 0000,斷電重啟

四、多核啟動過程

        C66x DSP 內部有一個固化的ROM,裡面存放著boot 程式碼(ROM bootloader)。每當DSP 啟動時,會自動從這裡讀取程式碼並執行。這裡執行的程式碼是固化的不可更改的,其作用就是根據DSP的管腳配置方式對核進行初始化(比如PLL 等)和完成不同模式的Boot 處理。所有的core 執行同一份程式碼。不同的core 在執行的時候通過DNUM(核編號索引)來去做區分。初始化外設的操作由 core0來完成。所以core0初始化其他外設的同時,其他core都會執行相關的程式碼對映IPC 中斷,並配置相應的暫存器,然後進入IDLE 狀態,等待core0 的IPC中斷髮起。簡言之,其他核是在core0 的命令下執行第一句程式碼。


        Boot Magic 地址是每個core 各自一塊固定的記憶體。該字存放的是各個core 初始化之後需要跳轉到的c程式入口地址 _c_int00()。TMS320C6657/TMS320C6670的Boot Magic地址是0x1x8FFFFC,因為他們L2 RAM大小為1MB。TMS320C6678的Boot Magic地址是0x1x87FFFC,因為L2 RAM只有512KB。

        如果多核DSP 是由同一套工程分別編譯,那麼每個核記憶體分配完全相同。core0 在讀取自己核的Boot Magic 地址(0x108ffffc)後,加上0x0*000000 後就可以得到其他核的Boot Magic 地址(*為核號)。但是如果各核編譯各自獨立工程,各變數記憶體對映關係不再相同,那麼就無法從core0 的Boot Magic 地址裡的值去推算其他核相應地址。這個時候只能事先記錄下各核的 Magic地址,然後寫死在核 0 的使用者初始化程式碼上。

       在完成所有上述操作後,core0 需要對每個核的IPCGRx 暫存器寫中斷以喚醒其他核的正常執行狀態。IPCGRx 暫存器的31-4 位元位是IPC 中斷源索引,最多可支援多達28 箇中斷源,文中例程可以設定為全0;位元3-1 是保留位,可以任意賦值。因此只要對最低位元賦1 就可以完成IPC 中斷的觸發。