在 main.c 的開(kāi)頭,我們加載了需要使用的幾個(gè)頭文件,在 Xilinx SDK 中,已經(jīng)包含了一些預(yù)設(shè)好的函式庫(kù)等功能,具體信息請(qǐng)查閱 Xilinx OS and Libraries Document Collection (UG643) 手冊(cè)。
xparameters.h 這個(gè)頭文件則是 Xilinx SDK 自己產(chǎn)生的,里面會(huì)包含一些關(guān)于你使用的 IP Core 的信息,比如標(biāo)準(zhǔn)輸出的基地址 (base address) 或是其他和你這份硬件相關(guān)的設(shè)定。而 xgpio.h 則提供了一些高階的抽象函式,讓你開(kāi)發(fā) GPIO 相關(guān)的功能可以更加輕松。
#include "xparameters.h"
#include "xgpio.h"
#include
#include
我們用一個(gè)非常簡(jiǎn)單的延遲 (delay) 函式讓 CPU 很忙碌的計(jì)算,來(lái)達(dá)到延遲程序的效果。
void simple_delay (int simple_delay)
{
volatile int i = 0;
for (i = 0; i < simple_delay; i++);
}
接下來(lái)是我們的主程序,我們將它拆開(kāi)來(lái)看,后面見(jiàn)到的程序代碼都會(huì)塞到主程序中。
int main(int argc, char *argv[])
{
// code
return 0;
}
是時(shí)候進(jìn)入到 GPIO 的功能設(shè)定,注意到 XPAR_AXI_GPIO_0_DEVICE_ID 這個(gè),你可以把它對(duì)應(yīng)回我們的 Block Design 的 axi_gpio_0 ,這個(gè)宏(Macro)即是 Xilinx SDK 產(chǎn)生,定義在 xparameter.h 里面。
XGpio led_gpio; /* LED Instance */
/* Initialize LED GPIO settings */
XGpio_Initialize(&led_gpio, XPAR_AXI_GPIO_0_DEVICE_ID);
XGpio_SetDataDirection(&led_gpio, 1, 0);
我們透過(guò) printf 去顯示一些簡(jiǎn)單得除錯(cuò)訊息,這邊的訊息會(huì)透過(guò) UART 輸出,你可以透過(guò)計(jì)算機(jī)端的軟件來(lái)收到(ex: gtkterm、teraterm),我自己是透過(guò) emacs 的 serial-term 命令來(lái)收訊息,baud rate 則是設(shè)定為 115200 、連接目標(biāo)則是 /dev/ttyUSB1 。
/* Output something via UART1, 115200 baudrate */
printf("Start to blink led !!!\n\r");
最后,使用一個(gè)無(wú)窮循環(huán)去控制 LED 數(shù)值的變化,并透過(guò) XGpio_DiscreteWrite 去對(duì) GPIO 的通道 1 (參考前面 Block Design) 進(jìn)行數(shù)據(jù)寫(xiě)入的工程,再調(diào)整下一次到循環(huán)時(shí)要的 LED 數(shù)值,一直重復(fù)這些動(dòng)作。
就這樣,我們的程序完成了。
int led_value = 0x03; /* default led value */
while(1) {
printf("led value set to 0x%X\n\n", led_value);
/* Set GPIO Channel 1 value. */
XGpio_DiscreteWrite(&led_gpio, 1, led_value);
/* sleep and change led value */
simple_delay(10000000);
led_value = ~led_value;
}
下載到 Zybo board
確定此時(shí)你有將 Zybo board 接到計(jì)算機(jī),并且你 JP5 設(shè)定在 QSPI 模式下,就像這樣
選擇 Xilinx Tools -> Program FPGA 進(jìn)行 FPGA 的刻錄。
確認(rèn)要刻錄的數(shù)據(jù)無(wú)誤后,點(diǎn)選 Program 將比特流 (bitstream) 刻錄到 FPGA 去,燒完后你會(huì)發(fā)現(xiàn) LD0 ~ LD3 都是亮燈的狀態(tài),因?yàn)槲覀冊(cè)?Block Design 預(yù)設(shè) AXI_GPIO 輸出為 0xF 。
選擇 Run -> Run Configuration 進(jìn)行執(zhí)行前的一些設(shè)定。
我們?cè)?Xilinx C/C++ Application(GDB) 建立一個(gè)新的設(shè)定,由于我們已經(jīng)刻錄好 FPGA 因此只需要重起處理器系統(tǒng) (Processing System, PS)即可。
確認(rèn)你有啟用 ps7_init 這些設(shè)定,ps7_init 定義了一些初始化的程序,我們之所以能夠使用 printf 將信息透過(guò) UART 輸出,也是透過(guò) ps7_init 的協(xié)助,具體請(qǐng)參考 Zynq-7000 All Programmable SoC: Embedded Design Tutorial A Hands-On Guide to Effective Embedded System Design (UG1165), p.24 頁(yè)。
評(píng)論
查看更多