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Ω的电阻,两…...
网络安全等级保护:网络安全等级保护基本技术
下面我们概括性探讨一下等级保护用到的一些技术,有关这些技术的每一个方面的每一个部分都可以是一部大块头,甚至一部大块头都无法介绍清楚,需要系列性的书籍去展开,所以这里也只能做到抛砖而已。期望起到抛砖引玉的作用࿰…...
信刻光盘安全隔离与信息交换系统让“数据摆渡”安全高效
随着数据传输、存储及信息技术的飞速发展,信息安全保护已成为重中之重。各安全领域对跨网数据交互的需求日益迫切,数据传输的安全可靠性成为不可忽视的关键。为满足业务需求并遵守保密规范,针对于涉及重要秘密信息,需做到安全的物…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
