ZYNQ-GPIO外设

[复制链接]
发表于 2025-10-1 23:15:33 | 显示全部楼层 |阅读模式
重新开始学ZYNQ开发,学完上linux体系
底子知识:ZYNQ 的三种GPIO :MIO、EMIO、AXI - FPGA/ASIC技能 - 电子发烧友网
GPIO是ZYNQ PS端的一个IO外设,用于观测(input)和控制(output)器件引脚的状态 
MIO(Multiplexed I/O)多路复用IO。是ZYNQ PS端的一部门,未来自PS外设和静态存储器接口的访问多路复用到PS引脚上,直接毗连到PS端的引脚,用于控制外设(如LED、按键等)。MIO的引脚位置是固定的,不必要像PL端那样举行引脚束缚。
EMIO(Extended MIO),扩展的MIO。EMIO是PS与PL的接口,当PS引脚不敷用的时间,可以利用EMIO来举行扩展,从而利用PL的IO;当某个装备硬件已经毗连到PL端,但是通过Verilog代码实现较复杂的时间,可以用EMIO让PS端来驱动。
 GPIO分组:Bank0:32位控制MIO[31:0];Bank1:32位控制MIO[53:32];                                        Bank2:32位控制EMIO[31:0];Bank3:32位控制EMIO[63:32]。
软件通过GPIO可以独立且动态的编程,作为输入/输出以及停止模式。

实验任务一:点灯大家(基于寄存器)利用PS端的MIO控制两个LED,实现LED闪耀的效果,闪耀隔断为1s。
第一步:在vivado上block design中创建了一个最小体系(system)作为zynq的ps端。在最小体系(DDR3+UART)中添加了GPIO(通用输入输出)外设,负责管理和控制MIO引脚的状态。GPIO通过MIO引脚直接毗连到LED,实现对其的控制。

 第二步:代码逻辑控制ps端,通过GPIO的数据手册中的几个寄存器控制LED.

  1. #include <stdio.h>
  2. #include "xil_io.h"
  3. #include "sleep.h"
  4. #define GPIOPS_BASE_ADDRESS          0xE000A000  // GPIO基地址
  5. #define XGPIOPS_DIRM_OFFSET          0x00000204  // 方向模式寄存器偏移地址
  6. #define XGPIOPS_OUTEN_OFFSET          0x00000208  // 输出使能寄存器偏移地址
  7. #define XGPIOPS_DATA_LSW_OFFSETR 0x00000000  // 带屏蔽的数据寄存器偏移地址
  8. int main() {
  9.     printf("GPIO MIO TEST!\n");
  10.     // 对GPIO引脚进行配置
  11.     // 配置方向模式寄存器,使MIO7和MIO8为输出模式
  12.     Xil_Out32(GPIOPS_BASE_ADDRESS + XGPIOPS_DIRM_OFFSET, 0x00000180);  // 0000_0000_0000_0000_0000_0001_1000_0000
  13.     // 配置输出使能寄存器,使MIO7和MIO8输出使能
  14.     Xil_Out32(GPIOPS_BASE_ADDRESS + XGPIOPS_OUTEN_OFFSET, 0x00000180); // 0000_0000_0000_0000_0000_0001_1000_0000
  15.     while (1) {
  16.         // 点亮MIO7,熄灭MIO8
  17.         Xil_Out32(GPIOPS_BASE_ADDRESS + XGPIOPS_DATA_LSW_OFFSETR, 0xff7f0080); // 0000_0000_0000_0000_0000_0000_1000_0000
  18.         sleep(1); // 延迟1秒
  19.         Xil_Out32(GPIOPS_BASE_ADDRESS + XGPIOPS_DATA_LSW_OFFSETR, 0xff7f0000); // 0000_0000_0000_0000_0000_0000_1000_0000
  20.         sleep(1); // 延迟1秒
  21.         // 点亮MIO8,熄灭MIO7
  22.         Xil_Out32(GPIOPS_BASE_ADDRESS + XGPIOPS_DATA_LSW_OFFSETR, 0xfeff0100); // 0000_0000_0000_0000_0000_0001_0000_0000
  23.         sleep(1); // 延迟1秒
  24.         Xil_Out32(GPIOPS_BASE_ADDRESS + XGPIOPS_DATA_LSW_OFFSETR, 0xfeff0000); // 0000_0000_0000_0000_0000_0001_0000_0000
  25.         sleep(1);
  26.     }
  27.     return 0;
  28. }
复制代码
实验任务二:点灯大家(基于库函数)利用PS端的MIO控制两个LED,实现LED闪耀的效果,闪耀隔断为1s(和实验一逻辑是一样)。
  1. #include <stdio.h>
  2. #include "xparameters.h"
  3. #include "xgpiops.h"
  4. #include "sleep.h"
  5. #define GPIO_DEVICE_ID                XPAR_XGPIOPS_0_DEVICE_ID
  6. #define MIO_LED0            7 //MIO 7
  7. #define MIO_LED1            8 //MIO 7
  8. XGpioPs Gpio;
  9. int main(){
  10.         XGpioPs_Config *ConfigPtr;
  11.         printf("GPIO TEST SUCCESS!\n");
  12.         //对GPIO进行初始化(两步)    /* Initialize the GPIO driver. */
  13.         //第一步:根据器件ID去查找器件的配置信息
  14.         ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
  15.         //第二步:对GPIO的驱动进行初始化
  16.         XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);
  17.         //设置引脚的方向,0为输入,1为输出
  18.         XGpioPs_SetDirectionPin(&Gpio, MIO_LED0, 1);
  19.         XGpioPs_SetDirectionPin(&Gpio, MIO_LED1, 1);
  20.         //设置输出使能,1:使能输出,0:不使能输出
  21.         XGpioPs_SetOutputEnablePin(&Gpio, MIO_LED0, 1);
  22.         XGpioPs_SetOutputEnablePin(&Gpio, MIO_LED1, 1);
  23.         while(1){
  24.         //对引脚输出为高电平,点亮LED灯
  25.         XGpioPs_WritePin(&Gpio, MIO_LED0, 0x1);
  26.         sleep(1);
  27.         //交替闪烁
  28.         XGpioPs_WritePin(&Gpio, MIO_LED1, 0x1);
  29.         sleep(1);
  30.         //对引脚输出为低电平,熄灭LED灯   /* Set the GPIO output to be low. */
  31.         XGpioPs_WritePin(&Gpio, MIO_LED0, 0x0);
  32.         sleep(1);
  33.         XGpioPs_WritePin(&Gpio, MIO_LED1, 0x0);
  34.         sleep(1);
  35.         }
  36.         return 0;
  37. }
复制代码
上板验证:

实验任务3:利用两个用户按键分别控制PS端的两个LED灯的亮灭,此中一个按键必要通过EMIO举行扩展(PL端的到场)。必要增长GPIO输入的功能,实验二GPIO用于输出。

只必要在任务2中vivado ps端的IO设置中勾选上emio接口,且emio位宽设置为1(由于只必要一个PL端的按键去控制PS端的灯)。假如必要多个位宽,则必要在vivado中的xdc文件举行引脚束缚,否则会报错!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表