Skip to content

adc_configure_trigger bug #130

Open
Open
@avsteele

Description

@avsteele

in adc.c

the library code:

/**
 * \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)
{
	//Warning ADC_MR_TRGSEL_Msk does not include ADC_MR_TRGEN.
	p_adc->ADC_MR &= ~(ADC_MR_TRGEN | ADC_MR_TRGSEL_Msk | ADC_MR_FREERUN); //Clear all bits related to triggers and freerun
	
	//Configure FreeRun
	if(uc_freerun & ADC_MR_FREERUN == ADC_MR_FREERUN_ON) {                 //FreeRun is enabled
		p_adc->ADC_MR |= ADC_MR_FREERUN_ON;
		
		//Free Run Mode: Never wait for any trigger
		//No need to continue and enable hardware triggers
		return;
	}
	
	//Configure hardware triggers
	if(trigger & ADC_MR_TRGEN == ADC_MR_TRGEN_EN) {                       //Hardware trigger is enabled
		p_adc->ADC_MR |= (trigger & ADC_MR_TRGSEL_Msk) | ADC_MR_TRGEN_EN; //Set trigger selection bits and enable hardware trigger
	}
}

...will not enable frerrun if passed ADC_ML_FREERUN_ON (0x1u<<7). Because == has higher precedence than & The function will enable freerun only when passed 1. It will not enable freerun when passed ADC_MR_FREERUN_ON .

The corrected line can simply be

if(uc_freerun == ADC_MR_FREERUN_ON) ...

Which is probably the desired behavior according to the documentation, but may break existing usage. Alternatively

if(uc_freerun != ADC_MR_FREERUN_OFF) ...

will enable freerun when passing anything other than ADC_FREERUN_OFF.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions