参考视频:
FPGA小白到精通共10讲:MIO GPIO结构简介_哔哩哔哩_bilibili
GPIO,MIO,EMIO的全称是什么
GPIO: General-Purpose Input/Output
MIO: Multiplexed Input/Output
EMIO: Extended Multiplexed Input/Output
关系图
将MIO配置成别的
MIO 引脚的配置原理
-
多路复用(Multiplexing):MIO 引脚的核心机制是多路复用。Zynq 的处理系统(PS)包含了多种外设(如 GPIO、UART、SPI 等),而 MIO 引脚的数量有限。通过多路复用技术,每个 MIO 引脚可以根据配置选择用于不同的外设功能。
-
功能选择:每个 MIO 引脚有多个预定义的功能,这些功能通过特定的配置寄存器选择。例如,一个 MIO 引脚可以被配置为 UART 的 Tx 引脚,也可以被配置为 SPI 的时钟引脚,具体取决于如何设置该引脚的功能。
通过配置MIO实现别的功能
如下图,MIO的第16到21。不能同时被定义为SD和SP。因为冲突了。
如下图,可以将uart即串口定义到mio的48到49.
GPIO的实现
EMIO的实现
下面的这段不理解.
、如下图所示目标,他的机理是什么呢?
代码和相应的注释
/*
* main.c
*
* Created on: 2024年8月26日
* Author: Administrator
*/
#include "xparameters.h"
#include "xgpiops.h"
#include "xstatus.h"
#include "xplatform_info.h"
#include <xil_printf.h>
// XPAR_XGPIOPS_0_DEVICE_ID 实际上是宏定义的0
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
#define LED_MIO_0 7
#define LED_MIO_1 8
// EMIO位宽为1,是54,位宽为2,是55,依次类推
#define LED_EMIO_0 54
/* The driver instance for GPIO Device. */
XGpioPs Gpio_ps;
int main()
{
// 实例化一个GPIO的配置指针
// typedef struct {
// u16 DeviceId; /**< Unique ID of device */
// u32 BaseAddr; /**< Register base address */
// } XGpioPs_Config;
XGpioPs_Config *Gpio_ConfigPtr;
/* Initialize the GPIO driver. */
// 传入一个设备ID,获取基地址等指针
Gpio_ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
// 返回值可以不要,因为正常情况下不会失败
XGpioPs_CfgInitialize(&Gpio_ps, Gpio_ConfigPtr,Gpio_ConfigPtr ->BaseAddr);
// 设置管脚的方向
// void XGpioPs_SetDirectionPin(XGpioPs *InstancePtr, u32 Pin, u32 Direction)
// InstancePtr是传入的结构体的指针,pin是管脚的MIO编号,Direction,1代表输出,0代表输入
XGpioPs_SetDirectionPin(&Gpio_ps, LED_MIO_0 , 1);
XGpioPs_SetDirectionPin(&Gpio_ps, LED_MIO_1 , 1);
XGpioPs_SetDirectionPin(&Gpio_ps, LED_EMIO_0, 1);
// 使能GPIO的管脚
XGpioPs_SetOutputEnablePin(&Gpio_ps, LED_MIO_0 , 1);
XGpioPs_SetOutputEnablePin(&Gpio_ps, LED_MIO_1 , 1);
XGpioPs_SetOutputEnablePin(&Gpio_ps, LED_EMIO_0 , 1);
// 给管脚写入数据
while(1)
{
XGpioPs_WritePin(&Gpio_ps, LED_MIO_0 , 0x0);
XGpioPs_WritePin(&Gpio_ps, LED_MIO_1 , 0x0);
XGpioPs_WritePin(&Gpio_ps, LED_EMIO_0 , 0x0);
sleep(1);
// 我在板子上面的LED
XGpioPs_WritePin(&Gpio_ps, LED_MIO_0 , 0x1);
// 没有连东西的MIO
XGpioPs_WritePin(&Gpio_ps, LED_MIO_1 , 0x1);
// 这个EMIO能够在XDC文件里面配置,我绑定了扩展板的led
XGpioPs_WritePin(&Gpio_ps, LED_EMIO_0 , 0x1);
sleep(1);
print("output!");
}
// 读取管脚
// Data = XGpioPs_ReadPin(&Gpio, Output_Pin);
return 0;
}
输出和板子的情况
并且此时的板子上面的灯和扩展板的灯是亮的
PS和PL联合调试,查看ila
要使用ila,这里不做勾选
在vivado中拉出ila