请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28335 工具/软件:Code Composer Studio
我使用了以下代码。 它在 CCSV8中运行正常。 我已使用我的代码修改了 ADC_SOC 示例。 正在编译代码、但它暂停在 Defaultsr.C 文件中的无效 ISR 函数。恢复中断 ISR 后、未使用。 我在下面附上了我的代码、请提示我需要进行的任何更正。
//###################################################################################################################### // //文件:example_28x33c.Adc3.c // //标题:ADC 转换开始示例 // ! \addtogroup F2833x_example_list //!ADC 转换开始(ADC_SoC)
//! //! 此 ADC 示例使用 ePWM1在 SEQ1上生成周期性 ADC SOC。 //! 转换了 ADCINA3和 ADCINA2两个通道。 //! //! b 监视\b 变量\n //! - Voltage1[10]-最后10个 ADCRESULT0值 //! - Voltage2[10]-最后10个 ADCRESULT1值 //! - ConversionCount -当前结果编号0-9 //! -循环计数 -空闲循环计数 器// ///////############################################################################################################## //$TI 发布:F2833x 支持库 v2.00.00.00 $ //$发布 日期:Tue Jun 26 03:14:14 CDT 2018 $ //版权所有: //版权所有(C) 2009-2018 Texas Instruments Incorporated - http://www.ti.com/ // 只要 满足以下条件,就允许以源代码和二进制形式重新分发和使用//修改或不修改//: // //重新分发源代码必须保留上述版权 //声明、此条件列表和以下免责声明。 // //二进制形式的再发行必须复制上述版权 //声明、此条件列表和// 分发随附的//文档和/或其他材料中的以下免责声明。 //// 未经 事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。 //// 本软件由版权所有者和贡献者提供 //“按原样”,不 承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权 //所有者或贡献者都不对任何直接、间接、偶然、 //特殊、模范、 或相应的损害(包括但不 限于采购替代产品或服务;丧失使用、 //数据或利润; 或业务中断)、无论 出于何种原因使用 本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。 //$ //######################################################################################################################## // //包含的文件 // #include "DSP28x_Project.h" //设备头文件和示例包括文件 #include #include // //函数原型 // __interrupt void ADC_ISR (void); __interrupt void CPU_timer0_ISR (void); void InitEPwm1Example (void); void GPIO_Setup1 (void); uint16 LoopCount、iwstatus=0、ipstatus=0; uint16转换计数、state=0、scount=0; // 主 // void main (void) { // //步骤1. 初始化系统控制: // PLL、安全装置、启用外设时钟 //此示例函数位于 DSP2833x_SYSCTRL.c 文件中。 // InitSysCtrl(); EALLOW; #IF (CPU_FRQ_150MHz) //默认- 150MHz SYSCLKOUT // // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)= 25.0MHz // #define ADC_MODCLK 0x3 #endif #IF (CPU_FRQ_100MHz) // // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2)= 25.0MHz // #define ADC_MODCLK 0x2 #endif EDIS; // //定义 ADCCLK 时钟频率(小于或等于25MHz) //假设 InitSysCtrl()已将 SYSCLKOUT 设置为150MHz // EALLOW; SysCtrlRegs.HISPCP。all = ADC_MODCLK; EDIS; // //步骤2. 初始化 GPIO: //此示例函数位于 DSP2833x_GPIO.c 文件和中 //说明了如何将 GPIO 设置为其默认状态。 // // InitGpio();//针对此示例跳过 // //步骤3. 清除所有中断并初始化 PIE 矢量表: //禁用 CPU 中断 // Dint; // //将 PIE 控制寄存器初始化为默认状态。 //默认状态为禁用所有 PIE 中断和标志 //被清除。 //此函数位于 DSP2833x_PIECTRL.c 文件中。 // InitPieCtrl(); // //禁用 CPU 中断并清除所有 CPU 中断标志: // IER = 0x0000; IFR = 0x0000; // //使用指向 shell 中断的指针初始化 PIE 矢量表 //服务例程(ISR)。 //这将填充整个表,即使是中断也是如此 //在本例中未使用。 这对于调试很有用。 //可以在 DSP2833x_DefaultIsr.c 中找到 shell ISR 例程 //此函数可在 DSP2833x_PieVect.c 中找到 // InitPieVectTable(); // //此示例中使用的中断被重新映射到 //此文件中的 ISR 函数。 // EALLOW;//这是写入 EALLOW 受保护寄存器所必需的 PieVectTable.ADCINT =&ADC_ISR; PieVectTable.TINT0 =&CPU_timer0_ISR; EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的 InitCpuTimer();//对于此示例,只初始化 CPU 计时器 #IF (CPU_FRQ_150MHz) // //将 CPU 定时器0配置为每500毫秒中断一次: // 150MHz CPU 频率,50毫秒周期(以 uSeconds 为单位) // ConfigCpuTimer (&CpuTimer0、150、50); #endif #IF (CPU_FRQ_100MHz) // //将 CPU 定时器0配置为每500毫秒中断一次: // 100MHz CPU 频率,50毫秒周期(以 uSeconds 为单位) // ConfigCpuTimer (&CpuTimer0、100、50000); #endif CpuTimer0Regs.TCR.ALL = 0x4000; // //步骤4. 初始化所有器件外设: //此函数位于 DSP2833x_InitPeripherals.c 中 // // InitPeripherals ();//此示例不需要 InitAdc ();//对于此示例,初始化 ADC GPIO_Setup1 (); InitEPwm1Examples(); // //步骤5. 特定于用户的代码、启用中断: // //在 PIE 中启用 ADCINT // PieCtrlRegs.PIEIER1.bit.INTx6=1; PieCtrlRegs.PIEIER1.bit.INTx7=1; IER |= M_INT1; //启用 CPU 中断1 EINT; //启用全局中断 INTM ERTM; //启用全局实时中断 DBGM LoopCount = 0; ConversionCount = 0; // //配置 ADC // AdcRegs.ADCTRL3.bit.SMODE_SEL=0; AdcRegs.ADCMAXCONV.ALL = 0x0000; //在 SEQ1上设置4 conv AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x8;//设置 ADCINA7 - IPV 读取。 // //从 ePWM 启用 SOCA 以启动 SEQ1 // AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1 = 1; AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;//启用 SEQ1中断(每个 EOS) for (;;) { LoopCount++; } } // // ADC_ISR - // _中断 void ADC_ISR (void) { ipv[count]=(AdcRegs.ADCRESULT0 >>4); //5 IPV AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; //重置 SEQ1 AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; //清除 INT SEQ1位 PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//确认 PIE 中断 return; } __interrupt void cpu_timer0_isr (void) { CpuTimer0.InterruptCount++; // //确认此中断以从组1接收更多中断 // PieCtrlRegs.PIEACX.ALL = PIEACK_Group1; } void GPIO_Setup1 (void){ EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;//启用 GPIO0上的上拉 GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;//启用 GPIO1上的上拉 GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;// GPIO0 = PWM1A GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;// GPIO1 = PWM1B EDIS; } void InitEPwm1Example (void) { // //设置 TBCLK // //EPWM1 A 和 B 为 GPIO 0和1 EPwm1Regs.TBCTL.bit.CTRMODE = 0;//向上计数递减 EPwm1Regs.TBPRD = 3750; //设置计时器周期 EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载 EPwm1Regs.TBPHS.Half.TBPHS = 0x0000; //相位为0 EPwm1Regs.TBCTR = 0x0000; //清除计数器 EPwm1Regs.TBCTL.bit.HSPCLKDIV = 001;//时钟与 SYSCLKOUT 之比 EPwm1Regs.TBCTL.bit.CLKDIV = 000; EPwm1Regs.TBCTL.bit.SYNCOSEL=1; EPwm1Regs.CMPA.half.CMPA =1875;//设置比较值 EPwm1Regs.CMPB = 1875; //设置比较 B 值 EPwm1Regs.DBCTL.bit.out_mode=3; EPwm1Regs.DBCTL.bit.POLSEL=2; EPwm1Regs.DBCTL.bit.in_mode=0; EPwm1Regs.DBRED=50; EPwm1Regs.DBFED=50; EPwm1Regs.AQCTLA.bit.CAU=2;//将 PWM1A 设置为零 EPwm1Regs.AQCTLA.bit.PRD=1; EPwm1Regs.AQCTLB.bit.CBU=2; EPwm1Regs.AQCTLB.bit.PRD=1; EPwm1Regs.ETSEL.bit.SOCAEN = 1; //在组上启用 SOC EPwm1Regs.ETSEL.bit.SOCASEL = 4;//从 CPMA 中选择 SOC、以进行递增计数 EPwm1Regs.ETPS.bit.SOCAPRD = 1; //在第一个事件上生成脉冲 } // 文件结束 //