This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28388D:TMS320F28388D CLB ECAP 设置

Guru**** 2911890 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1648073/tms320f28388d-tms320f28388d-clb-ecap-setting

器件型号: TMS320F28388D

您好:

我正在尝试将 CLB 逻辑块设置为 ECAP 函数。

我提到并遵循了 TI 提供的示例、并一直在制作我自己的 PJT。  

(CLB 和 ECAP 实验)

 

  • 输入信号匹配:实数外部脉冲信号-> GPIO5 -> INPUTXBAR7 -> AUXSIG0 -> CLB XBAR MUX17 -> CLB1_BASE CLB_IN0/1/2
  • 按如下方式配置 TILE0

//--------------------------------------------------------------------------------------------------------------------------------
// TILE0
//--------------------------------------------------------------------------------------------------------------------------------
#define TILE0_PUBLE_MODE 0
#define TILE0_CFG_OUTLUT_0 0x0
#define TILE0_CFG_OUTLUT_1 0x0
#define TILE0_CFG_OUTLUT_2 0x0
#define TILE0_CFG_OUTLUT_3 0x0
#define TILE0_CFG_OUTLUT_4 0x0
#define TILE0_CFG_OUTLUT_5 0x0
#define TILE0_CFG_OUTLUT_6 0x0
#define TILE0_CFG_OUTLUT_7 0x0

#define TILE0_CFG_LUT4_IN0 0x1498
#define TILE0_CFG_LUT4_IN1 0x6b40
#define TILE0_CFG_LUT4_IN2 0x0
#define TILE0_CFG_LUT4_IN3 0x0
#define TILE0_CFG_LUT4_FN10 ((0x88880000)| 0x5555)
#define TILE0_CFG_LUT4_FN2 0x8888

#define TILE0_CFG_FSM_EXT_IN0   0x19
#define TILE0_CFG_FSM_EXT_IN1   0x0
#define TILE0_CFG_FSM_EXTRA_IN0  0x0
#define TILE0_CFG_FSM_EXTRA_IN1  0x0
#define TILE0_CFG_FSM_next_STATE_0 ((0xa5a50000)| 0x5a5a)
#define TILE0_CFG_FSM_next_State_1 (0x00000)| 0x0)
#define TILE0_CFG_FSM_next_STATE_2 ((0x00000)| 0x0)
#define TILE0_CFG_FSM_LUT_FN10  (0x00000)| 0xaaaa)
#define TILE0_CFG_FSM_LUT_LN2   0x0
#define TILE0_FSM_MISC_CONTROL  0x0

#define TILE0_CFG_COUNTER_RESET 0x359
#define TILE0_CFG_COUNTER_EVENT 0x0
#define TILE0_CFG_COUNTER_MODE_0 0xF8
#define TILE0_CFG_COUNTER_MODE_1 0x108

#define TILE0_CFG_TAP_SEL      0x0
#define TILE0_CFG_MISC_CONTROL  (0x0 | TILE0_FSM_MISC_CONTROL)

#define TILE0_COUNTER_0_MATCH1_VAL 0
#define TILE0_COUNTER_0_MATCH2_VAL 0
#define TILE0_COUNTER_0_LOAD_VAL  0
#define TILE0_COUNTER_1_MATCH1_VAL 0
#define TILE0_COUNTER_1_MATCH2_VAL 0
#define TILE0_COUNTER_1_LOAD_VAL  0
#define TILE0_COUNTER_2_MATCH1_VAL 0
#define TILE0_COUNTER_2_MATCH2_VAL 0
#define TILE0_COUNTER_2_LOAD_VAL  0


#define TILE0_SPI_EN 0

#define TILE0_HLC_EVENT_SEL 0x5f2f
#define TILE0_HLC_R0_init 0
#define TILE0_HLC_R1_init 0
#define TILE0_HLC_R2_init 0
#define TILE0_HLC_R3_INIT 0

void initTILE0 (uint32_t base)

  uint16_t i;
  //
  // 流水线模式
  //
  clb_disablePipelineMode (base);
  //
  // 输出 LUT
  //
  CLB_configOutputLUT (BASE、CLB_OUT0、TILE0_CFG_OUTLUT_0);

  CLB_configOutputLUT (BASE、CLB_OUT1、TILE0_CFG_OUTLUT_1);

  CLB_configOutputLUT (BASE、CLB_OUT2、TILE0_CFG_OUTLUT_2);

  CLB_configOutputLUT (BASE、CLB_OUT3、TILE0_CFG_OUTLUT_3);

  CLB_configOutputLUT (BASE、CLB_OUT4、TILE0_CFG_OUTLUT_4);

  CLB_configOutputLUT (BASE、CLB_OUT5、TILE0_CFG_OUTLUT_5);

  CLB_configOutputLUT (BASE、CLB_OUT6、TILE0_CFG_OUTLUT_6);

  CLB_configOutputLUT (BASE、CLB_OUT7、TILE0_CFG_OUTLUT_7);

  //
  // AOC
  //
  CLB_configAOC (BASE、CLB_AOC0、TILE0_OUTPUT_COND_CTR_0);
  CLB_configAOC (BASE、CLB_AOC1、TILE0_OUTPUT_COND_CTR_1);
  CLB_configAOC (BASE、CLB_AOC2、TILE0_OUTPUT_COND_CTR_2);
  CLB_configAOC (BASE、CLB_AOC3、TILE0_OUTPUT_COND_CTR_3);
  CLB_configAOC (BASE、CLB_AOC4、TILE0_OUTPUT_COND_CTR_4);
  CLB_configAOC (BASE、CLB_AOC5、TILE0_OUTPUT_COND_CTR_5);
  CLB_configAOC (BASE、CLB_AOC6、TILE0_OUTPUT_COND_CTR_6);
  CLB_configAOC (BASE、CLB_AOC7、TILE0_OUTPUT_COND_CTR_7);

  //
  // LUT 0 - 2 在 clb_config.h 中配置为宏;这些宏在中使用
  // clb_selectLUT4Inputs 和 clb_configLUT4Function
  //
  //
  // 查找表块 0 的公式 TILE0:!i0
  //
  // TILE0 的查找表块 1 的公式:I0&i1
  //
  // TILE0 的查找表块 2 的公式:I0&i1

  //
  // LUT 配置
  //
  CLB_selectLUT4Inputs (BASE、TILE0_CFG_LUT4_IN0、TILE0_CFG_LUT4_IN1、TILE0_CFG_LUT4_IN2、TILE0_CFG_LUT4_IN3);
  CLB_configLUT4Function (BASE、TILE0_CFG_LUT4_FN10、TILE0_CFG_LUT4_FN2);

  //
  // FSM 0 - 2 在中配置
  //
  //
  // TILE0 的有限状态机 0 的输出方程:S0
  // TILE0 的有限状态机 0 的状态 0 输出方程:S0^e0
  // TILE0 的有限状态机 0 的状态 1 输出方程:!(s0^e0)
  //

  //
  // FSM
  //
  CLB_selectFSMInputs (BASE、TILE0_CFG_FSM_EXT_IN0、TILE0_CFG_FSM_EXT_IN1、TILE0_CFG_FSM_EXTRA_IN0、TILE0_CFG_FSM_EXTRA_IN1);
  CLB_configFSMNextState (BASE、TILE0_CFG_FSM_NEXT_STATE_0、TILE0_CFG_FSM_NEXT_STATE_1、TILE0_CFG_FSM_NEXT_STATE_2);
  CLB_configFSMLUTFunction (BASE、TILE0_CFG_FSM_LUT_FN10、TILE0_CFG_FSM_LUT_FN2);

  //
  //在中配置了计数器 0 - 2
  //

  //
  // 计数器
  //
  CLB_selectCounterInputs (BASE、TILE0_CFG_COUNTER_RESET、TILE0_CFG_COUNTER_EVENT、TILE0_CFG_COUNTER_MODE_0、TILE0_CFG_COUNTER_MODE_1);
  CLB_configMiscCtrlModes (BASE、TILE0_CFG_MISC_CONTROL);

  CLB_configCounterLoadMatch (BASE、CLB_CTR0、TILE0_COUNTER_0_LOAD_VAL、TILE0_COUNTER_0_MATCH1_VAL、TILE0_COUNTER_0_MATCH2_VAL);
  CLB_configCounterLoadMatch (BASE、CLB_CTR1、TILE0_COUNTER_1_LOAD_VAL、TILE0_COUNTER_1_MATCH1_VAL、TILE0_COUNTER_1_MATCH2_VAL);
  CLB_configCounterLoadMatch (BASE、CLB_CTR2、TILE0_COUNTER_2_LOAD_VAL、TILE0_COUNTER_2_MATCH1_VAL、TILE0_COUNTER_2_MATCH2_VAL);
  CLB_configCounterTapSelects (BASE、TILE0_CFG_TAP_SEL);

  //
  //在中配置了 HLC
  //

  //
  // HLC
  //
  CLB_configHLCeventSelect (BASE、TILE0_HLC_EVENT_SEL);
  CLB_setHLCRegisters (BASE、TILE0_HLC_R0_init、TILE0_HLC_R1_init、TILE0_HLC_R2_init、TILE0_HLC_R3_init);

  适用于 (I = 0;I <= CLB_NUM_HLC_INSTR;I++)
  {
    CLB_programHLCInstruction (BASE、I、TILE0HLCInstr[i]);
  }
}

 

但是、计数器无法正常工作、需要帮助进行改进。

如果有人能查看、请给我反馈。

此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mingi Park:
    让我来看看配置。 我很快就会回复您。
    谢谢
    Praneeth

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Praneeth、

    感谢您的答复。

    我的目标系统具有以下要求:

    • 测量来自 多个独立输入通道的脉冲间隔
    • 输入信号频率:约为 1MHz
    • 应用 预分频 (1/25 ~ 1/30) 以降低事件发生率
    • 只 需要频率和周期测量(不需要占空比)
    • 所有测量应 在 CLB 内自主执行
    • CPU 应 异步读取结果 (例如,通过计时器中断或 ADC 中断)
    • 避免对每个事件进行中断驱动型捕获、以尽可能降低 CPU 负载

    最初、我回顾了 TI CLB + eCAP 实验示例。

    感谢您的帮助、期待您的参与。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mingi Park:
    我将牢记您提到的要求  
    谢谢
    Praneeth

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mingi Park:
    我可以看到没有选择偶数来触发计数。 计数器中的匹配值未设置。 计数器将无法运行。 需要针对预分频和频率测量设置这些值。
    当你说柜台不能正常工作时、你能详细说明一下吗?
    谢谢
    Praneeth

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Praneeth、

    CLB 计数器在调试期间不会递增、其值保持不变、表示没有发生计数活动。
    我刚刚复制了 TI 示例 (CLB 和 ECAP 实验)中的代码、但正如您所说的、计数器似乎没有触发和匹配事件。
    我仍然无法确定代码的哪一部分需要修改...
    您能否说明必须修改配置的哪一部分才能正确生成触发器、以便计数器能够按预期开始运行?
    我认为我没有完全支持 CLB 函数、因此如果可能、您能提供完整的代码或项目吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mingi Park:
    我无法提供用于配置的文件、但可以提供配置的屏幕截图。 我建议您使用 syscfg 进行软件开发。 例如、我可以提供测量周期和频率的配置。 您可以从此处进行构建。 这对您有好处吗? 开发这个逻辑可能需要几天的时间。 我会尽快回复您。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Praneeth、

    syscfg 中配置的屏幕截图对 我非常有帮助。

    衷心感谢您的帮助。

    Mingi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mingi Park:

    从上面可以看到、我启用了四个输入。

    我选择了一个 EPWM 输出作为 CLB 逻辑块的输入。 每个输入都选择了两个通道的上升沿、下降沿 ePWM1A 和 ePWM1B。

    对于时间段测量、我始终启用计数器。 它将始终进行计数、因为我已经给计数器使能 1。 但当接收到输入 3 脉冲时、计数器复位为零。 这里、输入 3 是 EPWM1B 的下降沿。


    在 HLC 中、当输入 3 脉冲到来时、计数器零值将加载到寄存器 R0、可由软件访问该值。
    根据此访问值、可以计算时间段。
    同样、您可以通过适当配置 CLB 计数器、有限状态机、高电平计数器等、找到两个脉冲之间的占空比、相移
    我希望这对您有所帮助、使您能够利用 CLB 完成许多工作。
    谢谢
    Praneeth