I am using custom board with K63. I would like to use ADC interrupt to be triggered when value is less than threshold.
I have gone through ADC sample code and write my own ADC interrupt, yet I am not able to get ADC interrupt.
#define VBUS_ADC ADC1
#define VBUS_THRESH 0.64
/* Alias for ADC0 peripheral */
#define VBUS_ADC_IRQ_HANDLER ADC1_IRQHandler
#define VBUS_ADC_IRQ ADC1_IRQn
#define SE_12BIT 4096.0
#define VREF_BRD 3.300 /* ADC VREF voltage */
#define ADC_THRSHLD 750
void VBUS_ADC_IRQ_HANDLER(void)
{
uint32_t g_Adc16ConversionValue = 0;
static bool low_voltage = false;
g_Adc16ConversionValue = ADC16_GetChannelConversionValue(VBUS_ADC, 0);
if (g_Adc16ConversionValue < ADC_THRSHLD && !low_voltage)
{
low_voltage = true;
}
else if (g_Adc16ConversionValue >= ADC_THRSHLD)
{
low_voltage = false;
}
#if defined __CORTEX_M && (__CORTEX_M == 4U)
__DSB();
#endif
}
void VBUS_ADC_init(void)
{
NVIC_SetPriority(VBUS_ADC_IRQ, 4);
/* Enable ADC1 IRQ */
EnableIRQ(VBUS_ADC_IRQ);
adc16_config_t ADC16_config = {
.referenceVoltageSource = kADC16_ReferenceVoltageSourceVref,
.clockSource = kADC16_ClockSourceAsynchronousClock, /* ADC clock freq is (5.2Mhz / 8). see ADC electrical characteristics */
/* calculated time of conversion is 3.8us. Refer pg 881 of RM */
.enableAsynchronousClock = true,
.clockDivider = kADC16_ClockDivider8,
.resolution = kADC16_ResolutionSE12Bit,
.longSampleMode = kADC16_LongSampleDisabled,
.enableHighSpeed = false,
.enableLowPower = false,
.enableContinuousConversion = true};
adc16_hardware_compare_config_t compare_config = { .hardwareCompareMode = kADC16_HardwareCompareMode0,
.value1 = (int) (VBUS_THRESH * SE_12BIT / VREF_BRD)
};
/* Initialize ADC16 converter */
ADC16_Init(VBUS_ADC, &ADC16_config);
ADC16_EnableHardwareTrigger(VBUS_ADC, false);
/* Setting hardware compare value */
ADC16_SetHardwareAverage(VBUS_ADC, kADC16_HardwareAverageCount8);
/* Auto-calibrate the ADC value */
ADC16_DoAutoCalibration(VBUS_ADC);
ADC16_SetHardwareCompareConfig(VBUS_ADC, &compare_config);
/* Set channel and enable generation of interrupt */
ADC16_SetChannelConfig(VBUS_ADC, 0, &VBUS_ADC_channelsConfig);
//ADC16_SetHardwareAverage(VBUS_ADC, kADC16_HardwareAverageCount32);
return;
}
Here, I am not able to get interrupt when ADC voltage is < value1.