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.

cc3200 如何通过dma方式实现pwm duty更改

Other Parts Discussed in Thread: CC3200

大家好,

我想通过dma的方式实现pwm duty的修改,可是根本无法输出pwm波形,并且进入不了TimerA3IntHandler中断处理函数,代码如下,请各位大侠帮忙分析一下,十分感激

static void
TimerA3IntHandler(void)
{
    unsigned long ulStatus;
    
    //
    // Clear all interrupts for Timer unit 0.
    //
    ulStatus = MAP_TimerIntStatus(TIMERA3_BASE, true);
    MAP_TimerIntClear(TIMERA3_BASE, ulStatus);
    
    MAP_TimerEnable(TIMERA3_BASE, TIMER_A);
}

      for(uint8_t i =0;i<255;i++)
          duty_cycle[i] = i*DUTYCYCLE_GRANULARITY;
  //
    // TIMERA3 (TIMER B) as YELLOW of RGB light. GPIO 10 --> PWM_6
    //
    SetupTimerPWMMode(TIMERA3_BASE, TIMER_A,  (TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PWM), 1);

    UDMAInit();

    UDMAChannelSelect(UDMA_CH6_TIMERA3_A, NULL);
     //
    // Setup DMA transfer for PWM
    //
      MAP_TimerIntRegister(TIMERA3_BASE,TIMER_A,TimerA3IntHandler);
    
      MAP_TimerIntEnable(TIMERA3_BASE,TIMER_TIMA_MATCH);
    
      UDMASetupTransfer(UDMA_CH6_TIMERA3_A,UDMA_MODE_BASIC,255,UDMA_SIZE_16,UDMA_ARB_1,
                      (void *)duty_cycle,
                      UDMA_SRC_INC_16,
                      (void *)(TIMERA3_BASE+TIMER_O_TAMATCHR),
                      UDMA_DST_INC_NONE);
    
    MAP_uDMAChannelAttributeEnable(UDMA_CH6_TIMERA3_A,UDMA_ATTR_HIGH_PRIORITY);
    MAP_TimerDMAEventSet(TIMERA3_BASE,TIMER_DMA_MODEMATCH_A);
    MAP_uDMAChannelRequest(UDMA_CH6_TIMERA3_A);
}

  • 请参考CC3200 TRM的9.3.2.4节,提供了一个PWM的例程: www.ti.com/lit/ug/swru367d/swru367d.pdf
  • Hi viki shi,
    thanks for your reply. in my application i want to change pwm duty cycle by DMA mode, i have already posted code here. will you please kindly have a look and figure out the problem. i really can't find out the matter. many thanks
  • dear all,

             in my project, i  want to change pwm duty cycle through  DMA mode ,i have following config for this ,but it doesn't  work. i can't find  why. so any people can give me more advices? here i post my code, thanks

    static void
    TimerA3IntHandler(void)
    {
        unsigned long ulStatus;
        
        //
        // Clear all interrupts for Timer unit 0.
        //
        ulStatus = MAP_TimerIntStatus(TIMERA3_BASE, true);
        MAP_TimerIntClear(TIMERA3_BASE, ulStatus);
        
        MAP_TimerEnable(TIMERA3_BASE, TIMER_A);
    }

          for(uint8_t i =0;i<255;i++)
              duty_cycle[i] = i*DUTYCYCLE_GRANULARITY;
      //
        // TIMERA3 (TIMER B) as YELLOW of RGB light. GPIO 10 --> PWM_6
        //
        SetupTimerPWMMode(TIMERA3_BASE, TIMER_A,  (TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PWM), 1);

        UDMAInit();

        UDMAChannelSelect(UDMA_CH6_TIMERA3_A, NULL);
         //
        // Setup DMA transfer for PWM
        //
          MAP_TimerIntRegister(TIMERA3_BASE,TIMER_A,TimerA3IntHandler);
        
          MAP_TimerIntEnable(TIMERA3_BASE,TIMER_TIMA_MATCH);
        
          UDMASetupTransfer(UDMA_CH6_TIMERA3_A,UDMA_MODE_BASIC,255,UDMA_SIZE_16,UDMA_ARB_1,
                          (void *)duty_cycle,
                          UDMA_SRC_INC_16,
                          (void *)(TIMERA3_BASE+TIMER_O_TAMATCHR),
                          UDMA_DST_INC_NONE);
        
        MAP_uDMAChannelAttributeEnable(UDMA_CH6_TIMERA3_A,UDMA_ATTR_HIGH_PRIORITY);
        MAP_TimerDMAEventSet(TIMERA3_BASE,TIMER_DMA_MODEMATCH_A);
        MAP_uDMAChannelRequest(UDMA_CH6_TIMERA3_A);
    }