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.

[参考译文] CCS/TMS320F28377D:在28377中,是否存在 CLB 模块的时钟概念?

Guru**** 2763585 points

Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/926788/ccs-tms320f28377d-in-28377-does-there-exist-the-concept-of-clock-for-the-clb-module

器件型号:TMS320F28377D
主题中讨论的其他器件:C2000WARE

工具/软件:Code Composer Studio

大家好、我正在尝试使用 CLB 模块来保护 PWM 信号。 整个过程如下图所示、与演示"clb_ex4_PWM_protection"类似。

我的意图是:

GPIO2、3被置位以生成 EPWM2信号。  GPIO16被连接至一个按钮。 按下按钮时、I/O 将处于低电平。

因此、GPIO16被用来激励误差信号。

在正常情况下、GPIO2、3可以生成复杂的 PWM 信号。 按下按钮时 、GPIO2、3的输出应该为低电平。  

Tile2 用作与门。

我遵循了用户指南的说明和论坛上提供的答案。 但是、我仍然遇到了以下问题:  

GPIO2、3可以生成 PWM 信号、但 GPIO14、15无法生成。  CLB 模块似乎不起作用。

代码中包含一些详细说明。

我的代码是:

void main (void)
{

InitSysCtrl();//系统初始200MHz

InitGpio();

InitEPwm1Gpio();// GPIO0、1连接有两个 LED、表示按钮状态
InitEPwm2Gpio();// EPWM2A、B 是生成的 PWM 信号。

//GPIO16被设定为 I/O 并且被连接至一个按钮。
//按下按钮时,低电平表示 PWM 故障
//和 PWM 信号应该被阻断。
GPIO_SetupPinMux (16、0、0);
GPIO_SetupPinOptions (16、0、GPIO_PULLUP);//


Dint;

InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();



EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0;
EDIS;

InitEPwm2Examples();// 10kHz

EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS;

IER = 0;//中断被禁用


//---- 上面的代码可以正常工作。 我的问题是 CLB 寄存器的设置。
EALLOW; //将 GPIO16设置为输入 Xbar1 Xbar_setInputPin (XBAR_Input1、16); //将 InputXBar 1设置为 XBAR_AUXSIG0 HWREG (XBAR_CLB_CFG_REG_BASE + XBAR_O_AUXSIG0MUX0TO15CFG)|= 4; //启用 XBAR_AUXSIG0 HWREG (XBAR_CLB_EN_REG_BASE + XBAR_AUXSIG0)|= XBAR_MUX01; EDIS; //选择 CLB2_base CLB_CONFIGLocalInputMux (CLB2_base、CLB_IN0、CLB_LOCAL_IN_MUX_GLOBAL_IN); CLB_CONFIGLocalInputMux (CLB2_base、CLB_IN1、CLB_LOCAL_IN_MUX_GLOBAL_IN); CLB_CONFIGLocalInputMux (CLB2_base、CLB_IN2、CLB_LOCAL_IN_MUX_GLOBAL_IN); CLB_CONFIGLocalInputMux (CLB2_base、CLB_in3、CLB_LOCAL_IN_MUX_GLOBAL_IN); CLB_CONFIGLocalInputMux (CLB2_base、CLB_IN4、CLB_LOCAL_IN_MUX_GLOBAL_IN); CLB_CONFIGLocalInputMux (CLB2_base、CLB_iN5、CLB_LOCAL_IN_MUX_GLOBAL_IN); CLB_CONFIGLocalInputMux (CLB2_base、CLB_IN6、CLB_LOCAL_IN_MUX_GLOBAL_IN); CLB_CONFIGLocalInputMux (CLB2_base、CLB_IN7、CLB_LOCAL_IN_MUX_GLOBAL_IN); // GPIO16-->输入 XBar 1 --> AUXSIG0 -->边界0 // EPWM2A_DB ->边界1 // EPWM2B_DB ->边界2. CLB_CONFIGGlobalInputMux (CLB2_base、CLB_IN0、CLB_GLOBAL_IN_MUX_CLB_AUXSIG0); CLB_CONFIGGlobalInputMux (CLB2_base、CLB_IN1、CLB_GLOBAL_IN_MUX_EPWM2A_DB); CLB_CONFIGGlobalInputMux (CLB2_base、CLB_IN2、CLB_GLOBAL_IN_MUX_EPWM2B_DB); CLB_CONFIGGlobalInputMux (CLB2_base、CLB_in3、CLB_GLOBAL_IN_MUX_EPWM1A); CLB_CONFIGGlobalInputMux (CLB2_base、CLB_IN4、CLB_GLOBAL_IN_MUX_EPWM1A); CLB_CONFIGGlobalInputMux (CLB2_base、CLB_iN5、CLB_GLOBAL_IN_MUX_EPWM1A); CLB_CONFIGGlobalInputMux (CLB2_base、CLB_IN6、CLB_GLOBAL_IN_MUX_EPWM1A); CLB_CONFIGGlobalInputMux (CLB2_base、CLB_IN7、CLB_GLOBAL_IN_MUX_EPWM1A); //为 CLB2、IN0、1、2选择外部 CLB_CONFIGGPInputMux (CLB2_base、CLB_IN0、CLB_GP_IN_MUX_EXTERNAL); CLB_CONFIGGPInputMux (CLB2_base、CLB_IN1、CLB_GP_IN_MUX_EXTERNAL); CLB_CONFIGGPInputMux (CLB2_base、CLB_IN2、CLB_GP_IN_MUX_EXTERNAL); CLB_CONFIGGPInputMux (CLB2_base、CLB_in3、CLB_GP_IN_MUX_GP_REG); CLB_CONFIGGPInputMux (CLB2_base、CLB_IN4、CLB_GP_IN_MUX_GP_REG); CLB_CONFIGGPInputMux (CLB2_base、CLB_iN5、CLB_GP_IN_MUX_GP_REG); CLB_CONFIGGPInputMux (CLB2_base、CLB_IN6、CLB_GP_IN_MUX_GP_REG); CLB_CONFIGGPInputMux (CLB2_base、CLB_IN7、CLB_GP_IN_MUX_GP_REG); EALLOW; //将 GPIO14设置为 outputXbar 3. GpioCtrlRegs.GPAPUD.bit.GPIO14 = 1;//禁用 GPIO14上的上拉 GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 6;//将 GPIO14配置为 outputbar3 GpioCtrlRegs.GPADIR.bit.GPIO14 = 1;//输出 //将 GPIO15设置为 outputXbar 4. GpioCtrlRegs.GPAPUD.bit.GPIO15 = 1;//禁用 GPIO15上的上拉 GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 6;//将 GPIO15配置为 outputbar4 GpioCtrlRegs.GPADIR.bit.GPIO15 = 1;//输出 // OutputXbarRegs.OUTPUTLOCK.ALL = 0;//允许修改以下寄存器 OutputXbarRegs.OUTPUT3MUX0TO15CFG.bit.MUX5 = 2; //将 CLB2_OUT4设置为 outputXbar 3. OutputXbarRegs.OUTPUT3MUXENABLE.bit.MUX5 = 1; //启用输出 Xbar3 OutputXbarRegs.OUTPUT4MUX0TO15CFG.bit.MUX7 = 2; //将 CLB2_OUT5设置为 outputXbar 4. OutputXbarRegs.OUTPUT4MUXENABLE.bit.MUX7 = 1; //启用输出 Xbar4 CLB_setOutputMask (CLB2_base、1 << 6 | 1 << 7、true);//let CLB_OUT6、7替代 DB_PWM2A、B。 EDIS; //初始化 CLB2和使能 initTILE2 (clb2_base); clb_enableCLB (CLB2_base); //EINT;// //ERTM;//禁用中断

//以下 GPIO16可以正常工作 for (;;) { //检测是否按下按钮 if (GpioDataRegs.GPADD.bit.GPIO16 ==0) { GpioDataRegs.GPASET.bit.GPIO0 = 1;// LED 打开 DELAY_US (100); } 其他 { GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;// LED 关闭 DELAY_US (100); } }

逻辑块配置显示为:

 在 EPWM2 I/O 上 、PWM 信号正常。  但是、在输出 XBar I/O 上、 不存在信号。

按下按钮后、LED 可以正常工作、但 EPWM2信号不变。

我的代码的错误在哪里?

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

    我必须就此咨询 PWM 专家。 我们很快就会回来

    此致、

    Peter

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

    在咨询 PWM 专家之前、我将要求您更详细地描述您的代码要执行的操作。 具体而言、请描述每个步骤、并告诉我们具体的目的是什么以及该步骤是否起作用。 当您进入不起作用的步骤时、请向我们解释刺激因素是什么、您期望的结果是什么以及您获得的结果是什么。

    谢谢、

    Peter

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

    您好、Peter、

    感谢您的回复。

    我修改了问题的描述并添加了一些解释。 我确信 PWM 模块和 GPIO 模块已正确设置。

    我不确定 CLB 模块、无法确定问题是什么。

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

    您好!

    我正在就此与 CLB/PWM 专家联系、很快就会与您联系。


    此致、

    Peter

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

    您能否用 driverlib 版本替换输出 XBAR 函数并重试?

    输出 XBar 的 GPIO PinMux 配置也是如此。

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

    您好、Nima、  

    非常感谢您的帮助。 我听从了你的建议、但问题仍然存在。

    我制作了一个视频、演示了如何创建项目和实验结果。

    https://zhuanlan.zhihu.com/p/165997033

    根据实验、PWM 模块工作正常、只要按下按钮、LED 就会改变。

    详细代码如下所示。 我仍然找不到问题。 请帮帮我。

    #include "F28x_Project.h" //器件头文件和示例包括文件
    
    #define DB_UP 1
    #define DB_DOWN 0
    
    void InitEPwm2Example (void);
    
    void main (void)
    {
    InitSysCtrl();//系统初始200MHz
    InitGpio();
    
    InitEPwm1Gpio();// GPIO0、1连接有两个 LED、表示按钮状态
    InitEPwm2Gpio();// EPWM2A、B 是生成的 PWM 信号。
    
    //GPIO16被设定为 I/O 并且被连接至一个按钮。
    //按下按钮时,低电平表示 PWM 故障
    //和 PWM 信号应该被阻断。
    GPIO_SetupPinMux (16、0、0);
    GPIO_SetupPinOptions (16、0、GPIO_PULLUP);//
    
    Dint;
    
    InitPieCtrl();
    
    IER = 0x0000;
    IFR = 0x0000;
    
    InitPieVectTable();
    
    //
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0;
    EDIS;
    
    InitEPwm2Examples();
    
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
    EDIS;
    
    //---- 上面的代码可以正常工作。
    EALLOW;
    //将 GPIO16设置为输入 Xbar1
    Xbar_setInputPin (XBAR_Input1、16);
    
    //将 InputXBar 1设置为 XBAR_AUXSIG0
    Xbar_setCLBMuxConfig (XBAR_AUXSIG0、XBAR_CLB_MUX01_INPUTXBAR1);
    Xbar_enableCLBMUX (XBAR_AUXSIG0、XBAR_MUX01);
    
    EDIS;
    
    
    
    //将 GPIO14设置为 outputXbar 3.
    GPIO_setPinConfig (GPIO_14_OUTPUTXBAR3);
    GPIO_setDirectionMode (14、GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig (14、GPIO_PIN_TYPE_STD);
    
    //将 GPIO15设置为 outputXbar 4.
    GPIO_setPinConfig (GPIO_15_OUTPUTXBAR4);
    GPIO_setDirectionMode (15、GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig (15、GPIO_PIN_TYPE_STD);
    
    
    //将 CLB2_OUT4设置为 outputXbar 3.
    Xbar_setOutputMuxConfig (XBAR_OUTPUT3、XBAR_OUT_MUX05_CLB2_OUT4);
    Xbar_enableOutputMux (XBAR_OUTPUT3、XBAR_MUX05);
    
    //将 CLB2_OUT5设置为 outputXbar 4.
    Xbar_setOutputMuxConfig (XBAR_OUTPUT4、XBAR_OUT_MUX07_CLB2_OUT5);
    Xbar_enableOutputMux (XBAR_OUTPUT4、XBAR_MUX07);
    
    //LET CLB_OUT6、7替代 DB_PWM2A、B。
    clb_setOutputMask (clb2_base、1 << 6 | 1 << 7、true);
    
    EDIS;
    
    
    
    
    //选择 CLB2_base
    CLB_CONFIGLocalInputMux (CLB2_base、CLB_IN0、CLB_LOCAL_IN_MUX_GLOBAL_IN);
    CLB_CONFIGLocalInputMux (CLB2_base、CLB_IN1、CLB_LOCAL_IN_MUX_GLOBAL_IN);
    CLB_CONFIGLocalInputMux (CLB2_base、CLB_IN2、CLB_LOCAL_IN_MUX_GLOBAL_IN);
    CLB_CONFIGLocalInputMux (CLB2_base、CLB_in3、CLB_LOCAL_IN_MUX_GLOBAL_IN);
    CLB_CONFIGLocalInputMux (CLB2_base、CLB_IN4、CLB_LOCAL_IN_MUX_GLOBAL_IN);
    CLB_CONFIGLocalInputMux (CLB2_base、CLB_iN5、CLB_LOCAL_IN_MUX_GLOBAL_IN);
    CLB_CONFIGLocalInputMux (CLB2_base、CLB_IN6、CLB_LOCAL_IN_MUX_GLOBAL_IN);
    CLB_CONFIGLocalInputMux (CLB2_base、CLB_IN7、CLB_LOCAL_IN_MUX_GLOBAL_IN);
    
    
    // GPIO16-->输入 XBar 1 --> AUXSIG0 -->边界0
    // EPWM2A_DB ->边界1
    // EPWM2B_DB ->边界2.
    CLB_CONFIGGlobalInputMux (CLB2_base、CLB_IN0、CLB_GLOBAL_IN_MUX_CLB_AUXSIG0);
    CLB_CONFIGGlobalInputMux (CLB2_base、CLB_IN1、CLB_GLOBAL_IN_MUX_EPWM2A_DB);//
    CLB_CONFIGGlobalInputMux (CLB2_base、CLB_IN2、CLB_GLOBAL_IN_MUX_EPWM2B_DB);//
    //
    CLB_CONFIGGlobalInputMux (CLB2_base、CLB_in3、CLB_GLOBAL_IN_MUX_EPWM1A);
    CLB_CONFIGGlobalInputMux (CLB2_base、CLB_IN4、CLB_GLOBAL_IN_MUX_EPWM1A);
    CLB_CONFIGGlobalInputMux (CLB2_base、CLB_iN5、CLB_GLOBAL_IN_MUX_EPWM1A);
    CLB_CONFIGGlobalInputMux (CLB2_base、CLB_IN6、CLB_GLOBAL_IN_MUX_EPWM1A);
    CLB_CONFIGGlobalInputMux (CLB2_base、CLB_IN7、CLB_GLOBAL_IN_MUX_EPWM1A);
    
    
    //为 CLB2、IN0、1、2选择外部
    CLB_CONFIGGPInputMux (CLB2_base、CLB_IN0、CLB_GP_IN_MUX_EXTERNAL);
    CLB_CONFIGGPInputMux (CLB2_base、CLB_IN1、CLB_GP_IN_MUX_EXTERNAL);
    CLB_CONFIGGPInputMux (CLB2_base、CLB_IN2、CLB_GP_IN_MUX_EXTERNAL);
    
    CLB_CONFIGGPInputMux (CLB2_base、CLB_in3、CLB_GP_IN_MUX_GP_REG);
    CLB_CONFIGGPInputMux (CLB2_base、CLB_IN4、CLB_GP_IN_MUX_GP_REG);
    CLB_CONFIGGPInputMux (CLB2_base、CLB_iN5、CLB_GP_IN_MUX_GP_REG);
    CLB_CONFIGGPInputMux (CLB2_base、CLB_IN6、CLB_GP_IN_MUX_GP_REG);
    CLB_CONFIGGPInputMux (CLB2_base、CLB_IN7、CLB_GP_IN_MUX_GP_REG);
    
    //初始化 CLB2和使能
    initTILE2 (clb2_base);
    clb_enableCLB (CLB2_base);
    
    //EINT;//
    ERTM;//
    
    for (;;)
    {
    
    if (GpioDataRegs.GPADD.bit.GPIO16 ==0)
    {
    GpioDataRegs.GPASET.bit.GPIO0 = 1;
    // delay_US (100);
    
    }
    其他
    {
    GpioDataRegs.GPACLEAR.bit.GPIO0=1;
    // delay_US (100);
    
    }
    
    ASM (" NOP");
    
    }
    }
    
    
    
    空 InitEPwm2Examples()
    {
    
    EPwm2Regs.TBPRD = 5000; //设置计时器周期
    EPwm2Regs.TBPHS.bit.TBPHS = 0x0000; //相位为0
    EPwm2Regs.TBCTR = 0x0000; //清除计数器
    
    //设置 TBCLK
    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数
    EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE; //禁用相位加载
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2; //时钟与 SYSCLKOUT 的比率
    EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; //在上慢下来观察
    //范围
    
    //设置比较
    EPwm2Regs.CMPA.bit.CMPA = 2500;
    
    //设置操作
    EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; //将 PWM2A 设置为零
    EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;
    
    EPwm2Regs.AQCTLB.bit.CAU = AQ_CLEAR; //将 PWM2A 设置为零
    EPwm2Regs.AQCTLB.bit.CAD = AQ_SET;
    
    //低电平有效互补 PWM -设置死区
    EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
    EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
    EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL;
    EPwm2Regs.DBRED.bit.DBRED = 400;// x*100 =延迟 x us
    EPwm2Regs.DBFED.bit.DBFED = 400;
    ///EPwm2_DB_DIRECTION = 1;
    
    //中断,我们将在其中修改死区
    EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; //选择“零时 INT”事件
    EPwm2Regs.ETSEL.bit.INTEN = 1; //启用 INT
    EPwm2Regs.ETPS.bit.INTPRD = et_3rd; //生成第3个事件的 INT
    
    }
    
    
    

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

    您将覆盖死区模块上的 EPWM2输出信号。 您还可以在死区模块中接收来自 EPWM2的信号。 这一切都很好。

    您将输出发送到 OUT4和 OUT5、然后使用输出 XBAR 将其从器件中取出、该输出看起来也是正确的。

    但是、您的 CLB 逻辑块根本无法正常工作... 您的 ePWM 输出不会改变、而您的 CLB OUT4和 OUT5始终处于低电平...

    我不确定问题是什么。 您能否从与门 EX8类似的较小示例开始? 我们需要分步调试这个。

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

    您是否尝试过 EX8?

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

    您好、Nima、

    我已经尝试了 EX8

    我将 EPWM3A (50%周期)设置为 GPIO0的输入、将 V3.3设置为 GPIO1的输入。 希望 GPIO24 (outputxbar 1)生成 EPWM3A 波形。 但是、波形保持低电平。  

    这也表明 CLB 模块不能正常工作。 这是否与硬件相关?   

    您可以在 TI LaunchPad 中尝试我的代码吗?

    非常感谢您的帮助。

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

    您能否仅使用 DRIVERLIB 恢复项目、以便我可以在 myside 上进行测试。 我看到一些位字段、我不记得曾经提供过基于位字段的 CLB 项目。

    您是否可以更新要在 EX8基础上构建的项目? 这样、我就可以确认问题不是来自 InitSysctl 和最初未使用 Driverlib CLB 示例进行测试的其他函数。

    NIMA

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

    你好、Nima

    非常感谢您的帮助。 当我尝试修改源代码以  仅使用 DRIVERLIB 时、我发现存在两大不便。

    然后、我意识到我使用的所有文件都来自 C2000Ware、这是由我颠倒提供的 vedio 所示的。

    正如我在下一篇文章中提到的、为什么同一函数存在不同的库非常令人困惑。  

    https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/926319

     要找到解决方案, 我将尝试购买 TI LaunchPad 并测试代码。 再次感谢您的所有帮助

    陈建波

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

    谢谢、

    完成后请告知我。

    NIMA