gpio——mio学习
DATA_RO: 数据只读寄存器,通过该寄存器能够观察器件引脚上的值。
DATA:数据寄存器,该寄存器控制 GPIO信号配置为输出时要输出的值。该寄存器的所有 32位都是一次写入的。读取该寄存器返回写入 DATA或 MASK_DATA_ {LSW MSW}的先前值,它不会返回器件引脚的当前值。
MASK_DATA_LSW和 MASK_DATA_MSW:数据掩码寄存器,该寄存器使软件能够有选择地一次更改所需的的输出值。可以写入最多16位的任意组合。
DIRM:方向模式寄存器,用于控制 I/O引脚是用作输入还是输出。当 DIRM [x] == 0时,输出驱动器被禁用,该引脚作为输入引脚使用。
OEN:使能输出寄存器。将 I/O配置为输出时,该寄存器控制是否启用输出。禁用输出时,引脚为 3态。当 OEN [x] == 0时,输出被禁用。
gpio的几个函数函数分析:
1. ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID); //通过ID查找设备的基地址,每一个设备都会用到,包括后面的中断,DMA等。
#define GPIO_DEVICE_ID XPAR_PS7_GPIO_0_DEVICE_ID
2. Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);
// 初始化函数.首先各种参数的初始化,然后根据芯片型号选择赋值bank数和number数,最后关闭所有bank的所有pin的中断。
3. XGpioPs_SetDirectionPin(&Gpio, Output_Pin, 1);//设置pin脚的输入输出方向。1-out,0-in
里面主要涉及的函数有:
XGpioPs_GetBankPin((u8)Pin, &Bank, &PinNumber);//通过pin脚找到找到bank,以及所在bank上的pinNumber,以便操作寄存器。 //当mio为50的时候,pinNumber=18,&bank=1, pin为输入引脚号。
DirModeReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr,
((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) +
XGPIOPS_DIRM_OFFSET); //读所对应Bank的DIRM 寄存器的值
根据调用函数设置的方向参数设置方向,写回寄存器。
4. XGpioPs_SetOutputEnablePin(&Gpio, Output_Pin, 1); //和设置方向寄存器一个套路,设置所对应的bank的使能寄存器中的对应引脚使能。
5.XGpioPs_WritePin(XGpioPs *InstancePtr, u32 Pin, u32 Data)//向引脚写数据
首先也是通过pin脚,查找bank,以及对应的pinNumber,以便选择操作DATA_MSW和DATA_LSW寄存器。
计算写入数据的值,高16位为msk的值,低16位为data的值。
DataVar &= (u32)0x01;
Value = ~((u32)1 << (PinNumber + 16U)) & ((DataVar << PinNumber) | 0xFFFF0000U);
最后将数据写入对应的MSK/DATA寄存器。
XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr,
((u32)(Bank) * XGPIOPS_DATA_MASK_OFFSET) +
RegOffset, Value);
6. XGpioPs_ReadPin(XGpioPs *InstancePtr, u32 Pin) //读出对应的bank的pinNuber的寄存器DATA_RO的值。
(XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr,
((u32)(Bank) * XGPIOPS_DATA_BANK_OFFSET) +
XGPIOPS_DATA_RO_OFFSET) >> (u32)PinNumber) & (u32)1; //读出右移,输出0或者1.
其他:延时函数:
for (Delay = 0; Delay < LED_DELAY; Delay++);
/*
* main.c
*
* Created on: 2020年3月12日
* Author:
*/
/***************************** Include Files ********************************/
#include "xparameters.h"
#include "xgpiops.h"
#include "xstatus.h"
#include "xplatform_info.h"
#include <xil_printf.h>
#include "sleep.h"
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
#define MIO7 7
u32 Data;
int main(void){
int Status;
XGpioPs_Config *ConfigPtr;
XGpioPs Gpio; /* The driver instance for GPIO Device. */
xil_printf("MIO Test is begin!\r\n");
/* Initialize the GPIO driver. */
ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,
ConfigPtr->BaseAddr);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
//设置为输出
XGpioPs_SetDirectionPin(&Gpio, MIO7, 1);
//输出使能
XGpioPs_SetOutputEnablePin(&Gpio, MIO7, 1);
while(1){
/* Set the GPIO output to be low. */
XGpioPs_WritePin(&Gpio, MIO7, 0x1);
sleep(1);
Data = XGpioPs_ReadPin(&Gpio, MIO7);
XGpioPs_WritePin(&Gpio, MIO7, 0x0);
xil_printf("MIO Test is successful! MIO7\r\n");
sleep(1);
}
}