zynq开发系列2:GPIO连接MIO控制LED闪烁(SDK端代码编写详解)
- 根据文档只需要3步,zynq文档学习之向GPIO引脚写数据
- 把GPIO方向设置为输出
- 设置输出使能
- 写数据到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);
可以知道ConfigPtr
是XGioPs_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端代码编写详解)相关推荐
- zynq开发系列2:GPIO连接MIO控制LED闪烁
MIO连接得是PS端模块,UART用来输出调试信息,GPIO连接MIO再连接到PS端LED.zedboard上LED是MIO7 这次实验主要在PS端运行所以zynq核只需要留下DDR和FIXED_IO ...
- STM32开发笔记82: 使用C++语言控制LED闪烁
单片机型号:STM32L053R8T6 本文介绍应用C++语言控制LED闪烁的方法. 先看电路图,单片机PB12引脚控制LED的亮灭,当PB12引脚给出低电平LED亮,当PB12引脚给出高电平LED灭 ...
- petalinux zynq spi_ZYNQ 系列 01 | PL 实现按键控制 LED(1)
注:本篇文章由[开源骚客:OpenSoc]公众号首发,现转载至头条号. 新的开始,这一篇文章,就算是使用 Vitis 开发 ZYNQ 的第一篇文章吧. 计划把 ZYNQ 开发写成一个系列,所使用的的软 ...
- Code First开发系列之管理数据库创建,填充种子数据以及LINQ操作详解
本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LINQ to Entities 使用LINQ to Entities操作实体 L ...
- PWM控制LED亮度变化的原理(超详解)
PWM控制LED亮度变化的原理 通过ARR寄存器来设定预装载值,以确定循环频率和周期,计数器寄存器CNT从0开始计数,设定一个CCR寄存器的值,来跟CNT的计数值进行比较,当CNT的值小于CCR寄存器 ...
- RK3399平台开发系列讲解(内核入门篇)1.48、LDM数据结构详解
- zynq开发系列3:GPIO连接MIO通过按键控制LED灯亮起
按键和LED由MIO连接,在PS端用按键控制LED,按键按下时发出信号,LED接收到信号后亮起 可以参考上一节实验 zynq开发系列2:GPIO连接MIO控制LED闪烁 的流程和代码,在vivado操 ...
- ZYNQ开发系列——PS开发之HelloWorld
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列--PS开发之HelloWorld 前言 外设接口 SDK建立工程相关操作记录 前言 俗话说一日不见,如隔三秋.两年没 ...
- 使用 Arduino 和 Python在 Bluemix 上开发一个 IoT 应用程序之控制LED灯开关
上篇"[物联网(IoT)开发]Arduino 入门 Hello World(LED闪烁)"只是通过将一段程序烧录到Arduino开发板上控制LEC闪烁,没有任何连网动作,也就是说断 ...
最新文章
- PTA 基础编程题目集 7-33 有理数加法 C语言
- python中的List 和 Tuple
- 【错误记录】Android 中使用 Kotlin 为 EditText 组件设置文本报错 ( Type mismatch. Required:Editable. Found:String )
- RecyclerView高级控件-附实例【android专题】
- 朱峰谈概念设计(六):美术部门
- Mapreduce设置多路径输入输出
- OpenShift 4 之Istio-Tutorial (3) 监控微服务运行
- mongodb指南(翻译)(十六) - developer zone - 何时使用GridFS
- Json概述以及python对json的相关操作
- MSN Messenger去广告和其他修改方法
- 个头小本领大的员工——火车站巡检机器人
- html在浏览器中打开就是网站,浏览器打开网页的过程
- java maven 读写pdf_Java向PDF模板写入数据
- 【Rust 日报】2021-10-14 Rust是一种让你首先得到宿醉的语言
- length php,length与size()使用对比
- PFLD: A Practical Facial Landmark Detector--Xiaojie Guo
- c# 的取负数_c# – 负数范围可枚举
- 计算机公式乘法字处理,字符串乘法
- 【小5聊】情人节送给爱人的心形创意相册
- 荔枝微课如何引流?荔枝微课如何操作?荔枝微课怎么增加人气?
热门文章
- python开发自动化创建一个任务下发到手机_python自动化开发问题集
- mysql bin 分析_mysql bin log 分析
- 【链表】牛客网:链表删除
- java下载网络文件_java 从网络Url中下载文件
- 搭建Sublime Text3 Java编译运行环境
- ztree实现节点事件
- java swing对话框_Java开发笔记(一百三十五)Swing的文件对话框
- 【基础】算法的时间复杂度分析
- 【网络流24题】【LOJ6013】负载平衡(环形纸牌均分,最小费最大流)
- 接口 同花顺_Fiddler模拟接口数据(mock)