普通网友 2024-04-19 15:13 采纳率: 81.8%
浏览 1

计数器的位如何与SRC字段的42-32位对齐?

我想为我的 UVC 设备实现 PTS 和 SRC 值,但在知道如何获取这些值时遇到了一些困难。 我遇到了一个讨论这些值的 话题 ,但我对 pts 和 SRC 的 STC 值如何使用 cyu3pgettime 和 0.1us 时间戳( 在本KBA中解释) 感到困惑。 根据规范,PTS 和 STC 都依赖 dwclockFrequency 作为单位,所以这让我觉得 PTS 和 STC 的值使用相同的源时钟。 这是正确的吗? 如果不是,如果我的时钟设置为 403.2MHz 和 100MHz GPIF,PTS 和 STC 应该使用哪个时钟? 我是否将 dwclockFrequency 设置为 403.2MHz?
我的理解是,当收到 CY_U3P_DMA_CB_PROD_EVENT 事件时,PTS 和 STC 都是在新帧开始时拍摄的。 由于它们都具有相同的单元,因此它们都来自同一个时钟源。 它们也是恒定的。 这是正确的吗?
我知道 SRC 在一些重要性更高的位中包含帧计数器,但这似乎相当简单,因为它只计算通过 FX3 的完整帧数。 关于计数器,我唯一的问题是我的计数器的位如何与 SRC 字段的 42-32 位对齐?

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-19 15:13
    关注

    引自免费微信小程序:皆我百晓生

    在实现UVC设备的PTS和SRC值时,首先我们需要明确几个关键概念:

    1. PTS (Presentation Time Stamp):表示视频数据应该显示的时间戳。
    2. STC (System Time Code):系统时间码,用于同步不同设备的时间。
    3. SRC (Stream Relative Counter):流相对计数器,包含了帧计数器信息。

    对于你的问题,让我们一步步解决:

    1. 时钟频率

    根据你的描述,你的系统有两套时钟:403.2MHz和100MHz GPIF。你需要确认哪个时钟作为dwclockFrequency的基础。通常情况下,PTS和STC使用的时钟应该是与视频数据传输相关的最高速度的时钟。如果你的视频数据是通过100MHz的GPIF接口传输,那么100MHz可能是合适的时钟选择。但具体取决于你的硬件设计和实际需求。

    uint64_t dwclockFrequency = 100000000; // Assuming 100 MHz clock frequency
    

    2. PTS和STC的计算

    PTS和STC都是基于这个选定的时钟频率来计算的。你提到的0.1us时间戳可能是指每两个连续帧之间的时间间隔。这样,你可以计算出每个帧对应的时钟周期数。

    double timestamp_per_frame = 0.1e-6; // 0.1 microsecond per frame
    int cycles_per_frame = dwclockFrequency * timestamp_per_frame;
    

    3. 计数器与SRC的对齐

    为了确保计数器的正确对齐,你需要知道FX3内部有多少位用来存储SRC。假设FX3的SRC有48位,其中前32位是时间戳,后16位是帧计数器。你需要将计数器的值转换成二进制,并填充到SRC的相应位置。

    // 假设你有一个名为frameCounter的变量,它记录了完整的帧数
    uint32_t frameCounter;
    
    // 将帧计数器扩展到16位,因为FX3的帧计数器是16位
    uint32_t extendedFrameCounter = frameCounter << 16; // Shift left by 16 bits to make room for time stamp
    
    // 现在,你需要将时间戳转换成二进制,然后组合到SRC中
    uint64_t currentTimestampInCycles = ... // Calculate the current timestamp in cycles based on your logic
    uint64_t srcValue = currentTimestampInCycles | extendedFrameCounter;
    

    在这个例子中,currentTimestampInCycles是当前帧的时钟周期数,extendedFrameCounter是帧计数器的16位扩展。然后,我们将这两个值按位或操作(|),以便将它们组合在一起形成完整的SRC值。

    4. 事件处理

    当接收到CY_U3P_DMA_CB_PROD_EVENT事件时,你应该更新PTS、STC和SRC。注意,这里的时间戳可能需要考虑到从上一帧到当前帧的时间差,而不是仅仅计算每帧的固定间隔。

    注意事项

    请根据你的实际硬件配置和软件库调整上述代码。此外,确保你的计数器不会溢出。如果帧计数器超过16位,你可能需要定期重置它,或者使用更复杂的方法来处理溢出情况。

    如果你有更多的疑问或者需要进一步的帮助,请随时告诉我。我会根据你的反馈提供更多的指导。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月19日

悬赏问题

  • ¥15 stc15f2k60s2单片机关于流水灯,时钟,定时器,矩阵键盘等方面的综合问题
  • ¥15 YOLOv8已有一个初步的检测模型,想利用这个模型对新的图片进行自动标注,生成labellmg可以识别的数据,再手动修改。如何操作?
  • ¥30 NIRfast软件使用指导
  • ¥20 matlab仿真问题,求功率谱密度
  • ¥15 求micropython modbus-RTU 从机的代码或库?
  • ¥15 django5安装失败
  • ¥15 Java与Hbase相关问题
  • ¥15 后缀 crn 游戏文件提取资源
  • ¥20 bash代码推送不上去 git fetch origin master #失败了
  • ¥15 LOL外服加入了反作弊系统,现在游戏录像rofl文件离线都无法打开