GPIO實驗
一、實驗原理
調用GPIO實現PS對引腳的控制
二、實驗步驟
1、建立工程
這部分是ivado的操作內容,這里不做過多說明。
2、添加ZYNQ處理器IP
在左側菜單欄中雙擊Create Block Design(bd為文件),在跳出的Diagram界面添加IP核processing_system7_0(點擊中間的加號后輸入zynq即可篩選出來)
3、配置IP核
勾選UART1用於調試,設置DDR用於下載,具體的配置方式根據相應的芯片做出設置。
4、添加兩個GPIO與總線連接的IP核
AXI-GPIO核添加和內核添加類似,直接調用IP核的庫就行。
5、設置輸入與輸出的GPIO-AXI核類型
輸入:
輸出:
6、自動連接和自動
在Diagram框內出現Run Block Automation 和 Run Connection Automation兩個選項,先后再前,依次執行,得到的效果圖·:
7、生成例化
在資源界面頂層文件右擊》generate Productor,默認生成即可。再右擊選擇Create HDL wrapped即可得到自動例化的文件。
8、配置引腳
雙擊open elaborated design,打開引腳管理器IO ports(2019的默認在右下角),根據原理圖選擇管腳。注意使用開發板的管教電壓。
9、綜合映射生成bit文件
這里本來有三個個步驟,但是可以合在一起執行。直接點擊左下角的generate Bitstream即可得到bit文件。這里需要比較長的時間,需要耐心等待。映射也是需要做的。
這里說明一下bit文件的作用。
生成好的bit文件可以在file》export中輸出hardware,生成的hardware可以使用sdk或者vitis平台讀取,形成自定義的硬件平台。換言之,截至到這一步,所有的硬件設備已經調用完成,不能再添加硬件設計了。下面的都是基於軟件的設計,不能修改硬件。所以這里需要檢查所有的硬件設計是否達標。由於這里設計簡單,就不做仿真了,使用過的全是IP核,具有保障。
成功的標志是生成xsa文件。
這里總是出現licence不支持的情況,如果使用是下載的licence的話,到licence管理器中刷新后重啟軟件好像可以解決,不確定。
10、vitis讀取硬件
在2019之前的版本使用的是SDK,可以自動調用,新出的vitis好像不行,需要自己引用文件。
11、新建application project
在file》new 》application project中新建一個文件。
需要更改的設置就是platform
這里的選擇Create a new platform from hardware,使用添加(加號)選擇vivado生成的xsa文件(默認位於工程目錄下,在生成的時候可以自己設置)
還有就是在不熟悉軟件的架構之前可以使用hello word 模板,可以有效縮短時間。
12、編寫代碼
找到主文件(工程名.c),寫入代碼。
由於這部分不做代碼設計的實驗,就先找了一份代碼作為測試:
#include <stdio.h> #include "platform.h" #include "xparameters.h" #include "xscugic.h" #include "xil_exception.h" #include "xgpio.h" #include <unistd.h> // usleep() #include <stdbool.h> // bool #define LED_DEVICE_ID XPAR_AXI_GPIO_1_DEVICE_ID #define KEY_DEVICE_ID XPAR_AXI_GPIO_0_DEVICE_ID XGpio LEDInst; XGpio KEYInst; u8 key_value_pre=0; u8 key_value_now=0; int main() { init_platform(); int status; status = XGpio_Initialize(&KEYInst, KEY_DEVICE_ID); // initial KEY if(status != XST_SUCCESS) return XST_FAILURE; status = XGpio_Initialize(&LEDInst, LED_DEVICE_ID); // initial LED if(status != XST_SUCCESS)return XST_FAILURE; XGpio_SetDataDirection(&KEYInst, 1, 1); // set KEY IO direction as in XGpio_SetDataDirection(&LEDInst, 1, 0); // set LED IO direction as out XGpio_DiscreteWrite(&LEDInst, 1, 0x0);// at initial, all LED turn off printf(">>> Press PL KEY1 ~ KEY4 one by one, and check the PL LED1 ~ LED4\n"); while(1) { usleep(100000); // 0.1s sleep, to debounce, in common, the meta-state will sustain no more than 20ms key_value_pre=key_value_now; key_value_now= XGpio_DiscreteRead(&KEYInst, 1) & 0x0F; XGpio_DiscreteWrite(&LEDInst, 1, key_value_now); if(key_value_pre!=key_value_now) printf("key state_changed!\n"); } cleanup_platform(); return 0; }
注:以上代碼源自小熊貓學堂
13、調試代碼
首先要搭建該工程的調試環境,使用小錘子圖標可以實現。
先debug編譯,再運行。編譯時選擇板上編譯。這兩個操作就是對應調試蟲和開始鍵,接觸過的人就應該知道。由於這個設計中加入了串口,所以還要加入端口,端口設置就不用多說了,做過串口實驗的就會。根據這個可以得到調試的結果。如果要下載的話則調用flash即可。
三、實驗結果
串口顯示結果:
開發板顯示結果: