主题: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"不“不是一个选项、因为我需要优化代码的其他部分才能正常运行。 请提供帮助