aaaavva 2024-07-24 18:43 采纳率: 0%
浏览 5

使用stm32输出两个pwm作为fpga两个时钟,相互独立地控制存储区传输数据,为什么结果不对

使用stm32分别输出两个频率为1M和25K的时钟,连接到fpga端口,作为两个时钟信号相互独立地分别传输存储器数据。最终仿真结果正确,但下载到fpga板上结果不对,这是为什么呢
约束文件、仿真图片如图,仿真结果没问题,上板完全不对

img

img

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-07-24 18:43
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    根据您提供的信息,您在使用STM32输出两个频率不同的PWM信号作为FPGA的两个时钟信号,用于独立控制存储器数据的传输。仿真结果正确,但实际硬件上的结果不正确。以下是一些可能的原因和解决方案:

    可能的原因:

    1. 硬件连接问题:确保STM32与FPGA之间的连接正确无误,包括引脚连接、信号完整性和屏蔽。

    2. 信号质量:PWM信号可能在硬件上受到干扰或存在抖动,导致信号质量下降。

    3. FPGA时钟管理:FPGA内部的时钟管理可能没有正确设置,或者与STM32输出的时钟信号不匹配。

    4. 时钟同步问题:两个时钟信号在FPGA内部可能存在同步问题,需要确保时钟域交叉正确处理。

    5. 软件编程错误:STM32的PWM编程可能存在逻辑错误或配置不当。

    6. FPGA配置问题:FPGA的配置文件或时钟设置可能不正确。

    解决方案:

    1. 硬件检查:重新检查硬件连接,确保没有接触不良或焊接问题。

    2. 信号完整性分析:使用示波器检查STM32输出的PWM信号质量,确保信号稳定且无明显抖动。

    3. 时钟抖动测试:对于高频信号,使用示波器测量时钟抖动,并尝试优化PWM信号的生成方式。

    4. FPGA配置检查:检查FPGA的配置文件,确保时钟设置正确。

    5. 时钟域管理:如果存在时钟域交叉,需要在FPGA设计中添加适当的时钟域交叉处理逻辑。

    6. STM32编程检查:检查STM32的PWM初始化和配置代码,确保时钟频率和占空比设置正确。

    7. FPGA时钟管理调整:根据实际的时钟频率调整FPGA内部的时钟管理逻辑。

    编程示例(STM32 PWM设置):

    // 假设使用STM32 HAL库进行PWM配置
    TIM_HandleTypeDef htim1; // 1MHz时钟
    TIM_HandleTypeDef htim2; // 25kHz时钟
    
    void MX_TIM_Init(void)
    {
      // 初始化1MHz时钟
      htim1.Instance = TIMx;
      htim1.Init.Prescaler = (uint32_t)((SystemCoreClock / 2) / 1000000) - 1;
      htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
      htim1.Init.Period = 1000 - 1;
      htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
      htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
      if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
      {
        Error_Handler();
      }
    
      // 初始化25kHz时钟
      htim2.Instance = TIMy;
      htim2.Init.Prescaler = (uint32_t)((SystemCoreClock / 2) / 25000) - 1;
      htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
      htim2.Init.Period = 25000 - 1;
      // ...其他配置与1MHz时钟相同
      if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
      {
        Error_Handler();
      }
    
      // 配置PWM通道并启动
      // ...配置代码
      HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
      HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
    }
    
    void Error_Handler(void)
    {
      // 用户定义的错误处理代码
    }
    

    注意事项:

    • 确保STM32和FPGA的时钟源稳定,避免因时钟问题导致的数据传输错误。
    • 如果问题依旧存在,可能需要进一步的硬件调试和逻辑分析。
    • 上述代码仅为示例,实际应用中需要根据具体的硬件配置和需求进行调整。

    希望这些建议能够帮助您解决问题。如果需要更具体的帮助,例如针对特定硬件的配置或代码优化,请提供更多的信息。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 7月24日
  • 创建了问题 7月24日

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀