【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使用PIL库将PNG图片转换为ICO图标的示例代码

《Python使用PIL库将PNG图片转换为ICO图标的示例代码》在软件开发和网站设计中,ICO图标是一种常用的图像格式,特别适用于应用程序图标、网页收藏夹图标等场景,本文将介绍如何使用Python的... 目录引言准备工作代码解析实践操作结果展示结语引言在软件开发和网站设计中,ICO图标是一种常用的图像

C++ Primer 标准库vector示例详解

《C++Primer标准库vector示例详解》该文章主要介绍了C++标准库中的vector类型,包括其定义、初始化、成员函数以及常见操作,文章详细解释了如何使用vector来存储和操作对象集合,... 目录3.3标准库Vector定义和初始化vector对象通列表初始化vector对象创建指定数量的元素值

MyBatis与其使用方法示例详解

《MyBatis与其使用方法示例详解》MyBatis是一个支持自定义SQL的持久层框架,通过XML文件实现SQL配置和数据映射,简化了JDBC代码的编写,本文给大家介绍MyBatis与其使用方法讲解,... 目录ORM缺优分析MyBATisMyBatis的工作流程MyBatis的基本使用环境准备MyBati

spring @EventListener 事件与监听的示例详解

《spring@EventListener事件与监听的示例详解》本文介绍了自定义Spring事件和监听器的方法,包括如何发布事件、监听事件以及如何处理异步事件,通过示例代码和日志,展示了事件的顺序... 目录1、自定义Application Event2、自定义监听3、测试4、源代码5、其他5.1 顺序执行

MySQL 日期时间格式化函数 DATE_FORMAT() 的使用示例详解

《MySQL日期时间格式化函数DATE_FORMAT()的使用示例详解》`DATE_FORMAT()`是MySQL中用于格式化日期时间的函数,本文详细介绍了其语法、格式化字符串的含义以及常见日期... 目录一、DATE_FORMAT()语法二、格式化字符串详解三、常见日期时间格式组合四、业务场景五、总结一、

mysql线上查询之前要性能调优的技巧及示例

《mysql线上查询之前要性能调优的技巧及示例》文章介绍了查询优化的几种方法,包括使用索引、避免不必要的列和行、有效的JOIN策略、子查询和派生表的优化、查询提示和优化器提示等,这些方法可以帮助提高数... 目录避免不必要的列和行使用有效的JOIN策略使用子查询和派生表时要小心使用查询提示和优化器提示其他常

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

golang panic 函数用法示例详解

《golangpanic函数用法示例详解》在Go语言中,panic用于触发不可恢复的错误,终止函数执行并逐层向上触发defer,最终若未被recover捕获,程序会崩溃,recover用于在def... 目录1. panic 的作用2. 基本用法3. recover 的使用规则4. 错误处理建议5. 常见错

Python进行PDF文件拆分的示例详解

《Python进行PDF文件拆分的示例详解》在日常生活中,我们常常会遇到大型的PDF文件,难以发送,将PDF拆分成多个小文件是一个实用的解决方案,下面我们就来看看如何使用Python实现PDF文件拆分... 目录使用工具将PDF按页数拆分将PDF的每一页拆分为单独的文件将PDF按指定页数拆分根据页码范围拆分