Xilinx zynq7000,zynq7k上GPIO使用笔记

来源:互联网 发布:监测游戏帧数软件 编辑:程序博客网 时间:2024/06/05 06:24


1 GPIO
ZYNQ7K上GPIO分为2类MIO和EMIO,MIO和常见的CPU管脚功能是一样的和很多外设是复用的,在使用前需要进行PIN Assignment,幸运的是这个PIN assignment可以在VIVADO 工具里
自动完成,并且会在FSBL里生成对应的代码完成管脚分配。当然用户也可以在应用程序中重新分配管脚。MIO共54个管脚分布在BANK0和BANK1,BANK1有32个,BANK2有22个每个BANK可以设置不同的电压等级。
MIO控制寄存器对应的基地址是0xE000A000

对MIO的控制主要要配置以下寄存器:
 DIRM_0/1
 OEN_0/1
 DATA_0/1
 DATA_RO_0/1
 MIO_PIN_xx (在SLCR寄存器组内使用前要先UNLOCK SR写保护)

EMIO是从PL侧扩展出的GPIO管脚(就像当于传统的FPGA提供了几个内存影射的寄存器,这些寄存器可用控制这些FPGA的官脚,同时这些寄存器地址对PS可直接访问
对EMIO的控制主要要配置以下寄存器:
 DIRM_2/3
 OEN_2/3
 DATA_2/3
 DATA_RO_2/3

 
配置MIO47,48,49为GPIO
     XLNX_ZYNQ7K_SR_REGISTER_WRITE(0xF80007BC,0x00001600);/*MIO47,GPIO*/
   
 XLNX_ZYNQ7K_SR_REGISTER_WRITE(0xF80007C0,0x00001600);/*MIO48,GPIO*/
   
 XLNX_ZYNQ7K_SR_REGISTER_WRITE(0xF80007C4,0x00001600);/*MIO49,GPIO*/ 


#define MIO32_53_DIR_ADDR  0xE000A244
#define MIO32_53_OEN_ADDR  0xE000A248

#define GPIO_REG_READ(addr)        \
    *((volatile UINT32 *)(addr))
#define GPIO_REG_WRITE(addr, data) \
    *((volatile UINT32 *)(addr)) = data

void sclk_low(void)
{
 UINT32 data;
 data=GPIO_REG_READ(MIO32_53_DATA);
 data&=~0x10000;
 GPIO_REG_WRITE(MIO32_53_DATA,data);
}


void mosi_high(void)
{
 UINT32 data;
 data=GPIO_REG_READ(MIO32_53_DATA);
 data|=0x4000;
 GPIO_REG_WRITE(MIO32_53_DATA,data);
}

void initGPIO46_49(void)
{
 UINT32 dir;
 UINT32 oen;

 
 dir=GPIO_REG_READ(MIO32_53_DIR_ADDR);
 oen=GPIO_REG_READ(MIO32_53_OEN_ADDR);


 dir|=0x34000;
 GPIO_REG_WRITE(MIO32_53_DIR_ADDR,dir);
 
 oen|=0x34000;
 GPIO_REG_WRITE(MIO32_53_OEN_ADDR,oen);
 

 
}

原创粉丝点击