Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: hello SerialTestv11 SerialTestv12 Sierpinski ... more
Diff: TARGET_EFM32GG11_STK3701/TOOLCHAIN_IAR/em_idac.h
- Revision:
- 171:3a7713b1edbc
- Parent:
- 160:5571c4ff569f
diff -r e95d10626187 -r 3a7713b1edbc TARGET_EFM32GG11_STK3701/TOOLCHAIN_IAR/em_idac.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/TARGET_EFM32GG11_STK3701/TOOLCHAIN_IAR/em_idac.h Thu Nov 08 11:45:42 2018 +0000
@@ -0,0 +1,354 @@
+/***************************************************************************//**
+ * @file em_idac.h
+ * @brief Current Digital to Analog Converter (IDAC) peripheral API
+ * @version 5.3.3
+ *******************************************************************************
+ * # License
+ * <b>Copyright 2016 Silicon Laboratories, Inc. http://www.silabs.com</b>
+ *******************************************************************************
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
+ * obligation to support this Software. Silicon Labs is providing the
+ * Software "AS IS", with no express or implied warranties of any kind,
+ * including, but not limited to, any implied warranties of merchantability
+ * or fitness for any particular purpose or warranties against infringement
+ * of any proprietary rights of a third party.
+ *
+ * Silicon Labs will not be liable for any consequential, incidental, or
+ * special damages, or any other relief, or for any claim by any third party,
+ * arising from your use of this Software.
+ *
+ ******************************************************************************/
+
+#ifndef EM_IDAC_H
+#define EM_IDAC_H
+
+#include "em_device.h"
+
+#if defined(IDAC_COUNT) && (IDAC_COUNT > 0)
+#include <stdbool.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/***************************************************************************//**
+ * @addtogroup emlib
+ * @{
+ ******************************************************************************/
+
+/***************************************************************************//**
+ * @addtogroup IDAC
+ * @brief
+ * Current Digital-to-Analog Converter (IDAC) Peripheral API
+ *
+ * @details
+ * The current digital-to-analog converter (IDAC) can source or sink a configurable
+ * constant current, which can be output on, or sinked from pin or ADC. The current
+ * is configurable with several ranges of various step sizes. The IDAC can be used
+ * with PRS and it can operate down to EM3.
+ *
+ * The following steps are necessary for basic operation:
+ *
+ * Clock enable:
+ * @include em_idac_clock_enable.c
+ *
+ * Initialize the peripheral with default settings and modify selected fields such as
+ * output select:
+ * @if DOXYDOC_P1_DEVICE
+ * @include em_idac_init_adc.c
+ * @endif
+ * @if DOXYDOC_P2_DEVICE
+ * @include em_idac_init_aport.c
+ * @endif
+ *
+ * Set output:
+ * @include em_idac_basic_usage.c
+ *
+ * @{
+ ******************************************************************************/
+
+/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
+
+/** Validation of IDAC register block pointer reference for assert statements. */
+#define IDAC_REF_VALID(ref) ((ref) == IDAC0)
+
+/** @endcond */
+
+/*******************************************************************************
+ ******************************** ENUMS ************************************
+ ******************************************************************************/
+
+/** Output mode. */
+typedef enum {
+#if defined(_IDAC_CTRL_OUTMODE_MASK)
+ idacOutputPin = IDAC_CTRL_OUTMODE_PIN, /**< Output to IDAC OUT pin */
+ idacOutputADC = IDAC_CTRL_OUTMODE_ADC /**< Output to ADC */
+#elif ( _IDAC_CTRL_APORTOUTSEL_MASK )
+ idacOutputAPORT1XCH0 = IDAC_CTRL_APORTOUTSEL_APORT1XCH0, /**< Output to APORT 1X CH0 */
+ idacOutputAPORT1YCH1 = IDAC_CTRL_APORTOUTSEL_APORT1YCH1, /**< Output to APORT 1Y CH1 */
+ idacOutputAPORT1XCH2 = IDAC_CTRL_APORTOUTSEL_APORT1XCH2, /**< Output to APORT 1X CH2 */
+ idacOutputAPORT1YCH3 = IDAC_CTRL_APORTOUTSEL_APORT1YCH3, /**< Output to APORT 1Y CH3 */
+ idacOutputAPORT1XCH4 = IDAC_CTRL_APORTOUTSEL_APORT1XCH4, /**< Output to APORT 1X CH4 */
+ idacOutputAPORT1YCH5 = IDAC_CTRL_APORTOUTSEL_APORT1YCH5, /**< Output to APORT 1Y CH5 */
+ idacOutputAPORT1XCH6 = IDAC_CTRL_APORTOUTSEL_APORT1XCH6, /**< Output to APORT 1X CH6 */
+ idacOutputAPORT1YCH7 = IDAC_CTRL_APORTOUTSEL_APORT1YCH7, /**< Output to APORT 1Y CH7 */
+ idacOutputAPORT1XCH8 = IDAC_CTRL_APORTOUTSEL_APORT1XCH8, /**< Output to APORT 1X CH8 */
+ idacOutputAPORT1YCH9 = IDAC_CTRL_APORTOUTSEL_APORT1YCH9, /**< Output to APORT 1Y CH9 */
+ idacOutputAPORT1XCH10 = IDAC_CTRL_APORTOUTSEL_APORT1XCH10, /**< Output to APORT 1X CH10 */
+ idacOutputAPORT1YCH11 = IDAC_CTRL_APORTOUTSEL_APORT1YCH11, /**< Output to APORT 1Y CH11 */
+ idacOutputAPORT1XCH12 = IDAC_CTRL_APORTOUTSEL_APORT1XCH12, /**< Output to APORT 1X CH12 */
+ idacOutputAPORT1YCH13 = IDAC_CTRL_APORTOUTSEL_APORT1YCH13, /**< Output to APORT 1Y CH13 */
+ idacOutputAPORT1XCH14 = IDAC_CTRL_APORTOUTSEL_APORT1XCH14, /**< Output to APORT 1X CH14 */
+ idacOutputAPORT1YCH15 = IDAC_CTRL_APORTOUTSEL_APORT1YCH15, /**< Output to APORT 1Y CH15 */
+ idacOutputAPORT1XCH16 = IDAC_CTRL_APORTOUTSEL_APORT1XCH16, /**< Output to APORT 1X CH16 */
+ idacOutputAPORT1YCH17 = IDAC_CTRL_APORTOUTSEL_APORT1YCH17, /**< Output to APORT 1Y CH17 */
+ idacOutputAPORT1XCH18 = IDAC_CTRL_APORTOUTSEL_APORT1XCH18, /**< Output to APORT 1X CH18 */
+ idacOutputAPORT1YCH19 = IDAC_CTRL_APORTOUTSEL_APORT1YCH19, /**< Output to APORT 1Y CH19 */
+ idacOutputAPORT1XCH20 = IDAC_CTRL_APORTOUTSEL_APORT1XCH20, /**< Output to APORT 1X CH20 */
+ idacOutputAPORT1YCH21 = IDAC_CTRL_APORTOUTSEL_APORT1YCH21, /**< Output to APORT 1Y CH21 */
+ idacOutputAPORT1XCH22 = IDAC_CTRL_APORTOUTSEL_APORT1XCH22, /**< Output to APORT 1X CH22 */
+ idacOutputAPORT1YCH23 = IDAC_CTRL_APORTOUTSEL_APORT1YCH23, /**< Output to APORT 1Y CH23 */
+ idacOutputAPORT1XCH24 = IDAC_CTRL_APORTOUTSEL_APORT1XCH24, /**< Output to APORT 1X CH24 */
+ idacOutputAPORT1YCH25 = IDAC_CTRL_APORTOUTSEL_APORT1YCH25, /**< Output to APORT 1Y CH25 */
+ idacOutputAPORT1XCH26 = IDAC_CTRL_APORTOUTSEL_APORT1XCH26, /**< Output to APORT 1X CH26 */
+ idacOutputAPORT1YCH27 = IDAC_CTRL_APORTOUTSEL_APORT1YCH27, /**< Output to APORT 1Y CH27 */
+ idacOutputAPORT1XCH28 = IDAC_CTRL_APORTOUTSEL_APORT1XCH28, /**< Output to APORT 1X CH28 */
+ idacOutputAPORT1YCH29 = IDAC_CTRL_APORTOUTSEL_APORT1YCH29, /**< Output to APORT 1Y CH29 */
+ idacOutputAPORT1XCH30 = IDAC_CTRL_APORTOUTSEL_APORT1XCH30, /**< Output to APORT 1X CH30 */
+ idacOutputAPORT1YCH31 = IDAC_CTRL_APORTOUTSEL_APORT1YCH31, /**< Output to APORT 1Y CH31 */
+#endif
+} IDAC_OutMode_TypeDef;
+
+/** Selects which Peripheral Reflex System (PRS) signal to use when
+ PRS is set to control the IDAC output. */
+typedef enum {
+ idacPRSSELCh0 = IDAC_CTRL_PRSSEL_PRSCH0, /**< PRS channel 0. */
+ idacPRSSELCh1 = IDAC_CTRL_PRSSEL_PRSCH1, /**< PRS channel 1. */
+ idacPRSSELCh2 = IDAC_CTRL_PRSSEL_PRSCH2, /**< PRS channel 2. */
+ idacPRSSELCh3 = IDAC_CTRL_PRSSEL_PRSCH3, /**< PRS channel 3. */
+#if defined(IDAC_CTRL_PRSSEL_PRSCH4)
+ idacPRSSELCh4 = IDAC_CTRL_PRSSEL_PRSCH4, /**< PRS channel 4. */
+ idacPRSSELCh5 = IDAC_CTRL_PRSSEL_PRSCH5, /**< PRS channel 5. */
+#endif
+#if defined(IDAC_CTRL_PRSSEL_PRSCH6)
+ idacPRSSELCh6 = IDAC_CTRL_PRSSEL_PRSCH6, /**< PRS channel 6. */
+ idacPRSSELCh7 = IDAC_CTRL_PRSSEL_PRSCH7, /**< PRS channel 7. */
+ idacPRSSELCh8 = IDAC_CTRL_PRSSEL_PRSCH8, /**< PRS channel 8. */
+ idacPRSSELCh9 = IDAC_CTRL_PRSSEL_PRSCH9, /**< PRS channel 9. */
+ idacPRSSELCh10 = IDAC_CTRL_PRSSEL_PRSCH10, /**< PRS channel 10 */
+ idacPRSSELCh11 = IDAC_CTRL_PRSSEL_PRSCH11, /**< PRS channel 11 */
+#endif
+} IDAC_PRSSEL_TypeDef;
+
+/** Selects which current range to use. */
+typedef enum {
+ idacCurrentRange0 = IDAC_CURPROG_RANGESEL_RANGE0, /**< current range 0. */
+ idacCurrentRange1 = IDAC_CURPROG_RANGESEL_RANGE1, /**< current range 1. */
+ idacCurrentRange2 = IDAC_CURPROG_RANGESEL_RANGE2, /**< current range 2. */
+ idacCurrentRange3 = IDAC_CURPROG_RANGESEL_RANGE3, /**< current range 3. */
+} IDAC_Range_TypeDef;
+
+/*******************************************************************************
+ ******************************* STRUCTS ***********************************
+ ******************************************************************************/
+
+/** IDAC init structure, common for both channels. */
+typedef struct {
+ /** Enable IDAC. */
+ bool enable;
+
+ /** Output mode */
+ IDAC_OutMode_TypeDef outMode;
+
+ /**
+ * Enable Peripheral reflex system (PRS) to control IDAC output. If false,
+ * the IDAC output is controlled by writing to IDAC_OUTEN in IDAC_CTRL or
+ * by calling IDAC_OutEnable().
+ */
+ bool prsEnable;
+
+ /**
+ * Peripheral reflex system channel selection. Only applicable if @p prsEnable
+ * is enabled.
+ */
+ IDAC_PRSSEL_TypeDef prsSel;
+
+ /** Enable/disable current sink mode. */
+ bool sinkEnable;
+} IDAC_Init_TypeDef;
+
+/** Default config for IDAC init structure. */
+#if defined(_IDAC_CTRL_OUTMODE_MASK)
+#define IDAC_INIT_DEFAULT \
+ { \
+ false, /**< Leave IDAC disabled when init done. */ \
+ idacOutputPin, /**< Output to IDAC output pin. */ \
+ false, /**< Disable PRS triggering. */ \
+ idacPRSSELCh0, /**< Select PRS ch0 (if PRS triggering enabled). */ \
+ false /**< Disable current sink mode. */ \
+ }
+#elif (_IDAC_CTRL_APORTOUTSEL_MASK)
+#define IDAC_INIT_DEFAULT \
+ { \
+ false, /**< Leave IDAC disabled when init done. */ \
+ idacOutputAPORT1XCH0, /**< Output to APORT. */ \
+ false, /**< Disable PRS triggering. */ \
+ idacPRSSELCh0, /**< Select PRS ch0 (if PRS triggering enabled). */ \
+ false /**< Disable current sink mode. */ \
+ }
+#endif
+
+/*******************************************************************************
+ ***************************** PROTOTYPES **********************************
+ ******************************************************************************/
+
+void IDAC_Init(IDAC_TypeDef *idac, const IDAC_Init_TypeDef *init);
+void IDAC_Enable(IDAC_TypeDef *idac, bool enable);
+void IDAC_Reset(IDAC_TypeDef *idac);
+void IDAC_MinimalOutputTransitionMode(IDAC_TypeDef *idac, bool enable);
+void IDAC_RangeSet(IDAC_TypeDef *idac, const IDAC_Range_TypeDef range);
+void IDAC_StepSet(IDAC_TypeDef *idac, const uint32_t step);
+void IDAC_OutEnable(IDAC_TypeDef *idac, bool enable);
+
+#if defined(_IDAC_IEN_MASK)
+/***************************************************************************//**
+ * @brief
+ * Clear one or more pending IDAC interrupts.
+ *
+ * @param[in] idac
+ * Pointer to IDAC peripheral register block.
+ *
+ * @param[in] flags
+ * Pending IDAC interrupt source(s) to clear. Use one or more valid
+ * interrupt flags for the IDAC module (IDAC_IF_nnn) OR'ed together.
+ ******************************************************************************/
+__STATIC_INLINE void IDAC_IntClear(IDAC_TypeDef *idac, uint32_t flags)
+{
+ idac->IFC = flags;
+}
+
+/***************************************************************************//**
+ * @brief
+ * Disable one or more IDAC interrupts.
+ *
+ * @param[in] idac
+ * Pointer to IDAC peripheral register block.
+ *
+ * @param[in] flags
+ * IDAC interrupt source(s) to disable. Use one or more valid
+ * interrupt flags for the IDAC module (IDAC_IF_nnn) OR'ed together.
+ ******************************************************************************/
+__STATIC_INLINE void IDAC_IntDisable(IDAC_TypeDef *idac, uint32_t flags)
+{
+ idac->IEN &= ~flags;
+}
+
+/***************************************************************************//**
+ * @brief
+ * Enable one or more IDAC interrupts.
+ *
+ * @note
+ * Depending on the use, a pending interrupt may already be set prior to
+ * enabling the interrupt. Consider using IDAC_IntClear() prior to enabling
+ * if such a pending interrupt should be ignored.
+ *
+ * @param[in] idac
+ * Pointer to IDAC peripheral register block.
+ *
+ * @param[in] flags
+ * IDAC interrupt source(s) to enable. Use one or more valid
+ * interrupt flags for the IDAC module (IDAC_IF_nnn) OR'ed together.
+ ******************************************************************************/
+__STATIC_INLINE void IDAC_IntEnable(IDAC_TypeDef *idac, uint32_t flags)
+{
+ idac->IEN |= flags;
+}
+
+/***************************************************************************//**
+ * @brief
+ * Get pending IDAC interrupt flags.
+ *
+ * @note
+ * The event bits are not cleared by the use of this function.
+ *
+ * @param[in] idac
+ * Pointer to IDAC peripheral register block.
+ *
+ * @return
+ * IDAC interrupt source(s) pending. Returns one or more valid
+ * interrupt flags for the IDAC module (IDAC_IF_nnn) OR'ed together.
+ ******************************************************************************/
+__STATIC_INLINE uint32_t IDAC_IntGet(IDAC_TypeDef *idac)
+{
+ return idac->IF;
+}
+
+/***************************************************************************//**
+ * @brief
+ * Get enabled and pending IDAC interrupt flags.
+ * Useful for handling more interrupt sources in the same interrupt handler.
+ *
+ * @param[in] idac
+ * Pointer to IDAC peripheral register block.
+ *
+ * @note
+ * Interrupt flags are not cleared by the use of this function.
+ *
+ * @return
+ * Pending and enabled IDAC interrupt sources.
+ * The return value is the bitwise AND combination of
+ * - the OR combination of enabled interrupt sources in IDACx_IEN_nnn
+ * register (IDACx_IEN_nnn) and
+ * - the OR combination of valid interrupt flags of the IDAC module
+ * (IDACx_IF_nnn).
+ ******************************************************************************/
+__STATIC_INLINE uint32_t IDAC_IntGetEnabled(IDAC_TypeDef *idac)
+{
+ uint32_t ien;
+
+ /* Store flags in temporary variable in order to define explicit order
+ * of volatile accesses. */
+ ien = idac->IEN;
+
+ /* Bitwise AND of pending and enabled interrupts */
+ return idac->IF & ien;
+}
+
+/***************************************************************************//**
+ * @brief
+ * Set one or more pending IDAC interrupts from SW.
+ *
+ * @param[in] idac
+ * Pointer to IDAC peripheral register block.
+ *
+ * @param[in] flags
+ * IDAC interrupt source(s) to set to pending. Use one or more valid
+ * interrupt flags for the IDAC module (IDAC_IF_nnn) OR'ed together.
+ ******************************************************************************/
+__STATIC_INLINE void IDAC_IntSet(IDAC_TypeDef *idac, uint32_t flags)
+{
+ idac->IFS = flags;
+}
+#endif
+
+/** @} (end addtogroup IDAC) */
+/** @} (end addtogroup emlib) */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* defined(IDAC_COUNT) && (IDAC_COUNT > 0) */
+
+#endif /* EM_IDAC_H */


