Differential ADC - error: could not convert '0' from 'int'

Hopefully someone can shed some light on this. I’m trying to use the same working high-speed ADC code from another topic to acquire from the two differential channels instead of the single-ended ones. There is no highlighted errors in the text of the code, but there’s an error compiling for board Artemis ATP:

MODERATOR EDIT: PLEASE USE CODE TAGS WHEN INCLUDING CODE.

In file included from C:\Users\dpouw\AppData\Local\Arduino15\packages\SparkFun\hardware\apollo3\1.0.20/cores/arduino/am_sdk_ap3/mcu/apollo3/am_mcu_apollo.h:139,
from C:\Users\dpouw\AppData\Local\Arduino15\packages\SparkFun\hardware\apollo3\1.0.20/cores/arduino/ard_sup/Arduino.h:40,
from sketch\ArtemisATP_2ch_diff_HiSpeed_ADC_OK.ino.cpp:1:
E:\1_TRU_Other\Programming\Arduino\ArduinoSketches\ArtemisATP_2ch_diff_HiSpeed_ADC_OK\ArtemisATP_2ch_diff_HiSpeed_ADC_OK.ino: In function 'void setup()':
C:\Users\dpouw\AppData\Local\Arduino15\packages\SparkFun\hardware\apollo3\1.0.20/cores/arduino/am_sdk_ap3/mcu/apollo3/hal/am_hal_pin.h:156:36: error: could not convert '0' from 'int' to 'am_hal_gpio_pincfg_t'
#define AM_HAL_PIN_13_ADCD0PSE8 (0)
~^~
E:\1_TRU_Other\Programming\Arduino\ArduinoSketches\ArtemisATP_2ch_diff_HiSpeed_ADC_OK\ArtemisATP_2ch_diff_HiSpeed_ADC_OK.ino:302:29: note: in expansion of macro 'AM_HAL_PIN_13_ADCD0PSE8'
am_hal_gpio_pinconfig(13, AM_HAL_PIN_13_ADCD0PSE8);//pads 12 (-), pad 13(+)
^~~~~~~~~~~~~~~~~~~~~~~
C:\Users\dpouw\AppData\Local\Arduino15\packages\SparkFun\hardware\apollo3\1.0.20/cores/arduino/am_sdk_ap3/mcu/apollo3/hal/am_hal_pin.h:165:36: error: could not convert '0' from 'int' to 'am_hal_gpio_pincfg_t'
#define AM_HAL_PIN_14_ADCD1P (0)
~^~
E:\1_TRU_Other\Programming\Arduino\ArduinoSketches\ArtemisATP_2ch_diff_HiSpeed_ADC_OK\ArtemisATP_2ch_diff_HiSpeed_ADC_OK.ino:303:30: note: in expansion of macro 'AM_HAL_PIN_14_ADCD1P'
am_hal_gpio_pinconfig(14, AM_HAL_PIN_14_ADCD1P); //pads 15 (-), pad 14(+)
^~~~~~~~~~~~~~~~~~~~
exit status 1

The sketch:

[i]//*****************************************************************************
//
//! @file adc_lpmode0_dma.c
//!
//! @brief This example takes samples with the ADC at high-speed using DMA.
//!
//! Purpose: This example shows the CTIMER-A3 triggering repeated samples of an external
//! input at 1.2Msps in LPMODE0. The example uses the CTIMER-A3 to trigger
//! ADC sampling. Each data point is 8 sample average and is transferred
//! from the ADC FIFO into an SRAM buffer using DMA.

// uses bit-masking to parse out the data

#include "am_bsp.h"


// ADC Sample buffer.

#define ADC_SAMPLE_BUF_SIZE (1024) //2channels at 512 samples. Ch1 and Ch2 alternate in the buffer

uint32_t g_ui32ADCSampleBuffer[ADC_SAMPLE_BUF_SIZE];

unsigned long useconds_refresh;

// ADC Device Handle. Already declared.
//static void *g_ADCHandle;

// ADC DMA complete flag.
volatile bool g_bADCDMAComplete;

// ADC DMA error flag.
volatile bool g_bADCDMAError;

// Define Differential channel 0
const am_hal_gpio_pincfg_t g_AM_PIN_13_ADCD0PSE8 =
{
.uFuncSel = AM_HAL_PIN_13_ADCD0PSE8,
};

// Define Differential channel 1
const am_hal_gpio_pincfg_t g_AM_HAL_PIN_14_ADCD1P =
{
.uFuncSel = AM_HAL_PIN_14_ADCD1P,
};

// Interrupt handler for the ADC.
//*****************************************************************************
extern "C" void am_adc_isr() //must use 'extern "C" ' for the Artemis
{
uint32_t ui32IntMask;

// Read the interrupt status.
if (AM_HAL_STATUS_SUCCESS != am_hal_adc_interrupt_status(g_ADCHandle, &ui32IntMask, false))
{
Serial.println("Error reading ADC interrupt status");
}

// Clear the ADC interrupt.
if (AM_HAL_STATUS_SUCCESS != am_hal_adc_interrupt_clear(g_ADCHandle, ui32IntMask))
{
Serial.println("Error clearing ADC interrupt status");
}

// If we got a DMA complete, set the flag.
if (ui32IntMask & AM_HAL_ADC_INT_DCMP)
{
g_bADCDMAComplete = true;
}

// If we got a DMA error, set the flag.
if (ui32IntMask & AM_HAL_ADC_INT_DERR)
{
g_bADCDMAError = true;
}
}

// Set up the core for sleeping, and then go to sleep.
//*****************************************************************************
void sleep()
{
// Disable things that can't run in sleep mode.
//#if (0 == ADC_EXAMPLE_DEBUG)
// am_bsp_debug_printf_disable();
//#endif

// Go to Deep Sleep.
am_hal_sysctrl_sleep(AM_HAL_SYSCTRL_SLEEP_DEEP);

// Re-enable peripherals for run mode.
//#if (0 == ADC_EXAMPLE_DEBUG)
// am_bsp_debug_printf_enable();
//#endif

}

// Configure the ADC.
//*****************************************************************************
void adc_config_dma()
{
am_hal_adc_dma_config_t ADCDMAConfig;

// Configure the ADC to use DMA for the sample transfer.
ADCDMAConfig.bDynamicPriority = true;
ADCDMAConfig.ePriority = AM_HAL_ADC_PRIOR_SERVICE_IMMED;
ADCDMAConfig.bDMAEnable = true;
ADCDMAConfig.ui32SampleCount = ADC_SAMPLE_BUF_SIZE;
ADCDMAConfig.ui32TargetAddress = (uint32_t)g_ui32ADCSampleBuffer;
if (AM_HAL_STATUS_SUCCESS != am_hal_adc_configure_dma(g_ADCHandle, &ADCDMAConfig))
{
Serial.println("Error - configuring ADC DMA failed.");
}
// Reset the ADC DMA flags.
g_bADCDMAComplete = false;
g_bADCDMAError = false;

}


// Configure the ADC.
//*****************************************************************************
void adc_config()
{
am_hal_adc_config_t ADCConfig;
am_hal_adc_slot_config_t ADCSlotConfig;

// Initialize the ADC and get the handle.
if ( AM_HAL_STATUS_SUCCESS != am_hal_adc_initialize(0, &g_ADCHandle) )
{
Serial.println("Error - reservation of the ADC instance failed.");
}

// Power on the ADC.
if (AM_HAL_STATUS_SUCCESS != am_hal_adc_power_control(g_ADCHandle,
AM_HAL_SYSCTRL_WAKE,
false) )
{
//am_util_stdio_printf("Error - ADC power on failed.\n");
Serial.println("Error - ADC power on failed.");
}

// Set up the ADC configuration parameters. These settings are reasonable
// for accurate measurements at a low sample rate.
ADCConfig.eClock = AM_HAL_ADC_CLKSEL_HFRC;
ADCConfig.ePolarity = AM_HAL_ADC_TRIGPOL_RISING;
ADCConfig.eTrigger = AM_HAL_ADC_TRIGSEL_SOFTWARE;
ADCConfig.eReference = AM_HAL_ADC_REFSEL_INT_2P0;
/*
AM_HAL_ADC_REFSEL_INT_2P0,
AM_HAL_ADC_REFSEL_INT_1P5,
AM_HAL_ADC_REFSEL_EXT_2P0,
AM_HAL_ADC_REFSEL_EXT_1P5
*/
ADCConfig.eClockMode = AM_HAL_ADC_CLKMODE_LOW_LATENCY;
ADCConfig.ePowerMode = AM_HAL_ADC_LPMODE0;
ADCConfig.eRepeat = AM_HAL_ADC_REPEATING_SCAN; //AM_HAL_ADC_SINGLE_SCAN
if (AM_HAL_STATUS_SUCCESS != am_hal_adc_configure(g_ADCHandle, &ADCConfig))
{
//am_util_stdio_printf("Error - configuring ADC failed.\n");
Serial.println("Error - configuring ADC failed.");
}

// Set up an ADC slot 0
ADCSlotConfig.eMeasToAvg = AM_HAL_ADC_SLOT_AVG_1;
ADCSlotConfig.ePrecisionMode = AM_HAL_ADC_SLOT_14BIT;
ADCSlotConfig.eChannel = AM_HAL_ADC_SLOT_CHSEL_DF0;
ADCSlotConfig.bWindowCompare = false;
ADCSlotConfig.bEnabled = true;
/*
AM_HAL_ADC_SLOT_AVG_1,
AM_HAL_ADC_SLOT_AVG_2,
AM_HAL_ADC_SLOT_AVG_4,
AM_HAL_ADC_SLOT_AVG_8,
AM_HAL_ADC_SLOT_AVG_16,
AM_HAL_ADC_SLOT_AVG_32,
AM_HAL_ADC_SLOT_AVG_64,
AM_HAL_ADC_SLOT_AVG_128

AM_HAL_ADC_SLOT_14BIT,
AM_HAL_ADC_SLOT_12BIT,
AM_HAL_ADC_SLOT_10BIT,
AM_HAL_ADC_SLOT_8BIT

// Single-ended channels
AM_HAL_ADC_SLOT_CHSEL_SE0, (pad 16, ArtemisRB A4)
AM_HAL_ADC_SLOT_CHSEL_SE1, (pad 29, ArtemisRB A0)
AM_HAL_ADC_SLOT_CHSEL_SE2, (pad 11, ArtemisRB A1)
AM_HAL_ADC_SLOT_CHSEL_SE3, (pad 31, ArtemisRB A5)
AM_HAL_ADC_SLOT_CHSEL_SE4, (pad 32, ArtemisRB A8)
AM_HAL_ADC_SLOT_CHSEL_SE5, (pad 33, ArtemisRB A3)
AM_HAL_ADC_SLOT_CHSEL_SE6, (pad 34, ArtemisRB A2)
AM_HAL_ADC_SLOT_CHSEL_SE7, (pad 35, ArtemisRB n/a)
AM_HAL_ADC_SLOT_CHSEL_SE8, (pad 13, ArtemisRB A10)
AM_HAL_ADC_SLOT_CHSEL_SE9, (pad 12, ArtemisRB A9)
// Differential channels.
AM_HAL_ADC_SLOT_CHSEL_DF0, pads 12 (-), pad 13(+)
AM_HAL_ADC_SLOT_CHSEL_DF1, pads 15 (-), pad 14(+) (ArtemisRB n/a)
// Miscellaneous other signals.
AM_HAL_ADC_SLOT_CHSEL_TEMP,
AM_HAL_ADC_SLOT_CHSEL_BATT,
AM_HAL_ADC_SLOT_CHSEL_VSS
*/

if (AM_HAL_STATUS_SUCCESS != am_hal_adc_configure_slot(g_ADCHandle, 0, &ADCSlotConfig))
{
//am_util_stdio_printf("Error - configuring ADC Slot 0 failed.\n");
Serial.println("Error - configuring ADC Slot 0 failed.");
}

// Set up an ADC slot 1
ADCSlotConfig.eMeasToAvg = AM_HAL_ADC_SLOT_AVG_1;
ADCSlotConfig.ePrecisionMode = AM_HAL_ADC_SLOT_14BIT;
ADCSlotConfig.eChannel = AM_HAL_ADC_SLOT_CHSEL_DF1;
ADCSlotConfig.bWindowCompare = false;
ADCSlotConfig.bEnabled = true;
if (AM_HAL_STATUS_SUCCESS != am_hal_adc_configure_slot(g_ADCHandle, 1, &ADCSlotConfig))
{
Serial.println("Error - configuring ADC Slot 0 failed.");
}

// Configure the ADC to use DMA for the sample transfer.
adc_config_dma();

//
am_hal_adc_interrupt_enable(g_ADCHandle, AM_HAL_ADC_INT_DERR | AM_HAL_ADC_INT_DCMP );

// Enable the ADC.
if (AM_HAL_STATUS_SUCCESS != am_hal_adc_enable(g_ADCHandle))
{
Serial.println("Error - enabling ADC failed.");
}
}


// Initialize the ADC repetitive sample timer A3.
//*****************************************************************************
void init_timerA3_for_ADC()
{
// Start a timer to trigger the ADC periodically
am_hal_ctimer_config_single(3, AM_HAL_CTIMER_TIMERA,
AM_HAL_CTIMER_HFRC_12MHZ |
AM_HAL_CTIMER_FN_REPEAT |
AM_HAL_CTIMER_INT_ENABLE);

am_hal_ctimer_int_enable(AM_HAL_CTIMER_INT_TIMERA3);

am_hal_ctimer_period_set(3, AM_HAL_CTIMER_TIMERA, 10, 5); //10 tick period, 5 ticks wide

// Enable the timer A3 to trigger the ADC directly
am_hal_ctimer_adc_trigger_enable();

// Start the timer.
am_hal_ctimer_start(3, AM_HAL_CTIMER_TIMERA);
}


void setup() {
Serial.begin(115200);
while (!Serial) {}
Serial.println("2 Channel Hi-speed ADC test");
// Set the clock frequency.
if (AM_HAL_STATUS_SUCCESS != am_hal_clkgen_control(AM_HAL_CLKGEN_CONTROL_SYSCLK_MAX, 0))
{
Serial.println("Error - configuring the system clock failed.");
}

// Set the default cache configuration and enable it.
if (AM_HAL_STATUS_SUCCESS != am_hal_cachectrl_config(&am_hal_cachectrl_defaults))
{
Serial.println("Error - configuring the system cache failed.");
}
if (AM_HAL_STATUS_SUCCESS != am_hal_cachectrl_enable())
{
Serial.println("Error - enabling the system cache failed.");
}

// Configure the board for low power operation.
am_bsp_low_power_init();

// Enable only the first 512KB bank of Flash (0). Disable Flash(1)
if (AM_HAL_STATUS_SUCCESS != am_hal_pwrctrl_memory_enable(AM_HAL_PWRCTRL_MEM_FLASH_MIN))
{
Serial.println("Error - configuring the flash memory failed.");
}

// Enable the first 32K of TCM SRAM.
if (AM_HAL_STATUS_SUCCESS != am_hal_pwrctrl_memory_enable(AM_HAL_PWRCTRL_MEM_SRAM_32K_DTCM))
{
Serial.println("Error - configuring the SRAM failed.");
}

// Start the ITM interface.
//am_bsp_itm_printf_enable();

// Start the CTIMER A3 for timer-based ADC measurements.
init_timerA3_for_ADC();

// Enable interrupts.
NVIC_EnableIRQ(ADC_IRQn);
am_hal_interrupt_master_enable();

// Set up pins for differential ADC input,
am_hal_gpio_pinconfig(13, AM_HAL_PIN_13_ADCD0PSE8);//pads 12 (-), pad 13(+)
am_hal_gpio_pinconfig(14, AM_HAL_PIN_14_ADCD1P); //pads 15 (-), pad 14(+)

// Configure the ADC
adc_config();

// Trigger the ADC sampling for the first time manually.
if (AM_HAL_STATUS_SUCCESS != am_hal_adc_sw_trigger(g_ADCHandle))
{
Serial.println("Error - triggering the ADC failed.");
}

// Print the banner.
am_util_stdio_terminal_clear();
Serial.println("ADC Example with 1.2Msps and LPMODE=0");

// Allow time for all printing to finish.
am_util_delay_ms(10);

}

void loop() {
// Go to Deep Sleep.
useconds_refresh = micros();
if (!g_bADCDMAComplete)
{
sleep();
}

// Check for DMA errors.
if (g_bADCDMAError)
{
//am_util_stdio_printf("DMA Error occured\n");
Serial.println("DMA Error occured");
while (1);
}

// Check if the ADC DMA completion interrupt occurred.
if (g_bADCDMAComplete)
{
bool toggle = 0;
for (int i = 0; i < ADC_SAMPLE_BUF_SIZE; i++) {
//14 bit is 0-16383 on a range of 0-2V
uint32_t result = g_ui32ADCSampleBuffer;
uint32_t mask = 0xFFFC0; // all ones for bits 6-19, other bits zeroed
//Shift result depending on resolution, averaging
result = result & mask; //get bits 6-19 data only
result = result >> (6); //remove the fractional values

// Serial.println(result);
if (!toggle){
Serial.print(result * (2.0 / 16383.0), 3);
Serial.print(",");
}
else{
Serial.println(result * (2.0 / 16383.0), 3);
}
toggle = !toggle;
}


while (1) {} // stop to view data


// Reset the DMA completion and error flags.
g_bADCDMAComplete = false;

// Re-configure the ADC DMA.
adc_config_dma();

// Clear the ADC interrupts.
if (AM_HAL_STATUS_SUCCESS != am_hal_adc_interrupt_clear(g_ADCHandle, 0xFFFFFFFF))
{
//am_util_stdio_printf("Error - clearing the ADC interrupts failed.\n");
Serial.println("Error - clearing the ADC interrupts failed.");
}

// Trigger the ADC sampling for the first time manually.
if (AM_HAL_STATUS_SUCCESS != am_hal_adc_sw_trigger(g_ADCHandle))
{
//am_util_stdio_printf("Error - triggering the ADC failed.\n");
Serial.println("Error - triggering the ADC failed.");
}
}

}

Thanks for your help.

I sorted it out. It was just an error in closely named constants.

For posterity here’s the working code using both differential ADC channels:

//*****************************************************************************
//
//! @file adc_lpmode0_dma.c
//!
//! @brief This example takes samples with the ADC at high-speed using DMA.
//!
//! Purpose: This example shows the CTIMER-A3 triggering repeated samples of an external
//! input at 1.2Msps in LPMODE0. The example uses the CTIMER-A3 to trigger
//! ADC sampling. Each data point is 8 sample average and is transferred
//! from the ADC FIFO into an SRAM buffer using DMA.

// uses bit-masking to parse out the data

#include "am_bsp.h"


// ADC Sample buffer.
 
#define ADC_SAMPLE_BUF_SIZE (1024) //2channels at 512 samples.  Ch1 and Ch2 alternate in the buffer

uint32_t g_ui32ADCSampleBuffer[ADC_SAMPLE_BUF_SIZE];

unsigned long useconds_refresh;

// ADC Device Handle. Already declared.
//static void *g_ADCHandle;

// ADC DMA complete flag.
volatile bool g_bADCDMAComplete;

// ADC DMA error flag.
volatile bool g_bADCDMAError;

// Define Differential channel 0+
const am_hal_gpio_pincfg_t g_AM_PIN_13_ADCD0PSE8 =
{
  .uFuncSel = AM_HAL_PIN_13_ADCD0PSE8,
};

// Define Differential channel 0-
const am_hal_gpio_pincfg_t g_AM_PIN_12_ADCD0NSE9 =
{
  .uFuncSel = AM_HAL_PIN_12_ADCD0NSE9,
};

// Define Differential channel 1+
const am_hal_gpio_pincfg_t g_AM_PIN_14_ADCD1P =
{
  .uFuncSel = AM_HAL_PIN_14_ADCD1P,
};

// Define Differential channel 1-
const am_hal_gpio_pincfg_t g_AM_PIN_15_ADCD1N =
{
  .uFuncSel = AM_HAL_PIN_15_ADCD1N,
};
// Interrupt handler for the ADC.
//*****************************************************************************
extern "C" void am_adc_isr() //must use 'extern "C" ' for the Artemis
{
  uint32_t ui32IntMask;

  // Read the interrupt status.
  if (AM_HAL_STATUS_SUCCESS != am_hal_adc_interrupt_status(g_ADCHandle, &ui32IntMask, false))
  {
    Serial.println("Error reading ADC interrupt status");
  }

  // Clear the ADC interrupt.
  if (AM_HAL_STATUS_SUCCESS != am_hal_adc_interrupt_clear(g_ADCHandle, ui32IntMask))
  {
    Serial.println("Error clearing ADC interrupt status");
  }

  // If we got a DMA complete, set the flag.
  if (ui32IntMask & AM_HAL_ADC_INT_DCMP)
  {
    g_bADCDMAComplete = true;
  }

  // If we got a DMA error, set the flag.
  if (ui32IntMask & AM_HAL_ADC_INT_DERR)
  {
    g_bADCDMAError = true;
  }
}

// Set up the core for sleeping, and then go to sleep.
//*****************************************************************************
void sleep()
{
  // Disable things that can't run in sleep mode.
  //#if (0 == ADC_EXAMPLE_DEBUG)
  // am_bsp_debug_printf_disable();
  //#endif

  // Go to Deep Sleep.
  am_hal_sysctrl_sleep(AM_HAL_SYSCTRL_SLEEP_DEEP);

  // Re-enable peripherals for run mode.
  //#if (0 == ADC_EXAMPLE_DEBUG)
  // am_bsp_debug_printf_enable();
  //#endif

}

// Configure the ADC.
//*****************************************************************************
void adc_config_dma()
{
  am_hal_adc_dma_config_t ADCDMAConfig;

  // Configure the ADC to use DMA for the sample transfer.
  ADCDMAConfig.bDynamicPriority = true;
  ADCDMAConfig.ePriority = AM_HAL_ADC_PRIOR_SERVICE_IMMED;
  ADCDMAConfig.bDMAEnable = true;
  ADCDMAConfig.ui32SampleCount = ADC_SAMPLE_BUF_SIZE;
  ADCDMAConfig.ui32TargetAddress = (uint32_t)g_ui32ADCSampleBuffer;
  if (AM_HAL_STATUS_SUCCESS != am_hal_adc_configure_dma(g_ADCHandle, &ADCDMAConfig))
  {
    Serial.println("Error - configuring ADC DMA failed.");
  }
  // Reset the ADC DMA flags.
  g_bADCDMAComplete = false;
  g_bADCDMAError = false;

}


// Configure the ADC.
//*****************************************************************************
void adc_config()
{
  am_hal_adc_config_t ADCConfig;
  am_hal_adc_slot_config_t ADCSlotConfig;

  // Initialize the ADC and get the handle.
  if ( AM_HAL_STATUS_SUCCESS != am_hal_adc_initialize(0, &g_ADCHandle) )
  {
    Serial.println("Error - reservation of the ADC instance failed.");
  }

  // Power on the ADC.
  if (AM_HAL_STATUS_SUCCESS != am_hal_adc_power_control(g_ADCHandle,
      AM_HAL_SYSCTRL_WAKE,
      false) )
  {
    //am_util_stdio_printf("Error - ADC power on failed.\n");
    Serial.println("Error - ADC power on failed.");
  }

  // Set up the ADC configuration parameters. These settings are reasonable
  // for accurate measurements at a low sample rate.
  ADCConfig.eClock = AM_HAL_ADC_CLKSEL_HFRC;
  ADCConfig.ePolarity = AM_HAL_ADC_TRIGPOL_RISING;
  ADCConfig.eTrigger = AM_HAL_ADC_TRIGSEL_SOFTWARE;
  ADCConfig.eReference = AM_HAL_ADC_REFSEL_INT_2P0;
  /*
    AM_HAL_ADC_REFSEL_INT_2P0,
    AM_HAL_ADC_REFSEL_INT_1P5,
    AM_HAL_ADC_REFSEL_EXT_2P0,
    AM_HAL_ADC_REFSEL_EXT_1P5
  */
  ADCConfig.eClockMode = AM_HAL_ADC_CLKMODE_LOW_LATENCY;
  ADCConfig.ePowerMode = AM_HAL_ADC_LPMODE0;
  ADCConfig.eRepeat = AM_HAL_ADC_REPEATING_SCAN; //AM_HAL_ADC_SINGLE_SCAN
  if (AM_HAL_STATUS_SUCCESS != am_hal_adc_configure(g_ADCHandle, &ADCConfig))
  {
    //am_util_stdio_printf("Error - configuring ADC failed.\n");
    Serial.println("Error - configuring ADC failed.");
  }

  // Set up an ADC slot 0
  ADCSlotConfig.eMeasToAvg = AM_HAL_ADC_SLOT_AVG_1;
  ADCSlotConfig.ePrecisionMode = AM_HAL_ADC_SLOT_14BIT;
  ADCSlotConfig.eChannel = AM_HAL_ADC_SLOT_CHSEL_DF0;
  ADCSlotConfig.bWindowCompare = false;
  ADCSlotConfig.bEnabled = true;
  /*
    AM_HAL_ADC_SLOT_AVG_1,
    AM_HAL_ADC_SLOT_AVG_2,
    AM_HAL_ADC_SLOT_AVG_4,
    AM_HAL_ADC_SLOT_AVG_8,
    AM_HAL_ADC_SLOT_AVG_16,
    AM_HAL_ADC_SLOT_AVG_32,
    AM_HAL_ADC_SLOT_AVG_64,
    AM_HAL_ADC_SLOT_AVG_128

    AM_HAL_ADC_SLOT_14BIT,
    AM_HAL_ADC_SLOT_12BIT,
    AM_HAL_ADC_SLOT_10BIT,
    AM_HAL_ADC_SLOT_8BIT

    // Single-ended channels
    AM_HAL_ADC_SLOT_CHSEL_SE0, (pad 16, ArtemisRB A4)
    AM_HAL_ADC_SLOT_CHSEL_SE1, (pad 29, ArtemisRB A0)
    AM_HAL_ADC_SLOT_CHSEL_SE2, (pad 11, ArtemisRB A1)
    AM_HAL_ADC_SLOT_CHSEL_SE3, (pad 31, ArtemisRB A5)
    AM_HAL_ADC_SLOT_CHSEL_SE4, (pad 32, ArtemisRB A8)
    AM_HAL_ADC_SLOT_CHSEL_SE5, (pad 33, ArtemisRB A3)
    AM_HAL_ADC_SLOT_CHSEL_SE6, (pad 34, ArtemisRB A2)
    AM_HAL_ADC_SLOT_CHSEL_SE7, (pad 35, ArtemisRB n/a)
    AM_HAL_ADC_SLOT_CHSEL_SE8, (pad 13, ArtemisRB A10)
    AM_HAL_ADC_SLOT_CHSEL_SE9, (pad 12, ArtemisRB A9)
    // Differential channels.
    AM_HAL_ADC_SLOT_CHSEL_DF0, pads 12 (-), pad 13(+)
    AM_HAL_ADC_SLOT_CHSEL_DF1, pads 15 (-), pad 14(+) (ArtemisRB n/a)
    // Miscellaneous other signals.
    AM_HAL_ADC_SLOT_CHSEL_TEMP,
    AM_HAL_ADC_SLOT_CHSEL_BATT,
    AM_HAL_ADC_SLOT_CHSEL_VSS
  */

  if (AM_HAL_STATUS_SUCCESS != am_hal_adc_configure_slot(g_ADCHandle, 0, &ADCSlotConfig))
  {
    //am_util_stdio_printf("Error - configuring ADC Slot 0 failed.\n");
    Serial.println("Error - configuring ADC Slot 0 failed.");
  }

  // Set up an ADC slot 1
  ADCSlotConfig.eMeasToAvg = AM_HAL_ADC_SLOT_AVG_1;
  ADCSlotConfig.ePrecisionMode = AM_HAL_ADC_SLOT_14BIT;
  ADCSlotConfig.eChannel = AM_HAL_ADC_SLOT_CHSEL_DF1;  
  ADCSlotConfig.bWindowCompare = false;
  ADCSlotConfig.bEnabled = true;
  if (AM_HAL_STATUS_SUCCESS != am_hal_adc_configure_slot(g_ADCHandle, 1, &ADCSlotConfig))
  {
    Serial.println("Error - configuring ADC Slot 0 failed.");
  }

  // Configure the ADC to use DMA for the sample transfer.
  adc_config_dma();
  
  //
  am_hal_adc_interrupt_enable(g_ADCHandle, AM_HAL_ADC_INT_DERR | AM_HAL_ADC_INT_DCMP );

  // Enable the ADC.
  if (AM_HAL_STATUS_SUCCESS != am_hal_adc_enable(g_ADCHandle))
  {
    Serial.println("Error - enabling ADC failed.");
  }
}


// Initialize the ADC repetitive sample timer A3.
//*****************************************************************************
void init_timerA3_for_ADC()
{
  // Start a timer to trigger the ADC periodically 
  am_hal_ctimer_config_single(3, AM_HAL_CTIMER_TIMERA,
                              AM_HAL_CTIMER_HFRC_12MHZ |
                              AM_HAL_CTIMER_FN_REPEAT |
                              AM_HAL_CTIMER_INT_ENABLE);

  am_hal_ctimer_int_enable(AM_HAL_CTIMER_INT_TIMERA3);

  am_hal_ctimer_period_set(3, AM_HAL_CTIMER_TIMERA, 10, 5); //10 tick period, 5 ticks wide

  // Enable the timer A3 to trigger the ADC directly
  am_hal_ctimer_adc_trigger_enable();

  // Start the timer.
  am_hal_ctimer_start(3, AM_HAL_CTIMER_TIMERA);
}


void setup() {
  Serial.begin(115200);
  while (!Serial) {}
  Serial.println("2 Channel Hi-speed ADC test");
  // Set the clock frequency.
  if (AM_HAL_STATUS_SUCCESS != am_hal_clkgen_control(AM_HAL_CLKGEN_CONTROL_SYSCLK_MAX, 0))
  {
    Serial.println("Error - configuring the system clock failed.");
  }

  // Set the default cache configuration and enable it.
  if (AM_HAL_STATUS_SUCCESS != am_hal_cachectrl_config(&am_hal_cachectrl_defaults))
  {
    Serial.println("Error - configuring the system cache failed.");
  }
  if (AM_HAL_STATUS_SUCCESS != am_hal_cachectrl_enable())
  {
    Serial.println("Error - enabling the system cache failed.");
  }

  // Configure the board for low power operation.
  am_bsp_low_power_init();

  // Enable only the first 512KB bank of Flash (0). Disable Flash(1)
  if (AM_HAL_STATUS_SUCCESS != am_hal_pwrctrl_memory_enable(AM_HAL_PWRCTRL_MEM_FLASH_MIN))
  {
    Serial.println("Error - configuring the flash memory failed.");
  }

  // Enable the first 32K of TCM SRAM.
  if (AM_HAL_STATUS_SUCCESS != am_hal_pwrctrl_memory_enable(AM_HAL_PWRCTRL_MEM_SRAM_32K_DTCM))
  {
    Serial.println("Error - configuring the SRAM failed.");
  }

  // Start the ITM interface.
  //am_bsp_itm_printf_enable();

  // Start the CTIMER A3 for timer-based ADC measurements.
  init_timerA3_for_ADC();

  // Enable interrupts.
  NVIC_EnableIRQ(ADC_IRQn);
  am_hal_interrupt_master_enable();

  // Set up pins for differential ADC input,
  am_hal_gpio_pinconfig(13, g_AM_PIN_13_ADCD0PSE8);//pads 12 (-), pad 13(+)   
   am_hal_gpio_pinconfig(12, g_AM_PIN_12_ADCD0NSE9);
   am_hal_gpio_pinconfig(14, g_AM_PIN_14_ADCD1P); //pads 15 (-), pad 14(+)
   am_hal_gpio_pinconfig(15, g_AM_PIN_15_ADCD1N); 

  // Configure the ADC
  adc_config();

  // Trigger the ADC sampling for the first time manually.
  if (AM_HAL_STATUS_SUCCESS != am_hal_adc_sw_trigger(g_ADCHandle))
  {
    Serial.println("Error - triggering the ADC failed.");
  }

  // Print the banner.
  am_util_stdio_terminal_clear();
  Serial.println("ADC Example with 1.2Msps and LPMODE=0");

  // Allow time for all printing to finish.
  am_util_delay_ms(10);

}

void loop() {
  // Go to Deep Sleep.
  useconds_refresh = micros();
  if (!g_bADCDMAComplete)
  {
    sleep();
  }

  // Check for DMA errors.
  if (g_bADCDMAError)
  {
    //am_util_stdio_printf("DMA Error occured\n");
    Serial.println("DMA Error occured");
    while (1);
  }

  // Check if the ADC DMA completion interrupt occurred.
  if (g_bADCDMAComplete)
  { 
    bool toggle = 0;
    for (int i = 0; i < ADC_SAMPLE_BUF_SIZE; i++) {
      //14 bit is 0-16383 on a range of 0-2V
      uint32_t result = g_ui32ADCSampleBuffer[i];
      uint32_t mask = 0xFFFC0;  // all ones for bits 6-19, other bits zeroed
      //Shift result depending on resolution, averaging
      result = result & mask; //get bits 6-19 data only
      result = result >> (6); //remove the fractional values

      // Serial.println(result);
      if (!toggle){
      Serial.print(result * (2.0 / 16383.0), 3);
      Serial.print(",");      
      }
      else{
        Serial.println(result * (2.0 / 16383.0), 3);
      }
      toggle = !toggle;
    }
    
    
    while (1) {}  // stop to view data


    // Reset the DMA completion and error flags.
    g_bADCDMAComplete = false;

    // Re-configure the ADC DMA.
    adc_config_dma();

    // Clear the ADC interrupts.
    if (AM_HAL_STATUS_SUCCESS != am_hal_adc_interrupt_clear(g_ADCHandle, 0xFFFFFFFF))
    {
      //am_util_stdio_printf("Error - clearing the ADC interrupts failed.\n");
      Serial.println("Error - clearing the ADC interrupts failed.");
    }

    // Trigger the ADC sampling for the first time manually.
    if (AM_HAL_STATUS_SUCCESS != am_hal_adc_sw_trigger(g_ADCHandle))
    {
      //am_util_stdio_printf("Error - triggering the ADC failed.\n");
      Serial.println("Error - triggering the ADC failed.");
    }
  } 

}