Closed
Description
In https://github.com/arduino/Arduino/blob/ide-1.5.x/hardware/arduino/sam/system/libsam/source/adc.c
/**
* \brief Configure conversion trigger and free run mode.
*
* \param p_adc Pointer to an ADC instance.
* \param trigger Conversion trigger.
* \param uc_freerun ADC_MR_FREERUN_ON enables freerun mode,
* ADC_MR_FREERUN_OFF disables freerun mode.
*
*/
void adc_configure_trigger(Adc *p_adc, const enum adc_trigger_t trigger,
uint8_t uc_freerun)
{
p_adc->ADC_MR |= trigger | ((uc_freerun << 7) & ADC_MR_FREERUN);
}
ADC_MR_FREERUN_ON == 0x80
ADC_MR_FREERUN_OFF == 0x00
Running the following on a due show the problem
Serial.begin(115200);
Serial.print("ADC->ADC_MR == ");
Serial.println(ADC->ADC_MR);
//Should enable FreeRun but it will not.
adc_configure_trigger(ADC, ADC_TRIG_SW, ADC_MR_FREERUN_ON);
Serial.print("ADC->ADC_MR == ");
Serial.println(ADC->ADC_MR);
//This call properly enables FreeRun
ADC->ADC_MR |= ADC_MR_FREERUN_ON; // DAC in free running mode.
Serial.print("ADC->ADC_MR == ");
Serial.println(ADC->ADC_MR);
//This should disable FreeRun but it will not.
adc_configure_trigger(ADC, ADC_TRIG_SW, ADC_MR_FREERUN_OFF);
Serial.print("ADC->ADC_MR == ");
Serial.println(ADC->ADC_MR);
Edit: Updated my sketch to include
int ADCMR = ADC->ADC_MR;
adc_configure_trigger(ADC, ADC_TRIG_SW, ADC_MR_FREERUN_ON); // DAC in free running mode.
//Temporary bug fix
if(ADCMR == ADC->ADC_MR) {
Serial.println("Bug with adc_configure_trigger, See https://github.com/arduino/Arduino/issues/1819 for more information.");
ADC->ADC_MR |= ADC_MR_FREERUN_ON; // DAC in free running mode.
}