【ZYNQ】ZYNQ7000 XADC 及其驱动示例

2023-12-23 21:44
文章标签 驱动 示例 zynq xadc zynq7000

本文主要是介绍【ZYNQ】ZYNQ7000 XADC 及其驱动示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

XADC 简介

ZYNQ SoC 的 XADC 模块包括两个 12 位的模数转换器,转换速率可以达到 1MSPS(每秒一百万次采样)。它带有片上温度和电压传感器,可以测量芯片工作时的温度和供电电压。

在 7 系列的 FPGA 中,XADC 提供了 JTAG 和 DRP(dynamic reconfiguration port)接口,用于访问其内部的状态和控制寄存器。在 ZYNQ-7000 SoC 器件中,XADC 增加了一个 PS-XADC 接口,用于 PS 中的软件控制 XADC 模块。

XADC 模块的系统框图如下所示:

在这里插入图片描述

在图中 PL-JTAG 接口可以用于开发工具(Vivado)控制 XADC 模块,包括读取芯片温度信息等。而运行在 PS 中的软件则可以通过两种方式与 XADC 进行通信:

  • 1、 通过 PS-XADC 接口,此时不需要对 PL 进行编程配置;
  • 2、 通过 PS 到 PL 的 AXI Master 接口(M_AXI_GP),此时需要在 PL 中调用 AXI XADC IP 核。

在使用 PS 控制 XADC 时,如果对应用的性能要求较高,则推荐第二种方式,它使用的是一个并行的数据路径(DRP 接口)。而 PS-XADC 接口同 PL-JTAG 接口一样,使用的是串行的数据路径,相对较慢。不过使用 PS-XADC 接口不占用 PL 的资源,也不需要对 PL 进行编程,只需要对 PL 部分供电即可。

需要注意的是,PL-JTAG 接口与 PS-XADC 接口不能同时使用。而 XADC 可以在 PL-JTAG 接口(或PS-XADC 接口)与 DRP 接口之间进行仲裁。

硬件设计

XADC 为硬核模块,不需要对 PL 进行配置。PS 端只需完成 UART、DDR 等基础配置就可以。

在这里插入图片描述

软件设计

本实验通过 PS-XADC 接口实现,创建基础 SDK 工程即可,添加源代码:

  • xadc.h
/*** Copyright (c) 2022-2023,HelloAlpha* * Change Logs:* Date           Author       Notes*/
#ifndef __XADC_H__
#define __XADC_H__#define USING_XADC#ifdef USING_XADC
#include "xparameters.h"
#include "xadcps.h"#define XADC_DEVICE_ID	XPAR_XADCPS_0_DEVICE_IDstruct Xadc_Data
{float temp;     // Temperaturefloat vccint;   // PL kernel voltagefloat vccaux;   // PL auxiliary voltagefloat vccbram;  // PL BRAM voltagefloat vccpint;  // PS kernel voltagefloat vccpaux;  // PS auxiliary voltagefloat vccpdro;  // PS DDR voltageuint16_t raw_temp;uint16_t raw_vccint;uint16_t raw_vccaux;uint16_t raw_vccbram;uint16_t raw_vccpint;uint16_t raw_vccpaux;uint16_t raw_vccpdro;
};typedef struct Xadc_Data XadcData_t;int XadcPs_Init(XAdcPs *XadcInstancePtr, uint16_t DeviceId);
void XadcPs_GetData(XAdcPs *XadcInstancePtr, XadcData_t *XadcData);#endif
#endif
  • xadc.c
/*** Copyright (c) 2022-2023,HelloAlpha* * Change Logs:* Date           Author       Notes*/
#include "xadc.h"#ifdef USING_XADC
int XadcPs_Init(XAdcPs *XadcInstancePtr, uint16_t DeviceId)
{int Status;XAdcPs_Config *XadcConfigPtr;XadcConfigPtr = XAdcPs_LookupConfig(DeviceId);if (NULL == XadcConfigPtr) {return XST_FAILURE;}Status = XAdcPs_CfgInitialize(XadcInstancePtr, XadcConfigPtr, XadcConfigPtr->BaseAddress);if (Status != XST_SUCCESS) {return XST_FAILURE;}XAdcPs_SetSequencerMode(XadcInstancePtr, XADCPS_SEQ_MODE_SAFE);return Status;
}void XadcPs_GetData(XAdcPs *XadcInstancePtr, XadcData_t *XadcData)
{XadcData->raw_temp = XAdcPs_GetAdcData(XadcInstancePtr, XADCPS_CH_TEMP);XadcData->temp = XAdcPs_RawToTemperature(XadcData->raw_temp);XadcData->raw_vccint = XAdcPs_GetAdcData(XadcInstancePtr, XADCPS_CH_VCCINT);XadcData->vccint = XAdcPs_RawToVoltage(XadcData->raw_vccint);XadcData->raw_vccaux = XAdcPs_GetAdcData(XadcInstancePtr, XADCPS_CH_VCCAUX);XadcData->vccaux = XAdcPs_RawToVoltage(XadcData->raw_vccaux);XadcData->raw_vccbram = XAdcPs_GetAdcData(XadcInstancePtr, XADCPS_CH_VBRAM);XadcData->vccbram = XAdcPs_RawToVoltage(XadcData->raw_vccbram);XadcData->raw_vccpint = XAdcPs_GetAdcData(XadcInstancePtr, XADCPS_CH_VCCPINT);XadcData->vccpint = XAdcPs_RawToVoltage(XadcData->raw_vccpint);XadcData->raw_vccpaux = XAdcPs_GetAdcData(XadcInstancePtr, XADCPS_CH_VCCPAUX);XadcData->vccpaux = XAdcPs_RawToVoltage(XadcData->raw_vccpaux);XadcData->raw_vccpdro = XAdcPs_GetAdcData(XadcInstancePtr, XADCPS_CH_VCCPDRO);XadcData->vccpdro = XAdcPs_RawToVoltage(XadcData->raw_vccpdro);
}
#endif
  • app_xadc.c
/*** Copyright (c) 2022-2023,HelloAlpha* * Change Logs:* Date           Author       Notes*/
#include "xadc.h"#ifdef USING_XADC
#include "stdio.h"
#define kprintf printf/*** xil_printf does not support printing floating point numbers
*/static XAdcPs Xadc;
static XadcData_t xadc_data;int xadc_read_data(void)
{XadcPs_GetData(&Xadc, &xadc_data);kprintf("On Chip Temperature:  %f C    \r\n", xadc_data.temp);kprintf("PL Kernel Voltage:     %f V    \r\n", xadc_data.vccint);kprintf("PL Auxiliary Voltage:  %f V    \r\n", xadc_data.vccaux);kprintf("PL BRAM Voltage:       %f V    \r\n", xadc_data.vccbram);kprintf("PS Kernel Voltage:     %f V    \r\n", xadc_data.vccpint);kprintf("PS Auxiliary Voltage:  %f V    \r\n", xadc_data.vccpaux);kprintf("PS DDR Voltage:        %f V    \r\n", xadc_data.vccpdro);return 0;
}int app_xadc_init(void)
{int Status = XST_SUCCESS;Status = XadcPs_Init(&Xadc, XADC_DEVICE_ID);if (Status != XST_SUCCESS) {return XST_FAILURE;}return Status;
}
#endif

更多 ZYNQ 相关源码也可以在这里 Github ZYNQ-SPACE 找到。

主函数种首先调用 app_xadc_init() 对 XADC 初始化,需要读取时调用 xadc_read_data() 即可。

验证

  • 测试平台:黑金ZYNQ7035
  • 开发工具:Vivado2017.4
  • 实验现象:

在这里插入图片描述

参考资料

  • UG585
  • 正点原子 ZYNQ 领航者
  • 黑金 ZYNQ7035

更多内容

  • CSDN博客:@Hello阿尔法
  • 哔哩哔哩:@Hello阿尔法
  • 知乎:@Hello阿尔法

这篇关于【ZYNQ】ZYNQ7000 XADC 及其驱动示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/529571

相关文章

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul