zynq 程序固化和啟動(dòng)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
我們前面的例程都是在 SDK 開(kāi)發(fā)環(huán)境中用 JTAG 直接下載程序運(yùn)行,如果開(kāi)發(fā)板斷電,程序就會(huì)丟失,如何讓程序能夠在開(kāi)發(fā)板斷電后再上電能重新啟動(dòng),這就需要用到應(yīng)用程序的固化。ZYNQ7000 SOC 芯片可以從 FLASH 啟動(dòng),也可以從 SD 卡里啟動(dòng), 本文給大家介紹程序的 FLASH 和/或者 SD 卡啟動(dòng)的方法。
前面我們也介紹過(guò), Zynq7000 SOC 芯片上電后,運(yùn)行的是 ARM 系統(tǒng)(PS)。然后再通過(guò) ARM 系統(tǒng)軟件部分加載 FPGA 的比特流文件.bit 至 FPGA(PL),啟動(dòng) FPGA 的邏輯功能。下面給大家介紹一下 ZYNQ 系統(tǒng)的啟動(dòng)流程:
開(kāi)發(fā)板啟動(dòng)流程
開(kāi)發(fā)板的啟動(dòng)分兩個(gè)階段,第一階段是 BOOT ROM,第二階段是 FSBL (First Stage Bootloader)。經(jīng)過(guò)兩個(gè)階段,應(yīng)用程序開(kāi)始運(yùn)行。
第一階段 (BOOT ROM)
1). AX7010/AX7020 開(kāi)發(fā)板上電后,Zynq7000 SOC 會(huì)首先執(zhí)行片內(nèi) Boot ROM 代碼, Boot ROM 代碼讀取 Boot mode 寄存器會(huì)決定是哪一種啟動(dòng)方式(SD card/QSPI Flash/JTAG)。
2). 確定好哪種啟動(dòng)方式后, Boot ROM 從相應(yīng)的啟動(dòng)設(shè)備(SD Card/QSPI Flash)加載 First
Stage Bootloader (FSBL) 到 On Chip Memory(OCM) RAM,開(kāi)始將執(zhí)行權(quán)交付給 FSBL。
第二階段 FSBL (First Stage Bootloader)
FSBL 開(kāi)始執(zhí)行, 后面我們會(huì)介紹了如何利用 SDK 工具一步步生成 FSBL 代碼和可執(zhí)行文
件,結(jié)合代碼可知 FSBL 主要做了如下工作:
1).初始化 CPU,初始化串口;
2). Processor System (PS) 一些控刢器的初始化,如 MIO, PLL, CLK and DDR;
3). 禁止 L1 Data Cache;
4). 注冊(cè) ARM 中斷向量;
5). 通過(guò) Boot mode 寄存器,判斷是哪種啟動(dòng)方式
a). QSPI Flash 啟動(dòng)方式:
初始化 QSPI Flash 控制器;
從 Flash 拷貝 system.bit 到 FPGA (如果 Flash 中存有 system.bit);
從 QSPI Flash 拷貝應(yīng)用程序的代碼到 DDR3;
調(diào)轉(zhuǎn)到應(yīng)用程序執(zhí)行;
b). SD Card 啟動(dòng)方式:
初始化 SD 控刢器;
從 SD Card 拷貝 system.bit 到 FPGA (如果 BOOT.BIN 中存有 system.bit);
從 SD card 拷貝應(yīng)用程序的代碼到 DDR3;
調(diào)轉(zhuǎn)到應(yīng)用程序執(zhí)行;
c). JTAG 啟動(dòng)方式,直接退出。
Vivado 工程修改
我們只是一個(gè)測(cè)試工程,可以找一個(gè)前面完成的工程,比如helloworld 或者有點(diǎn)現(xiàn)象一點(diǎn)的sdk 流水燈,當(dāng)然也可更復(fù)雜一點(diǎn)的。這里我就采用流水燈工程。
因?yàn)槲覀冃枰獙懭隨D 卡和Qspi,需要修改工程,就是提供sd卡和qspi 的支持,下面的圖示是基于黑金的開(kāi)發(fā)板或核心板AC7010,如果不一致,你需要核對(duì)你硬件的設(shè)計(jì)。
1. 為了不影響前面的項(xiàng)目,把my_led 工程另存為my_led_flash。
2. 打開(kāi)項(xiàng)目后,雙擊打開(kāi) Diagram 原理圖中的 Processing_system7_0, 打開(kāi)配置 ZYNQ 的配置界面,在 Peripheral I/O Pins 項(xiàng),使能 Quad SPI Flash
同樣,我們需要使能 SD0 的接口, SD 卡在 AX7010/AX7020 開(kāi)發(fā)板上是連接到 PS 的
MIO40~MIO45 的管腳上。
3. 在 MIO Configuration 項(xiàng),把 Quad SPI Flash 的 MIO1~MIO6 Speed 配置成 fast 模式。
在 SD_0 項(xiàng),選擇 CD 前面的鉤, IO 選擇 MIO47(需要跟開(kāi)發(fā)板一致), SD_0 的 IO 速度配置
成 fast 模式。
再配置 Bank1 I/O Voltage 的電壓為 1.8V。
保存好原理圖,等等,產(chǎn)生比特流bit,,輸出硬件(Export hardware),啟動(dòng)SDK(Launch SDK)
驗(yàn)證
在sdk 里, Xilinx->program FPGA
debug 或Run 驗(yàn)證你的sdk 工程運(yùn)行正常。
如果你還沒(méi)有運(yùn)行的工程,那你就建立一個(gè),并且調(diào)試運(yùn)行好。下面我們燒寫的就是這個(gè)程序。
生成 FSBL 可執(zhí)行文件
在 SDK 開(kāi)發(fā)環(huán)境里 , 點(diǎn)擊菜單 File -> New -> Application Project
僅在 Project name: 輸入 fsbl, Hardware Platform 需要選擇 system_wrapper_hw_platform_0,這個(gè)hardware platform和你上面的工程應(yīng)該是一樣的。
Next 后,選擇 Zynq FSBL 模板
軟件會(huì)自動(dòng)編譯生成 fsbl.elf 文件,當(dāng)然也可手動(dòng)編譯一下,如果認(rèn)為有問(wèn)題。
為了能夠讓串口打印出 Bootloader 的信息,我們這里需要在 fsbl_debug.h 文件里添加一條語(yǔ)句,定義一下“FSBL_DEBUG_INFO”常量。修改后保存,重新編譯一下 fsbl 頃目。
BOOT.BIN 文件的生成
接下去我們要把 FSBL 可執(zhí)行文件, FPGA 的比特流文件和 應(yīng)用程序結(jié)合成一個(gè) Bin 文件。
1. 選擇菜單 Xilinx Tools->Create Boot Image
2. 點(diǎn)擊 Browse 按鍵選擇 Zynq Boot Image 文件.bif 的存放地址。
我的是:C:\alinx\my_led_flash\output.bif
3. 點(diǎn)擊 Add 按鈕, 在彈出的 Add new boot image partition 對(duì)話框中, 點(diǎn)擊 Browse 選擇我們剛生成的 FSBL 可執(zhí)行文件 fsbl.elf。這里 Partition type 為 bootloader, fsbl.elf 作為bootloader 程序
我的是:C:\alinx\my_led_flash\my_led_flash.sdk\fsbl\Debug\fsbl.elf
4. 點(diǎn)擊 Add 按鈕,在彈出的 Add new boot image partition 對(duì)話框中, 點(diǎn)擊 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. 同樣的方法添加應(yīng)用程序文件 myled.elf, 這里 Partition type 也是 datafile。
我的是:
3 個(gè)文件添加后如下所示:
有了這一次后,以后可以如下方式進(jìn)行,不用每次都導(dǎo)入。上面圖是第一次的操作,后面可以import from existing BIF file.
說(shuō)實(shí)在的,第一次我操作有誤,bit 文件錯(cuò)誤成了hdf 文件,下面修改后才執(zhí)行正確。
6. 點(diǎn)擊 Create Image 按鈕,生成 BOOT.bin
燒寫 FLASH 并啟動(dòng)
我們需要測(cè)試 FLASH 的啟動(dòng)方法,需要把生成的 BOOT.bin 文件燒寫到 QSPI FLASH 中。
具體步驟如下:
1. 開(kāi)發(fā)板需要連接 JTAG 線到電腦,把開(kāi)發(fā)板上的啟動(dòng)配置的跳線帽插到中間的兩個(gè) Pin 上,
也就是從 QSPI Flash 啟動(dòng),再開(kāi)發(fā)板上電。
2. 在 SDK 開(kāi)發(fā)環(huán)境里,選擇菜單 Xilinx Tools->Program Flash。
其實(shí)在這個(gè)操作前應(yīng)該Xilinx Tools->Program FPGA,可能以前是不需要這樣操作。
3. 在這個(gè)操作對(duì)話框里,需要輸入fsbl.elf文件, image File 就是我們上面生成的,Hardware Platform 也是我們上面選擇的system_wrapper_hw_platform_0。硬件平臺(tái)都應(yīng)該與上面創(chuàng)建時(shí)一致。
4. 點(diǎn)擊 Program 按鈕下載,程序會(huì)開(kāi)始下載 BOOT.bin 文件到開(kāi)發(fā)板的 QSPI FLASH 中。
Console 窗口顯示 Flash Operation Successful 信息,說(shuō)明燒寫成功。
復(fù)位或者重開(kāi)機(jī)啟動(dòng),就可以看到程序運(yùn)行了,流水燈或者串口顯示。
SD 卡啟動(dòng)
從 SD 卡啟動(dòng)的方法更簡(jiǎn)單,只要把前面生成的 BOOT.bin 文件拷貝到 SD, 因?yàn)锳X7010/AX7020 開(kāi)發(fā)板使用的是 micro SD 卡,所以大家要向 SD 卡拷貝 BOOT.bin 文件的話,需要用到 USB 接口的 SD 讀卡器。
先用 FAT32的格式格式化一下 SD 卡,然后拷貝 BOOT.bin 文件到 SD 中。
把 Micro SD 卡再插入到開(kāi)發(fā)板的 SD 卡槽中,再把 Boot 啟動(dòng)配置的跳線帽調(diào)到 SD 位置的兩個(gè)引腳上。
加電或復(fù)位就看到程序運(yùn)行了。
介紹到此為止,很多開(kāi)發(fā)板的資料都應(yīng)該有介紹,下一篇介紹加密的方式寫入flash或者SD卡。





