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.

[参考译文] LP-MSPM0G3507:交叉触发单稳态

Guru**** 2620655 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1447587/lp-mspm0g3507-cross-triggering-one-shots

器件型号:LP-MSPM0G3507
主题中讨论的其他器件:SysConfig

工具与软件:

嗨、 Im 试图设置 TIMA0来一次性交叉触发 TIMA1、但我一定是误解了...

当 TIMA1设置为重复(

GPTIMER_CTRCTL_REPEAT_REPEAT_1)、然后 TIMA1按预期启动并运行。
如果我使用不同的加载值(TIMA0=1000、TIMA1=300)、则可以看到当 TIMA0发生比较递增事件时 TIMA1具有重新加载。
到目前为止一切顺利-似乎 TIMA0在每次比较时触发。
但是、如果我将 TIMA1设置为不重复-对于单次触发-那么它根本不会触发。
 
我尝试未启用 TIMA0、而是使用手动触发器:
TIMA0->COMMONREGS.CTTRIG = GPTIMER_CTTRIG_TRIG_GENERATE;

这会在 TIMA1上生成单次触发。

因此、我想知道:
如果 TIMA1设置为 REPEAT=1、而 TIMA0设置为 REPEAT=0、那么 TIMA0为什么会在每个比较递增事件上生成触发?
我缺少什么?

代码如下:

#include <ti/driverlib/m0p/dl_interrupt.h>
#include "ti_msp_dl_config.h"

void setup();

int main(void)
{
    setup();

    while (1)
    {
    }
}

void setup()
{
    SYSCFG_DL_initPower();  // Reset & Enable power to peripherals

    // Set up the pin mux. PINCM19 = PA8, PINCM39 = PA17
    IOMUX->SECCFG.PINCM[IOMUX_PINCM19] = (IOMUX_PINCM19_PF_TIMA0_CCP0 | IOMUX_PINCM_PC_CONNECTED);
    IOMUX->SECCFG.PINCM[IOMUX_PINCM39] = (IOMUX_PINCM39_PF_TIMA1_CCP0 | IOMUX_PINCM_PC_CONNECTED);
    GPIOA->DOESET31_0 = (DL_GPIO_PIN_8 | DL_GPIO_PIN_17);

    SYSCFG_DL_SYSCTL_init();    // Enable clocks, and some system thingimabobs.


    ///////////////////////////////////// PWM setup //////////////////////////////////////
    // 1 - Clocking
    TIMA0->CLKSEL = GPTIMER_CLKSEL_BUSCLK_SEL_ENABLE;
    TIMA0->CLKDIV = GPTIMER_CLKDIV_RATIO_DIV_BY_8;
    TIMA0->COMMONREGS.CPS = 39U;

    TIMA1->CLKSEL = GPTIMER_CLKSEL_BUSCLK_SEL_ENABLE;
    TIMA1->CLKDIV = GPTIMER_CLKDIV_RATIO_DIV_BY_8;
    TIMA1->COMMONREGS.CPS = 39U;

    // 2 - CCACT            CC pin actions: High on zero, low on compare-up
    uint32_t CCACT_MASK = (GPTIMER_CCACT_01_SWFRCACT_CMPL_MASK | GPTIMER_CCACT_01_SWFRCACT_MASK |
                           GPTIMER_CCACT_01_FEXACT_MASK | GPTIMER_CCACT_01_FENACT_MASK |
                           GPTIMER_CCACT_01_CC2UACT_MASK | GPTIMER_CCACT_01_CC2DACT_MASK |
                           GPTIMER_CCACT_01_CUACT_MASK | GPTIMER_CCACT_01_CDACT_MASK |
                           GPTIMER_CCACT_01_LACT_MASK | GPTIMER_CCACT_01_ZACT_MASK);

    uint32_t actions = (GPTIMER_CCACT_01_ZACT_CCP_HIGH | GPTIMER_CCACT_01_CUACT_CCP_LOW);
    TIMA0->COUNTERREGS.CCACT_01[0] = (TIMA0->COUNTERREGS.CCACT_01[0] & ~CCACT_MASK) | (actions & CCACT_MASK);
    TIMA1->COUNTERREGS.CCACT_01[0] = (TIMA1->COUNTERREGS.CCACT_01[0] & ~CCACT_MASK) | (actions & CCACT_MASK);

    // 3 - CCCTL            Compare mode, Load COND on CCP trigger rise, updates to CC written immediately.
    uint32_t CCCTL_MASK = (GPTIMER_CCCTL_01_COC_MASK | GPTIMER_CCCTL_01_ZCOND_MASK |
                           GPTIMER_CCCTL_01_LCOND_MASK | GPTIMER_CCCTL_01_ACOND_MASK |
                           GPTIMER_CCCTL_01_CCOND_MASK);

    uint32_t mode_Conds = (GPTIMER_CCCTL_01_COC_COMPARE | GPTIMER_CCCTL_01_CCUPD_IMMEDIATELY);
    TIMA0->COUNTERREGS.CCCTL_01[0] = (TIMA0->COUNTERREGS.CCCTL_01[0] & ~CCCTL_MASK) | (mode_Conds & CCCTL_MASK);

    mode_Conds |= GPTIMER_CCCTL_01_LCOND_CC_TRIG_RISE;
    TIMA1->COUNTERREGS.CCCTL_01[0] = (TIMA1->COUNTERREGS.CCCTL_01[0] & ~CCCTL_MASK) | (mode_Conds & CCCTL_MASK);

    // 4 - OCTL             CCP Initally low, no invertion, use generator out.
    TIMA0->COUNTERREGS.OCTL_01[0] = (GPTIMER_OCTL_01_CCPIV_LOW | GPTIMER_OCTL_01_CCPOINV_NOINV | GPTIMER_OCTL_01_CCPO_FUNCVAL);
    TIMA1->COUNTERREGS.OCTL_01[0] = (GPTIMER_OCTL_01_CCPIV_LOW | GPTIMER_OCTL_01_CCPOINV_NOINV | GPTIMER_OCTL_01_CCPO_FUNCVAL);

    // 5 - IFCTL            No invert, use trigger input
    uint32_t IFCTL_MASK = (GPTIMER_IFCTL_01_INV_MASK | GPTIMER_IFCTL_01_ISEL_MASK);
    uint32_t input = (GPTIMER_IFCTL_01_INV_NOINVERT | GPTIMER_IFCTL_01_ISEL_TRIG_INPUT);
    TIMA1->COUNTERREGS.IFCTL_01[0] = (TIMA1->COUNTERREGS.IFCTL_01[0] & ~IFCTL_MASK) | (input & IFCTL_MASK);

    // 6 - LOAD         pwm period = 1000
    TIMA0->COUNTERREGS.LOAD = 1000;
    TIMA1->COUNTERREGS.LOAD = 300;

    // 7 - CTRCTL           CVAE=0,
    uint32_t CTRCTL_MASK = (GPTIMER_CTRCTL_CZC_MASK | GPTIMER_CTRCTL_CAC_MASK |
                            GPTIMER_CTRCTL_CLC_MASK | GPTIMER_CTRCTL_CVAE_MASK |
                            GPTIMER_CTRCTL_CM_MASK | GPTIMER_CTRCTL_REPEAT_MASK |
                            GPTIMER_CTRCTL_EN_MASK);

    uint32_t ctrctl_val = (GPTIMER_CTRCTL_REPEAT_REPEAT_1 | GPTIMER_CTRCTL_CM_UP | GPTIMER_CTRCTL_EN_DISABLED | GPTIMER_CTRCTL_CVAE_ZEROVAL);
    TIMA0->COUNTERREGS.CTRCTL = (TIMA0->COUNTERREGS.CTRCTL & ~CTRCTL_MASK) | (CTRCTL_MASK & ctrctl_val);

    ctrctl_val = (GPTIMER_CTRCTL_REPEAT_REPEAT_1 | GPTIMER_CTRCTL_CM_UP | GPTIMER_CTRCTL_EN_DISABLED | GPTIMER_CTRCTL_CVAE_ZEROVAL);
    TIMA1->COUNTERREGS.CTRCTL = (TIMA1->COUNTERREGS.CTRCTL & ~CTRCTL_MASK) | (CTRCTL_MASK & ctrctl_val);

    // 8 - DUTY CYCLE (compare value)
    TIMA0->COUNTERREGS.CC_01[0] = 610;
    TIMA1->COUNTERREGS.CC_01[0] = 229;

    // 9 - ENABLE CLOCK   
    TIMA0->COMMONREGS.CCLKCTL = GPTIMER_CCLKCTL_CLKEN_ENABLED;
    TIMA1->COMMONREGS.CCLKCTL = GPTIMER_CCLKCTL_CLKEN_ENABLED;

    // 10 - SET CCP DIRECTION
    TIMA0->COMMONREGS.CCPD = GPTIMER_CCPD_C0CCP0_OUTPUT;
    TIMA1->COMMONREGS.CCPD = GPTIMER_CCPD_C0CCP0_OUTPUT;

    // 11 - TRIGGER CONTROL
    TIMA0->COMMONREGS.CTTRIGCTL = (GPTIMER_CTTRIGCTL_EVTCTTRIGSEL_CCU0 | GPTIMER_CTTRIGCTL_EVTCTEN_ENABLE | GPTIMER_CTTRIGCTL_CTEN_ENABLE);

    // 12 - TSEL     Trigger select
    TIMA1->COUNTERREGS.TSEL = (TIMA1->COUNTERREGS.TSEL & ~GPTIMER_TSEL_ETSEL_MASK) | (GPTIMER_TSEL_ETSEL_TRIG0 & GPTIMER_TSEL_ETSEL_MASK);
    TIMA1->COUNTERREGS.TSEL |= (GPTIMER_TSEL_TE_ENABLED);


    TIMA0->COUNTERREGS.CTRCTL |= GPTIMER_CTRCTL_EN_ENABLED; // Start the main timer
    //TIMA0->COMMONREGS.CTTRIG = GPTIMER_CTTRIG_TRIG_GENERATE;  // Manually generate trigger
}

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

    尊敬的 Anders:感谢您向我们伸出援手! 让我在我的 LP 上实施此方案、然后看看我是否能够复制/解决您所遇到的问题。 为了我的理解、您能提供更多有关您正尝试实现的特定功能最终目标的信息吗? 这仅帮助我了解代码流程和预期的行为。

    -Brian

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

    嘿、感谢您的答复。
    目前、我正在研究此处理器上的一切工作原理。 最终目标是使用处理器来控制电源-但现在更具体地说、我正在研究使用相同外设但不同相位产生四个 PWM 信号的可能性。
    可能有不止一种方法可以做到这一点,但现在的调查已经引导我到这个特定的岛屿。
    简而言之、如果我尝试将 TIMA0设置为生成触发信号、那么我可以让 TIMA1获得"交叉触发"、但如果我尝试将 TIMA1设置为单次触发(REPEAT=0)、那么它似乎没有被触发。

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

    大家好、Anders、好的、这很合理。 我正在调查此问题、并将尽快与您联系、提供潜在 原因/解决方案。

    -Brian

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

    Anders 您好、您可以共享您的 SysConfig 以便我可以完全复制该文件吗? 同样、也不妨查看 timx_timer_mode_pwm_edge_sleep_shadow 示例。 此示例看起来与您最终尝试通过相当高的可配置性实现的目标类似。

    -Brian