当前位置: 首页 > news >正文

7.2 - 定时器之计算脉冲宽度实验

文章目录

  • 1 实验任务
  • 2 系统框图
  • 3 软件设计

1 实验任务

本实验任务是通过CPU私有定时器来计算按键按下的时间长短。

2 系统框图

参见7.1。

3 软件设计

注意事项:

  1. 定时器是递减计数的,需要考虑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;
}
http://www.lryc.cn/news/545008.html

相关文章:

  • Imagination DXTP GPU IP:加速游戏AI应用,全天候畅玩无阻
  • 关于流水线的理解
  • 采样算法二:去噪扩散隐式模型(DDIM)采样算法详解教程
  • 北京大学DeepSeek提示词工程与落地场景(PDF无套路免费下载)
  • Hutool - POI:让 Excel 与 Word 操作变得轻而易举
  • IDEAPyCharm安装ProxyAI(CodeGPT)插件连接DeepSeek-R1教程
  • Iceberg Catalog
  • 2025年2月个人工作生活总结
  • vscode java环境中文乱码的问题
  • Java数据结构第十五期:走进二叉树的奇妙世界(四)
  • 【MySQL】CAST()在MySQL中的用法以及其他常用的数据类型转换函数
  • 使用Truffle、Ganache、MetaMask、Vue+Web3完成的一个简单区块链项目
  • 初出茅庐的小李博客之按键驱动库使用
  • 如何调试Linux内核?
  • ECharts组件封装教程:Vue3中的实践与探索
  • NAT 代理服务 内网穿透
  • CAN硬件协议详解
  • 网络安全等级保护:网络安全等级保护基本技术
  • 信刻光盘安全隔离与信息交换系统让“数据摆渡”安全高效
  • 数据结构课程设计(java实现)---九宫格游戏,也称幻方
  • [思考记录]AI时代下,悄然的改变
  • JAVA笔记【一】
  • [Java基础] 常用注解
  • uvm中的run_test作用
  • brew search报错,xcrun:error:invalid active developer path CommandLineTools
  • C#内置委托(Action)(Func)
  • kubernetes 部署项目
  • 《几何原本》命题I.2
  • 【我的 PWN 学习手札】House of Kiwi
  • nvm的学习