请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28377S 您好!
有人能告诉我我的错误在哪里。 我尝试使用 CPU 定时器0触发 ADC、ADC ISR 不会运行。
#define _LAUNCHXL_F28377S 1 #include "F28x_Project.h" #define DAC_num 1 // //函数原型 // _ interrupt void CPU_timer0_ISR (void); void configureDAC (void );void ConfigureADC (void); void SetupADC_tint (uint16 channel); _ void CONFIG1 interrupt (void);void _adc (void 1 interrupt) volatile struct dac_regs* dac_ptr[4]={0x0、&DacaRegs、&DacbRegs、&DaccRegs}; uint16 stejt = 0; void main (void) { // //步1. 初始化系统控制: // PLL、看门狗、启用外设时钟 //此示例函数位于 F2837xS_SYSCTRL.c 文件中。 // InitSysCtrl(); // //步骤2。 初始化 GPIO: //此示例函数位于 F2837xS_GPIO.c 文件中, //说明了如何将 GPIO 设置为其默认状态。 // InitGpio(); //// 步骤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(); // //此示例中使用的中断被重新映射到 这个文件中的// ISR 函数。 // EALLOW;//这是写入 EALLOW 受保护寄存器所必需的 PieVectTable.ADCA1_INT =&adca1_ISR; PieVectTable.ADCA_EVT_INT =&adca1_ISR; PieVectTable.TIMER0_INT =&CPU_timer0_ISR; EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需 的// //步骤4。 初始化器件外设。 此函数可以是 // 可在 F2837xS_CpuTimers.c //中找到 InitCpuTimer();//对于此示例,只初始化 CPU 计时器 ConfigCpuTimer (&CpuTimer0、200、22.675); ConfigureADC(); SetupADC_tint (2); //configureDAC (); // 将 CPU 定时器0、1和2配置为每秒中断一次: // 200MHz CPU 频率,1秒周期(以 uSeconds 为单位) // //ConfigCpuTimer (&CpuTimer0、200、11.338); // 为了确保精确计时、请使用只写指令写入 //整个寄存器。 因此、如果 // ConfigCpuTimer 和 InitCpuTimers (在 F2837xS_cputimervars.h 中)中的任何配置位发生更改、也 必须更新以下//设置。 // CpuTimer0Regs.TCR.ALL = 0x4000; // //步骤5。 用户特定代码、启用中断: // // 启用连接到 CPU 定时器0的 CPU INT1、 连接到 CPU 定时器1的 CPU INT13 //和连接 到 CPU 定时器2的 CPU int 14: // IER |= M_INT1; // //在 PIE 中启用 TINT0:组1中断7 // PieCtrlRegs.PIEIER1.bit.INTx7 = 1; // 启用全局中断和更高优先级的实时调试事件: // EINT;//启用全局中断 INTM ERTM;//启用全局实时中断 DBGM // //步骤6。 空闲循环。 只需坐下来循环(可选): // CpuTimer0.RegsAddr->TCR.bit.tie = 1; while (1) { //GPIO_WritePin (13、stejt); //DAC_PTR[DAC_num]->DACVALS.all = stejt; } } __interrupt void cpu_timer0_ISR (void) { CpuTimer0.InterruptCount++; //stejt = 4095 - stejt; // 确认此中断以接收来自组1的更多中断 // ////stejt = 4000; PieCtrlRegs.PIEACK.all = PIEACK_ADC1; void}(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; } void SetupADC_tint (uint16通道) { // //选择要转换的通道和转换结束标志 // EALLOW; AdcaRegs.ADCSOC0CTL.bit.CHSEL = 2;//SOC0将转换引脚 A2 AdcaRegs.ADCSOC0CTL.bit.ACQPS = 14;//采样窗口为100个 SYSCLK 周期- 12位 AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 1;// CPU 定时器0上的触发 AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0结束将设置 INT1标志 AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志 AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除 EDIS; } 中断 void adca1_ISR (void) { //DAC_PTR[DAC_num]->DACVALS.ALL = AdcaResultRegs.ADCRESULT0; //stejt = AdcaResultRegs.ADCRESULT2; stejt = 4000; PieCtrlRegs.PIEACX.ALL = PIEACK_Group1; } void configureDAC() { EALLOW; DAC_PTR[DAC_num]->DACCTL.bit.DACREFSEL = 1; DAC_PTR[DAC_num]->DACOUTEN 位.DACOUTEN = 1; DAC_PTR[DAC_num]->DACVALS.ALL = 0; DELAY_US (10);//缓冲 DAC 加电延迟 EDIS; } //// 文件结束 //

