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.
工具/软件: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触发。