2.GPIO_MIO_LED 实验
注:该实验,PYNQ_Z2板子MIO没有对应的LED接口,若需要观察实验现象,需要外部接入LED
硬件:PYNQ_Z2开发板
笔记
-
GPIO 是一个外设,用来对期间的引脚作
观测(i
n
p
u
t
)
\textcolor {red} {观测(input)}
观测(
in
p
u
t
)
以及
控制(o
u
t
p
u
t
)
\textcolor {red} {控制(output)}
控制(
o
u
tp
u
t
)
。 -
MIO(Multiuse I/O),将;来自PS 外设和静态存储器接口的访问
多路复用\textcolor {red} {多路复用}
多路复用
到PS 的引脚上。 -
GPIO可以独立且动态地编程,作为
输入/
输出
\textcolor {red} {输入/输出}
输入
/
输出
以及
中断模式\textcolor {red} {中断模式}
中断模式
。 -
GPIO被分成了4个Bank,
Ba
n
k
0
/
B
a
n
k
1
\textcolor {red} {Bank0/Bank1}
B
ank
0/
B
ank
1
通过
MI
O
\textcolor {red} {MIO}
M
I
O
连接到PS的引脚,Bank2/Bank3通过
EM
I
O
\textcolor {red} {EMIO}
EM
I
O
连接到PL。 -
软件通过一组
存储映射\textcolor {red} {存储映射}
存储映射
的寄存器来控制GPIO。 -
寄存器组:
DA
T
A
−
R
O
\textcolor {red} {DATA-RO}
D
A
T
A
−
RO
,数据只读寄存器,用来反映期间引脚的状态。
DA
T
A
\textcolor {red} {DATA}
D
A
T
A
,数据寄存器,在GPIO被配置成输出的时候,该寄存器可以控制输出的数值。
MA
S
K
−
D
A
T
A
−
L
S
W
\textcolor {red} {MASK-DATA-LSW}
M
A
S
K
−
D
A
T
A
−
L
S
W
,数据掩码寄存器,用于屏蔽DATA的低16位。
MA
S
K
−
D
A
T
A
−
M
S
W
\textcolor {red} {MASK-DATA-MSW}
M
A
S
K
−
D
A
T
A
−
MS
W
,数据掩码寄存器用,于屏蔽DATA的高16位。
DI
R
M
\textcolor {red} {DIRM}
D
I
RM
,方向模式寄存器,用于控制I/O引脚是 作为输入还是输出。0:关闭输出驱动;1:使能输出驱动。
OE
N
\textcolor {red} {OEN}
OEN
,使能输出寄存器,当I/O被配置成输出时,该寄存器用于打开/关闭输出使能。0:关闭输出使能;1:打开输出使能。 -
MIO[8:7]在系统复位过程中作为VMODE引脚(作为输入),用于配置MIO Bank的电压,复位结束后,MIO[8:7]只能作为输出信号。
+++
介绍
GPIO 外设一般用于控制一些简单的外设,如 LED 和蜂鸣器,此时 GPIO 用作输出;也可以用于观测一些简单外设的状态,如按键,此时 GPIO 用作输入。
GPIO 可以通过 MIO 连接到 PS 端的引脚,也可以通过 EMIO 连接到 PL。
除 Bank1 之外的 Bank 都具有 32bit,Bank1 只具有 22bit ,因为总共只有 54 个 MIO,其中 32bit 的 Bank0 控制了 MIO[0~31],剩下的 MIO[31~53]就由 22bit 的 Bank1 控制。Bank2 和 Bank3 用于控制扩展的 MIO 即 EMIO,也就是说总共可以有 32+32=64 个 EMIO。
实验过程
vivado2019.2版本使用的是vitis,在创建一个新的Application Projects后,会自动出现一个Board Support Package.
- 直接导入实例 Import Examples
- 找到main函数,点击GpioPolledExample函数(ctrl+左键)
- 找到初始化GPIO的驱动
/* Initialize the GPIO driver. */
ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);//根据器件的ID,查找器件的配置信息
//······中间隔了好几行······
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);//初始化GPIO驱动
-
//把GPIO的方向设置为输出 (0:输入/ 1:输出) XGpioPs_SetDirectionPin(&Gpio, MIO0_LED, 1); //设置输出使能(0:关闭/ 1:打开) XGpioPs_SetOutputEnablePin(&Gpio, MIO0_LED, 1); //写数据到GPIO的输出引脚(1点亮) XGpioPs_WritePin(&Gpio, MIO0_LED, 0x1);
-
LED闪烁效果,用sleep() 延时函数
while(1)
{
//点亮
XGpioPs_WritePin(&Gpio, MIO0_LED, 0x1);
//延时
sleep(1);
//熄灭
XGpioPs_WritePin(&Gpio, MIO0_LED, 0x0);
//延时
sleep(1);
}
/*sleep() 函数介绍
给一个以秒为单位的延时
变量为int型
在sleep.h头文件中,有其他类型的延时函数
usleep(unsigned long useconds);
以 us 为单位
*/
代码
#include "stdio.h"
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
//核心板上PS端LED(PYNQ板子上PS端没有LED,需要外部接入;但是可用EMIO控制)
#define MIO0_LED 0
XGpioPs_Config * ConfigPtr;
XGpioPs Gpio; /* The driver instance for GPIO Device. */
int main()
{
printf("GPIO MIO TEST!\n\r");
//根据器件的ID,查找器件的配置信息
ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
//初始化GPIO驱动
XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);
//把GPIO的方向设置为输出 (0:输入/ 1:输出)
XGpioPs_SetDirectionPin(&Gpio, MIO0_LED, 1);
//设置输出使能(0:关闭/ 1:打开)
XGpioPs_SetOutputEnablePin(&Gpio, MIO0_LED, 1);
// //写数据到GPIO的输出引脚(1点亮)
// XGpioPs_WritePin(&Gpio, MIO0_LED, 0x1);
//LED闪烁效果
while(1)
{
//点亮
XGpioPs_WritePin(&Gpio, MIO0_LED, 0x1);
//延时1s
sleep(1);
//熄灭
XGpioPs_WritePin(&Gpio, MIO0_LED, 0x0);
//延时1s
sleep(1);
}
return 0;
}