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.

[参考译文] CCS/TMS320F28377S:使用 DMA 存储 ADC 数据

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/565628/ccs-tms320f28377s-storing-adc-data-using-dma

器件型号:TMS320F28377S

工具/软件:Code Composer Studio

您好!

我正在使用 TI Delfino Launchpad。 我正在使用 ADC1触发 DMA。 我已成功执行 DMA 数据传输。 但这只有在我保持 ADC ISR 并清除 ADC 中断标志时才有效。  `s 我禁用 ISR 并且它各自的 PIE 组、则 DMA 只传输一个字、然后不传输任何字。 我想问题是清除中断标志。

数据表显示:"收到外设中断事件信号后、DMA 将自动向中断源发送清零信号、以便随后发生中断事件"。

那么、在没有 CPU 干扰的情况下、DMA 和 ADC 实际上是否可以继续传输数据?

#include "F28x_Project.h"
#define _LAUNCHXL_F28377S
//
DMA 相关
//
#pragma DATA_SECTION (RDATA、"ramgs0");
#define burst 0 //将0写入寄存器以获得1
#define 传输(512*6)-1的突发大小 //[(MEM_buffer_size/(burst + 1))- 1]
uint16 RDATA[传输+1];
volatile uint16 * DMADest;
volatile Uint16 * DMASource;


__interrupt void local_D_INTCH6_ISR (void);
void dma_init (void);

//
//定义
void ConfigureADC (void);
void SetupADCepwm (uint16通道);
//中断 void adca1_ISR (void);
//
// DMA 原型
//
_interrupt void local_D_INTCH6_ISR (void);
void dma_init (void);

//
Main
//
void (


Step 1)// main (void)/ void (void)。 初始化系统控制:
// PLL、看门狗、启用外设时钟
//此示例函数位于 F2837xS_SYSCTRL.c 文件中。
//
InitSysCtrl();

//
//步骤2。 初始化 GPIO:
//此示例函数位于 F2837xS_GPIO.c 文件中,
//说明了如何将 GPIO 设置为其默认状态。
//
InitGpio();
// GPIO_SetupPinMux (toggle、GPIO_MUX_CPU1、0);
GPIO_SetupPinOptions (toggle、 GPIO_OUTPUT、GPIO_PushPull);/
GPIO_SetupPinMux (CHECK、GPIO_MUX_CPU1、0);//
GPIO_SetupPinOptions (check、GPIO_output、GPIO_PushPull);
*//

//启用 PWM2和 PWM7
//
CpuSysRegs.PCLKCR2.bit.EPWM8=1;
CpuSysRegs.PCLKCR2.bit.EPWM7=1;
CpuSysRegs.PCLKCR2.bit.EPWM3=1;

//
对于这种情况、只需初始化 ePWM1、ePWM2、ePWM3的 GPIO 引脚
//这些函数位于 F2837xS_ePWM.c 文件
//
//InitEPwm2Gpio();
InitEPwm8Gpio();
InitEPwm7Gpio();
InitEPwm3Gpio();

/* EALLOW;
GpioCtrlRegs.GPCPUD.bit.GPIO73=1;// XCLKOUT 代码要检查 PLLSYSCLK、时钟被8分频。
ClkCfgRegs.CLKSRCCTL3.bit.XCLKOUTSEL=0;
GpioCtrlRegs.GPCGMUX1.bit.GPIO73=0;
GpioCtrlRegs.GPCMUX1.bit.GPIO73=3;
EDIS;
*
//

//
///////步骤3。 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
Dint;

//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态是禁用所有 PIE 中断并
清除标志//。
//此函数位于 F2837xS_PIECTRL.c 文件中。
//
InitPieCtrl();

//
禁用 CPU 中断并清除所有 CPU 中断标志:
//
IER = 0x0000;
IFR = 0x0000;

//
//初始化 PIE 矢量表,其中包含指向 shell 中断
//服务例程(service routines,ISR)的指针。
//这将填充整个表,即使在
本示例中未使用中断//也是如此。 这对于调试很有用。
//可以在 F2837xS_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2837xS_PieVect.c 中找到
//
InitPieVectTable();
dma_init ();//设置本

示例中使用的 DMA ////中断被重新映射到此
文件中的// ISR 函数。
//
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.EPWM7_INT =&epwm7_ISR;//为 PWM7模块设置例程。
PieVectTable.EPWM8_INT =&epwm8_ISR;
PieVectTable.EPWM3_INT =&epwm3/ISR;
// PieVectTable.ADCA1_INT =&adca1_ISR;
PieVectTable.DMA_CH6_INT=&LOCAL_D_INTCH6_ISR;//^^^^^^^^^^^^^^^^^^^^μ s -------- ^^^^^^^^^^^^^^^^^^^μ A
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需


的//
//对于这个示例,只初始化 ePWM
//
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;
CpuSysRegs.SECMSEL.bit.PF2SEL = 1;// DMA 双端口桥接已连接
EDIS;
// GPIO_WritePin (TOGGLE、1);
ConfigureADC();//配置 ADC,
InitEPwm7Examples();
InitEPwm8Examples();
InitEPwm3Examples();

EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;
EDIS;
//EALLOW;
// CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
// EDIS;
int i;
对于(i = 0;i < transfer+1;i++)
{
RDATA[i]= 10;
}



SetupADCepwm (0);
//
//步骤4。 用户特定代码,启用中断:
//
启用连接到 EPWM1-3的 CPU INT3 INT:
//
IER |= M_INT3;//--- >启用 EPWM1-12
//IER |= M_INT1;//启用组1中断
IER |= M_INT7;//启用组7、DMA 中断组


//
在 PIE 中启用 EPWM INTn 中断1-3
//PieCtrlRegs.PIEIER1.bit.INTx1 = 1;// ADC1
PieCtrlRegs.PIEIER3.bit.INTx8 = 1;
PieCtrlRegs.PIEIER3.bit.INTx7=1;
PieCtrlRegs.PIEIER3.bit.INTx3=1;
PieCtrlRegs.PIEIER7.bit.INTx6 = 1;//启用 PIE 组7、INT 2 (DMA CH6)

//
启用全局中断和更高优先级的实时调试事件:
//
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM

EALLOW;
CDPHCR0=SYCDCLKCR0.N;

//启用全局中断 DBCLKCRCLKCR0.THRCnC;SYCLKCR0.THRC.0;SYCLKCR0.THRCnC
while (1)
{ 
} void ConfigureADC (void) { EALLOW; // //写入配置 // AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4 AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE); // //将脉冲位置设置为晚期 // AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;//在结果被载入到 ADC 结果寄存器之前只中断一个周期 // //为 ADC 加电 // AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1; // //延迟1ms 以允许 ADC 加电时间 // DELAY_US (1000); EDIS; } void dma_init() { // //有关以下函数的说明,请参阅 dma.c。 // // //初始化 DMA // DMAInitialize(); DMASSOURCE = AdcaResultRegs.ADCRESULT0; DMADest =((volatile UINT16 *) RDATA); // //配置 DMA CH6 // DMACH6AddrConfig (DMADest、DMASource); DMACH6BurstConfig (突发、0、1); DMACH6TransferConfig (传输、0、1); DMACH6ModeConfig (DMA_ADCAINT1、PERINT_ENABLE、OneShot_disable、CONT_disable、 SYNC_DISABLE、SYNC_SRC、OVRFLOW_DISABLE、十六位、 Chint_end、CHINT_enable); } __interrupt void local_D_INTCH6_ISR (void) { count= DmaRegs.CH6.SRC_ADDR_SHADDR; m= DmaRegs.CH6.dst_ADDR_SHADDR; //x[1]= DmaRegs.CH6.dst_ADDR_影子; EALLOW;//需要在 ISR 内执行 EALLOW!!! DmaRegs.ch6.control.bit.halt = 1; PieCtrlRegs.PIEACK.all = PIEACK_group7;// ACK 以接收更多中断 //来自此 PIE 组 EDIS; asm (" ESTOP0"); }

ADC SOC 由 EPwm7触发。

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

    在本例中、请检查您是否已启用 ADC 的连续模式。 这可以通过置位 ADCINTSELxNy 寄存器的 INTxSEL 位来完成。

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

    谢谢。