1. 程式人生 > >ZYNQ的三種啟動方式-JTAG、SD card、Flash

ZYNQ的三種啟動方式-JTAG、SD card、Flash

ZYNQ的三種啟動方式-JTAG、SD card、Flash

轉自: https://blog.csdn.net/u014485485/article/details/78324183

前言:

 

前面我們都是使用JTAG方式下載位元流檔案,然後下載elf檔案,最後點選Run as或者Debug as來執行程式。JTAG方式是通過tcl指令碼來初始化PS,然後用JTAG收發資訊,優點是可以線上除錯,缺點是斷電後程序就丟失了。為了解決程式丟失的問題,可以製作映象檔案燒寫到sd卡或者flash中,上電即可載入程式。

ZYNQ有兩大類啟動模式:從BootROM主動啟動,從JTAG被動啟動。

在沒有外部JTAG的情況下,處理系統(PS)與可程式設計邏輯(PL)都必須依靠PS來完成晶片的初始化配置。即藉助CPU來完成配置,這也是ZYNQ系列的不同之處。

板子依然使用的是zc702.

 

啟動模式設定:

zynq 具有多種啟動方式: NOR, NAND, Quad-SPI, SD Card以及 JTAG 。 zynq 如何判斷從哪裡啟動呢? 上電後, zynq 會根據模式管腳的設定選用 boot 的方式。 而這個管腳的設定是通過核心板上的撥碼開關實現的。zc702的撥碼開關是sw16。

The ZC702 board supports these configurationoptions:
• PS Configuration: Quad SPI flash memory
• PS Configuration: Processor System Boot from SD Card (J64)
• PL Configuration: USB JTAG configuration port (Digilent module)
• PL Configuration: Platform cable header J2 and flying lead header J58 JTAG configurationports 

 

 

 

 

JTAG啟動:

配置介面如下:

 

設定完之後點選Apply-->Debug即可開始除錯,Run as類似。

 

通過製作映象檔案在外設控制器中啟動,也稱之為固化。固化需要三個檔案:FSBL.elf、該工程的bit檔案、該工程的elf檔案,由此三個檔案製作一個BOOT.bin檔案。

 

那麼通過外設啟動的過程是怎樣的呢?

分為三個階段,大多數的ARM都是這個啟動過程。

階段0:即傳統的 BootROM 過程, zynq 晶片裡有個 rom 裡面固化了一段不可修改的程式, 只有 zynq 一上電, 這段程式就會執行, 它將初始化CPU和 NAND、 NOR、 SD卡等基本外設。初始化好,BootROM讀取儲存器中的程式程式碼,並將FSBL拷貝到OCM(On-chip memory)裡 , 這個被拷貝到片上 RAM 執行的程式就來自於我們要製作的檔案——BOOT.bin。
階段1:第一階段載入程式(First Stage Boot Loader,FSBL)啟動,BOOT.bin開始執行:首先繼續配置PS,PS初始化好後,再配置PL,最後還可以載入階段2的程式碼。 

階段2:開始執行PS端程式碼,也可以是第二階段載入程式(Second Stage Boot Loader,SSBL)。完全在使用者的控制之下,是可選的。

 

 

囉嗦第二遍:

 

BootROM負責:

1.上電覆位以後,PS端即開始進行配置。在不使用JTAG的情況下,ARM將在片上的BootROM中開始執行程式碼。BootROM中的程式碼對NAND、NOR、Quad-SPI、SD與PCAP的基本外設控制器進行初始化,使得ARM核可以訪問、使用這些外設。(而DDR等其他外設將在階段1或者之後進行初始化。)

2.BootROM讀取MIO[2..8]的引腳設定來確定啟動裝置,將選定裝置的頭192Kbyte內容,也就是FSBL,複製到OCM中,並將控制權交給FSBL。

FSBL啟動時可以使用整塊256Kb的OCM,當FSBL開始執行後,器件就正式由由使用者控制了。

FSBL負責: 
1. 根據Vivado中的配置,完成PS端的初始化。 
2. 使用位元流檔案對PL進行配置 
3. 載入第二階段載入程式(SSBL)或者裸跑程式(直接在ARM上執行無作業系統程式)到記憶體空間。 
4. 跳轉執行SSBL或者裸跑程式。 

關於PS配置:

Ps7_init.c和ps7_init.h,用於初始化CLK,DDR和MIO。Ps7_init.tcl完成的初始化和ps7_init.c程式碼完成的初始化是相同的。

由於不是通過JTAG執行,所以沒有執行p7_init.tcl,直接在裸機程式開始處呼叫ps7_init()。

 

 

Xilinx為我們寫好了一個FSBL程式,沒有特殊要求可以直接使用。

製作BOOT.bin檔案:

1.Vivado那邊完成之後,開啟sdk,新建應用工程

工程名設為FSBL

點選next選擇自帶的FSBL程式,右邊是FSBL功能介紹

點選Finish會自動編譯,在Debug目錄下可以找到FSBL.elf檔案

2.點選Xilinx Tools ->Create zynq Boot Image

一般 該新增的檔案它都會幫你新增好。

需要新增的檔案如下:

在FSBL資料夾下新建一個bootImage檔案,點選Browse,將輸出指向這裡

 

點選add,先新增FSBL.elf檔案,作為bootloader

再新增hw_platform下的.bit檔案,這是PL部分的

 

最後新增裸機程式.elf檔案

 

都新增完如下圖:

以上三個檔案的新增順序不可變,點選Create Image,就可以生成BOOT.bin檔案了,預設的輸出路徑在bootImage下。

 

 

SD卡啟動

1.將生成的BOOT.bin檔案拷貝到SD卡中,2.啟動模式設定為SD卡啟動,上電,程式就可以運行了。

我這裡的現象led閃爍,斷電再上電,程式依然在,從SD卡載入的。

 

Flash啟動

1.啟動模式設定為QSPI啟動,

2.開發板上電,

3.點選Xilinx tool-->Program Flash

4.點選Program

下載好後程序就固化了,斷電後重啟,程式從QSPI Flash載入。

 

如果你使用已經存在的bsp檔案時出現這種情況:

右鍵那個bsp工程,點選Board  Support Pacage Setting,勾選這兩個庫

 

總結:

主流的下載方式就這三種,基本可以滿足你的一切需要了。