在线情况
楼主
  • 头像
  • 级别
    • 积分23
    • 经验1506
    • 文章25
    • 注册2010-12-22
    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的设置可能有问题,但不会改,纠结了快一星期了,请大侠帮帮忙看看~~~~~
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
    • 门派
    • 职务总版主
    • 声望+9
    • 财富5
    • 积分3065
    • 经验390701
    • 文章6744
    • 注册2006-03-07
    你这程序是直接拿TI的原例子来使用吗?
    如果是的话,应该可以直接使用啊...。一般采用TI提供的例子都没问题的。你具体要实现怎样的传输?
    [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
    在线情况
    3
    • 头像
    • 级别
      • 积分23
      • 经验1506
      • 文章25
      • 注册2010-12-22
      不是直接使用,TI的只找到看门狗和DMA的设置,看门狗+DMA用的是软件触发,就是DMACTL0 |= DMA0TSEL_0(选0通道),看了数据手册Ta的触发是1通道。具体传输就是定时时间到了,触发了DMA的启动,DMA把数值搬到IO上让灯闪烁。
      就是想看看数据用DMA搬移比经过CPU快多少
      微控网感谢您的参与
      在线情况
      4
      • 头像
      • 级别
      • 门派
      • 职务总版主
      • 声望+9
      • 财富5
      • 积分3065
      • 经验390701
      • 文章6744
      • 注册2006-03-07
      这个疑问确实有意思,测试比较者的速度。对于DMA在我的实际中确实少用,所以能给你的意见并不多。
      不过可否在触发后的马上使用IO置0,然后到数据移完后马上就置1。用示波器测量这过程的动态时间。
      同样,CPU搬移数据更加可以这样的测量了。不知我想法是否可行呢?
      [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
      Powered by LeadBBS 9.2 .
      Page created in 0.1719 seconds with 5 queries.