zynq 程序固化和啓動

我們前面的例程都是在 SDK 開發環境中用 JTAG 直接下載程序運行,如果開發板斷電,程序就會丟失,如何讓程序能夠在開發板斷電後再上電能重新啓動,這就需要用到應用程序的固化。 ZYNQ7000 SOC 芯片可以從 FLASH 啓動,也可以從 SD 卡里啓動, 本文給大家介紹程序的 FLASH 或者 SD 卡啓動的方法。

前面我們也介紹過, Zynq7000 SOC 芯片上電後,運行的是 ARM 系統(PS)。然後再通過 ARM 系統軟件部分加載 FPGA 的比特流文件.bit 至 FPGA(PL),啓動 FPGA 的邏輯功能。 下面給大家介紹一下 ZYNQ 系統的啓動流程:

開發板啓動流程

開法板的啓動分兩個階段,第一階段是 BOOT ROM,第二階段是 FSBL (First Stage Bootloader)。經過兩個階段,應用程序開始運行。

 第一階段 (BOOT ROM)

1). AX7010/AX7020 開發板上電後,Zynq7000 SOC 會首先執行片內 Boot ROM 代碼, Boot ROM 代碼讀取 Boot mode 寄存器會決定是哪一種啓動方式(SD card/QSPI Flash/JTAG)。

2). 確定好哪種啓動方式後, Boot ROM 從相應的啓動設備(SD Card/QSPI Flash)加載 First
Stage Bootloader (FSBL) 到 On Chip Memory(OCM) RAM,開始將執行權交付給 FSBL。

 第二階段 FSBL (First Stage Bootloader)

FSBL 開始執行, 後面我們會介紹瞭如何利用 SDK 工具一步步生成 FSBL 代碼和可執行文
件,結合代碼可知 FSBL 主要做了如下工作:

1).初始化 CPU,初始化串口;

2). Processor System (PS) 一些控刢器的初始化,如 MIO, PLL, CLK and DDR;

3). 禁止 L1 Data Cache;

4). 註冊 ARM 中斷向量;

5). 通過 Boot mode 寄存器,判斷是哪種啓動方式
a). QSPI Flash 啓動方式:
 初始化 QSPI Flash 控制器;
 從 Flash 拷貝 system.bit 到 FPGA (如果 Flash 中存有 system.bit);
 從 QSPI Flash 拷貝應用程序的代碼到 DDR3;
 調轉到應用程序執行;
b). SD Card 啓動方式:
初始化 SD 控刢器;
從 SD Card 拷貝 system.bit 到 FPGA (如果 BOOT.BIN 中存有 system.bit);
從 SD card 拷貝應用程序的代碼到 DDR3;
調轉到應用程序執行;
c). JTAG 啓動方式,直接退出。

Vivado 工程修改

我們只是一個測試工程,可以找一個前面完成的工程,比如helloworld 或者有點現象一點的sdk 流水燈,當然也可更復雜一點的。這裏我就採用流水燈工程。

因爲我們需要寫入SD 卡和Qspi,需要修改工程,就是提供sd卡和qspi 的支持,下面的圖示是基於黑金的開發板或核心板AC7010,如果不一致,你需要覈對你硬件的設計。

1. 爲了不影響前面的項目,把my_led 工程另存爲my_led_flash。

2. 打開項目後,雙擊打開 Diagram 原理圖中的 Processing_system7_0, 打開配置 ZYNQ 的配置界面,在 Peripheral I/O Pins 項,使能 Quad SPI Flash

同樣,我們需要使能 SD0 的接口, SD 卡在 AX7010/AX7020 開發板上是連接到 PS 的
MIO40~MIO45 的管腳上。


 

3. 在 MIO Configuration 項,把 Quad SPI Flash 的 MIO1~MIO6 Speed 配置成 fast 模式。


 

在 SD_0 項,選擇 CD 前面的鉤, IO 選擇 MIO47(需要跟開發板一致), SD_0 的 IO 速度配置
成 fast 模式。
 


再配置 Bank1 I/O Voltage 的電壓爲 1.8V。


保存好原理圖,等等,產生比特流bit,,輸出硬件(Export hardware),啓動SDK(Launch SDK)

驗證

在sdk 裏, Xilinx->program FPGA

debug 或Run 驗證你的sdk 工程運行正常。

如果你還沒有運行的工程,那你就建立一個,並且調試運行好。下面我們燒寫的就是這個程序。

生成 FSBL 可執行文件

在 SDK 開發環境裏 , 點擊菜單 File -> New -> Application Project

僅在 Project name: 輸入 fsbl, Hardware Platform 需要選擇 system_wrapper_hw_platform_0,這個hardware platform和你上面的工程應該是一樣的。

Next 後,選擇 Zynq FSBL 模板

軟件會自動編譯生成 fsbl.elf 文件,當然也可手動編譯一下,如果認爲有問題。

爲了能夠讓串口打印出 Bootloader 的信息,我們這裏需要在 fsbl_debug.h 文件裏添加一條語句,定義一下“FSBL_DEBUG_INFO”常量。修改後保存,重新編譯一下 fsbl 頃目。

BOOT.BIN 文件的生成

接下去我們要把 FSBL 可執行文件, FPGA 的比特流文件和 應用程序結合成一個 Bin 文件。

1. 選擇菜單 Xilinx Tools->Create Boot Image

2. 點擊 Browse 按鍵選擇 Zynq Boot Image 文件.bif 的存放地址。

我的是:C:\alinx\my_led_flash\output.bif

3. 點擊 Add 按鈕, 在彈出的 Add new boot image partition 對話框中, 點擊 Browse 選擇我們剛生成的 FSBL 可執行文件 fsbl.elf。這裏 Partition type 爲 bootloader, fsbl.elf 作爲bootloader 程序

我的是:C:\alinx\my_led_flash\my_led_flash.sdk\fsbl\Debug\fsbl.elf

4. 點擊 Add 按鈕,在彈出的 Add new boot image partition 對話框中, 點擊 Browse 按鈕找到 FPGA 的比特流文件 system_wrapper.bit, 這裏 Partition type 爲 datafile。

我的是:C:\alinx\my_led_flash\my_led_flash.sdk\system_wrapper_hw_platform_0\system_wrapper.bit

5. 同樣的方法添加應用程序文件 myled.elf, 這裏 Partition type 也是 datafile。

我的是:

3 個文件添加後如下所示:


有了這一次後,以後可以如下方式進行,不用每次都導入。上面圖是第一次的操作,後面可以import from existing BIF file.

說實在的,第一次我操作有誤,bit 文件錯誤成了hdf 文件,下面修改後才執行正確。

6. 點擊 Create Image 按鈕,生成 BOOT.bin

燒寫 FLASH 並啓動


我們需要測試 FLASH 的啓動方法,需要把生成的 BOOT.bin 文件燒寫到 QSPI FLASH 中。
具體步驟如下:
1. 開發板需要連接 JTAG 線到電腦,把開發板上的啓動配置的跳線帽插到中間的兩個 Pin 上,
也就是從 QSPI Flash 啓動,再開發板上電。

2. 在 SDK 開發環境裏,選擇菜單 Xilinx Tools->Program Flash。

其實在這個操作前應該Xilinx Tools->Program FPGA,可能以前是不需要這樣操作。

3. 在這個操作對話框裏,需要輸入fsbl.elf文件, image File 就是我們上面生成的,Hardware Platform 也是我們上面選擇的system_wrapper_hw_platform_0。硬件平臺都應該與上面創建時一致。


 

4. 點擊 Program 按鈕下載,程序會開始下載 BOOT.bin 文件到開發板的 QSPI FLASH 中。

Console 窗口顯示 Flash Operation Successful 信息,說明燒寫成功。

復位或者重開機啓動,就可以看到程序運行了,流水燈或者串口顯示。

SD 卡啓動

從 SD 卡啓動的方法更簡單,叧要把前面生成的 BOOT.bin 文件拷貝到 SD, 因爲AX7010/AX7020 開發板使用的是 micro SD 卡,所以大家要向 SD 卡拷貝 BOOT.bin 文件的話,需要用到 USB 接口的 SD 讀卡器。
先用 FAT32的格式格式化一下 SD 卡,然後拷貝 BOOT.bin 文件到 SD 中。
把 Micro SD 卡再插入到開發板的 SD 卡槽中,再把 Boot 啓動配置的跳線帽調到 SD 位置的兩個引腳上。

加電或復位就看到程序運行了。

介紹到此爲止,很多開發板的資料都應該有介紹,下一篇介紹加密的方式寫入flash或者SD卡。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章