ZYNQ系列學習GPIO實驗


 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即可。

 

三、實驗結果

串口顯示結果:

開發板顯示結果:

 視頻連接

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM