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

zynq arm全局计时器和私有定时器

BD

在这里插入图片描述

目标

  1. 全局定时器产生时间戳
  2. 私有定时器产生200ms中断回调,打印时间戳

裸机测试

/************************************************************* SCU Timer 中断测试程序* - 使用 ARM Cortex-A9 的私有定时器 (SCU Timer)* - 定时周期 = 200ms* - 每次中断打印当前毫秒计数和翻转的状态位** 硬件环境:*   - PS (Processing System) 内部的私有定时器*   - GIC (通用中断控制器)************************************************************/#include "xparameters.h"   // 包含器件的硬件参数 (Device ID、基地址等)
#include "xscutimer.h"     // SCU 定时器驱动函数声明
#include "xscugic.h"       // 中断控制器驱动函数声明
#include "xil_printf.h"    // 串口打印函数
#include "xtime_l.h"       // 全局计时器 (ARM Global Timer)//========================= 硬件参数定义 =========================//#define TIMER_DEVICE_ID   XPAR_XSCUTIMER_0_DEVICE_ID    // SCU 定时器 Device ID
#define INTC_DEVICE_ID    XPAR_SCUGIC_SINGLE_DEVICE_ID  // GIC Device ID
#define TIMER_IRPT_INTR   XPAR_SCUTIMER_INTR            // 定时器中断 ID// SCU Timer 时钟频率 = CPU 时钟 / 2 = 333 MHz (假设 CPU = 666 MHz)
// 目标延时 = 200 ms
// 计算公式:LOAD_VALUE = T(s) * Freq - 1
//          = 0.2 * 333,000,000 - 1 ≈ 66,599,999
//          = 0x3F83C3F
#define TIMER_LOAD_VALUE  0x03F83C3F  // 定时器装载值,对应周期约 200ms//========================= 全局实例 =========================//XScuGic   Intc;    // 中断控制器实例
XScuTimer Timer;   // SCU 定时器实例//========================= 工具函数 =========================///*** @brief 获取当前毫秒数 (基于 ARM 全局计数器)*/
uint32_t BspGetMillis(void)
{XTime t;XTime_GetTime(&t);uint32_t ms = (uint32_t)(t / (COUNTS_PER_SECOND / 1000));return ms;
}//========================= 定时器初始化 =========================///*** @brief 初始化 SCU 定时器*/
int timer_init(XScuTimer *timer_ptr)
{int status;// 查找定时器配置XScuTimer_Config *timer_cfg_ptr = XScuTimer_LookupConfig(TIMER_DEVICE_ID);if (timer_cfg_ptr == NULL)return XST_FAILURE;// 初始化定时器实例status = XScuTimer_CfgInitialize(timer_ptr,timer_cfg_ptr,timer_cfg_ptr->BaseAddr);if (status != XST_SUCCESS)return XST_FAILURE;// 设置定时器周期XScuTimer_LoadTimer(timer_ptr, TIMER_LOAD_VALUE);// 设置为自动重载模式 (到期后自动重新装载)XScuTimer_EnableAutoReload(timer_ptr);return XST_SUCCESS;
}//========================= 中断服务函数 =========================///*** @brief 定时器中断处理函数*/
void timer_intr_handler(void *CallBackRef)
{static int toggle = 0;  // 翻转标志,用于显示状态XScuTimer *timer_ptr = (XScuTimer *)CallBackRef;// 打印当前时间和翻转状态xil_printf("%u ms  state=%d\r\n", BspGetMillis(), (toggle ^= 1));// 清除定时器中断标志位XScuTimer_ClearInterruptStatus(timer_ptr);
}//========================= 中断初始化 =========================///*** @brief 初始化中断控制器并注册定时器中断*/
void timer_intr_init(XScuGic *intc_ptr, XScuTimer *timer_ptr)
{// 查找 GIC 配置XScuGic_Config *intc_cfg_ptr = XScuGic_LookupConfig(INTC_DEVICE_ID);// 初始化 GICXScuGic_CfgInitialize(intc_ptr,intc_cfg_ptr,intc_cfg_ptr->CpuBaseAddress);// 注册异常处理函数 (把 CPU 的中断入口指向 GIC 驱动)Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,intc_ptr);Xil_ExceptionEnable();  // 使能 CPU 中断// 连接定时器中断到 GICXScuGic_Connect(intc_ptr,TIMER_IRPT_INTR,(Xil_ExceptionHandler)timer_intr_handler,(void *)timer_ptr);// 使能定时器中断 (GIC 和 SCU Timer 本身)XScuGic_Enable(intc_ptr, TIMER_IRPT_INTR);XScuTimer_EnableInterrupt(timer_ptr);
}//========================= 主函数 =========================//
int main(void)
{int status;xil_printf("SCU Timer Interrupt Test Start\r\n");// 初始化定时器status = timer_init(&Timer);if (status != XST_SUCCESS) {xil_printf("Timer Initialization Failed\r\n");return XST_FAILURE;}// 初始化中断timer_intr_init(&Intc, &Timer);// 启动定时器XScuTimer_Start(&Timer);// 主循环空转,靠中断驱动while (1);return 0;
}

测试结果

在这里插入图片描述


文章转载自:

http://7f9uvcjl.znnsk.cn
http://9SXOJ1v0.znnsk.cn
http://BOw6xhIV.znnsk.cn
http://RYvayXvG.znnsk.cn
http://iISTJ1Db.znnsk.cn
http://F0y31q8n.znnsk.cn
http://b18iwnUa.znnsk.cn
http://A2nRoa02.znnsk.cn
http://zr5ZQjGb.znnsk.cn
http://1rn3v53B.znnsk.cn
http://of6ccZOa.znnsk.cn
http://Lvk6wv93.znnsk.cn
http://mo34PBmc.znnsk.cn
http://oa5BRzI2.znnsk.cn
http://hInLZhsK.znnsk.cn
http://tsguDnWx.znnsk.cn
http://6VBB98RG.znnsk.cn
http://ScxRhft4.znnsk.cn
http://pDmSXtLv.znnsk.cn
http://vQ34RL1b.znnsk.cn
http://8ydS67tj.znnsk.cn
http://Zrn3m1wd.znnsk.cn
http://dzT6uIBy.znnsk.cn
http://8rumOCkH.znnsk.cn
http://kRnoHMxQ.znnsk.cn
http://OeRwQzUb.znnsk.cn
http://PXnEGSDw.znnsk.cn
http://3ohwMS9v.znnsk.cn
http://STB03DV5.znnsk.cn
http://Sa0Xsu17.znnsk.cn
http://www.dtcms.com/a/380641.html

相关文章:

  • TCP套接字的使用
  • 红日靶场(三)——个人笔记
  • Linux 进程和线程基础知识解析
  • MySQL 查询不正确身份证号的方法
  • 淘宝商品详情 API 的安全强化与生态协同创新路径
  • 全志A133 android10 secure boot 安全启动
  • 储能电站的监控运维软件推荐,降低运营成本
  • 麒麟v10系统内存不足
  • fpga图像处理
  • 使用netstat 获取各Oracle数据库实例对应应用IP地址脚本
  • QT M/V架构开发实战:QAbstractItemModel介绍
  • PHP 与 WebAssembly 的 “天然隔阂”
  • QML 的第一步
  • IP验证学习之env集成编写
  • Android8 binder源码学习分析笔记(四)——ServiceManager启动
  • fastapi搭建Ansible Playbook执行器
  • 第四阶段C#通讯开发-1:通讯基础理论,串口,通讯模式,单位转换,代码示例
  • 微信小程序——云函数【使用使用注意事项】
  • 【java】常见排序算法详解
  • HarmonyOS 应用开发深度解析:基于声明式UI的现代化状态管理实践
  • Linux 中 exec 等冷门命令的执行逻辑探究
  • Qt多语言翻译实战指南:常见陷阱与动态切换解决方案
  • 【秋招笔试】2025.09.11阿里云秋招算法岗笔试真题
  • Ethernaut Level 1: Fallback - 回退函数权限提升攻击
  • 【VPX637】基于XCKU115 FPGA+ZU15EG MPSOC的6U VPX双FMC接口通用信号处理平台
  • Flutter基础(②④事件回调与交互处理)
  • 软考系统架构设计师之软件架构篇
  • 软考-系统架构设计师 访问控制和数字签名技术详细讲解
  • C语言初学者笔记【预处理】
  • android中ViewModel 和 onSaveInstanceState 的最佳使用方法