• 根据文档只需要3步,zynq文档学习之向GPIO引脚写数据
  1. 把GPIO方向设置为输出
  2. 设置输出使能
  3. 写数据到GPIO的输出引脚
  • 参考官方参考教程学习编写代码(system.mss下没有这栏说明gpio没有生成成功,回vivado配置zynq核把gpio勾上)。打开第二个教程(第一个教程intr关于中断)
  • 打开 xgpiops_polles_example.c看见它把示例程序封装成一个独立的函数,按住ctrl点击GpioPolledExample进入函数
  • 查看函数GpioPolledExample,找到第1步初始化GPIO设备,把这两行代码复制进main.c,status用来接收返回状态可以去掉(可以看提示出错的地方)。先查找GPIO_DEVICE_ID可以看到上面有个宏定义,点击定义内容可以看见跳转至xparameters.h内,这个头文件包含了很多宏定义。关注的是GPIO驱动的宏定义,第一个是DEVICE_ID,第二个是基地址0xE000A000(寄存器起始地址),第三个是结束地址。
  • 解释一下为什么定义0,一般外设都有两个,例如USB。但GPIO实际上只有一个
#include "stdio.h"
int main() {/** 初始化GPIO驱动*/// 根据器件ID查找器件的配置信息ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);// 初始化GPIO驱动XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);return 0;
}
  • 把宏定义也粘贴进文档包括定义宏的文件
#include "stdio.h"
#include "xparameters.h"
#define GPIO_DEVICE_ID      XPAR_XGPIOPS_0_DEVICE_ID
int main() {ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);return 0;
}

  • 查找函数XGpioPs_LookupConfig() 进入xgpiopsps_sinit.c这个文件,查看XGpioPs_LookupConfig()函数的说明,根据器件ID查找器件配置信息,输入DeviceId返回一个指针类型变量 XGioPs_Config *。对应这行代码ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);可以知道 ConfigPtrXGioPs_Config *型变量。
  • 查看XGioPs_Config *,选择第一个进入xgpiops.h,可以看出这是一个结构体类型变量,里面有两个变量器件ID和寄存器基地址
  • ConfigPtr实际上在下一个函数XGpioPs_CfgInitialize()中作为参数用到了
#include "stdio.h"
#include "xparameters.h"
#include "xgpiops.h"
#define GPIO_DEVICE_ID      XPAR_XGPIOPS_0_DEVICE_ID
XGpioPs_Config * ConfigPtr;
int main() {ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);// 根据器件ID查找器件的配置信息XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);return 0;
}

  • 查找XGpioPs_CfgInitialize()函数进入到xgpiops.c文件,可以看到这个函数功能是初始化XGpioPs驱动,第一个参数是XGpioPs实例型指针XGpioPs *,第二个变量是上一节讲得ConfigPtr,同样为指针类型变量 XGioPs_Config *,第三个变量是有效地址
  • xgpiops_polles_example.c文件下查看参数Gpio发现转到一处定义XGpioPs Gpio;,拷贝进main.c
#include "stdio.h"
#include "xparameters.h"
#include "xgpiops.h"
#define GPIO_DEVICE_ID      XPAR_XGPIOPS_0_DEVICE_ID
XGpioPs Gpio;
XGpioPs_Config * ConfigPtr;
int main() {ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);// 根据器件ID查找器件的配置信息XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr); // 初始化GPIO驱动return 0;
}
  • 查看XGpioPs,这个结构体变脸驱动实例数据(instance data)。对GPIO所有操作都是通过XGpioPs进行
  • 可以看到XGpioPs_CfgInitialize()定义第一个变量是指针类型变量,故输入&Gpio用于取地址

  • 在示例程序xgpiops_polles_example.c往下看找到运行输出示例,查看函数GpioOutputExample(),可以看到两行设置输出方向和输出使能

  • 进入第一个函数XGpioPs_SetDirectionPin(),函数功能设置输出方向。第一个参数是指针指向XGpioPs实例XGpioPs Gpio;,第二个参数是操作的引脚,第三个参数是方向,0作为输入,1作为输出。

  • 确定器件引脚MIO 7,并且当输入高电平时灯亮起(实际上我是在板子上直接看得)。添加宏定义#define MIO7_LED 7

  • 进入设置输出使能函数查看XGpioPs_SetOutputEnablePin(),第三个参数为1是打开输出使能

#include "stdio.h"
#include "xparameters.h"
#include "xgpiops.h"
#define GPIO_DEVICE_ID      XPAR_XGPIOPS_0_DEVICE_ID
#define MIO7_LED 7
XGpioPs Gpio;
XGpioPs_Config * ConfigPtr;
int main() {ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);// 根据器件ID查找器件的配置信息XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr); // 初始化GPIO驱动XGpioPs_SetDirectionPin(&Gpio, MIO7_LED, 1); // 把GPIO方向设置为输出XGpioPs_SetOutputEnablePin(&Gpio, MIO7_LED, 1); // 设置输出使能return 0;
}

  • 准备写数据,在示例中点击XGpioPs_WritePin()查看函数的定义。重点看第三个参数Data,这是准备写到指定引脚的数,虽然是u32类型数据只能写0或1。1代表高电平。添加这行就可以点亮LEDXGpioPs_WritePin(&Gpio, MIO7_LED, 0x1);
#include "stdio.h"
#include "xparameters.h"
#include "xgpiops.h"
#define GPIO_DEVICE_ID      XPAR_XGPIOPS_0_DEVICE_ID
#define MIO7_LED 7
XGpioPs Gpio;
XGpioPs_Config * ConfigPtr;
int main() {ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);// 根据器件ID查找器件的配置信息XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr); // 初始化GPIO驱动XGpioPs_SetDirectionPin(&Gpio, MIO7_LED, 1); // 把GPIO方向设置为输出XGpioPs_SetOutputEnablePin(&Gpio, MIO7_LED, 1); // 设置输出使能XGpioPs_WritePin(&Gpio, MIO7_LED, 0x1); //点亮LEDreturn 0;
}
  • 完成闪烁效果用 #include "sleep.h"函数延时,usleep单位微秒
#include "stdio.h"
#include "xparameters.h"
#include "xgpiops.h"
#define GPIO_DEVICE_ID      XPAR_XGPIOPS_0_DEVICE_ID
#define MIO7_LED 7
XGpioPs Gpio;
XGpioPs_Config * ConfigPtr;
int main() {ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);// 根据器件ID查找器件的配置信息XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr); // 初始化GPIO驱动XGpioPs_SetDirectionPin(&Gpio, MIO7_LED, 1); // 把GPIO方向设置为输出while(1) {XGpioPs_WritePin(&Gpio, MIO7_LED, 0x1);usleep(500000);XGpioPs_WritePin(&Gpio, MIO7_LED, 0x0);usleep(500000);}return 0;
}

感谢正点原子B站发布的视频【第二期】手把手教你学ZYNQ之嵌入式开发篇

zynq开发系列2:GPIO连接MIO控制LED闪烁(SDK端代码编写详解)相关推荐

  1. zynq开发系列2:GPIO连接MIO控制LED闪烁

    MIO连接得是PS端模块,UART用来输出调试信息,GPIO连接MIO再连接到PS端LED.zedboard上LED是MIO7 这次实验主要在PS端运行所以zynq核只需要留下DDR和FIXED_IO ...

  2. STM32开发笔记82: 使用C++语言控制LED闪烁

    单片机型号:STM32L053R8T6 本文介绍应用C++语言控制LED闪烁的方法. 先看电路图,单片机PB12引脚控制LED的亮灭,当PB12引脚给出低电平LED亮,当PB12引脚给出高电平LED灭 ...

  3. petalinux zynq spi_ZYNQ 系列 01 | PL 实现按键控制 LED(1)

    注:本篇文章由[开源骚客:OpenSoc]公众号首发,现转载至头条号. 新的开始,这一篇文章,就算是使用 Vitis 开发 ZYNQ 的第一篇文章吧. 计划把 ZYNQ 开发写成一个系列,所使用的的软 ...

  4. Code First开发系列之管理数据库创建,填充种子数据以及LINQ操作详解

    本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LINQ to Entities 使用LINQ to Entities操作实体 L ...

  5. PWM控制LED亮度变化的原理(超详解)

    PWM控制LED亮度变化的原理 通过ARR寄存器来设定预装载值,以确定循环频率和周期,计数器寄存器CNT从0开始计数,设定一个CCR寄存器的值,来跟CNT的计数值进行比较,当CNT的值小于CCR寄存器 ...

  6. RK3399平台开发系列讲解(内核入门篇)1.48、LDM数据结构详解

  7. zynq开发系列3:GPIO连接MIO通过按键控制LED灯亮起

    按键和LED由MIO连接,在PS端用按键控制LED,按键按下时发出信号,LED接收到信号后亮起 可以参考上一节实验 zynq开发系列2:GPIO连接MIO控制LED闪烁 的流程和代码,在vivado操 ...

  8. ZYNQ开发系列——PS开发之HelloWorld

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列--PS开发之HelloWorld 前言 外设接口 SDK建立工程相关操作记录 前言 俗话说一日不见,如隔三秋.两年没 ...

  9. 使用 Arduino 和 Python在 Bluemix 上开发一个 IoT 应用程序之控制LED灯开关

    上篇"[物联网(IoT)开发]Arduino 入门 Hello World(LED闪烁)"只是通过将一段程序烧录到Arduino开发板上控制LEC闪烁,没有任何连网动作,也就是说断 ...

最新文章

  1. PTA 基础编程题目集 7-33 有理数加法 C语言
  2. python中的List 和 Tuple
  3. 【错误记录】Android 中使用 Kotlin 为 EditText 组件设置文本报错 ( Type mismatch. Required:Editable. Found:String )
  4. RecyclerView高级控件-附实例【android专题】
  5. 朱峰谈概念设计(六):美术部门
  6. Mapreduce设置多路径输入输出
  7. OpenShift 4 之Istio-Tutorial (3) 监控微服务运行
  8. mongodb指南(翻译)(十六) - developer zone - 何时使用GridFS
  9. Json概述以及python对json的相关操作
  10. MSN Messenger去广告和其他修改方法
  11. 个头小本领大的员工——火车站巡检机器人
  12. html在浏览器中打开就是网站,浏览器打开网页的过程
  13. java maven 读写pdf_Java向PDF模板写入数据
  14. 【Rust 日报】2021-10-14 Rust是一种让你首先得到宿醉的语言
  15. length php,length与size()使用对比
  16. PFLD: A Practical Facial Landmark Detector--Xiaojie Guo
  17. c# 的取负数_c# – 负数范围可枚举
  18. 计算机公式乘法字处理,字符串乘法
  19. 【小5聊】情人节送给爱人的心形创意相册
  20. 荔枝微课如何引流?荔枝微课如何操作?荔枝微课怎么增加人气?

热门文章

  1. python开发自动化创建一个任务下发到手机_python自动化开发问题集
  2. mysql bin 分析_mysql bin log 分析
  3. 【链表】牛客网:链表删除
  4. java下载网络文件_java 从网络Url中下载文件
  5. 搭建Sublime Text3 Java编译运行环境
  6. ztree实现节点事件
  7. java swing对话框_Java开发笔记(一百三十五)Swing的文件对话框
  8. 【基础】算法的时间复杂度分析
  9. 【网络流24题】【LOJ6013】负载平衡(环形纸牌均分,最小费最大流)
  10. 接口 同花顺_Fiddler模拟接口数据(mock)