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.

[参考译文] MSP430FR5969:ADC->DMA-> fram的最佳资源

Guru**** 2538930 points
Other Parts Discussed in Thread: ENERGIA

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1089630/msp430fr5969-best-resource-for-adc--dma--fram

部件号:MSP430FR5969
主题中讨论的其他部件:Energia

我想知道是否有从ADC12获取的样本数量可控的示例代码,然后通过DMA将数据存储到FRAM内存中。 我从多个其他示例中将其拼合在一起,但一半语法不适用于我的Energia项目,导入所需的标题由于某种原因而无法正常工作。

我更喜欢一个可以直接从资源浏览器中提取的项目(如果存在用于不同MSP430的项目)。 此ADC->DMA->FRAM示例是否存在于任何地方?

谢谢你。

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

    此程序以TI示例MSP430F55xx_DMA_04.c的形式开始使用,所需的更改相对较少。 它写入SRAM,而不是FRAM。  写入FRAM是一个小程序更改,但需要了解内存保护单元(MPU)。 我建议您先尝试一下。

    ///
    //  FR5969 ADC12->DMA demo
    //  Started life as TI example MSP430F55xx_dma_04.c
    //
    #include <msp430.h>
    #include <stdint.h>
    #define DEMO_5969   1                       // Specifics for FR5969 and/or Launchpad
    unsigned int DMA_DST;                       // ADC conversion result is stored in this variable
    
    int main(void)
    {
      WDTCTL = WDTPW+WDTHOLD;                   // Hold WDT
    
      P1OUT &= ~BIT0;                           // P1.0 clear
      P1DIR |= BIT0;                            // P1.0 output
    #if DEMO_5969   // FR5969 Launchpad
      P1SEL0 |= BIT2;                           // P1.2 as A2 per
      P1SEL1 |= BIT2;                           //  SLAS704F Table 6-49
      PM5CTL0 &= ~LOCKLPM5;                     // Needed for FR5969, not for F5529
    #else           // Original for F5529
      P5SEL |= BIT7;                            // P5.7/TB1 option select
      P5DIR |= BIT7;                            // Output direction
      P6SEL |= BIT0;                            // Enable A/D channel A0
    #endif
    
      //Setup Timer B0
      TBCCR0 = 0xFFFE;
      TBCCR1 = 0x8000;
      TBCCTL1 = OUTMOD_3;                       // CCR1 set/reset mode
      TBCTL = TBSSEL_2+MC_1+TBCLR;              // SMCLK, Up-Mode
    
      // Setup ADC12
      ADC12CTL0 = ADC12SHT0_15+ADC12MSC+ADC12ON;// Sampling time, MSC, ADC12 on
      ADC12CTL1 = ADC12SHS_3+ADC12CONSEQ_2;     // Use sampling timer; ADC12MEM0
                                                // Sample-and-hold source = CCI0B =
                                                // TBCCR1 output
                                                // Repeated-single-channel
    #if DEMO_5969  // Use A2 since A0/A1 are taken on the Launchpad
      ADC12MCTL0 = ADC12VRSEL_0+ADC12INCH_2;     // V+=AVcc V-=AVss, A0 channel
    #else
      ADC12MCTL0 = ADC12SREF_0+ADC12INCH_0;     // V+=AVcc V-=AVss, A0 channel
    #endif
      ADC12CTL0 |= ADC12ENC;
    
      // Setup DMA0
    #if DEMO_5969     // Different DMA trigger number
      DMACTL0 = DMA0TSEL_26;                    // ADC12IFGx trigger per DS Table 6-12
    #else
      DMACTL0 = DMA0TSEL_24;                    // ADC12IFGx triggered
    #endif
      DMACTL4 = DMARMWDIS;                      // Read-modify-write disable
      DMA0CTL &= ~DMAIFG;
      DMA0CTL = DMADT_4+DMAEN+DMADSTINCR_0+DMAIE; // Rpt single tranfer, unchanged dst, Int
      DMA0SZ = 1;                               // DMA0 size = 1
    
      __data20_write_long((uintptr_t) &DMA0SA,(uintptr_t) &ADC12MEM0);
                                                // Source block address
      __data20_write_long((uintptr_t) &DMA0DA,(uintptr_t) &DMA_DST);
                                                // Destination single address
      __bis_SR_register(LPM0_bits + GIE);       // LPM0 w/ interrupts
      __no_operation();                         // used for debugging
    }
    
    //------------------------------------------------------------------------------
    // DMA Interrupt Service Routine
    //------------------------------------------------------------------------------
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=DMA_VECTOR
    __interrupt void DMA_ISR(void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(DMA_VECTOR))) DMA_ISR (void)
    #else
    #error Compiler not supported!
    #endif
    {
      switch(__even_in_range(DMAIV,16))
      {
        case 0: break;
        case 2:                                 // DMA0IFG = DMA Channel 0
          P1OUT ^= BIT0;                        // Toggle P1.0 - PLACE BREAKPOINT HERE AND CHECK DMA_DST VARIABLE
          break;
        case 4: break;                          // DMA1IFG = DMA Channel 1
        case 6: break;                          // DMA2IFG = DMA Channel 2
        case 8: break;                          // DMA3IFG = DMA Channel 3
        case 10: break;                         // DMA4IFG = DMA Channel 4
        case 12: break;                         // DMA5IFG = DMA Channel 5
        case 14: break;                         // DMA6IFG = DMA Channel 6
        case 16: break;                         // DMA7IFG = DMA Channel 7
        default: break;
      }
    }
    

    [编辑:为了参考,原始文件位于此处:

    https://dev.ti.com/tirex/explore/node?node=ALkqBIa6R80LFOC7XAng.Q__IOGqZri__LATEST

    ]

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

    您好,

    ADC和DMA学院可以帮助您进行编码。 您可以参考以下链接。  

    https://dev.ti.com/tirex/explore/node?node=AKzqA0IGyLAD2nwRN2jyTA__IOGqZri__LATEST

    https://dev.ti.com/tirex/explore/node?node=AJAJEjm2KsURl3nLMsYpVw__IOGqZri__LATEST

    此致,

    现金Hao

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

    感谢您的提示。 我最后需要禁用MPU以从FRAM中读取任何内容。 这可能不是正确的方法,这就是为什么我希望提供一个示例。

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

    您是否成功使用了SRAM版本(如上所述)?

    CCS在“生成设置”->“常规”->“MPU”选项卡中有一个相当方便的MPU配置器。 您可能需要声明FRAM缓冲区为持久性,以便将它们放置在FRAM的可预测区域中(底部)。

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

    我没有尝试SRAM版本,因为我需要FRAM,因为最终数据需要在电源循环后继续运行。

    MPU选项卡是我禁用MPU的地方。 'Let compiler handle memory...'复选框已打开,无法从我尝试的位置的FRAM读取数据。 我计划在完成程序的其余详细信息后手动指定内存。

    除非'Let compiler handle memory...'复选框需要持久性标志和一些相关代码来工作,而这些代码未包含在我所使用的TI示例中?

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

    我不知道MPU选项卡是否考虑了TI.PERSISTAT部分的大小,因为我总是从相反的方向看到它。 试试吧。 MAP文件通常是一个很大的帮助。

    更广泛地说:我认为您超出了TI示例的范围(我必须研究该示例以提供某些内容),因此您可能需要进行一些实验。