7.2 - 定时器之计算脉冲宽度实验
文章目录
- 1 实验任务
- 2 系统框图
- 3 软件设计
1 实验任务
本实验任务是通过CPU私有定时器来计算按键按下的时间长短。
2 系统框图
参见7.1。
3 软件设计
注意事项:
- 定时器是递减计数的,需要考虑StartCount<EndCount的情况。
/***************************** Include Files ********************************/
#include <stdio.h>
#include "xparameters.h"
#include "xgpiops.h"
#include "xscutimer.h"
#include "xstatus.h"
/************************** Constant Definitions ****************************/
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
#define TIMER_DEVICE_ID XPAR_XSCUTIMER_0_DEVICE_ID#define PS_KEY0_GPIO_PIN 50#define TIMER_LOAD_VALUE 0xFFFFFFFF#define TIMER_CLK_FREQ XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ / 2
/**************************** Type Definitions ******************************//***************** Macros (Inline Functions) Definitions ********************//************************** Function Prototypes *****************************/
int GpioInit(XGpioPs* GpioInstPtr);
int TimerInit(XScuTimer* TimerInstPtr);
/************************** Variable Definitions ****************************/
XGpioPs GpioInst;
XScuTimer TimerInst;u32 StartCount = 0;
u32 EndCount = 0;
/****************************************************************************/int GpioInit(XGpioPs* GpioInstPtr)
{//int Status;XGpioPs_Config* GpioPsConfigPtr;//GpioPsConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);Status = XGpioPs_CfgInitialize(GpioInstPtr, GpioPsConfigPtr, GpioPsConfigPtr->BaseAddr);if (Status != XST_SUCCESS) {return XST_FAILURE;}// 设置输入XGpioPs_SetDirectionPin(GpioInstPtr, PS_KEY0_GPIO_PIN, 0);//return XST_SUCCESS;
}int TimerInit(XScuTimer* TimerInstPtr)
{//int Status;XScuTimer_Config* TimerConfigPtr;//TimerConfigPtr = XScuTimer_LookupConfig(TIMER_DEVICE_ID);Status = XScuTimer_CfgInitialize(TimerInstPtr, TimerConfigPtr, TimerConfigPtr->BaseAddr);if (Status != XST_SUCCESS) {return XST_FAILURE;}// 自动加载XScuTimer_EnableAutoReload(TimerInstPtr);// 加载初值XScuTimer_LoadTimer(TimerInstPtr, TIMER_LOAD_VALUE);//return XST_SUCCESS;
}int main()
{//int Status;u32 KeyValue;u32 CountDiff;u32 TimerClkFreq = TIMER_CLK_FREQ;float PressedTime;//Status = GpioInit(&GpioInst);if (Status == XST_FAILURE) {printf("GPIO Init Failed.\n");}//Status = TimerInit(&TimerInst);if (Status == XST_FAILURE) {printf("Timer Init Failed.\n");}// 启动定时器XScuTimer_Start(&TimerInst);//printf("Press the key to start timing...\n");//while(1){// 等待按键按下while (1) {KeyValue = XGpioPs_ReadPin(&GpioInst, PS_KEY0_GPIO_PIN);if (KeyValue == 0) { // 按键按下为低电平StartCount = XScuTimer_GetCounterValue(&TimerInst);printf("Key pressed, timing started.\n");break;}}// 等待按键释放while (1) {KeyValue = XGpioPs_ReadPin(&GpioInst, PS_KEY0_GPIO_PIN);if (KeyValue == 1) { // 按键释放为高电平EndCount = XScuTimer_GetCounterValue(&TimerInst);printf("Key released, timing stopped.\n");break;}}// 计算差值if (EndCount > StartCount) {printf("EndCount > StartCount.\n");CountDiff = (0xFFFFFFFF - EndCount) + StartCount + 1; // 注意:定时器会溢出}else {printf("EndCount < StartCount.\n");CountDiff = StartCount - EndCount; // 注意:定时器是递减的}//printf("Key pressed for %lu clock cycles.\n", CountDiff);// 转换为时间PressedTime = (float)CountDiff / TimerClkFreq;printf("Key pressed for %.3f seconds.\n", PressedTime);}//return 0;
}
相关文章:
7.2 - 定时器之计算脉冲宽度实验
文章目录 1 实验任务2 系统框图3 软件设计 1 实验任务 本实验任务是通过CPU私有定时器来计算按键按下的时间长短。 2 系统框图 参见7.1。 3 软件设计 注意事项: 定时器是递减计数的,需要考虑StartCount<EndCount的情况。 /***********…...
Imagination DXTP GPU IP:加速游戏AI应用,全天候畅玩无阻
日前,Imagination 推出了最新产品——Imagination DXTP GPU IP,在智能手机和其他功耗受限设备上加速图形和AI工作负载时,保证全天候的电池续航。它是我们最新D系列GPU的最终产品,集成了自2022年发布以来引入的一系列功能ÿ…...
关于流水线的理解
还是不太理解,我之前一直以为,对axis总线,每一级的寄存器就像fifo一样,一级一级的分级存储最后一级需要的数据。(现在看来,我这个理解应该也是没有问题的) 如下图,一开始是在解析axi…...
采样算法二:去噪扩散隐式模型(DDIM)采样算法详解教程
参考 https://arxiv.org/pdf/2010.02502 一、背景与动机 去噪扩散隐式模型(DDIM) 是对DDPM的改进,旨在加速采样过程同时保持生成质量。DDPM虽然生成效果优异,但其采样需迭代数百至数千次,效率较低。DDIM通过以下关键…...
北京大学DeepSeek提示词工程与落地场景(PDF无套路免费下载)
近年来,大模型技术飞速发展,但许多用户发现:即使使用同一款 AI 工具,效果也可能天差地别——有人能用 AI 快速生成精准方案,有人却只能得到笼统回答。这背后的关键差异,在于提示词工程的应用能力。 北京大…...
Hutool - POI:让 Excel 与 Word 操作变得轻而易举
各位开发者们,在日常的 Java 开发工作里,处理 Excel 和 Word 文件是相当常见的需求。无论是从 Excel 里读取数据进行分析,还是将数据写入 Excel 生成报表,亦或是对 Word 文档进行内容编辑,传统的 Apache POI 库虽然功能…...
IDEAPyCharm安装ProxyAI(CodeGPT)插件连接DeepSeek-R1教程
背景:最近DeepSeek比较火嘛,然后在githup上也看到了GitHub Copilot,就想着现在AI的准确率已经可以提高工作效率了。所以从网上找了一些编程插件,发现Proxy支持的模型比较多,通用性和适配性比较好。所以本文记录一下pro…...
Iceberg Catalog
使用限制 支持 Iceberg V1/V2 表格式。支持 Position Delete。2.1.3 版本开始支持 Equality Delete。支持 Parquet 文件格式2.1.3 版本开始支持 ORC 文件格式。 创建 Catalog 基于 Hive Metastore 创建 Catalog 和 Hive Catalog 基本一致,这里仅给出简单示…...
2025年2月个人工作生活总结
本文为 2025年2月工作生活总结。 工作记录 AI浪潮 AI非常火,春节至今,到处充斥着大量和AI、DeepSeek有关的新闻。领导也一再强调要用AI,甚至纳入到新一年的考核里。再往上,大领导开会的新闻稿里也作出要求,不能停下脚…...
vscode java环境中文乱码的问题
先说我的结论: 由于我的系统是windows的,所以vscode使用的是默认gbk的编码进行的。 但是我的目的是全部都使用utf-8,因为我的程序始终是要去linux上去运行的,总不能在本地是好的,然后到服务器上就不行了吧,…...
Java数据结构第十五期:走进二叉树的奇妙世界(四)
专栏:Java数据结构秘籍 个人主页:手握风云 目录 一、二叉树OJ练习题(续) 1.1. 二叉树的层序遍历 1.2. 二叉树的最近公共祖先 1.3. 从前序与中序遍历序列构造二叉树 1.4. 从中序与后序遍历序列构造二叉树 1.5. 根据二叉树创建…...
【MySQL】CAST()在MySQL中的用法以及其他常用的数据类型转换函数
1. cast() CAST() 在 MySQL 中用于将一个表达式的类型转换为另一个类型。这在处理不同类型的数据时非常有用,比如将字符串转换为数字,或者将浮点数转换为整数等。 1.1 CAST() 函数的基本语法 CAST() 函数的基本语法如下: CAST(expression…...
使用Truffle、Ganache、MetaMask、Vue+Web3完成的一个简单区块链项目
文章目录 概要初始化Truffle项目创建编写合约编译合约配置Ganache修改truffle-config.js文件编写迁移文件部署合约使用Truffle 控制台使用MetaMask和VueWeb3与链交互 概要 使用Truffle、Ganache、MetaMask、VueWeb3完成的一个简单区块链项目。 初始化Truffle项目 安装好truf…...
初出茅庐的小李博客之按键驱动库使用
驱动库介绍 源码地址:https://github.com/jiejieTop/ButtonDrive 使用只需3步,创建按键,按键事件与回调处理函数链接映射,周期检查按键,支持单双击、连按、长按;采用回调处理按键事件(自定义消…...
如何调试Linux内核?
通过创建一个最小的根文件系统,并使用QEMU和GDB进行调试。 1.准备工作环境 确保系统上安装了所有必要的工具和依赖项。 sudo apt-get update //更新一下软件包 sudo apt-get install build-essential git libncurses-dev bison flex libssl-dev qemu-system-x…...
ECharts组件封装教程:Vue3中的实践与探索
在日常的前端开发中,ECharts 作为一款强大且易用的图表库,被广泛应用于数据可视化场景。为了更好地在 Vue3 项目中复用 ECharts 功能,我们可以将其封装成一个组件。本文将带大家一步步实现 ECharts 的 Vue3 组件封装,并演示如何在父组件中调用和使用。 一、封装 ECharts 组…...
NAT 代理服务 内网穿透
🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 NAT 技术背景二:🔥 NAT IP 转换过程三:🔥 NAPT四:🔥 代理服务器🦋 正向…...
CAN硬件协议详解
一、基本理论: 1、CAN的总线结构: CAN总线 网络结构 有 闭环和开环 两种形式;无论实际的网络多复杂,都离不开这两种基本结构。 闭环结构的CAN总线网络,总线的两端各并联一个120Ω的电阻,两…...
网络安全等级保护:网络安全等级保护基本技术
下面我们概括性探讨一下等级保护用到的一些技术,有关这些技术的每一个方面的每一个部分都可以是一部大块头,甚至一部大块头都无法介绍清楚,需要系列性的书籍去展开,所以这里也只能做到抛砖而已。期望起到抛砖引玉的作用࿰…...
信刻光盘安全隔离与信息交换系统让“数据摆渡”安全高效
随着数据传输、存储及信息技术的飞速发展,信息安全保护已成为重中之重。各安全领域对跨网数据交互的需求日益迫切,数据传输的安全可靠性成为不可忽视的关键。为满足业务需求并遵守保密规范,针对于涉及重要秘密信息,需做到安全的物…...
Kafka消费者数据质量与治理:构建可信数据管道的最佳实践
摘要 在实时数据驱动的企业架构中,Apache Kafka已成为流式数据骨干的核心组件。然而,随着数据规模的指数级增长和数据消费者的多样化,如何确保Kafka管道中的数据质量与治理有效性,成为数据平台团队面临的核心挑战。本文从Kafka消…...
LabelImg闪退报错别慌!手把手教你排查‘list index out of range’和‘ValueError’
LabelImg闪退报错全攻略:从崩溃到流畅标注的完整指南 当你正全神贯注地标注数据集时,LabelImg突然闪退并抛出一串红色错误信息——这种经历对任何AI从业者来说都堪称噩梦。别担心,这不是你一个人的问题。根据社区统计,超过60%的La…...
RS485接口EMC设计要点与工程实践
1. RS485接口电路设计概述RS485作为一种常见的工业通信接口,广泛应用于设备间的数据传输。在实际工程应用中,我发现很多工程师只关注通信功能实现,却忽视了关键的EMC设计,导致产品在测试或现场应用中出现各种问题。我曾参与过一款…...
爬虫对抗实战 - ZLibrary 反爬机制分析与突破
一、背景介绍1. 爬虫与反爬的永恒博弈网络爬虫的核心原理是通过程序模拟 HTTP/HTTPS 请求,获取网页数据并解析提取,广泛应用于数据采集、搜索引擎索引、数据分析等场景。网站部署反爬措施的核心必要性:保护服务器资源,避免恶意爬虫…...
生成剧本杀软件2025推荐,创新剧情设计工具引领潮流
剧本杀软件2025推荐,创新剧情设计工具引领潮流随着剧本杀市场的蓬勃发展,越来越多的创作者和玩家对剧本杀软件的需求日益增长。为了帮助大家在众多选择中找到最适合自己的工具,本文将推荐一款在2025年备受瞩目的剧本杀软件——量子探险AI漫剧…...
BeMusic 3.1.3音乐网站源码:打造个人专属音乐平台的完美选择
在当今数字音乐时代,拥有一个属于自己的音乐网站已成为许多音乐爱好者和开发者的梦想。BeMusic 3.1.3音乐网站源码正是实现这一梦想的理想工具。作为一个功能全面的音乐分享和流媒体平台,BeMusic允许用户在几分钟内创建专业级的音乐网站,无需…...
7张图讲透Claude Code架构(非常详细),Harness设计从入门到精通,收藏这一篇就够了!
1. 整体概述 众所周知,Claude Code不仅仅是Coding产品,更是一个通用的终端Agent:能循环思考、调度工具、治理权限、恢复上下文、稳定长会话… 如何研读项目源码呢? 首先,我让AI帮着梳理了下目录架构和模块职责&…...
从零搭建WebRTC SFU服务器:基于Mediasoup的1080P视频会议部署教程
从零搭建WebRTC SFU服务器:基于Mediasoup的1080P视频会议部署教程 视频会议已成为现代远程协作的核心工具,而WebRTC技术让浏览器间的实时音视频通信变得触手可及。但当你需要支持10人以上的高清会议时,单纯的P2P连接就会暴露出带宽和性能瓶颈…...
Linux命令-ncftp(增强的的FTP工具)
ncftp 是 Linux 中一个功能强大的 FTP 客户端,提供了比传统 ftp 命令更丰富的功能和更友好的界面。它支持自动登录、断点续传、递归传输、书签管理等功能,是 FTP 操作的强大工具。 📖 基本语法 ncftp [选项] [主机名] ncftpget [选项] 主机名…...
无人船编队 无人车编队 MPC 模型预测控制 多智能体协同控制 一致性 MATLAB 无人车 USV
无人船编队 无人车编队 MPC 模型预测控制 多智能体协同控制 一致性 MATLAB 无人车 USV 带原文献一、代码核心定位与应用场景 本套MATLAB源码针对自主水下航行器(AUV)、无人船(USV)、无人车等多智能体系统,实现了基于事…...
