Zynq7000的GPIO原理和控制实现

所需积分/C币:33 2019-04-26 16:30:16 1.03MB PDF
收藏 收藏
举报

主要讲述了GPIO的原理和控制实现,通过GPIO来操作MIO。
PS-PL ContinuatiOn summary Roper Lng 3bck DEs cn Search: ay 卜g Eesu priori FLCK CLKTRIG2 Enables PL clock nigger a gna2 uBec to h3‖ the pL clcs when co」 MIO Cu IicureliJll FLCK CLKTRIG3 Enables PL clock rigger soal 3] hall the PL clcc< when coI - c ock ReSB FCLK RESETO N sIal o FL lonc FCLK RE3ET1 N Enables signal 1 for PL lo? FCLK RESET2 N FCLK_RESET3_NI Enables genera purpose eset sinal 3 for PL lo c nlerurts )v Enable AXI Non Secure Transaction M AI GP) ntcmlcc Enbloc Genco purpose A mac cr in crtacc D Thread ID Widh Thread c wicth ter CP] interface M A GP1 nterface Enables Gene"a purpose A mas: er in erface 1 hread D wIgh 查看原理图,我们可以观察到uart是连到了MI012和MIO13这两根引脚上,并且Bank1的 电平标准是1.8v VCCs VCC5V CON1 a 2 UART pHY1T×04 1最餐器 PHY1 F PHYI XADC VP OTG CLK 444444444444466666666 s0c《BMoi0 2 OTC_CATA2 6 3岛 3 OTG DATAS 6 我们根据原理图,配置这一栏的uart和电平标准 nG-IL Ccnh guratio Search: Q He'lpreralJ0-in Hank U I VCMOS 3 3V PErpheral 030起·1B20223x2 Mos。 fig: ion □= ne inell Ene 口三hme1 3 这一栏是专门配置MI0的,可以看到MI0接口实现的所有功能。但是我们只需要让MIO 实现GPI0的功能就可以了,因北我们只需要勾选这一项。 MIO Configuration summary Renor Z'rqLockD∈sgn Benk 0 / village Lv'Cwos3 Bank 1 vO vcltaDeLVCMOS 1 MIO Cormguratl n Perth eral signal1o了y spoed rUnup DIrect Dr doC ComI qLraD3n SP11 DOR onnculalcn ApplI caion Frocesso'Urit programmable Lcgc Tsst and Debug 这是配置好的系统|P的 Block design processing_ system7 0 FIXED 10 ZYNQ FCLK CLKO FCLK RESETO N o ZYNQ7 Processing System 点击自动连线 QQ∷瓦eQ。+p Designer Assistance available Run BlacK Automation 生成输出文件 Sources x Design Signals 二口 Q三寺十回 r Design Sources (1) 热GI Source Node Properties Constraint Ctrl+E ) G Simulation C open File Alt+0 Create HDL wrapper. View Instantiation Template Generate Output Products. Reset Output Products Replace File Hierarchy IP Copy Flle Into Project 生成顶层HDL文件 Sources x Design Signals -口c Q三寺十回●0 a Design Sources (1) 品回GPo_ test (GPIo test h1 Constraints Source Node Properties Ctrl+E 户 Open file Alt+O Create HDL Wrapper View Instantiation Template Generate Output Products Reset output Products Replace Fil Hierarchy IP Sourc CoDy File Into Proiect 8 因为MO可以看作是纯PS操作,因此我们不需要其它的P操作,直接生成BT文件即 五、源代码分析 1.查找函数 这是一个查找函数,是用来查找GPO硬件设备的,一方面,利用这个函数查找一下 是不是存在GP|○这个硬件设备,另一方面,如果存在GPO设备,则要查询它的相关硬件 信息。 查找GPO的配置,然后判断是不是空的,如果是空的,则直接返回查找失败的标志 GpioConfigPtr XGpiops_ LookupConfig(XPAR_ PS7_GPIO_0 DEVICE_ID); if(GpioConfigPtr = NULL) return XST FAILURE 现在我们可以查看一下这个查找函数,是怎么查找GPO的硬件信息的, 本水本本事本本本事本本事事亭不事本本本事布本本事布本水水市木木水本木本本木本本本事寒市本客事本本事事 eXGpioPs_ Config *XGpioPs_ Lookup Config(u16 DeviceId) XGpioPs Config *CfgPtr NULL; u32 Index for (Index 0U; Index <(u32)XPAR_ XGPIOPS_ NUM_ INSTANCES; Index++)t if (XGpioPs ConfigTabLe/Index. DeviceId DeviceId)t CfgPtr &XGpioPs ConfigTabLe[Index]j break return (XGpioPs Config *)cfgptri 业△】 从上图可以看到,这端代码中含有一个设备配置向量表,通过查询这个设备配置向量表, 就可以查到GPO的相关配置信息,我们可以打开这个配置向量表看一下 XGpioPs_ Config XGpioPs ConfigTabLe[ XPAR_ XGPIOPS NUM_INSTANCES] ARps7GTo6DEⅵCEYD, XPAR PS7GP0日 BASEADDR 配置的信息有:设备D号,以及基地址 Definitions for peripheral pS7 GPIo 0 % #define xpar pst gpio 0 DEVIce ID e #define XPAR_PS7_ GPIO_0 BASEADDR 0xE000A000 #define Par ps7 GPIo 0 HIGHADDr 0xE000AFFF 我们可以记录一下这个基地址 GPIO BASEADDR OXEOOOA000 2初始化函数 这是一个初始化函数,用来初始化GPO设备的,如果初始化失败,通过串口会输出PS GPIO NT FALLED的信息。 status= XGpiops fgimitiaLize(apsGpioInstancePtr, GpioConfigptr, GpioconfigPtr->BaseAddr if(XST_ SUCCESS 1= XStatus) print(" PS GPIO INIT FAILED In\r )j 我们可以具体分析一下这个初始化函数。 因为不同的zynq系列,它的PS端的bank数是不同的,而且bank上的MO数量也是 不同的。对于zyma7000系列,它是有4个bank,MO和EMO一共有118b Initialize the Bank data based on platform % if (InstancePtr->PLatform = XPLAT_ ZYNQ ULTRA MP)t Max pins in the ZyngMP GPIo device 0-25, Bank 0 26-51,Banh1 *52-77,Banh2 78-169,Bank3 11-141,Ban4 *142-173,Banh5 InstancePtr->MaxPinNum =(u32)174; InstancePtr->MaxBanks =(u8)6, ) else t k Max pin s in the GPio device *32-53,Banh1 *54-85,Bank2 *86-117,Bank3 InstancePtr-)MaxPinNum =(u32)11 InstancePtr->MaxBanks =(u8)4; 这是一个写寄存器的函数,通过查询UG585我们可以知道这个寄存器的功能 XiL Out32((InstancePtr->GpioConfig BaseAddr )+(u32)(((u32)(i)*0x0e000040U)+0x00000214U) XE09A9+0x009214U E809A21 //(u32)(OxFF for (i=0;i<Instanceptr->MaxBanks; i++)t XGpioPsWriteReg(InstancePtr-)GpioConfig. BaseAddr, ((u32)(i)* XGPIOPS REG MASK _ OFFSET)+ XGPIOPSINTDIS_ OFFSET, OxFFFFFFFFU); 功能描述 默认情况下,在GP|O中不会屏蔽中断。 当往寄存器中写入 OXFFFFFFFF的时候,则为禁用4个bank的所有pin脚的中断。 3、设置M|O的方向 XGpioPs SetDirectionPin( &psGpioInstancePtr, iPinNumber, uPinDirection)]. 这个函数有两个参数,是比较重要的,一个是 iPinNumber,另一个是 iNdirection, 这两个参数都可以在宏定义中找到,我们可以查看一下具体含义 iPinNumber 这个参数是用来说明我们要操作的M○的标号,因为本次实验是控制PS端的LED灯, 我们可以看原理图psed是和MO的哪一根相连的 PS MIO7 461 PHY1 RESE PS MIO8 OTG RESET MIOg PS LED PS MIO11 PS KEY 我们可以看到, PS LED是和PSMO9相连的,因此我们这个参数,设置为9 int ipinNumber= 9 iNdiRection: 这个参数是设置我们要操作的MO9的方向,如果这个参数设置为1则是输出,如果 设置为0则为输入。 U32 uPinDirection=x1;1表示输出,日表示输入 3 首先利用这个函数,查找我们要操作的MO是处于哪个bank和在这个bank上pin number是多少( pinnumberinbank) * Get the Bank number and pin number within the bank, 3/ XGpioPs GetBankPin((us)Pin, &Bank, &PinNumber )i 我们可以具体分析一下这个函数 如下图所示:方框圈出来的地方就是程序查找BANK号的。一开始程序先判断了zYNQ 的类型,我们知道na7000是有四个bank的,因此当程序执行之后,其实程序运行的是 else部分的程序,我们可以看一下else部分的程序。程序首先给了四个bank的bank号的 最大值,然后初始化了bank号为0,紧接着进入whie循环语句,限制了bank的最大数量 是4。紧接着用pin的序号9从 bankO到bank4逐个对比,若是此时pin的序号小于或者等 于当前bank的最大值,则可以判断出pin是属于这个bank的,跳出whe语句,否则bank 号进行自加操作直到得出bank号 接下来又是一个if语句,首先是判断bank号是不是 bankO,若是则将 pinnumber直 接赋值给 pinnumberinbank,否则经过计算一段公式得出 pinnumberinbank 在这里我们要区分 ipinnumber和 pinnumberinbank ipinnumber pinnumberinbank banko 0-31 0-31 bank1 32-53 32-53 bank2 54-85 0-31 bank3 86-117 32-63 if (Platform = XPLAT_ ZYNQ ULTRA MP)t x This structure defines the mapping of the pin numbers to the banks when s the driver ApIs are used for working on the individuaL pins XGpioPsPinTable]=(u32)25;/*日-25,Bamh目 XGpioPsPinTable[ 1]=(u32)51;/* 26-51, Bank 1 XGpioPsPinTabLe[2]=(u32)77,/* 52-77, Bank 2*/ XGpioPsPinTable[3=(u32)109;/*78-109, Bank 3/ XGPioPsPinTable[4] =(u32)141;/* 110-141, Bank 4 ( GpioPsPinTable[5]=(u32)173;/* 242- 173 Bank 5 *BankNumber eU; while(◆ BurikNurber-<) if (PinNumber < XGpioPsPinTabLe/"BankNumbernt break (*BankNumber )++i XGpioPsPinTable[o=(u32)31;/*0-31, Bank 0 * (GpioPsPinTable[1]=(u32)53; /* 32-53, Bank 1 XGPioPsPinTable[2 =(u32)85; /*54-85, Bank 2* XGpioPsPinTable[3]=(u32)117;/*86-117 Bank 3 *y/ *BankNumber while(*BankNumber< 4n)i if(PinNumber < XGpioPsPinTabLe[*BankNumber ])i (*BankNumber )++i f (*BankNumber ==(uB)0) nNumberinBank PinNumber eLse *PinNundber In Bunk =(u8)((u52)PirNuudrer7 (XGpioPsPinTablelBankMumber-(u8)1]+(u32)1))j 这是一个读寄存器,我们可以看一下这个寄存器的功能 //XiL In32((InstancePtr->GpioConfig BaseAddr )+(u32)(((u32)(Bank)*ex00000040U)+0x80000204U) //=0XE000A000 +(bank s 0xeoe0ee40U)+0x00000204U= E000A204 DirModeReg XGpioPs ReadReg(InstancePtr->GpioConfig BaseAddr> ((u32)(Bank)*XGPTOPS REG MASK_ OFFSET)+ XGPIOPS_ DIRM_ CFFSET) 功能描述: 通过读取这个寄存器的值,判断 BANKO上的Mo310是输入还是输出模式。 这是一个计算,最后求得 DirModeReg的值 if (Direction! =(u32)0)t/* Output Direction * DirModeReg =((u32)1<<(u32) PinNumber); f else i/* Input Direction DirModeReg &=-((u32)1<<(u32)PinNumber )j 这是一个写寄存器函数,我们可以分析这个寄存器实现的功能 / XiL out32((InstancePtr->GpioConfig BaseAddr )+(u32)(((u32)(Bank)*0x00000040U)+0x00000204U / 0XE000A000 +(bank 0x000e0040U)+0x00e00204U (u32)(DirModeReg)) XGpioPs_WriteReg (InstancePtr->GpioConfig BaseAddr XGPIOPS DIRM OFFSE, DirModeReg); 功能描述: 通过往这个寄存器写入数据,可以控制BANK0上的32根MO引脚的方向是输入还 是输出。本次实验只是设置了Mo9这根引脚作为输出引脚。 4使能M|O引脚 XGpioPs_ SetoutputEnabLePin(&psGpioInstancePtr, iPinNumber, 1)j 我们分析一下这个函数 首先利用这个函数,查找我们要操作的MO是处于哪个bank和在这个bank上的 P| N number是多少( pinnumberinbank)。因为这个函数在上面已经分析了,这里就不再 进行分析 Get the Bank number and Pin number within the bank. * XGpioPs GetBankPin((ua)Pin, &Bank, &PinNumber)j XiL In32((InstancePtr->GpioConfig, BaseAddr)+(u32)(((u32)(Bank)* 0x00000040U)+0x00000208U)) 0XEB00A000 +(bank 4 0x0000004eu)+ 0x00000208U E000A208 OpEnabLeReg XGpiops_ ReadReg (Instanceptr->GpioConfig BaseAddr ((u32)(Bank)*XGPTOPS REG MASK_ OFFSET)+ XGPIOPS_ OUTEN_ OFFSET); 功能描述 当bank0上的M|○配置成输出类型,这个寄存器控制着MO是否启用输出。也就是虽 然这个引脚已经设置成了输出的类型,但是需要使能,这个引脚才能使用。 因此,先读取这个寄存器,目的就是为了看一下,bank0上的MO引脚是不是已经使 能了。 3 这依旧是一个计算,目的是求出 openablereg的值

...展开详情
试读 14P Zynq7000的GPIO原理和控制实现
立即下载 低至0.43元/次 身份认证VIP会员低至7折
    抢沙发
    一个资源只可评论一次,评论内容不能少于5个字
    img

    关注 私信 TA的资源

    上传资源赚积分,得勋章
    最新推荐
    Zynq7000的GPIO原理和控制实现 33积分/C币 立即下载
    1/14
    Zynq7000的GPIO原理和控制实现第1页
    Zynq7000的GPIO原理和控制实现第2页
    Zynq7000的GPIO原理和控制实现第3页
    Zynq7000的GPIO原理和控制实现第4页
    Zynq7000的GPIO原理和控制实现第5页

    试读已结束,剩余9页未读...

    33积分/C币 立即下载 >