axi_gpio操作--轉載我之前的blog的內容
阿新 • • 發佈:2018-11-15
兩個星期沒有更新了,入手板子一段時間以來發現難度還是挺大的,但是心急吃不了熱豆腐,所以打算還是從基礎的一步一步來,實現對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; }