PYNQ (ZYNQ) GPIO :MIO、EMIO、AXI_GPIO 代码实现pynq EMIO 点灯
程序员文章站
2024-02-23 21:32:04
...
GPIO
MIO、EMIO都是ps的
GPIO 的控制和状态寄存器基地址为:0xE000_A000,我们 SDK 下软件操作底层都是对于内存地址空间的操作。
xparameters.h
#define XPAR_PS7_GPIO_0_DEVICE_ID 0
#define XPAR_PS7_GPIO_0_BASEADDR 0xE000A000
#define XPAR_PS7_GPIO_0_HIGHADDR 0xE000AFFF
1) MIO的GPIO
是PS的I/O引脚, 是固定管脚的, 使用时不消耗PL资源
对应的BANK是BANK0,BANK1。
- 是其他功能使用剩余之后MIO可以做为GPIO.可以用在GPIO、SPI、UART、TIMER、Ethernet、USB等功能上,每个引脚都同时具有多种功能,故叫多功能
- 这是FIXIO有固定对应的引脚,不需要用户约束引脚。
- 实现仅仅依靠PS部分,即使用是PL可以不配置。不需硬件配置,直接使用SDK软件进行编程。可以看作是纯 PS 的操作。
- 共有32+22=54个,
- 在SDK内的编号是0-53.
2) EMIO的GPIO
EMIO依然属于PS,只是连接到了PL,再从PL输出信号。
通过PL扩展,使用时需要分配管脚,使用时消耗PL管脚资源。当 MIO 不够用时, PS 可以通过驱动 EMIO 控制 PL 部分的引脚 。
对应的BANK1和BANK2,
- 这些IO是不被复用的,并且可以接到FPGA的引脚,也可以连接外部的FPGA逻辑,是非常灵活的扩展,
- 其实现依靠PS和PL系统完成。共有32+32=64个,
- 在SDK内部的编号对应从54-117.
3)AXI_GPIO核
是封装好的IP核,PS通过M_AXI_GPIO接口控制PL部分实现IO,使用时消耗管脚资源和逻辑资源。
寄存器
1),DATA_RO 寄存器是读端口数值。
2),DATA 是数据输出寄存器。
3),DIRM,OEN分别是方向控制寄存器和输出使能寄存器。
4), MASK_DATA_LSW是每个BANK低16位的输出控制,包括掩码位和数据位。(注意和DATA功能有重叠)
CODE
PYNQ MIO没有直接的led,先测试EMIO
CONSTRAINT
##Switches
set_property -dict { PACKAGE_PIN M20 IOSTANDARD LVCMOS33 } [get_ports { GPIO_0_0_tri_io[0] }]; #IO_L7N_T1_AD2N_35 Sch=sw[0]
#set_property -dict { PACKAGE_PIN M19 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L7P_T1_AD2P_35 Sch=sw[1]
##LEDs
set_property -dict { PACKAGE_PIN R14 IOSTANDARD LVCMOS33 } [get_ports { GPIO_0_0_tri_io[1] }]; #IO_L6N_T0_VREF_34 Sch=led[0]
SDK
导入例子
int main(void)
{
int Status;
u32 InputData;
XGpioPs_Config *ConfigPtr;
printf("cccc");
//my_gpiops_wr(0x204,v);
printf("GPIO Polled Mode Example Test \r\n");
//load gpio
ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,
ConfigPtr->BaseAddr);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
//load gpio_R
ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
Status = XGpioPs_CfgInitialize(&Gpio_r, ConfigPtr,
ConfigPtr->BaseAddr);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
//in
XGpioPs_SetDirectionPin(&Gpio_r, 54, 0);
XGpioPs_SetOutputEnablePin(&Gpio_r,54, 0);
//out
XGpioPs_SetDirectionPin(&Gpio, 55, 1);
XGpioPs_SetOutputEnablePin(&Gpio, 55, 1);//Output_Pin
while(1)
{
//InputData=XGpioPs_ReadPin(&Gpio_r, 54 );
InputData=XGpioPs_ReadPin(&Gpio_r, 54);
XGpioPs_WritePin(&Gpio, 55, InputData);
}
上一篇: ASP.NET取得所有颜色值示例