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.

[参考译文] TMS320F28377D:28377d ADC+DMA

Guru**** 2032800 points
Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/679539/tms320f28377d-28377d-adc-dma

器件型号:TMS320F28377D
Thread 中讨论的其他器件:controlSUITEC2000WARE

我想利用 ADC 模块和 DMA 模块在没有 CPU 的情况下完成采样。我修改 C:\ti\controlSUITE\device_support\F2837xD\V210\F2837xD_examples_cpu1\dma_gsram_transfer 中的代码、并在其中添加 ADC 模块。 C:\ti\controlSUITE\device_support\F2837xD\V210\F2837xD_Examples_CPU1\ADC_SoC_Continuous\cpu01。我修改了电路板的通道。但无法正常工作,程序将以"

while (0==AdcaRegs.ADCINTFLG.bit.ADCINT1);"、但当我屏蔽"dma_inlt ()" fus.ADC 可以正常运行。dma 的配置是否与 ADC 的交叉连接冲突? 我无法理解。有人能帮我解决这个问题吗? 非常感谢您。


接下来是我稍微修改过的代码

//######################################################################################################################

//

//文件:  dma_gsram_transfer_cpu01.c

//

//标题: DMA GSRAM 传输

//

//! addtogroup cpu01_example_list

//!

DMA GSRAM 传输(dma_gsram_transfer)

//!

//!  此示例使用一个 DMA 通道从中的缓冲区传输数据

//!  RAMGS0到 RAMGS1中的缓冲区。 该示例设置 DMA 通道

//!  PERINTFRC 位重复、直到16个突发传输(其中每个

//!  突发为8个16位字)已完成。 传输的时间

//!  完成后、它将触发 DMA 中断。

//!

//!  b 监视\b 变量\n

//!  -\b  sdata -要发送的数据

//!  -\b  RDATA -接收到的数据

//!

//

//######################################################################################################################

//$TI 版本:F2837xD 支持库 V210 $

//$Release Date:Tue  Nov1 14:46:15 CDT 2016 $

//版权所有:版权所有(C) 2013-2016 Texas Instruments Incorporated -

//            http://www.ti.com/ 保留所有权利$

//######################################################################################################################

 

//

//包含的文件

//

#include "F28x_Project.h"

 

//

// DMA 数据段

//

#pragma DATA_SECTION (sdata、 "ramgs0");  //将 TX 数据映射到存储器

#pragma DATA_SECTION (RDATA、 "ramgs1");  //将 RX 数据映射到存储器

 

//

//定义

//

#define BURST      7       //将7写入寄存器以获得8的突发大小

#define 传输   15      //[(MEM_buffer_size/(burst + 1))- 1]

#define results_buffer_size 1024

//

//全局

//

uint16 sdata[1024];   //发送数据缓冲区

uint16 RDATA[1024];   //接收数据缓冲区

uint16 AdcaResult2[1024];

//uint16 AdcaResult3[1024];

易失 性 uint16 * DMADest;

易失 性 uint16 * DMASSOURCE;

易失 性 uint16 完成;

 

//

//函数原型

void  ConfigureADC (void);

void  dma_init (void);

//Setup the ADC for continuous Conversions on channel 0

void  SetupADCContinu模糊(void);

_interrupt  void  local_D_INTCH6_ISR (void);

//void dma_init (void);

void  error()

 

//

//主函

//

void  main (void)

 

   uint16 结果索引;

//

//步骤1. 初始化系统控制:

// PLL、安全装置、启用外设时钟

//此示例函数位于 F2837xD_SYSCTRL.c 文件中。

//

   InitSysCtrl()

 

 

 

//步骤2. 初始化 GPIO:

//此示例函数位于 F2837xD_GPIO.c 文件和中

//说明了如何将 GPIO 设置为其默认状态。

    InitGpio(); //针对此示例跳过

 

//步骤3. 清除所有中断并初始化 PIE 矢量表:

//禁用 CPU 中断

   Dint;

 

//将 PIE 控制寄存器初始化为默认状态。

//默认状态为禁用所有 PIE 中断和标志

//被清除。

//此函数位于 F2837xD_PIECTRL.c 文件中。

    InitPieCtrl()

 

//禁用 CPU 中断并清除所有 CPU 中断标志:

   IER = 0x0000;

   IFR = 0x0000;

 

//使用指向 shell 中断的指针初始化 PIE 矢量表

//服务例程(ISR)。

//这将填充整个表,即使是中断也是如此

//在本例中未使用。  这对于调试很有用。

//可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程

//此函数可在 F2837xD_PieVect.c 中找到

    InitPieVectTable()

 

 

 

   EALLOW;  //这是写入 EALLOW 受保护寄存器所必需的

   PieVectTable.DMA_CH6_INT=&LOCAL_D_INTCH6_ISR;

   EDIS;    //这是禁止写入 EALLOW 受保护寄存器所必需的

 

    //确保 DMA 连接到外设帧2桥接器(EALLOW 受保护)

    //

   ConfigureADC();

 

            //Setup the ADC for continuous Conversions on channel 0

   SetupADCContinuime();

   dma_init ();  //设置  DMA

    StartDMACH6()

   EALLOW;

   CpuSysRegs.SECMSEL.bit.PF2SEL = 1;

   EDIS;

   

    for (resultsIndex=0;resultsIndex<1024;resultsIndex++)

   {

       

        AdcaResult2[resultsIndex]=0;

   }

 

    //

   PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   //启用 PIE 块

   PieCtrlRegs.PIEIER7.bit.INTx6 = 1;   //启用 PIE 组7、INT 2 (DMA CH2)

   IER = M_INT7;                         //启用 CPU INT6

 

 

 

 

 

     EINT;  //启用全局中断 INTM

     ERTM;  //启用全局 实时 中断 DBGM

//步骤5. 特定于用户的代码、启用中断:

//初始化数据缓冲区

 

 

//

//启用此示例所需的中断

//

 

     resultsIndex=0;

      操作

     {

 

                   //启用 ADCINT 标志    若不配置这里,ADC采样后中断不会置位

                  AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;

 

 

         AdcaRegs.ADCINTFLGCLR.ALL = 0x000F;

          //软件强制启动 SOC

         AdcaRegs.ADCSOCFRC1.ALL = 0x000C;//启动软件启动 转换

 

          //继续采样,直到结果缓冲区已满

               while (resultsIndex < results_buffer_size)

         {

              //等待当前6个转换集完成

              while (0 = AdcaRegs.ADCINTFlG.bit.ADCINT1);

              //清除当前6次转换生成的 INT 标志

             AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

 

              //保存当前6次转换的结果

              //

 

             AdcaResult2[resultsIndex]= AdcaResultRegs.ADCRESULT2;

       

             结果索引++;

         }

     

 

          //禁用所有 ADCINT 标志以停止采样

         AdcaRegs.ADCINTSEL1N2.bit.INT1E = 0;

 

          asm ("  ESTOP0");

        } while (1);

//

// DMA 传输完成后,程序将在此处停止

//

 

 

 

//

//错误-将停止调试器的错误函数

//

 错误()

   asm ("    ESTOP0");  //测试失败!!! 停下来!

    适用于 (;);

 

//

// dma_init - TX 和 RX 通道的 DMA 设置。

//

void  dma_init()

    //

    //有关以下函数的说明,请参阅 dma.c。

    //

 

    //

    //初始化 DMA

    //

    DMAInitialize()

 

   DMASSOURCE =(易失 性 UINT16 *)&AdcaResultRegs.ADCRESULT2;

   DMADest =(易失 性 UINT16 *) RDATA;

 

    //

    //配置 DMA CH6

    //

    DMACH6AddrConfig (DMADest、DMASource);

    DMACH6BurstConfig (突发、1、1);

    DMACH6TransferConfig (传输、1、1);

    DMACH6ModeConfig (DMA_ADCAINT1、PERINT_ENABLE、OneShot_disable、CONT_disable、

                   SYNC_DISABLE、SYNC_SRC、OVRFLOW_DISABLE、十六位、

                   Chint_end、CHINT_ENABLE);

 

 

//

// local_D_INTCH6_ISR - DMA 通道6 ISR

//

_interrupt  void  local_D_INTCH6_ISR (void)

    uint16 i;

 

   EALLOW;  //需要在 ISR 内执行 EALLOW!!!

   DmaRegs.ch6.control.bit.halt = 1;

   PieCtrlRegs.PIEACK.all = PIEACK_group7; // ACK 以接收更多中断

                                            //来自此 PIE 组

   EDIS;

 

    for (i = 0;i < 1024;i++)

   {

        //

        //检查数据完整性

        //

        if (RDATA[i]!= i)

       {

           error();

       }

   }

 

   DONE = 1; //测试完成。

    返回;

 

//

//文件结束

//

 

 

//写入 ADC 配置并为 ADC A 和 ADC B 加电

 配置 ADC ()

   EALLOW;

 

    //写入配置

   AdcaRegs.ADCCTL2.bit.prescale = 15; //将 ADCCLK 分频器  配置ADC时钟,有系统时钟参考时钟为/4 μ s

 

    AdcSetMode (ADC_ADCA、ADC_Resolution_16BIT、ADC_SIGNALMODE_differential);

 

 

    //将脉冲位置设置为晚期

   AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;设置ADC中断产生时机在转换完成后 μ s

 

 

    //为 ADC 加电

   AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;上电需要掩饰1ms左右等待上电完成 μ s

 

    //延迟1ms 以允许 ADC 加电时间

   DELAY_US (1000);

 

   EDIS;

 

//设置 ADC 在一个通道上连续转换

void  SetupADCContinu模糊(void)

    uint16 acqps;

 

    //根据分辨率确定最小采集窗口(在 SYSCLKS 中)

    if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution){

       acqps = 511; /2560ns

   }

    否则 { //分辨率为16位

       acqps = 511; //320ns

   }

 

   EALLOW;

 

   AdcaRegs.ADCSOC2CTL.bit.CHSEL = 2;  /SOC 将在通道上进行转换

   AdcaRegs.ADCSOC3CTL.bit.CHSEL = 3;  /SOC 将在通道上进行转换

 

   AdcaRegs.ADCSOC2CTL.bit.ACQPS = acqps;    //采样窗口为  acqps + 1个 SYSCLK 周期

   AdcaRegs.ADCSOC3CTL.bit.ACQPS = acqps;    //采样窗口为  acqps + 1个 SYSCLK 周期

 

   AdcaRegs.ADCINTSEL1N2.bit.INT1E = 0; //禁用 INT1标志

 

   AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 1;

 

   AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 2;  // SOC5的末尾将设置 INT1标志  最后一个优先级的SOC即可,随时需要修改

   // AdcaRegs.ADCINTFLGCLR.bit.ADCINT1=1;

 

 

    //ADCINT1将触发 SOC

 

   AdcaRegs.ADCINTSOCSEL1.bit.SOC2 = 1;

   AdcaRegs.ADCINTSOCSEL1.bit.SOC3 = 1;

 

 

 

 

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

    我们在 C2000Ware 中提供的 F2837xD 器件支持的更新版本中提供了一个示例、该示例演示了如何将 DMA 与 ADC 配合使用。 如果您不想下载整个 C2000Ware 软件包、则应能够通过 TI 云工具访问该软件包。

    dev.ti.com/.../

    请查看该示例、看看您是否可以使用它来使代码正常工作。 我不知道为什么配置 DMA 会导致 ADC 中断标志停止工作。

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