@@ -192,18 +192,39 @@ void adc_set_resolution(Adc *p_adc,const enum adc_resolution_t resolution)
192
192
void adc_configure_trigger (Adc * p_adc , const enum adc_trigger_t trigger ,
193
193
uint8_t uc_freerun )
194
194
{
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
+ }
196
211
}
197
212
#elif SAM3U_SERIES
198
213
/**
199
- * \brief Configure conversion trigger and free run mode .
214
+ * \brief Configure conversion trigger.
200
215
*
201
216
* \param p_adc Pointer to an ADC instance.
202
217
* \param trigger Conversion trigger.
203
218
*/
204
219
void adc_configure_trigger (Adc * p_adc , const enum adc_trigger_t trigger )
205
220
{
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
+ }
207
228
}
208
229
#endif
209
230
0 commit comments