请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:TMS320F2.8335万 主题:controlSUITE中讨论的其他部件
您好,
我正在处理一个需要将ADC与DMA结合使用的项目。
我在配置DMA时遇到问题。
我使用了控制套件中的示例项目,我已经更改了位,但当我编译时,我收到错误,就像配置中使用的宏不在项目中一样。
我必须包含哪些h文件? 我尝试包括dma_definitions.h,但我一直得到链接器错误,即使我已正确链接所有内容。
请您发布一些有效DMA的简单示例(我只需要将数据从一个ADC通道传输到内存位置并使用过采样)。
我将 在下面发布我的代码。
#include "DSP2833x_Device.h"
// external function augers
extern void InitAdc (void);
extern void InitPieCtrl (
void);
extern void InitPieVectorTable (void);extern void InitCpuTimers (void);
extern void ConfigCpuTimer(struct CPUTIME_VARS *, float, float);
//针对此文件中找到的函数的prototype语句。
void gPIO_select(void);
interrupt void cpu_timer0_isr(void);
interrupt void ADC_ISR(void); //序列结束
//全局petter pin Voltage_VR1=0; thr=0;r;r;r!<r!<r!<r!<r!<r!<r!<r!<r!<r!<r!<r!<r!<r!<ran=1000;<!<r!<r!<r!<r!<r!<r!<r!<r!<r!<r!<r!<r!<rf1;<!
volatile UINT16 *DMADest;
volatile UINT16 *DMASource;
__interrupt void local_DINTCH1_ISR(void);//########################################################################################.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#
// 主代码
//##########################################################################################
void main(void)
{
UINT16 i1;
int i;
for (i=0;i<60;i++)
tacke[i]=0;
Initwatchdtrl();// 从DSP2833x_sysctrl.c
EALLOW;
PresSysRegs.wdcr= 0x00af;// 重新启用
Watchdog Ctrl/DOSED;
禁用所有的DOSEDINT/中断 // GPIO9,GPIO11,GPIO34和GPIO49作为输出
//在外设资源管理器上的4个LED)
InitPieCtrl(); // PIE表的基本设置;来自DSP2833x_PIECTRL.c
InitPieVectorTable(); // PIE
InitAdc()中的默认ISR; //基本ADC设置,包括校准
AdcRegs.ADCTRL1.All = 0;
Adcencrl1/CASCR1.CASCR= ADR7.CASCR1.PS= ADR1.CASCR1.CASCRQ=7;ADRC= ADR1.CASCR1.CASCR1.CASCR1.CASCR1.CASCR0.1= ADR1.CASCR1.CASCR0.Q= ADR1.CASCR1.CASCR1.CASCR0.1=
//除以1
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; //单次运行模式!!!!!!
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
AdcRegs.ADCTRL2.ALL = 0;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // 1=启用SEQ1中断
AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1 =1; // 1=SEQ1启动ePWM_SOCA
触发器ADcRegs.ADCTRL2.bit.ePWM_POST_SEQ1.ADRMOD= 每个中断1
后的串0;CADR0位数= ADRCTL2.ADDR0 FCLK = HSPCLK /2 * ADCCLKPS
// HSPCLK = 75MHz (请参阅DSP2833x_sysctrl.c)
// FCLK = 12.5 MHz
AdcRegs.ADCMAXCONV.ALL = 0;//从
初始化SequencRegs.ADCCHSELQ1.bit.CONDMA0转换!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
对于(i1=0; i1<BUF_SIZE;i1+)
{
DMABBUF1[i1]= 0;
}//
配置DMA通道
DMADest =&DMABBUF1[0]; //点DMA目标到数组
DMASource的开头=&AdcMirror.ADCRESULT0;//点DMA源到ADC结果寄存器基址
DMACH1AddrConfig(DMADest,DMASource);
DMACH1BurstConfig(3,0,0);//(3-1) reci se uzima u burst,太棒了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
DMACH1TransferConfig(1,0,1);// broj burst-ova u transferu, ova DVA su ignorisana kada se pojavi wrap, sta god to znacilo:P!!!!!!!!!!
DMACH1WrapConfig(10,0,10,1);// wrap posle (0+1) bursta, jedinica na kraju podize se dest adres za 1// ove desetke disable-uju wrap jer je veci size od transfera
DMACH1ModeConfig(dma_SEQ1INT, INT_ENable, PERINT_ENable, PERSYNC_SYNC, DISAN, DISABON, DISABON, DISABON, DISABON, DISABON, DI
OVRFLOW_DISABLE,16位,CHINT_END,CHINT_ENABLE);
StartDMACH1();
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
EPwm2Regs.TBCTL.ALL = 0xC030; //配置计时器控制寄存器
/*
位15-14 11: 空闲/软,11=忽略仿真暂挂
位13 0: PHSDIR,0 =同步事件
位12-10后倒计时 000:CLKDIV,000 => TBCLK = HSPCLK/1
位9-7 000:HSPCLKDIV,000 => HSPCLK = SYSCLKOUT/1
位6 0: SWFSYNC,0 =未产生软件同步
位5-4 11: SYNCOSEL,11 =同步输出禁用
位3 0: PRDLD,0 =在计数器= 0
位2上重新加载PRD 0: PHSEN,0 =相位控制禁用
位1-0 00: CTRMODE,00 =计数模式
*/
EPwm2Regs.TBPRD = 299; // TBPRD +1 = TPWM /(HSPCLKDIV * CLKDIV * TSYSCLK) 3125 je za 48kHz ovo je za 500kHz (FS je 500/16=31.25kHz)
// = 20 µs / 6.667 ns
EPwm2Regs.ETPS.ALL = 0x0100; //配置ADC以ePWM2
/*
位15-14启动 00: EPWMxSOCB,只读
位13-12 00: SOCBPRD,不要在意
11-10 00: EPWMxSOCA,只读
位9-8 01: SOCAPRD,01 =在第一个事件
位7-4上生成SOCA 0000:保留
位3-2 00: INTCNT,不要在意
位1-0 00: INTPRD,不要在意
*/
EPwm2Regs.ETSEL.ALL = 0x0A00; //启用SOCA到ADC
/*
位15 0: SOCBEN,0 =禁用SOCB
位14-12 000:SOCBSEL,不要在意
第11位 1: SOCAEN,1 =启用SOCA
位10-8 010:SOCASEL,010 = PRD事件
位7-4上的SOCA 0000:保留
位3 0: inten,0 =禁用中断
位2-0 000:INTSEL,Do Do Care
*/
EALLOW;
PieVectorTable.TINT0 =&CPU_timer0_ISR;
PieVectorTable.ADCINT =&ADC_ISR;
EDIS;
InitCpuTimers(); //基本设置CPU Timer0,1和2
ConfigCpuTimer(&Cpu1/Timer1.Bit.INTx6=1;/21ms
PieCtrlRegs.PIEIER1.INTx7=1;TSS/ CPU Timer0
PieclRegs.PIEIER1.INTx6=1;TM/ 0150
=
Timer0; Timer0; Timer0=
0
= 0; Timer0; Timer0; Timer0; Timer0; Timer0= 0 = 0 = Cr; Timer0; Timer0; Timer0= 0 = 0; Timer0; Timer0; Timer0; Timer0= 0 = Cr= 0; Timer0= 0; Timer0; Timer0= 0 = 0; Timer0; Timer0= 0 = 0; Timer0; Timer0; Timer0= 0; Timer0= 0= 0; //服务WD #1 BEZ WATCHDOGA
SysCtrlRegs.WDKEY = 0xAA;// 服务WD #2
EDIS
;}
k=1;
}
}void gPIO_SELECT(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.ALL =0;// GPIO15... GPIO0 =一般Puroobiosystem I/O
GpioCtrlRegs.GPAMUX2.all = 0; // GPIO31 ... GPIO16 =通用I/O
GpioCtrlRegs.GPBMUX1.ALL = 0; // GPIO47 ... GPIO32 =通用I/O
GpioCtrlRegs.GPBMUX2.all = 0; // GPIO63 ... GPIO48 =通用I/O
GpioCtrlRegs.GPCMUX1.ALL = 0; // GPIO79 ... GPIO64 =通用I/O
GpioCtrlRegs.GPCMUX2.all = 0; // GPIO87 ... GPIO80 =通用I/O
GpioCtrlRegs.GPADIR.ALL = 0;
GpioCtrlRegs.GPADIR.bit.GPIO9 = 1; //外设资源管理器:GPIO9 GpioCtrlRegs.GPBDI.GPIO11=1
;
外围资源管理器gpiOPIO1.gPIR= 1.3gpiopiO= gpiopiO34.gPIR= gpiopiopiopiO34.gpiopiopiGPIR = gpiopiopiopiopiO34.gpiopiopiopiopiGPI = gpiopiO34.gpiopiopiopiopiopios= gpiopiopiopiop3= gpiopiopios= gpiopios
//外围设备浏览器:GPIO49
GpioCtrlRegs.GPCDIR.ALL = 0;// GPIO87-64作为输入
EDIS;
}
中断void CPU_timer0_ISR(void)
{
CpuTimer0.InterruptCount+;
PieCtrlRegs.PIEACX.ALL = PIEACK_AD1;
}中断void CPU_timer0_ISR1;
计数
器=0/空=
// if (j<1000) za svaki slucaj da ne preletimo niz, mozda i ne treba
tacke[j]=Voltage_VR1;//samo sabiram necu da usreddnjavam, brze je
Voltage_VR1=0;
j++
}*///
重新初始化下一个ADC序列
AdcRegs.RST_SE1 //重置SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; //清除INT SEQ1位
PieCtrlRegs.PIEACK/ALL = PIEACK_Group1;//确认PIE
}__interrupt
void local_DINTCH1_ISR(void) // DMA通道1
{//
要接收来自此PIE组的更多中断,请确认此中断
PieCtrlRegs.PIEACK/ALL = PIEACK_group7;
//接下来的两行调试仅在此处停止处理器
//插入ISR代码
__ASM后删除(" ESTOP0");
for (;);
}//===========================================================
//源代码结束。
//===========================================================================================================================================
我经常遇到与一致的错误
DMACH1ModeConfig (DMA_SEQ1INT,PERINT_ENABLE,OneShot_DISABLE,CONT_DISABLE,SYNC_DISABLE, OVRFLOW_DISABLE,CHINT_BIT,CHINT_END,CHINT_ENABLE);
似乎代码编写器不能识别宏(PERINT_ENABLE等...)。
此致,
伊凡。