RA2L1 PWM+DTC

我想使用RA2L1的PWM控制ws2812灯带(通过DTC传输改变GTCCRA从而改变每个周期的占空比),RA2L1只有DTC没有DMAC,尝试使用PWM+DTC,源地址为GPT的GTCCRA的设置值数据buff,目的地址为GPT的GTCCRA,DTC触发源为GPT溢出中断,发现DTC传输启动后源地址的值有增加、待传计数也有减少,但是GTCCRA并没有改变。

请问这种使用PWM+DTC的方式是否可行,或者有参考资料吗?

  • 你好,

    GTCCRA寄存器是无法直接写入的,所以想要直接修改GTCCRA是不可行的,如果只是想要修改占空比的话,请参考下列代码:

    #define GPT_EXAMPLE_DESIRED_DUTY_CYCLE_PERCENT (25)
    #define GPT_EXAMPLE_MAX_PERCENT (100)
    /* This example shows how to calculate a new duty cycle value at runtime. */
    void gpt_duty_cycle_calculation_example (void)
    {
    fsp_err_t err = FSP_SUCCESS;
    /* Initializes the module. */
    err = R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg);
    /* Handle any errors. This function should be defined by the user. */
    assert(FSP_SUCCESS == err);
    /* Start the timer. */
    (void) R_GPT_Start(&g_timer0_ctrl);
    /* Get the current period setting. */
    (void) R_GPT_InfoGet(&g_timer0_ctrl, &info);
    uint32_t current_period_counts = info.period_counts;
    /* Calculate the desired duty cycle based on the current period. Note that if the period could be larger than
    * UINT32_MAX / 100, this calculation could overflow. A cast to uint64_t is used to prevent this. The cast is
    * not required for 16-bit timers. */
    uint32_t duty_cycle_counts =
    (uint32_t) (((uint64_t) current_period_counts * GPT_EXAMPLE_DESIRED_DUTY_CYCLE_PERCENT) /
    GPT_EXAMPLE_MAX_PERCENT);
    /* Set the calculated duty cycle. */
    err = R_GPT_DutyCycleSet(&g_timer0_ctrl, duty_cycle_counts, GPT_IO_PIN_GTIOCB);
    assert(FSP_SUCCESS == err);
    }
  • 谢谢。

    我使用 R_GPT_DutyCycleSet可以设置成功,我看了一下 R_GPT_DutyCycleSet里面要设置CRA通道时是把值设置给了GTCCRC,我又查阅了用户指南,GTCCRC为GTCCRA的缓冲器,每当溢出时把GTCCRC的值传送给GTCCRA

    但是这样理论上DTC应该可以把目的地址设置为GTCCRC,每次溢出时DTC源地址buff的数据依次传送给GTCCRC再传送给GTCCRA。我尝试了一下把目的地址设置为GTCCRC,结果GTCCRC的值还是没有变化,GTCCRA也没有变