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.

[参考译文] MSPM0G1507:ADC IRQ 运行、IIDX.STAT 读数为 0

Guru**** 2482105 points
Other Parts Discussed in Thread: SYSCONFIG

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1553242/mspm0g1507-adc-irq-is-running-with-iidx-stat-reading-0

部件号:MSPM0G1507
主题:SysConfig 中讨论的其他器件

工具/软件:Theia

您好、这是 syscfg 中的 ADC 配置:

ADC121.$NAME =“ADC12_0";“;
ADC121.repeatMode = true;
ADC121.分辨率=“DL_ADC12_SAMP_CONV_RES_10_bit";“;
ADC121.powerDownMode =“DL_ADC12_POWER_DOWN_MODE_MANUAL";“;
ADC121.trigSrc =“DL_ADC12_TRIG_SRC_EVENT";“;
ADC121.configWinCompHighThld = 500;
ADC121.adcMem0TRIG =“DL_ADC12_TRIGGER_MODE_TRIGGER_NEXT";“;
ADC121.enabledInterrupts =[“DL_ADC12_INTERRUPT_MEM0_RESULT_LOADE"];“;
ADC121.SampleTime0 =“1.4us";“;
ADC121.adcMem0chansel =“DL_ADC12_INPUT_CHAN_13";“;
ADC121.subChanID = 1;
ADC121.pubChanID = 2;
ADC121.enabledEvents =[“DL_ADC12_EVENT_MEM0_RESULT_LOADED"];“;

稍后、我将其设置为单次转换 (取平均值 128 倍)。  

DL_ADC12_disableConversions(ADC12_0_INST);
          DL_ADC12_initSingleSample(ADC12_0_INST, DL_ADC12_REPEAT_MODE_ENABLED,
                                    DL_ADC12_SAMPLING_SOURCE_AUTO,
                                    DL_ADC12_TRIG_SRC_SOFTWARE,
                                    DL_ADC12_SAMP_CONV_RES_10_BIT,
                                    DL_ADC12_SAMP_CONV_DATA_FORMAT_UNSIGNED);
          DL_ADC12_configConversionMem(ADC12_0_INST, ADC12_0_ADCMEM_0,
                                       DL_ADC12_INPUT_CHAN_13,
                                       DL_ADC12_REFERENCE_VOLTAGE_VDDA,
                                       DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0,
                                       DL_ADC12_AVERAGING_MODE_ENABLED,
                                       DL_ADC12_BURN_OUT_SOURCE_DISABLED,
                                       DL_ADC12_TRIGGER_MODE_TRIGGER_NEXT,
                                       DL_ADC12_WINDOWS_COMP_MODE_DISABLED);
          DL_ADC12_setPowerDownMode(ADC12_0_INST,
                                    DL_ADC12_POWER_DOWN_MODE_MANUAL);
          DL_ADC12_configHwAverage(ADC12_0_INST, DL_ADC12_HW_AVG_NUM_ACC_128,
                                   DL_ADC12_HW_AVG_DEN_DIV_BY_128);
          // DL_ADC12_disableConversions(ADC12_0_INST);
          // DL_ADC12_setSampleTime0(ADC12_0_INST,
          // PARAM_Settings[ADC_SAMPLE_TIME]);
          // DL_ADC12_enableConversions(ADC12_0_INST);
          NVIC_ClearPendingIRQ(ADC12_0_INST_INT_IRQN);
          DL_ADC12_clearInterruptStatus(
              ADC12_0_INST, (DL_ADC12_INTERRUPT_MEM0_RESULT_LOADED));
          DL_ADC12_enableInterrupt(ADC12_0_INST,
                                 (DL_ADC12_INTERRUPT_MEM0_RESULT_LOADED));
          DL_ADC12_enableConversions(ADC12_0_INST);

          NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);
          DL_ADC12_startConversion(ADC12_0_INST);

我想处理 IRQ 中的结果。

void ADC12_0_INST_IRQHandler(void) {
  volatile static uint16_t adcCaptureCnt;
  int timingError = 0;
  // this IRQ is called only when there is signal
  volatile int interruptResult = DL_ADC12_getPendingInterrupt(ADC12_0_INST);
  switch (interruptResult) {
  case DL_ADC12_IIDX_MEM0_RESULT_LOADED:
    adcResult = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0);
    switch (PARAM_State) {
    case READ_DATA: {
      // readback values directly handled in parameterization.c
    } break;
    case CALIBRATION: {
      switch (calibrationType) {
      case DC_CAL: {
        PARAM_Put16BitValue(DC_L, DC_H,
                            adcResult); // eeprom is saved in parameterization.c
        CalInProgress = false;
      } break;
      case OPT_SHORT_CAL: {
        CalInProgress = false;
      } break;
      default:
        break;
      }
    } break;
    .... 

很奇怪、当我将编译器优化设置为“0"时“时、代码会正常运行。 但当我将优化设置为“2"时“时、IRQ 会运行、但中断 Result (IIDX.STAT) 为 0。 因此、它会跳过我的代码。

有趣的是、当我在 IRQ 中使用断点在调试下运行代码时、IRQ 实际上运行两次、一次中断 Result 为 0、然后第二次预期中断 Result 为 9 (DL_ADC12_IIDX_MEM0_RESULT_LOADED)。 虽然这并不理想、但我可以忍受。 但这种行为在正常运行期间不会发生。

我已经尝试清除所有中断、挂起的中断等 我不知道在这一点上还要做些什么。  将优化设置为“0"不“不是一个选项、因为我需要优化代码的其他部分才能正常运行。 请提供帮助

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tan:

    我检查了你的代码,从我这边看起来还可以。

    一些令人困惑的事情似乎您已覆盖主源代码中的 ADC 设置、因为 SysConfig 文件显示了不同的配置。 您可以清除 SysConfig 配置(我看到未使用事件配置/事件触发器)以防发生任何冲突吗?

    很奇怪、当我将编译器优化设置为“0"时“时、代码会正常运行。 但当我将优化设置为“2"时“时、IRQ 会运行、但中断 Result (IIDX.STAT) 为 0。 因此、它会跳过我的代码。

    优化不会影响硬件中断、除非中断设置存在一些差异、也许您可以检查与中断相关的寄存器 RIS/IMASK/MIS 以查看发生的任何异常状态(溢出或其他)。

    有趣的是、当我在 IRQ 内使用断点在调试下运行代码时、IRQ 实际上运行两次、一次中断 Result 为 0、然后第二次中断 Result 为 9 (DL_ADC12_IIDX_MEM0_RESULT_LOADED)。 虽然这并不理想、但我可以忍受。 但在正常运行期间不会发生此行为。

    这也很奇怪。 如果读回为 0、表示没有中断触发。  除非它在清除中断状态时触发中断。

    我对这种现象没有太多的想法,请检查登记册,也许还有其他破产的影响。

    我创建了一个测试工程、虽然我这边没有显示任何内容、但优化级别 2 运行良好 — 没有中断丢失或中断多次输入。

    请参阅以下附件以供参考: ADC_TEST.ZIP

    [如果相当旧的 SDK 版本有任何问题、您也可以尝试更新 SDK 版本]

    B.R.

    Sal

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于 SysConfig 文件显示了不同的配置、一些令人困惑的事情似乎已覆盖主源代码中的 ADC 设置。 您能否在存在任何冲突的情况下清理 SysConfig 配置(我看到未使用事件配置/事件触发器)。

    好的、我可以尝试一下。 出现“冲突“的原因是 ADC 根据应用需求以不同的配置运行。

    这也很奇怪。 如果读回为 0、表示没有中断触发。  除非它在清除中断状态时触发中断。

    “对了,对我来说,这是一个很大的问题。“  

    无论如何、我还有一些其他奇怪的竞争条件(当然,这可能是由于我自己的编码或中断配置问题)。 如果您 知道 中断触发有任何已知问题(尤其是计时器或 ADC)、请告诉我。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tan:

    中断错过问题、您也许还可以检查是否始终存在阻止 ADC 中断访问的高优先级挂起中断。

    您可以查看以下一些方法:

    1.禁用其他中断。

    2.检查 ADC IMASK/RIS/MIS 状态并检查 ADC 测量结果、以验证 ADC 是否已正确启用并完成转换。 ADC 使能流可能有一些误差。

    B.R.

    Sal

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我的道歉。 我忘记在我自己的应用程序中将变量声明为“volatile Weary。 这导致我的代码无法正常工作。 MCU 本身没有任何问题。 经验教训:必须小心地声明为在 ISR 和主循环中操作的“易失性“变量。

    ADC 的不同重新配置不会导致中断出现任何问题。 可能 DL_ADC12_getPendingInterrupt (ADC12_0_INST) 的“错误“值;是经过优化代码的调试器工件、但这会导致我在一段时间内查看错误的方向。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tan:

    很高兴听到您解决了这些问题。

    这方面很容易被忽视。

    B.R.

    Sal