@@ -192,18 +192,39 @@ void adc_set_resolution(Adc *p_adc,const enum adc_resolution_t resolution)
192192void adc_configure_trigger (Adc * p_adc , const enum adc_trigger_t trigger ,
193193 uint8_t uc_freerun )
194194{
195- p_adc -> ADC_MR |= trigger | ((uc_freerun << 7 ) & ADC_MR_FREERUN );
195+ //Warning ADC_MR_TRGSEL_Msk does not include ADC_MR_TRGEN.
196+ p_adc -> ADC_MR &= ~(ADC_MR_TRGEN | ADC_MR_TRGSEL_Msk | ADC_MR_FREERUN ); //Clear all bits related to triggers and freerun
197+
198+ //Configure FreeRun
199+ if (uc_freerun & ADC_MR_FREERUN == ADC_MR_FREERUN_ON ) { //FreeRun is enabled
200+ p_adc -> ADC_MR |= ADC_MR_FREERUN_ON ;
201+
202+ //Free Run Mode: Never wait for any trigger
203+ //No need to continue and enable hardware triggers
204+ return ;
205+ }
206+
207+ //Configure hardware triggers
208+ if (trigger & ADC_MR_TRGEN == ADC_MR_TRGEN_EN ) { //Hardware trigger is enabled
209+ p_adc -> ADC_MR |= (trigger & ADC_MR_TRGSEL_Msk ) | ADC_MR_TRGEN_EN ; //Set trigger selection bits and enable hardware trigger
210+ }
196211}
197212#elif SAM3U_SERIES
198213/**
199- * \brief Configure conversion trigger and free run mode .
214+ * \brief Configure conversion trigger.
200215 *
201216 * \param p_adc Pointer to an ADC instance.
202217 * \param trigger Conversion trigger.
203218 */
204219void adc_configure_trigger (Adc * p_adc , const enum adc_trigger_t trigger )
205220{
206- p_adc -> ADC_MR |= trigger ;
221+ //Warning ADC_MR_TRGSEL_Msk does not include ADC_MR_TRGEN.
222+ p_adc -> ADC_MR &= ~(ADC_MR_TRGEN | ADC_MR_TRGSEL_Msk ); //Clear all bits related to triggers
223+
224+ //Configure hardware triggers
225+ if (trigger & ADC_MR_TRGEN == ADC_MR_TRGEN_EN ) { //Hardware trigger is enabled
226+ p_adc -> ADC_MR |= (trigger & ADC_MR_TRGSEL_Msk ) | ADC_MR_TRGEN_EN ; //Set trigger selection bits and enable hardware trigger
227+ }
207228}
208229#endif
209230
0 commit comments