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.
工具/软件: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; }//// 文件结束 //
我看到了几件事--
Whitney