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.

[参考译文] 编译器/TMS320F2.8379万D:DMA读取ADC转换结果的问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/619086/compiler-tms320f28379d-problem-with-dma-reading-adc-conversion-result

部件号:TMS320F2.8379万D

工具/软件:TI C/C++编译器

您好,

我正在尝试使用f2.8379万D板上的DMA。 我尝试通过转换结束时生成的EOC0触发DMA CH5中断。 我确实在连续模式下运行ADC:  

AdcbRegs.ADCINTSEL1N2.bit.INT1CONT = 1;//

我在DMA中断例程中有一个check变量,我看到它正在递增,但是我看不到DMA要写入的变量有什么变化。 我也不确定如何配置突发和传输参数,这里的数据表让我困惑。

我将非常感谢你们的支持。 我的代码在此处:

//###################################################################
//
//文件:adc_so_ePWM_cpu01.c
////
标题:ADC通过ePWM触发F2837xD。
////
! \addtogroup cpu01_example_list
//! <h1>ADC ePWM触发(ADC_SOC_ePWM)</h1>//
!
//! 此示例设置ePWM以定期触发ADC。
//!
//! 程序运行后,内存将包含:\n
//! -\b AdcaResults \b:
来自//的一系列模数转换样本。 针脚A0。 样本之间的时间根据周期
//! ePWM计时器。
//
//###########################################################################
//$TI发布:F2837xD支持库V210 $//
发布日期:星期二11月1日14:46:15 CDT 2016 $//
$/$版权:版权所有(C) 2013-2016 Texas2016 Texas Instruments Incorporated -//
            http://www.ti.com/ 保留所有权利$//#########################################################################################


//
//包含的文件
//
#include "F28x_Project.h"



#define burst (FIFO_LVL-1)//突发大小应小于8#define
传输 0 //[(MEM_BUFFER_SIZE /FIFS_LVL)-1]


////
函数原型
//
void ConfigureADC (void);
void ConfigureEPWM (void);
void SetupADCEpwm (UINT16通道);
__interrupt void adcb1_ISR (void);
__interrupt void local_D_D_D_INTCH5_void (ISR);
void dma_init(void);

//__interrupt void local_D_INTCH6_ISR(void);

//
定义
//
#define results_buffer_size 256

////
Globals
//
UINT16 AdcbResults[results_buffer_size];
UINT16 resultsIndex;
volatile UINT16 bufferFull;
volatile U16 interes; UDM16
//接收数据缓冲
区UINT16检查;



void main (void)
{////

步骤1. 初始化系统控制:
// PLL,看门狗,启用外设时钟
//此示例功能可在F2837xD_sysctrl.c文件中找到。
//
InitSysCtrl();////


步骤2. 初始化GPIO:
//此示例函数可在F2837xD_GPIO文件中找到,
//说明了如何将GPIO设置为其默认状态。
//
InitGpio();//跳过此示例

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

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


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

////
使用指向shell Interrupt
//服务例程(ISR)的指针初始化PIE矢量表。
//这将填充整个表,即使在此
示例中未使用中断//。 这对于调试非常有用。
// shell ISR例程位于F2837xD_DefaultIsr.C.中
//此函数位于F2837xD_PieVect.C.中
//
InitPieVectorTable();

//
//确保DMA连接到外设帧2网桥(EALLOW保护)
//
EALLOW;
CpuSysRegs.SECMSEL.bit.pf2SEL = 1;
EDIS;

////
映射ISR功能
//
EALLOW;
// PieVectorTable.ADCB1_INT =&adcb1_ISR;// ADCB中断1的函数
PieVectorTable.DMA_CH5_INT=&LOCALE_D_INTCH5_ISR;
EDIS;

//
//配置ADC并将其加电
//
ConfigureADC();////


配置ePWM
//
ConfigureEPWM();////


在通道0
//上为ePWM触发的转换设置ADC
dma_init(); //为SPI配置设置DMA
SetupADCEpwm (5);

////
启用全局中断和较高优先级的实时调试事件:
//
PieCtrlRegs.PIECTRL.bit.ENPIE =1;//启用PIE块
PieCtrlRegs.PIEIER7.bit.INTx5 =1;//启用PIE组7, INT 1 (DMA通道1)
IER || M_INT7; //启用CPU INT6
// IER |= M_INT1;//启用组1中断
EINT;//启用全局中断INTM
ERTM;//启用全局实时中断DBGM

////
初始化结果缓冲区
//
for (resultsIndex = 0;resultsIndex < results_buffer_size;resultsIndex++)
{
AdcbResults[resultsIndex]=0;
}
结果索引=0;
bufferFull =0;////


启用PIE中断
////
PieCtrlRegs.PIEIER1.bit.INTx2 =1;////


同步ePWM
//
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;//PWM同步
EDIS;

StartDMACH5(); //为



	(;;){
	

	}}////










配置ADC启动DMA -写入ADC配置并为二者打开ADC电源
// ADC A和ADC B
//
void配置ADC (void){

EALLOW;

//
//写入配置
//
AdcbRegs.ADCCTL2.bit.prcale =6;//将ADCCLK除法器设置为/4
AdcSetMode (ADC_ADCB,ADC_Resolution _12位,ADC_SIGNALMODE_SINGLE);

//
//将脉冲位置设置为延迟
//
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;

//
//打开ADC的电源
//
ADcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;

//
//延迟1毫秒,以使ADC有时间开机
//
DELAY _US (1000);

EDIS;
}////


ConfigureEPWM -配置ePWM SOC并比较值
//
void ConfigureEPWM (void)
{

	EALLOW;
	GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0b01;
	GpioCtrlRegs.GPAGMUX1.bit.GPIO0 = 0b00;
	EDIS;

EALLOW;
//假定ePWM时钟已启用
EPwm1Regs.ETSEL.bit.SOCAEN =1;//禁用组上的SOC
EPwm1Regs.ETsel.bit.SOCASEL = 0b001;//在加电计数时选择SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1; //在第一个事件上生成脉冲
EPwm1Regs.CMPA.bit.CMPA = 2500; //设置比较值
EPwm1Regs.TBPRD = 5000; //设置期间
EPwm1Regs.TBCTL.bit.CTRMODE = 0b10; //向上-向下
EPwm1Regs.AQCTLA.bit.ZRO = 0b10; //
EPwm1Regs.AQCTLA.bit.PRD = 0b01; //
EPwm1Regs.AQCTLA.bit.CAU = 0b01; //
EPwm1Regs.AQCTLA.bit.CAD = 0b10; //


EDIS;
}////


SetupADCEpwm -设置ADC ePWM采集窗口
//
void SetupADCEpwm (UINT16通道)
{
UINT16 acqps;

//
//根据分辨率确定最小采集窗口(在SYSCLKS中)
//
IF (ADC_Resolution _12位== AdcbRegs.ADCCTL2.bit.Resolution)
{
acqps =14;//75ns
}
ELSE //分辨率为16位
{
acqps =63;//320ns
}

//
//选择要转换的通道和转换结束标志
//
EALLOW;
AdcbRegs.ADCSOC0CTL.bit.CHSEL =通道;//SOC0
AdcbRegs.ADCSOC0CTL.bit.ACQPS = acqps;//样例窗口为100个SYSCLK周期
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C上的触发器
ADcbRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// EOC1结束将设置INT1标志
AdcbRegs.ADCINTSEL1N2.bit.INT1E =1;//启用INT1标志
AdcbRegs.ADCINTSEL1N2.bit.INT1CONT = 1;//
AdcbRegs.ADCINTFLGCLL.bit.ADCINT1 =1;//确保INT1标志已清除
eDIS;
}




void dma_init()
{
//
//初始化DMA
//

DMAInitialize();

DMADest =&RDATA;

//
DMACH5AddrConfig(DMADest,&AdcbResultRegs.ADCRESULT0);
DMACH5BurstConfig (1,0,1);
DMACH5TransferConfig (0,0,1);
DMACH5ModeConfig (6,PERINT_ENABLE,OneShot_disable,CONT_DISABLE,
SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,十六位,
chint_end,chint_enable);
}////


local_d_INTCH5_ISR - DMA通道5 ISR
//
__interrupt void local_d_INTCH5_ISR(void)
{
EALLOW;//需要在ISR内执行EALLOW!!!
DmaRegs.CH5.control.bit.TRANSFERSTS = 1;
DmaRegs.CH5.control.bit.run = 1;
PieCtrlRegs.PIEACK.ALL = PIEACK_group7;// ACK接收更多中断
//来自此饼图组
EDIS;
检查++;

return;
}////


文件结束
//

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    我写这封信是为了告诉您,一位C2000小组成员已被指派担任此职位,应该很快就会回答。

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

    我看到了几件事--

    1. 确保将DMADest放置在DMA可以访问的位置。 您可能需要使用#pragma data_section。
    2. DMACH5BurstConfig()的Size参数应该是N-1,即,如果要在每个脉冲中移动一个单词,则需要将其设置为0。
    3. 我猜您会想在每次传输时填满缓冲区...? 如果是这种情况,我认为您需要将DMACH5TransferConfig的Size参数更改为(results_buffer_size -1)。


    Whitney