当前位置: 首页 > 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;
}

相关文章:

  • Kotlin协变与逆变区别
  • 网络安全完成mysql加固
  • [Web 安全] PHP 反序列化漏洞 —— POP 链构造思路
  • YOLOv11-ultralytics-8.3.67部分代码阅读笔记-VOC.yaml
  • 目录遍历文件包含测试
  • 精品整理-2025 DeepSeek核心技术解析与实践资料合集(24份)
  • 类中的流操作符的重载
  • Python 数据可视化(一)熟悉Matplotlib
  • python判断、循环、range语句
  • Servlet简介
  • 2025最新Nginx高频面试题
  • Python的pdf2image库将PDF文件转换为PNG图片
  • windous 下 ollama 迁移到 D 盘
  • 【2025年2月28日稳定版】小米路由器4C刷机Immortalwrt 23.05.4系统搭载mentohust 0.3.1插件全记录
  • 【Mark】记录用宝塔+Nginx+worldpress+域名遇到的跨域,301,127.0.0.1,CSS加载失败问题
  • 如何流畅访问github
  • 架构案例:从初创互联网公司到分布式存储与反应式编程框架的架构设计
  • 2011-2019年各省移动电话普及率数据
  • Deepseek对ChatGPT的冲击?
  • (平衡二叉树 判断是否为AVL树 )leetcode110
  • 主体负责人和网站负责人/福州seo经理招聘
  • java网站开发文档课程设计/搜索引擎优化的主要工作有
  • 武汉做网站seo优化/技能培训网站
  • 网站的管理系统/网站建设包括哪些内容
  • wordpress调用分类文章排序/seo资料站
  • 大型网站开发方案/免费产品推广软件