请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28377D 工具/软件:Code Composer Studio
大家好、我正在尝试运行示例 ADC 模块代码、但它停留在中断标志处、不再继续。 这可能是什么? 以下是源代码:
//###################################################################################################################### // ////文件:adc_soc_continuous_cpu01.c // 标题:F2837xD 的 ADC 连续自触发。 // //! addtogroup cpu01_example_list //!ADC 持续触发(ADC_SoC_Continuous)
//! //! 此示例将 ADC 设置为连续转换、从而实现最大 //! 采样率。\n //! //! 程序运行后、存储器将包含: //! //! -\b 结果:一个模数转换采样序列 //! 从引脚 A0开始。 采样之间的时间是基于 //! ADC 速度。 // //########################################################################################################################## //$TI 发行版:F2837xD 支持库 V210 $// $发行 日期:星期二11月1日14:46:15 CDT 2016 $// 版权所有:版权所有(C) 2013-2016德州仪器(TI)公司-// http://www.ti.com/ 保留所有权利$ //############################################################################################################ // //包含的文件 // #include "F28x_Project.h" // 函数原型 // void ConfigureADC (void); void SetupADCContinuid (uint16通道); // 定义 // #define results_buffer_size 256 //缓冲区,用于存储转换结果 //(size 必须是16的倍数) // Globals // uint16 AdcaResults[results_buffer_size]; uint16 resultsIndex; void main (void) { // 步骤1。 初始化系统控制: // PLL、看门狗、启用外设时钟 //此示例函数位于 F2837xD_sysctrl.c 文件中。 // InitSysCtrl(); // //步骤2。 初始化 GPIO: //此示例函数位于 F2837xD_GPIO.c 文件中, //说明了如何将 GPIO 设置为其默认状态。 // // InitGpio();//跳过本示例 // GpioCtrlRegs.GPADIR.bit.GPIO31 = 1; // GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; // GPIO_SetupPinOptions (31、GPIO_output、GPIO_PushPull); // GPIO_SetupPinOptions (34、GPIO_34) GPIO_OUTPUT、GPIO_PushPull); // GPIO_SetupPinMux (34、GPIO_MUX_CPU2、0); // // TODO 添加代码以允许使用 IPC 从 CPU02配置 GPADIR // EDIS; // GpioDataRegs.GPADD.bit.GPIO31 = 1;//关闭 LED // GpioDataRegs.GPBDAT.BIO34 = 1;//关闭 LED // 步骤3。 清除所有中断并初始化 PIE 矢量表: //禁用 CPU 中断 // Dint; // //将 PIE 控制寄存器初始化为默认状态。 //默认状态是禁用所有 PIE 中断并 清除标志//。 //此函数位于 F2837xD_PIECTRL.c 文件中。 // InitPieCtrl(); // 禁用 CPU 中断并清除所有 CPU 中断标志: // IER = 0x0000; IFR = 0x0000; // //初始化 PIE 矢量表,其中包含指向 shell 中断 //服务例程(service routines,ISR)的指针。 //这将填充整个表,即使在 本示例中未使用中断//也是如此。 这对于调试很有用。 //可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程 //此函数可在 F2837xD_PieVect.c 中找到 // InitPieVectTable(); // 配置 ADC 并为其加电 // ConfigureADC(); // //将 ADC 设置为通道0 上的连续转换// SetupADCContinuable (0); // //启用全局中断和更高优先级的实时调试事件: // EINT;//启用全局中断 INTM ERTM;//启用全局实时中断 DBGM // 初始化结果缓冲 区// for (resultsIndex = 0;resultsIndex < results_buffer_size;resultsIndex++) { AdcaResults[resultsIndex]= 0; } resultsIndex = 0; // //在循环 中无限地进行转换// 操作 { // //启用 ADCINT 标志 // AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; AdcaRegs.ADCINTSEL1N2.bit.INT2E = 1; AdcaRegs.ADCINTSEL3N4.bit.INT3E = 1; AdcaRegs.ADCINTSEL3N4.bit.INT4E = 1; AdcaRegs.ADCINTFLGCLR.ALL = 0x000F; // GpioDataRegs.GPADAT.bit.GPIO31 = 0; // GpioDataRegs.GPBDAT.bit.GPIO34 = 1; // //延迟一位。 // // DELAY_US (1000 * 500); // GpioDataRegs.GPADAT.bit.GPIO31 = 1; // GpioDataRegs.GPBDAT.bit.GPIO34 = 0; // //初始化结果索引 // resultsIndex = 0; // //软件强制启动 SOC0到 SOC7 // AdcaRegs.ADCSOCFRC1.ALL = 0x00FF; // //继续采样,直到结果缓冲区已满 // while (resultsIndex < results_buffer_size) { // //等待第一组8个转换完成 // while (0 = AdcaRegs.ADCINTFlG.bit.ADCINT3);//它会永远等待这里 // //清除前8个转换生成的两个 INT 标志 // AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;// AdcaRegs.ADCINTFLGCLR.bit.ADCINT3 = 1; // //保存前8次转换的结果 // //请注意,在此期间,第二个8次转换具有 //已被 EOC6->ADCIN1触发,将处于活动状态 //在保存前8个结果时转换 // AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT0; AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT1; AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT2; AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT3; AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT4; AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT5; AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT6; AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT7; // //等待第二组8个转换完成 // while (0 = AdcaRegs.ADCINTFlG.bit.ADCINT4); // //清除第二8次转换生成的两个 INT 标志 // AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1; AdcaRegs.ADCINTFLGCLR.bit.ADCINT4 = 1; // //保存第二个8次转换的结果 // //请注意,在这段时间内,前8次转换具有 //已由 EOC14->ADCIN2触发,并且将处于活动状态 //在保存第二个8个结果时转换 // AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT8; AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT9; AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT10; AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT11; AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT12; AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT13; AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT14; AdcaResults[resultsIndex++]= AdcaResultRegs.ADCRESULT15; } // //禁用所有 ADCINT 标志以停止采样 // AdcaRegs.ADCINTSEL1N2.bit.INT1E = 0; AdcaRegs.ADCINTSEL1N2.bit.INT2E = 0; AdcaRegs.ADCINTSEL3N4.bit.INT3E = 0; AdcaRegs.ADCINTSEL3N4.bit.INT4E = 0; // //此时,AdcaResults[]包含一系列转换 //从所选通道 // // //软件断点,再次点击运行以获取更新的转换 // asm (" ESTOP0"); }while (1); } // 配置 ADC -写入 ADC 配置并为这两 个//都加电 ADC ADC A 和 ADC B // 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 加电 // AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1; // //延迟1ms 以允许 ADC 加电时间 // DELAY_US (1000); EDIS; } // SetupADCContinuous-设置 ADC 在一个通道上持续转换 // void SetupADCContinuous(UINT16通道){ uint16 acqps; // //根据分辨率确定最小采集窗口(在 SYSCLKS 中) // if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution) { acqps = 14;//75ns } 否则、//分辨率为16位 { acqps = 63;//320ns } EALLOW; AdcaRegs.ADCSOC0CTL.bit.CHSEL =通道;//SOC 将在通道上转换 AdcaRegs.ADCSOC1CTL.bit.CHSEL =通道;//SOC 将在通道上转换 AdcaRegs.ADCSOC2CTL.bit.CHSEL =通道;//SOC 将在通道上转换 AdcaRegs.ADCSOC3CTL.bit.CHSEL =通道;//SOC 将在通道上转换 AdcaRegs.ADCSOC4CTL.bit.CHSEL =通道;//SOC 将在通道上转换 AdcaRegs.ADCSOC5CTL.bit.CHSEL =通道;//SOC 将在通道上转换 AdcaRegs.ADCSOC6CTL.bit.CHSEL =通道;//SOC 将在通道上转换 AdcaRegs.ADCSOC7CTL.bit.CHSEL =通道;//SOC 将在通道上转换 AdcaRegs.ADCSOC8CTL.bit.CHSEL =通道;//SOC 将在通道上转换 AdcaRegs.ADCSOC9CTL.bit.CHSEL =通道;//SOC 将在通道上转换 AdcaRegs.ADCSOC10CTL.bit.CHSEL =通道;//SOC 将在通道上转换 AdcaRegs.ADCSOC11CTL.bit.CHSEL =通道;//SOC 将在通道上转换 AdcaRegs.ADCSOC12CTL.bit.CHSEL =通道;//SOC 将在通道上转换 AdcaRegs.ADCSOC13CTL.bit.CHSEL =通道;//SOC 将在通道上转换 AdcaRegs.ADCSOC14CTL.bit.CHSEL =通道;//SOC 将在通道上转换 AdcaRegs.ADCSOC15CTL.bit.CHSEL =通道;//SOC 将在通道上转换 AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为 acqps + //1个 SYSCLK 周期 AdcaRegs.ADCSOC1CTL.bit.ACQPS = acqps;//采样窗口为 acqps + //1个 SYSCLK 周期 AdcaRegs.ADCSOC2CTL.bit.ACQPS = acqps;//采样窗口为 acqps + //1个 SYSCLK 周期 AdcaRegs.ADCSOC3CTL.bit.ACQPS = acqps;//采样窗口为 acqps + //1个 SYSCLK 周期 AdcaRegs.ADCSOC4CTL.bit.ACQPS = acqps;//采样窗口为 acqps + //1个 SYSCLK 周期 AdcaRegs.ADCSOC5CTL.bit.ACQPS = acqps;//采样窗口为 acqps + //1个 SYSCLK 周期 AdcaRegs.ADCSOC6CTL.bit.ACQPS = acqps;//采样窗口为 acqps + //1个 SYSCLK 周期 AdcaRegs.ADCSOC7CTL.bit.ACQPS = acqps;//采样窗口为 acqps + //1个 SYSCLK 周期 AdcaRegs.ADCSOC9CTL.bit.ACQPS = acqps;//采样窗口为 acqps + //1个 SYSCLK 周期 AdcaRegs.ADCSOC10CTL.bit.ACQPS = acqps;//采样窗口为 acqps + //1个 SYSCLK 周期 AdcaRegs.ADCSOC11CTL.bit.ACQPS = acqps;//采样窗口为 acqps + //1个 SYSCLK 周期 AdcaRegs.ADCSOC12CTL.bit.ACQPS = acqps;//采样窗口为 acqps + //1个 SYSCLK 周期 AdcaRegs.ADCSOC13CTL.bit.ACQPS = acqps;//采样窗口为 acqps + //1个 SYSCLK 周期 AdcaRegs.ADCSOC14CTL.bit.ACQPS = acqps;//采样窗口为 acqps + //1个 SYSCLK 周期 AdcaRegs.ADCSOC15CTL.bit.ACQPS = acqps;//采样窗口为 acqps + //1个 SYSCLK 周期 AdcaRegs.ADCINTSEL1N2.bit.INT1E = 0;//禁用 INT1标志 AdcaRegs.ADCINTSEL1N2.bit.INT2E = 0;//禁用 INT2标志 AdcaRegs.ADCINTSEL3N4.bit.INT3E = 0;//禁用 INT3标志 AdcaRegs.ADCINTSEL3N4.bit.INT4E = 0;//禁用 INT4标志 AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 0; AdcaRegs.ADCINTSEL1N2.bit.INT2CONT = 0; AdcaRegs.ADCINTSEL3N4.bit.INT3CONT = 0; AdcaRegs.ADCINTSEL3N4.bit.INT4CONT = 0; AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 6;// SOC6的末尾将设置 INT1标志 AdcaRegs.ADCINTSEL1N2.bit.INT2SEL = 14;// SOC14结束将设置 INT2标志 AdcaRegs.ADCINTSEL3N4.bit.INT3SEL = 7;// SOC7结束将设置 INT3标志 AdcaRegs.ADCINTSEL3N4.bit.INT4SEL = 15;// SOC15结束将设置 INT4标志 // //ADCINT2将触发前8个 SOC // AdcaRegs.ADCINTSOCSEL1.bit.SOC0 = 2; AdcaRegs.ADCINTSOCSEL1.bit.SOC1 = 2; AdcaRegs.ADCINTSOCSEL1.bit.SOC2 = 2; AdcaRegs.ADCINTSOCSEL1.bit.SOC3 = 2; AdcaRegs.ADCINTSOCSEL1.bit.SOC4 = 2; AdcaRegs.ADCINTSOCSEL1.bit.SOC5 = 2; AdcaRegs.ADCINTSOCSEL1.bit.SOC6 = 2; AdcaRegs.ADCINTSOCSEL1.bit.SOC7 = 2; // //ADCINT1将触发第二个8个 SOC // AdcaRegs.ADCINTSOCSEL2.bit.SOC8 = 1; AdcaRegs.ADCINTSOCSEL2.bit.SOC9 = 1; AdcaRegs.ADCINTSOCSEL2.bit.SOC10 = 1; AdcaRegs.ADCINTSOCSEL2.bit.SOC11 = 1; AdcaRegs.ADCINTSOCSEL2.bit.SOC12 = 1; AdcaRegs.ADCINTSOCSEL2.bit.SOC13 = 1; AdcaRegs.ADCINTSOCSEL2.bit.SOC14 = 1; AdcaRegs.ADCINTSOCSEL2.bit.SOC15 = 1; EDIS; } //// 文件结束 //