ZYNQ学习笔记

                          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);

}


}


 


    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

### 回答1: zynq-linux移植学习笔记应包含以下内容: 1. 对zynq架构和硬件资源的理解,包括PS和PL部分的特点。 2. 如何使用Xilinx SDK来编译和配置u-boot和Linux内核。 3. 如何在硬件平台上运行和调试Linux系统。 4. 怎样在Linux系统中配置和使用各种硬件资源,如DMA、Ethernet、Flash等。 5. 如何在Linux系统中移植和运行应用程序,并与硬件资源进行交互。 6. 如何进行系统优化和资源管理,以提高系统性能和稳定性。 ### 回答2: Zynq是一款Xilinx公司开发的一种嵌入式系统芯片,其使用了双核Cortex-A9处理器和可编程逻辑器件(FPGA)的组合。移植Linux到Zynq芯片中,可以使其具备无限的扩展能力,极大地拓展了其应用领域,因此掌握Zynq-Linux移植技术是非常重要的。 Zynq-Linux移植分为四个主要步骤: 第一,准备工作 在移植前,需要确认硬件平台是否支持Linux运行,并且需要对硬件进行配置,最好使用Zynq开发板的官方配置; 第二,内核移植 内核移植是整个移植过程中最关键的一步。需要根据硬件平台的特性对内核进行选择和配置。可以从内核源代码库中获取内核代码,然后进行交叉编译。移植内核的过程中需要注意内核配置参数的设置,同时也要确保内核模块和驱动程序的编写。 第三,文件系统移植 在移植Linux的过程中,文件系统也是非常重要的。可以使用开发板官方Linux镜像,也可以自己编译镜像。移植文件系统还涉及到root文件系统的配置、挂载方式、网络配置和各种服务的配置等问题。 第四,驱动移植 驱动程序是连接硬件和软件的关键部分,需编写相应的驱动程序来实现对硬件的控制。移植驱动程序的过程中需要关注各种硬件接口和设备驱动API的使用,确保驱动程序与硬件配合良好。 总结来说,Zynq-Linux移植技术的掌握需要具备较强的Linux基础知识、驱动开发经验和交叉编译工具链的使用能力。同时,还需要有耐心和细心,对每个步骤进行仔细的分析和处理。 在学习中,需要结合实际开发项目,多进行实践操作才能更好地掌握Zynq-Linux移植技术,为后续项目的开发和应用提供更好的支持。 ### 回答3: Zynq-7000系列是一种由Xilinx开发的SoC(系统级芯片),它将双ARM Cortex-A9处理器和可编程逻辑(FPGA)集成在一起。这使得开发人员可以使用硬件加速加速器来加速运行在Linux上的各种应用。然而,实现这个目标需要进行移植。 在开始Zynq Linux移植学习笔记之前,需要一些基本的知识。首先,需要了解Linux内核的基本工作原理和Linux驱动程序的编写技术。然后,需要了解FPGA和SoC体系结构。 在开始移植之前,需要为SoC开发板选择正确的Linux发行版。这通常需要考虑处理器体系结构,内存大小和设备驱动程序的可用性。另外,还需要考虑是否需要自定义内核或驱动程序以满足应用程序的需求。 接下来,需要编写设备树文件(DT)来描述SoC架构。设备树文件是一种描述硬件配置信息的特殊语言。它会告诉内核有哪些设备可用以及如何访问这些设备。 接下来,需要配置Linux内核以支持Zynq-7000处理器。这可能包括启用适当的内核配置选项,编写设备驱动程序以及配置启动过程。 最后,需要启动Zynq板并验证Linux系统稳定运行。这些步骤包括在启动过程中将设备树文件加载到内存中,以及启动用户空间应用程序。 总之,移植Zynq Linux是一项复杂的任务,需要广泛的专业知识和技术。但是,它可以为开发人员提供强大的硬件加速支持,使他们能够加速处理一系列计算密集型应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bronceyang131

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值