EFM32 Gecko Software Documentation  efm32g-doc-4.2.1
em_opamp.c
Go to the documentation of this file.
1 /**************************************************************************/
33 #include "em_opamp.h"
34 #if defined(OPAMP_PRESENT) && (OPAMP_COUNT == 1)
35 
36 #include "em_system.h"
37 #include "em_assert.h"
38 
39 /***************************************************************************/
45 /***************************************************************************/
191 /*******************************************************************************
192  ************************** GLOBAL FUNCTIONS *******************************
193  ******************************************************************************/
194 
195 /***************************************************************************/
205 void OPAMP_Disable(DAC_TypeDef *dac, OPAMP_TypeDef opa)
206 {
207  EFM_ASSERT(DAC_REF_VALID(dac));
208  EFM_ASSERT(DAC_OPA_VALID(opa));
209 
210  if (opa == OPA0)
211  {
212  dac->CH0CTRL &= ~DAC_CH0CTRL_EN;
213  dac->OPACTRL &= ~DAC_OPACTRL_OPA0EN;
214  }
215  else if (opa == OPA1)
216  {
217  dac->CH1CTRL &= ~DAC_CH1CTRL_EN;
218  dac->OPACTRL &= ~DAC_OPACTRL_OPA1EN;
219  }
220  else /* OPA2 */
221  {
222  dac->OPACTRL &= ~DAC_OPACTRL_OPA2EN;
223  }
224 }
225 
226 
227 /***************************************************************************/
266 void OPAMP_Enable(DAC_TypeDef *dac, OPAMP_TypeDef opa, const OPAMP_Init_TypeDef *init)
267 {
268  uint32_t offset;
269 
270  EFM_ASSERT(DAC_REF_VALID(dac));
271  EFM_ASSERT(DAC_OPA_VALID(opa));
272  EFM_ASSERT(init->bias <= (_DAC_BIASPROG_BIASPROG_MASK
274 
275  if (opa == OPA0)
276  {
277  EFM_ASSERT((init->outPen & ~_DAC_OPA0MUX_OUTPEN_MASK) == 0);
278 
279  dac->BIASPROG = (dac->BIASPROG
282  | (init->bias << _DAC_BIASPROG_BIASPROG_SHIFT)
283  | (init->halfBias ? DAC_BIASPROG_HALFBIAS : 0);
284 
285  if (init->defaultOffset)
286  {
287  offset = SYSTEM_GetCalibrationValue(&dac->CAL);
288  dac->CAL = (dac->CAL & ~_DAC_CAL_CH0OFFSET_MASK)
289  | (offset & _DAC_CAL_CH0OFFSET_MASK);
290  }
291  else
292  {
293  EFM_ASSERT(init->offset <= (_DAC_CAL_CH0OFFSET_MASK
295 
296  dac->CAL = (dac->CAL & ~_DAC_CAL_CH0OFFSET_MASK)
297  | (init->offset << _DAC_CAL_CH0OFFSET_SHIFT);
298  }
299 
300  dac->OPA0MUX = (uint32_t)init->resSel
301  | (uint32_t)init->outMode
302  | init->outPen
303  | (uint32_t)init->resInMux
304  | (uint32_t)init->negSel
305  | (uint32_t)init->posSel
306  | ( init->nextOut ? DAC_OPA0MUX_NEXTOUT : 0)
307  | ( init->npEn ? DAC_OPA0MUX_NPEN : 0)
308  | ( init->ppEn ? DAC_OPA0MUX_PPEN : 0);
309 
310  dac->CH0CTRL |= DAC_CH0CTRL_EN;
311  dac->OPACTRL = (dac->OPACTRL
312  & ~(DAC_OPACTRL_OPA0SHORT
313  | _DAC_OPACTRL_OPA0LPFDIS_MASK
314  | DAC_OPACTRL_OPA0HCMDIS))
315  | (init->shortInputs ? DAC_OPACTRL_OPA0SHORT : 0)
316  | (init->lpfPosPadDisable
317  ? DAC_OPACTRL_OPA0LPFDIS_PLPFDIS : 0)
318  | (init->lpfNegPadDisable
319  ? DAC_OPACTRL_OPA0LPFDIS_NLPFDIS : 0)
320  | (init->hcmDisable ? DAC_OPACTRL_OPA0HCMDIS : 0)
321  | DAC_OPACTRL_OPA0EN;
322  }
323  else if ( opa == OPA1 )
324  {
325  EFM_ASSERT((init->outPen & ~_DAC_OPA1MUX_OUTPEN_MASK) == 0);
326 
327  dac->BIASPROG = (dac->BIASPROG
330  | (init->bias << _DAC_BIASPROG_BIASPROG_SHIFT)
331  | (init->halfBias ? DAC_BIASPROG_HALFBIAS : 0 );
332 
333  if (init->defaultOffset)
334  {
335  offset = SYSTEM_GetCalibrationValue(&dac->CAL);
336  dac->CAL = (dac->CAL & ~_DAC_CAL_CH1OFFSET_MASK)
337  | (offset & _DAC_CAL_CH1OFFSET_MASK);
338  }
339  else
340  {
341  EFM_ASSERT(init->offset <= (_DAC_CAL_CH1OFFSET_MASK
343 
344  dac->CAL = (dac->CAL & ~_DAC_CAL_CH1OFFSET_MASK)
345  | (init->offset << _DAC_CAL_CH1OFFSET_SHIFT);
346  }
347 
348  dac->OPA1MUX = (uint32_t)init->resSel
349  | (uint32_t)init->outMode
350  | init->outPen
351  | (uint32_t)init->resInMux
352  | (uint32_t)init->negSel
353  | (uint32_t)init->posSel
354  | (init->nextOut ? DAC_OPA1MUX_NEXTOUT : 0)
355  | (init->npEn ? DAC_OPA1MUX_NPEN : 0)
356  | (init->ppEn ? DAC_OPA1MUX_PPEN : 0);
357 
358  dac->CH1CTRL |= DAC_CH1CTRL_EN;
359  dac->OPACTRL = (dac->OPACTRL
360  & ~(DAC_OPACTRL_OPA1SHORT
361  | _DAC_OPACTRL_OPA1LPFDIS_MASK
362  | DAC_OPACTRL_OPA1HCMDIS))
363  | (init->shortInputs ? DAC_OPACTRL_OPA1SHORT : 0)
364  | (init->lpfPosPadDisable
365  ? DAC_OPACTRL_OPA1LPFDIS_PLPFDIS : 0)
366  | (init->lpfNegPadDisable
367  ? DAC_OPACTRL_OPA1LPFDIS_NLPFDIS : 0)
368  | (init->hcmDisable ? DAC_OPACTRL_OPA1HCMDIS : 0)
369  | DAC_OPACTRL_OPA1EN;
370  }
371  else /* OPA2 */
372  {
373  EFM_ASSERT((init->posSel == DAC_OPA2MUX_POSSEL_DISABLE)
374  || (init->posSel == DAC_OPA2MUX_POSSEL_POSPAD)
375  || (init->posSel == DAC_OPA2MUX_POSSEL_OPA1INP)
376  || (init->posSel == DAC_OPA2MUX_POSSEL_OPATAP));
377 
378  EFM_ASSERT((init->outMode & ~DAC_OPA2MUX_OUTMODE) == 0);
379 
380  EFM_ASSERT((init->outPen & ~_DAC_OPA2MUX_OUTPEN_MASK) == 0);
381 
382  dac->BIASPROG = (dac->BIASPROG
383  & ~(_DAC_BIASPROG_OPA2BIASPROG_MASK
384  | DAC_BIASPROG_OPA2HALFBIAS))
385  | (init->bias << _DAC_BIASPROG_OPA2BIASPROG_SHIFT)
386  | (init->halfBias ? DAC_BIASPROG_OPA2HALFBIAS : 0);
387 
388  if (init->defaultOffset)
389  {
390  offset = SYSTEM_GetCalibrationValue(&dac->OPAOFFSET);
391  dac->OPAOFFSET = (dac->OPAOFFSET & ~_DAC_OPAOFFSET_OPA2OFFSET_MASK)
392  | (offset & _DAC_OPAOFFSET_OPA2OFFSET_MASK);
393  }
394  else
395  {
396  EFM_ASSERT(init->offset <= (_DAC_OPAOFFSET_OPA2OFFSET_MASK
397  >> _DAC_OPAOFFSET_OPA2OFFSET_SHIFT));
398  dac->OPAOFFSET = (dac->OPAOFFSET & ~_DAC_OPAOFFSET_OPA2OFFSET_MASK)
399  | (init->offset << _DAC_OPAOFFSET_OPA2OFFSET_SHIFT);
400  }
401 
402  dac->OPA2MUX = (uint32_t)init->resSel
403  | (uint32_t)init->outMode
404  | init->outPen
405  | (uint32_t)init->resInMux
406  | (uint32_t)init->negSel
407  | (uint32_t)init->posSel
408  | ( init->nextOut ? DAC_OPA2MUX_NEXTOUT : 0 )
409  | ( init->npEn ? DAC_OPA2MUX_NPEN : 0 )
410  | ( init->ppEn ? DAC_OPA2MUX_PPEN : 0 );
411 
412  dac->OPACTRL = (dac->OPACTRL
413  & ~(DAC_OPACTRL_OPA2SHORT
414  | _DAC_OPACTRL_OPA2LPFDIS_MASK
415  | DAC_OPACTRL_OPA2HCMDIS))
416  | (init->shortInputs ? DAC_OPACTRL_OPA2SHORT : 0)
417  | (init->lpfPosPadDisable
418  ? DAC_OPACTRL_OPA2LPFDIS_PLPFDIS : 0)
419  | (init->lpfNegPadDisable
420  ? DAC_OPACTRL_OPA2LPFDIS_NLPFDIS : 0)
421  | (init->hcmDisable ? DAC_OPACTRL_OPA2HCMDIS : 0)
422  | DAC_OPACTRL_OPA2EN;
423  }
424 }
425 
429 #endif /* defined( OPAMP_PRESENT ) && ( OPAMP_COUNT == 1 ) */
#define _DAC_CAL_CH1OFFSET_SHIFT
Definition: efm32g_dac.h:360
Emlib peripheral API "assert" implementation.
#define DAC_CH1CTRL_EN
Definition: efm32g_dac.h:193
uint32_t SYSTEM_GetCalibrationValue(volatile uint32_t *regAddress)
Get factory calibration value for a given peripheral register.
Definition: em_system.c:92
__IO uint32_t BIASPROG
Definition: efm32g_dac.h:55
#define _DAC_BIASPROG_BIASPROG_MASK
Definition: efm32g_dac.h:373
#define DAC_CH0CTRL_EN
Definition: efm32g_dac.h:154
__IO uint32_t CAL
Definition: efm32g_dac.h:54
#define _DAC_BIASPROG_BIASPROG_SHIFT
Definition: efm32g_dac.h:372
__IO uint32_t CH0CTRL
Definition: efm32g_dac.h:45
#define _DAC_CAL_CH0OFFSET_MASK
Definition: efm32g_dac.h:357
System API.
#define DAC_BIASPROG_HALFBIAS
Definition: efm32g_dac.h:376
Operational Amplifier (OPAMP) peripheral API.
__IO uint32_t CH1CTRL
Definition: efm32g_dac.h:46
#define _DAC_CAL_CH0OFFSET_SHIFT
Definition: efm32g_dac.h:356
#define _DAC_CAL_CH1OFFSET_MASK
Definition: efm32g_dac.h:361