5438中DMA+TA如何设置?

楼主
5438中DMA+TA如何设置?
void DMA_int();

int ledvalue=0xaa;
void main( void )
{
  WDTCTL = WDTPW + WDTHOLD;                 //关闭看门狗
  P11DIR = BIT1+BIT2;                       // P11.1-2 to output direction
  P11SEL |= BIT1+BIT2;                      // P11.1-2 to output SMCLK,MCLK
  P5SEL |= 0x0C;                            // Port select XT2

  UCSCTL6 &= ~XT2OFF;                       // Enable XT2
  UCSCTL3 |= SELREF_2;                      // FLLref = REFO
                                            // Since LFXT1 is not used,
                                            // sourcing FLL with LFXT1 can cause
                                            // XT1OFFG flag to set
  UCSCTL4 |= SELA_2;                        // ACLK=REFO,SMCLK=DCO,MCLK=DCO

  // Loop until XT1,XT2 & DCO stabilizes
  do
  {
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
                                            // Clear XT2,XT1,DCO fault flags
    SFRIFG1 &= ~OFIFG;                      // Clear fault flags
  }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag

  UCSCTL6 &= ~XT2DRIVE0;                    // Decrease XT2 Drive according to
                                            // expected frequency
  UCSCTL4 |= SELS_5 + SELM_5;               // SMCLK=MCLK=XT2
 
  P2DIR|=0xff ;                             //8个LED方向
 
 
  TA0CCTL0 = CCIE;                         // CCR0 interrupt enabled
  TA0CCR0 =16;
  TA0CTL |= TASSEL_2 +MC_1 + TACLR;         // SMCLK,
 
  DMA_int();
 
  __bis_SR_register(LPM3_bits + GIE);       // Enter LPM3, enable interrupts
  __no_operation();                         // For debugger
 
}
 
   #pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0_A0 (void)
{
 
  ledvalue=~ledvalue;
  DMA0CTL |=DMAEN;
   
}


void DMA_int()
{
   DMACTL0 |= DMA0TSEL_1;                        // TA0CCRO  CCIFG
   __data16_write_addr((unsigned short) &DMA0SA,(unsigned long) ledvalue);
   __data16_write_addr((unsigned short) &DMA0DA,(unsigned long) &P2OUT);
   DMA0SZ = 16;                    
   DMA0CTL |= DMADT_0;
}


  选了外部8M晶振,Ta单调增模式,DMA选择TA CCIFG触发,程序感觉没什么问题?但灯就是不亮。
  主要是想在示波器上看灯亮灭的周期,,DMA的设置可能有问题,但不会改,纠结了快一星期了,请大侠帮帮忙看看~~~~~
1楼
你这程序是直接拿TI的原例子来使用吗?
如果是的话,应该可以直接使用啊...。一般采用TI提供的例子都没问题的。你具体要实现怎样的传输?
2楼
不是直接使用,TI的只找到看门狗和DMA的设置,看门狗+DMA用的是软件触发,就是DMACTL0 |= DMA0TSEL_0(选0通道),看了数据手册Ta的触发是1通道。具体传输就是定时时间到了,触发了DMA的启动,DMA把数值搬到IO上让灯闪烁。
就是想看看数据用DMA搬移比经过CPU快多少
3楼
这个疑问确实有意思,测试比较者的速度。对于DMA在我的实际中确实少用,所以能给你的意见并不多。
不过可否在触发后的马上使用IO置0,然后到数据移完后马上就置1。用示波器测量这过程的动态时间。
同样,CPU搬移数据更加可以这样的测量了。不知我想法是否可行呢?

电脑版 Page created in 0.1562 seconds width 3 queries.