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

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

文章目录

  • 1 实验任务
  • 2 系统框图
  • 3 硬件设计
  • 4 软件设计
    • 4.1 注意事项
    • 4.2 工程源码

1 实验任务

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

2 系统框图

参见7.1。

3 硬件设计

参见7.1。

4 软件设计

4.1 注意事项

  1. 无。

4.2 工程源码

/***************************** Include Files ********************************/#include<stdio.h>#include"xparameters.h"#include"xgpiops.h"#include"xscutimer.h"/************************** Constant Definitions ****************************/#defineGPIOPS_DEVICE_IDXPAR_XGPIOPS_0_DEVICE_ID// GPIOPS设备ID#defineTIMER_DEVICE_IDXPAR_XSCUTIMER_0_DEVICE_ID// TIMER设备ID#defineMIO_KEY050// KEY0对应的MIO引脚号#defineTIMER_LOAD_VALUE0xFFFFFFFFU// Timer加载值(最大值, 约12.9秒)#defineTIMER_CLOCK_FREQ(XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ/2)// Timer时钟频率(CPU时钟的一半)/**************************** Type Definitions ******************************//***************** Macros (Inline Functions) Definitions ********************//************************** Function Prototypes *****************************/staticintGpioPsInit(XGpioPs*GpioPsInstPtr,u16 DeviceId);staticintTimerInit(XScuTimer*TimerInstPtr,u16 DeviceId);/************************** Variable Definitions ****************************/staticXGpioPs GpioPsInst;// GpioPs驱动实例staticXScuTimer TimerInst;// Timer驱动实例/************************** Function Definitions ****************************//* * @brief GpioPs初始化函数 - 配置KEY引脚为输入 * @param GpioPsInstPtr: GpioPs驱动实例指针 * @param DeviceId: GpioPs设备ID * @return 成功返回XST_SUCCESS,失败返回对应错误码 */staticintGpioPsInit(XGpioPs*GpioPsInstPtr,u16 DeviceId){// 校验GpioPs驱动实例指针是否为空if(NULL==GpioPsInstPtr){returnXST_INVALID_PARAM;}// 校验GpioPs设备ID是否有效if(DeviceId!=GPIOPS_DEVICE_ID){returnXST_INVALID_PARAM;}//intStatus;// GpioPs配置指针XGpioPs_Config*GpioPsConfigPtr;// 获取GpioPs设备配置信息GpioPsConfigPtr=XGpioPs_LookupConfig(DeviceId);if(NULL==GpioPsConfigPtr){returnXST_FAILURE;}// 根据配置信息初始化GpioPs驱动实例Status=XGpioPs_CfgInitialize(GpioPsInstPtr,GpioPsConfigPtr,GpioPsConfigPtr->BaseAddr);if(Status!=XST_SUCCESS){returnStatus;}// 设置MIO_KEY0引脚方向为输入XGpioPs_SetDirectionPin(GpioPsInstPtr,MIO_KEY0,0);// 初始化成功returnXST_SUCCESS;}/* * @brief Timer初始化函数 - 配置为单次计数模式, 不使用中断 * @param TimerInstPtr: Timer驱动实例指针 * @param DeviceId: Timer设备ID * @return 成功返回XST_SUCCESS,失败返回对应错误码 */staticintTimerInit(XScuTimer*TimerInstPtr,u16 DeviceId){// 校验Timer驱动实例指针是否为空if(NULL==TimerInstPtr){returnXST_INVALID_PARAM;}// 校验Timer设备ID是否有效if(DeviceId!=TIMER_DEVICE_ID){returnXST_INVALID_PARAM;}//intStatus;// Timer配置指针XScuTimer_Config*TimerConfigPtr;// 获取Timer设备配置信息TimerConfigPtr=XScuTimer_LookupConfig(DeviceId);if(NULL==TimerConfigPtr){returnXST_FAILURE;}// 根据配置信息初始化Timer驱动实例Status=XScuTimer_CfgInitialize(TimerInstPtr,TimerConfigPtr,TimerConfigPtr->BaseAddr);if(Status!=XST_SUCCESS){returnStatus;}// Timer自检Status=XScuTimer_SelfTest(TimerInstPtr);if(Status!=XST_SUCCESS){returnStatus;}// 停止TimerXScuTimer_Stop(TimerInstPtr);// 加载Timer计数值(最大值)XScuTimer_LoadTimer(TimerInstPtr,TIMER_LOAD_VALUE);// 禁用Timer自动重载模式(单次计数, 计到0停止)XScuTimer_DisableAutoReload(TimerInstPtr);// 禁用Timer中断XScuTimer_DisableInterrupt(TimerInstPtr);// 初始化成功returnXST_SUCCESS;}/* * @brief 主函数 - 通过轮询检测按键按下时长, 使用Timer计时并打印结果 */intmain(void){//intStatus;// 当前按键状态u32 key_current;// 上一次按键状态 - 初始值为1(松开)u32 key_previous=1;// Timer当前计数值u32 timer_value;// 按键按下时长(秒)floatpress_duration;// 初始化GpioPsStatus=GpioPsInit(&GpioPsInst,GPIOPS_DEVICE_ID);if(Status!=XST_SUCCESS){printf("GpioPs init failed, error code: %d\n",Status);returnStatus;}// 初始化TimerStatus=TimerInit(&TimerInst,TIMER_DEVICE_ID);if(Status!=XST_SUCCESS){printf("Timer init failed, error code: %d\n",Status);returnStatus;}// 打印提示信息printf("Timer Key Press Test: Measure button press duration\n");// 主循环 - 轮询检测按键边沿, 测量按下时长while(1){// 读取当前按键状态key_current=XGpioPs_ReadPin(&GpioPsInst,MIO_KEY0);// 检测下降沿: 按键从松开变为按下if(key_previous==1&&key_current==0){// 重载Timer计数值XScuTimer_LoadTimer(&TimerInst,TIMER_LOAD_VALUE);// 启动Timer开始计时XScuTimer_Start(&TimerInst);}// 检测上升沿: 按键从按下变为松开if(key_previous==0&&key_current==1){// 停止Timer计时XScuTimer_Stop(&TimerInst);// 读取Timer当前计数值timer_value=XScuTimer_GetCounterValue(&TimerInst);// 计算按键按下时长 = (加载值 - 当前计数值) / Timer时钟频率press_duration=(float)(TIMER_LOAD_VALUE-timer_value)/(float)TIMER_CLOCK_FREQ;// 打印按键按下时长printf("Key pressed for %.3f seconds\n",press_duration);}// 更新上一次按键状态key_previous=key_current;}// 程序正常退出returnXST_SUCCESS;}
http://www.jsqmd.com/news/820979/

相关文章:

  • 宁波哪里回收黄金最靠谱?亲身横评福正美等六家后的选择 - 福正美黄金回收
  • Apertis Skills:嵌入式AI模块化框架,实现边缘计算敏捷部署
  • Verilog AXI适配器终极教程:从基础到高级应用全掌握
  • 5分钟快速上手 deploy-rs:从零部署你的第一个 Nix 配置文件
  • Viper红队平台:容器化安全工具集成与攻防演练实战
  • 2026年亲测最好用的5款论文降AI率合集,帮你从99%降到5% - 降AI实验室
  • 26 年主流系统修复软件横向对比测评:功能、性能、服务三维度实测 - 速递信息
  • 5分钟快速上手OpenVSP:终极免费飞机参数化建模指南
  • 【专业权威】高通量微波消解仪十大品牌推荐及对比测评:谁是前处理领域的“效率王者”? - 品牌推荐大师1
  • 用 JiuwenClaw 打造合同审查辅助 Agent Team:从条款提取到风险标注的实践记录
  • 2026长春单招培训学校排行 实测资质与升学率对比 - 奔跑123
  • 终极苹果面试题指南:1年高频LeetCode题目分类与实战策略
  • NetSuite核心事务处理的总账分录解析——从采购到销售的完整链路
  • 长春本地第一梯队单招培训机构盘点:资质与实绩对比 - 奔跑123
  • 答辩 PPT 熬到凌晨?PaperXie 用 AI 把你的毕业焦虑,变成 10 分钟的从容
  • 目前专业的香港进口公司推荐排行榜单 - 品牌排行榜
  • 为了省电和提速:在BJT温度传感器里,我是如何用Cyclic ADC替换部分ΣΔ周期的
  • 资质认证!深圳5家顶奢回收机构,解锁香奈儿爱马仕高价变现技巧 - 奢侈品回收测评
  • 2026芜湖奢侈品名包名表回收商家推荐:正规靠谱,票据合同齐全 - 品牌企业推荐师(官方)
  • 黑龙江移远科技:正品铸根基 价优拓市场 服务赢口碑​ - 黑龙江单工科技
  • 2026杭州黄金回收哪家服务好?5家实体店上门回收流程与体验排名 - 奢侈品回收测评
  • 增强树的最大弱点
  • 别让答辩 PPT 毁了你的毕业季!PaperXie AI PPT,一键解锁零焦虑答辩模式
  • 智能电网技术解析:从硬件架构到通信实现
  • 2026年郑州留学中介深度解析,申请效率高且预算有限的优选方案 - 速递信息
  • [机器学习实战] 使用SelectFromModel进行自动化特征筛选:原理、策略与案例解析
  • 国内冷热量计优质厂家推荐,源头生产厂家实力盘点 - 陈工日常
  • 国产破局,PCM再起航|相变存储器能否扛起SCM的大旗?
  • 手把手教你给STM32H743的0.96寸OLED屏移植STemWin(裸机+FreeRTOS双版本)
  • 答辩 PPT 还在熬大夜?PaperXie 让你 15 分钟搞定全流程