1. 程式人生 > >axi_gpio操作--轉載我之前的blog的內容

axi_gpio操作--轉載我之前的blog的內容

兩個星期沒有更新了,入手板子一段時間以來發現難度還是挺大的,但是心急吃不了熱豆腐,所以打算還是從基礎的一步一步來,實現對GPIO操作。

1,ZYNQ7000GPIO介紹

ZYNQ7000上GPIO分為2類MIO和EMIO,MIO和常見的CPU管腳功能是一樣的和很多外設是複用的,在使用前需要進行PIN Assignment.MIO共54個管腳分佈在BANK0和BANK1 ,BANK1有32個,BANK2有22個每個BANK可以設定不同的電壓等級.MIO控制暫存器對應的基地址是0xE000A000但是在編譯生成硬體包裝時要對ps進行設定,不然MIO對應的引腳沒有映射出硬體地址

在ZYNQ裡面到處SDK生成硬體地址檔案System.hdf

而EMIO(全稱是Extendable MIO,即可擴充套件的MIO)是從PL側擴展出的GPIO管腳(就像當於傳統的FPGA提供了幾個記憶體影射的暫存器,這些暫存器可用控制這些FPGA的官腳,同時這些暫存器地址對PS可直接訪問。

在xparameters.h檔案裡生成的對應硬體地址為兩個,分別配置對應的GPIO:

API函式介面只能去賽靈思官網找手冊

2,一定要對執行進行配置,勾選重置!不然一直下不進去!!

GPIO外設提供的API函式實質就是把Xil_Out這樣的函式封裝了罷了

<span style="color:#404040"><span style="color:#333333"><code>#define RTC_IP_mWriteReg(BaseAddress, RegOffset, Data) \
  	Xil_Out32((BaseAddress) + (RegOffset), (u32)(Data))

void Xil_Out32(INTPTR Addr, u32 Value)
{
	u32 *LocalAddr = (u32 *)Addr;
	*LocalAddr = Value;
}
</code></span></span>

最後分別使用了PL端核PS端的GPIO驅動導致燈。

<span style="color:#404040"><span style="color:#333333"><code>#include "xgpiops.h"
#include "xgpio.h"
#include "sleep.h"
#include "platform.h"
int main()
{
	init_platform();
	u32 Delay;
	u32 Ledwidth;
static XGpioPs psGpioInstancePtr;
XGpioPs_Config* GpioConfigPtr;
XGpio GpioOutput;
int iPinNumber= 0; //LD9連線的是MIO0
int iPinNumber1= 13; //LD9連線的是MIO0
u32 uPinDirection = 0x1; //1表示輸出,0表示輸入
int xStatus,status;
//--MIO的初始化
    GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
if(GpioConfigPtr == NULL)
return XST_FAILURE;
xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr,GpioConfigPtr, GpioConfigPtr->BaseAddr);
if(XST_SUCCESS != xStatus)
print(" PS GPIO INIT FAILED \n\r");
//--MIO的輸入輸出操作

     XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber,uPinDirection);//配置MIO輸出方向
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber,1);//配置MIO的第7位輸出
XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber1,uPinDirection);//配置MIO輸出方向
XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber1,1);//配置MIO的第7位輸出

//EMIO
status=XGpio_Initialize(&GpioOutput, XPAR_AXI_GPIO_0_DEVICE_ID); //initialize GPIO IP
if(status != XST_SUCCESS) return XST_FAILURE;
XGpio_SetDataDirection(&GpioOutput, 1, 0x0); //set GPIO as output
XGpio_DiscreteWrite(&GpioOutput, 1, 0x0); //set GPIO output value to 0


while(1)
{
XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 1);//點亮MIO的第7位輸出1
XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber1, 1);//點亮MIO的第7位輸出1

for (Ledwidth = 0x0; Ledwidth < 4; Ledwidth++)
{
XGpio_DiscreteWrite(&GpioOutput, 1, 1 << Ledwidth);
for (Delay = 0; Delay < 8000000; Delay++);
XGpio_DiscreteClear(&GpioOutput, 1, 1 << Ledwidth);
}
sleep(1); //延時
XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 0);//熄滅MIO的第7位輸出0
XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber1, 0);//熄滅MIO的第7位輸出0
sleep(1); //延時
}
init_platform();
return 0;
}