请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号: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等...)。
此致,
伊凡。