xmclib/XMCLib/inc/xmc_eru.h
2024-10-17 17:09:59 +02:00

884 lines
39 KiB
C

/**
* @file xmc_eru.h
* @date 2016-03-10
*
* @cond
*********************************************************************************************************************
* XMClib v2.1.16 - XMC Peripheral Driver Library
*
* Copyright (c) 2015-2017, Infineon Technologies AG
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,are permitted provided that the
* following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following
* disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided with the distribution.
*
* Neither the name of the copyright holders nor the names of its contributors may be used to endorse or promote
* products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY,OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* To improve the quality of the software, users are encouraged to share modifications, enhancements or bug fixes with
* Infineon Technologies AG dave@infineon.com).
*********************************************************************************************************************
*
* Change History
* --------------
*
* 2015-02-20:
* - Initial <br>
* - Documentation updates <br>
*
* 2015-06-20:
* - Removed version macros and declaration of GetDriverVersion API <br>
*
* 2015-10-07:
* - Doc update for XMC_ERU_ETL_CONFIG_t field <br>
*
* 2016-03-10:
* - XMC_ERU_ETL_GetEdgeDetection() API is added to get the configured edge for event generation. <br>
*
* @endcond
*/
#ifndef XMC_ERU_H
#define XMC_ERU_H
/*********************************************************************************************************************
* HEADER FILES
********************************************************************************************************************/
#include "xmc_common.h"
/**
* @addtogroup XMClib XMC Peripheral Library
* @{
*/
/**
* @addtogroup ERU
* @brief Event Request Unit (ERU) driver for the XMC microcontroller family.
*
* The Event Request Unit (ERU) is a versatile multiple input event detection and processing unit.
* The ERU module can be used to expand the P-to-P connections of the device: ports-to-peripherals,
* peripherals-to-peripherals and ports-to-ports. It also offers configurable logic, that allows the generation of
* triggers, pattern detection and real-time signal monitoring.
*
* @image html "eru_overview.png"
*
* The driver is divided into two sections:
* \par Event trigger logic (ERU_ETL):
* This section of the LLD provides the configuration structure XMC_ERU_ETL_CONFIG_t and the initialization function
* XMC_ERU_ETL_Init().\n
* It can be used to:
* -# Select one out of two inputs (A and B). For each of these two inputs, a vector of 4 possible signals is available.
* (XMC_ERU_ETL_SetSource())
* -# Logically combine the two input signals to a common trigger. (XMC_ERU_ETL_SetSource())
* -# Define the transition (edge selection, or by software) that leads to a trigger event and can also store this status.
* (XMC_ERU_ETL_SetEdgeDetection() and XMC_ERU_ETL_SetStatusFlag())
* -# Distribute the events and status flags to the output channels. (XMC_ERU_ETL_EnableOutputTrigger())
*
* \par Output gating unit (ERU_OGU):
* This section of the LLD provides the provides the configuration structure XMC_ERU_OGU_CONFIG_t and the initialization
* function XMC_ERU_ETL_OGU_Init().
* It can be used to:
* -# Combine the trigger events and status information and gates the output depending on a gating signal.
* (XMC_ERU_OGU_EnablePatternDetection(), XMC_ERU_OGU_DisablePeripheralTrigger(), XMC_ERU_OGU_SetServiceRequestMode())
* @{
*/
/*********************************************************************************************************************
* MACROS
********************************************************************************************************************/
#if defined(ERU0)
#define XMC_ERU0 ((XMC_ERU_t *) ERU0_BASE) /**< ERU module 0 */
#endif
#if defined(ERU1)
#define XMC_ERU1 ((XMC_ERU_t *) ERU1_BASE) /**< ERU module 1, only available in XMC4 family */
#endif
#if UC_FAMILY == XMC1
#include "xmc1_eru_map.h"
#endif
#if UC_FAMILY == XMC4
#include "xmc4_eru_map.h"
#endif
#if defined(XMC_ERU0) && defined(XMC_ERU1)
#define XMC_ERU_CHECK_MODULE_PTR(PTR) (((PTR)== XMC_ERU0) | ((PTR)== XMC_ERU1))
#elif defined(XMC_ERU0)
#define XMC_ERU_CHECK_MODULE_PTR(PTR) (((PTR)== XMC_ERU0))
#elif defined(XMC_ERU1)
#define XMC_ERU_CHECK_MODULE_PTR(PTR) (((PTR)== XMC_ERU0))
#endif
/*********************************************************************************************************************
* ENUMS
********************************************************************************************************************/
/**
* Defines input signal for path A of ERSx(Event request source, x = [0 to 3]) unit.
* @image html "eru_input_a.png" "ETLx Input A selection"
*/
typedef enum XMC_ERU_ETL_INPUT_A
{
XMC_ERU_ETL_INPUT_A0 = 0x0U, /**< input A0 is selected */
XMC_ERU_ETL_INPUT_A1 = 0x1U, /**< input A1 is selected */
XMC_ERU_ETL_INPUT_A2 = 0x2U, /**< input A2 is selected */
XMC_ERU_ETL_INPUT_A3 = 0x3U /**< input A3 is selected */
} XMC_ERU_ETL_INPUT_A_t;
/**
* Defines input signal for path B of ERSx(Event request source, x = [0 to 3]) unit.
* @image html "eru_input_b.png" "ETLx Input B selection"
*/
typedef enum XMC_ERU_ETL_INPUT_B
{
XMC_ERU_ETL_INPUT_B0 = 0x0U, /**< input B0 is selected */
XMC_ERU_ETL_INPUT_B1 = 0x1U, /**< input B1 is selected */
XMC_ERU_ETL_INPUT_B2 = 0x2U, /**< input B2 is selected */
XMC_ERU_ETL_INPUT_B3 = 0x3U /**< input B3 is selected */
} XMC_ERU_ETL_INPUT_B_t;
/**
* Defines input path combination along with polarity for event generation by ERSx(Event request source) unit to
* ETLx(Event trigger logic),x = [0 to 3] unit.
* @image html "eru_input_trigger.png" "ETLx input trigger signal generation"
*/
typedef enum XMC_ERU_ETL_SOURCE
{
XMC_ERU_ETL_SOURCE_A = 0x0U, /**< select (A) path as a event source */
XMC_ERU_ETL_SOURCE_B = 0x1U, /**< select (B) path as a event source */
XMC_ERU_ETL_SOURCE_A_OR_B = 0x2U, /**< select (A <b>OR</b> B) path as a event source */
XMC_ERU_ETL_SOURCE_A_AND_B = 0x3U, /**< select (A <b>AND</b> B) path as a event source */
XMC_ERU_ETL_SOURCE_NOT_A = 0x4U, /**< select (inverted A) path as a event source */
XMC_ERU_ETL_SOURCE_NOT_A_OR_B = 0x6U, /**< select (inverted A <b>OR</b> B) path as a event source */
XMC_ERU_ETL_SOURCE_NOT_A_AND_B = 0x7U, /**< select (inverted A <b>AND</b> B) path as a event source */
XMC_ERU_ETL_SOURCE_NOT_B = 0x9U, /**< select (inverted B) path as a event source */
XMC_ERU_ETL_SOURCE_A_OR_NOT_B = 0xaU, /**< select (A <b>OR</b> inverted B) path as a event source */
XMC_ERU_ETL_SOURCE_A_AND_NOT_B = 0xbU, /**< select (A <b>AND</b> inverted B) path as a event source */
XMC_ERU_ETL_SOURCE_NOT_A_OR_NOT_B = 0xeU, /**< select (inverted A <b>OR</b> inverted B) path as a event
source */
XMC_ERU_ETL_SOURCE_NOT_A_AND_NOT_B = 0xfU /**< select (inverted A <b>AND</b> inverted B) path as a event
source */
} XMC_ERU_ETL_SOURCE_t;
/**
* Defines trigger edge for the event generation by ETLx (Event Trigger Logic, x = [0 to 3]) unit, by getting the signal
* from ERSx(Event request source, x = [0 to 3]) unit.
*/
typedef enum XMC_ERU_ETL_EDGE_DETECTION
{
XMC_ERU_ETL_EDGE_DETECTION_DISABLED = 0U, /**< no event enabled */
XMC_ERU_ETL_EDGE_DETECTION_RISING = 1U, /**< detection of rising edge generates the event */
XMC_ERU_ETL_EDGE_DETECTION_FALLING = 2U, /**< detection of falling edge generates the event */
XMC_ERU_ETL_EDGE_DETECTION_BOTH = 3U /**< detection of either edges generates the event */
} XMC_ERU_ETL_EDGE_DETECTION_t;
/**
* Defines Output Channel of OGUy(Output gating unit y = [0 to 3]) to be mapped by the trigger pulse generated by
* ETLx(Event Trigger Logic, x = [0 to 3]) unit.
* @note Generation of output trigger pulse need to be enabled @ref XMC_ERU_OGU_PERIPHERAL_TRIGGER_t
* @image html "eru_connection_matrix.png" "ERU_ETL ERU_OGU Connection matrix"
*/
typedef enum XMC_ERU_ETL_OUTPUT_TRIGGER_CHANNEL
{
XMC_ERU_ETL_OUTPUT_TRIGGER_CHANNEL0 = 0U, /**< Event from input ETLx triggers output OGU0 */
XMC_ERU_ETL_OUTPUT_TRIGGER_CHANNEL1 = 1U, /**< Event from input ETLx triggers output OGU1 */
XMC_ERU_ETL_OUTPUT_TRIGGER_CHANNEL2 = 2U, /**< Event from input ETLx triggers output OGU2 */
XMC_ERU_ETL_OUTPUT_TRIGGER_CHANNEL3 = 3U, /**< Event from input ETLx triggers output OGU3 */
} XMC_ERU_ETL_OUTPUT_TRIGGER_CHANNEL_t;
/**
* Defines generation of the trigger pulse by ETLx(Event Trigger Logic, x = [0 to 3]) unit.
* Use type XMC_ERU_ETL_OUTPUT_TRIGGER_t for this enum.
*/
typedef enum XMC_ERU_ETL_OUTPUT_TRIGGER
{
XMC_ERU_ETL_OUTPUT_TRIGGER_DISABLED = 0U, /**< trigger pulse generation disabled */
XMC_ERU_ETL_OUTPUT_TRIGGER_ENABLED = 1U /**< trigger pulse generation enabled */
} XMC_ERU_ETL_OUTPUT_TRIGGER_t;
/**
* Defines status flag reset mode generated by ETLx(Event Trigger Logic, x = [0 to 3]) unit.
* Use type XMC_ERU_ETL_STATUS_FLAG_MODE_t for this enum.
*/
typedef enum XMC_ERU_ETL_STATUS_FLAG_MODE
{
XMC_ERU_ETL_STATUS_FLAG_MODE_SWCTRL = 0U, /**< Status flag is in sticky mode. Retain the same state until
cleared by software. In case of pattern match this mode
is used. */
XMC_ERU_ETL_STATUS_FLAG_MODE_HWCTRL = 1U /**< Status flag is in non-sticky mode. Automatically cleared by
the opposite edge detection.\n
eg. if positive edge is selected as trigger event, for the
negative edge event the status flag is cleared. */
} XMC_ERU_ETL_STATUS_FLAG_MODE_t;
/**
* Defines pattern detection feature to be enabled or not in OGUy(Output gating unit, y = [0 to 3]).
*
*/
typedef enum XMC_ERU_OGU_PATTERN_DETECTION
{
XMC_ERU_OGU_PATTERN_DETECTION_DISABLED = 0U, /**< Pattern match is disabled */
XMC_ERU_OGU_PATTERN_DETECTION_ENABLED = 1U /**< Pattern match is enabled, the selected status flags of
ETLx(Event Trigger Logic, x = [0 to 3]) unit, are
used in pattern detection. */
} XMC_ERU_OGU_PATTERN_DETECTION_t;
/**
* Defines the inputs for Pattern detection. The configured status flag signal from the ETLx(Event Trigger Logic,
* x = [0 to 3]) unit indicates the pattern to be detected.
*/
typedef enum XMC_ERU_OGU_PATTERN_DETECTION_INPUT
{
XMC_ERU_OGU_PATTERN_DETECTION_INPUT0 = 1U, /**< Status flag ETL0, participating in pattern match */
XMC_ERU_OGU_PATTERN_DETECTION_INPUT1 = 2U, /**< Status flag ETL1, participating in pattern match */
XMC_ERU_OGU_PATTERN_DETECTION_INPUT2 = 4U, /**< Status flag ETL0, participating in pattern match */
XMC_ERU_OGU_PATTERN_DETECTION_INPUT3 = 8U /**< Status flag ETL0, participating in pattern match */
} XMC_ERU_OGU_PATTERN_DETECTION_INPUT_t;
/**
* Defines peripheral trigger signal for event generation. Based on the selected peripheral for event generation,
* the trigger signal is mapped.
*/
typedef enum XMC_ERU_OGU_PERIPHERAL_TRIGGER
{
XMC_ERU_OGU_PERIPHERAL_TRIGGER1 = 1U, /**< OGUy1 signal is mapped for event generation */
XMC_ERU_OGU_PERIPHERAL_TRIGGER2 = 2U, /**< OGUy2 signal is mapped for event generation */
XMC_ERU_OGU_PERIPHERAL_TRIGGER3 = 3U /**< OGUy3 signal is mapped for event generation */
} XMC_ERU_OGU_PERIPHERAL_TRIGGER_t;
/**
* Defines the gating scheme for service request generation. In later stage of the OGUy(Output gating unit,
* y = [0 to 3]) based on the gating scheme selected ERU_GOUTy(gated output signal) output is defined.
* @image html "interrupt_gating_signal.png" "Interrupt gating signal"
*/
typedef enum XMC_ERU_OGU_SERVICE_REQUEST
{
XMC_ERU_OGU_SERVICE_REQUEST_DISABLED = 0U, /**< Service request blocked, ERUx_GOUTy = 0 */
XMC_ERU_OGU_SERVICE_REQUEST_ON_TRIGGER = 1U, /**< Service request generated enabled, ERUx_GOUTy = 1 */
XMC_ERU_OGU_SERVICE_REQUEST_ON_TRIGGER_AND_PATTERN_MATCH = 2U, /**< Service request generated on trigger
event and input pattern match,
ERUx_GOUTy = ~pattern matching result*/
XMC_ERU_OGU_SERVICE_REQUEST_ON_TRIGGER_AND_PATTERN_MISMATCH = 3U/**< Service request generated on trigger
event and input pattern mismatch,
ERUx_GOUTy = pattern matching result*/
} XMC_ERU_OGU_SERVICE_REQUEST_t;
/*********************************************************************************************************************
* DATA STRUCTURES
********************************************************************************************************************/
/*Anonymous structure/union guard start*/
#if defined(__CC_ARM)
#pragma push
#pragma anon_unions
#elif defined(__TASKING__)
#pragma warning 586
#endif
/**
* ERU module
*/
typedef struct {
union {
__IO uint32_t EXISEL;
struct {
__IO uint32_t EXS0A : 2;
__IO uint32_t EXS0B : 2;
__IO uint32_t EXS1A : 2;
__IO uint32_t EXS1B : 2;
__IO uint32_t EXS2A : 2;
__IO uint32_t EXS2B : 2;
__IO uint32_t EXS3A : 2;
__IO uint32_t EXS3B : 2;
} EXISEL_b;
};
__I uint32_t RESERVED0[3];
union {
__IO uint32_t EXICON[4];
struct {
__IO uint32_t PE : 1;
__IO uint32_t LD : 1;
__IO uint32_t ED : 2;
__IO uint32_t OCS : 3;
__IO uint32_t FL : 1;
__IO uint32_t SS : 4;
__I uint32_t RESERVED1 : 20;
} EXICON_b[4];
};
union {
__IO uint32_t EXOCON[4];
struct {
__IO uint32_t ISS : 2;
__IO uint32_t GEEN : 1;
__I uint32_t PDR : 1;
__IO uint32_t GP : 2;
uint32_t : 6;
__IO uint32_t IPEN : 4;
__I uint32_t RESERVED2 : 16;
} EXOCON_b[4];
};
} XMC_ERU_t;
/**
* \if XMC4
* Structure for initializing ERUx_ETLy (x = [0..1], y = [0..4]) module.
* \endif
* \if XMC1
* Structure for initializing ERUx_ETLy (x = [0], y = [0..4]) module.
* \endif
*/
typedef struct XMC_ERU_ETL_CONFIG
{
union
{
uint32_t input; /**< While configuring the bit fields, the values have to be shifted according to the position */
struct
{
uint32_t input_a: 2; /**< Configures input A. Refer @ref XMC_ERU_ETL_INPUT_A_t for valid values */
uint32_t input_b: 2; /**< Configures input B. Refer @ref XMC_ERU_ETL_INPUT_B_t for valid values */
uint32_t : 28;
};
};
union
{
uint32_t raw;
struct
{
uint32_t enable_output_trigger: 1; /**< Enables the generation of trigger pulse(PE), for the configured edge
detection. This accepts boolean values as input. */
uint32_t status_flag_mode: 1; /**< Enables the status flag auto clear(LD), for the opposite edge of the
configured event edge. This accepts boolean values as input. */
uint32_t edge_detection: 2; /**< Configure the event trigger edge(FE, RE).
Refer @ref XMC_ERU_ETL_EDGE_DETECTION_t for valid values. */
uint32_t output_trigger_channel: 3; /**< Output channel select(OCS) for ETLx output trigger pulse.
Refer @ref XMC_ERU_ETL_OUTPUT_TRIGGER_CHANNEL_t for valid values. */
uint32_t : 1;
uint32_t source: 4; /**< Input path combination along with polarity for event generation.
Refer @ref XMC_ERU_ETL_SOURCE_t for valid values. */
uint32_t : 20;
};
};
} XMC_ERU_ETL_CONFIG_t;
/**
* \if XMC4
* Structure for initializing ERUx_OGUy (x = [0..1], y = [0..4]) module.
* \endif
* \if XMC1
* Structure for initializing ERUx_OGUy (x = [0], y = [0..4]) module.
* \endif
*/
typedef union XMC_ERU_OGU_CONFIG
{
uint32_t raw;
struct
{
uint32_t peripheral_trigger: 2; /**< peripheral trigger(ISS) input selection.
Refer @ref XMC_ERU_OGU_PERIPHERAL_TRIGGER_t for valid values. */
uint32_t enable_pattern_detection: 1; /**< Enable generation of(GEEN) event for pattern detection result change.
This accepts boolean values as input. */
uint32_t : 1;
uint32_t service_request: 2; /**< Gating(GP) on service request generation for pattern detection result.
Refer @ref XMC_ERU_OGU_SERVICE_REQUEST_t for valid values. */
uint32_t : 6;
uint32_t pattern_detection_input: 4; /**< Enable input for the pattern detection(IPENx, x = [0 to 3]).
Refer @ref XMC_ERU_OGU_PATTERN_DETECTION_INPUT_t for valid values.
<b>OR</b> combination of the enum items given as input */
uint32_t : 16;
};
} XMC_ERU_OGU_CONFIG_t;
/*Anonymous structure/union guard end */
#if defined(__CC_ARM)
#pragma pop
#elif defined(__TASKING__)
#pragma warning restore
#endif
/*********************************************************************************************************************
* API PROTOTYPES
********************************************************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
/**
* @param eru A constant pointer to XMC_ERU_t, pointing to the ERU base address
*
* @return None
*
* \par<b>Description:</b><br>
* \if XMC4
* If ERU1 module is selected, it enables clock and releases reset.<br>
* \endif
* \if XMC1
* Abstract API, not mandatory to call. <br>
* \endif
* \par
* This API is called by XMC_ERU_ETL_Init() or XMC_ERU_OGU_Init() and therefore no need to call it explicitly during
* initialization sequence. Call this API to enable ERU1 module once again if the module is disabled by calling
* XMC_ERU_Disable(). For ERU0 module clock gating and reset features are not available.
*
* \par<b>Note:</b><br>
* \if XMC4
* 1. Required to configure ERU1 module again after calling XMC_ERU_Disable(). Since the all the registers are
* reset with default values.
* \endif
* \par<b>Related APIs:</b><BR>
* XMC_ERU_ETL_Init(), XMC_ERU_OGU_Init(), XMC_ERU_Disable().
*/
void XMC_ERU_Enable(XMC_ERU_t *const eru);
/**
* @param eru A constant pointer to XMC_ERU_t, pointing to the ERU base address
*
* @return None
*
* \par<b>Description:</b><br>
* \if XMC4
* Disables clock and releases reset for ERU1 module.<br>
* \endif
* \if XMC1
* Abstract API, not mandatory to call. <br>
* \endif
*
* \par<b>Note:</b><br>
* \if XMC4
* 1. Required to configure ERU1 module again after calling XMC_ERU_ETL_Init() or XMC_ERU_OGU_Init(). Since the all the
* registers are reset with default values.
* \endif
* \par<b>Related APIs:</b><BR>
* XMC_ERU_Enable()
*/
void XMC_ERU_Disable(XMC_ERU_t *const eru);
/* ERU_ETL APIs */
/**
* @param eru A constant pointer to XMC_ERU_t, pointing to the ERU base address
* @param channel ERU_ETLx(Event trigger logic unit) channel
* Range : [0 to 3]
* @param config pointer to a constant ERU_ETLx configuration data structure.
* Refer data structure XMC_ERU_ETL_CONFIG_t for detail.
*
* @return None
*
* <b>Description:</b><br>
* Initializes the selected ERU_ETLx \a channel with the \a config structure.<br>
*
* Invokes XMC_ERU_Enable() to enable \a eru module clock. Then configures
* <ul>
* <li>Input signal for path A and Path B,</li>
* <li>Trigger pulse generation,</li>
* <li>status flag clear mode,</li>
* <li>Event Trigger edge,</li>
* <li>Output Channel of OGUy(Output gating unit y = [0 to 3]) to be mapped by the trigger pulse,</li>
* <li>input path combination along with polarity for event generation</li>
* </ul>.
*/
void XMC_ERU_ETL_Init(XMC_ERU_t *const eru, const uint8_t channel, const XMC_ERU_ETL_CONFIG_t *const config);
/**
* @param eru A constant pointer to XMC_ERU_t, pointing to the ERU base address.
* @param channel ERU_ETLx(Event trigger logic unit) channel.
* Range : [0 to 3]
* @param input_a input signal for path A of ERSx(Event request source, x = [0 to 3]) unit.\n
* Refer XMC_ERU_ETL_INPUT_A_t for valid value or xmc1_eru_map.h/xmc4_eru_map.h file where the mapping of
* the input is done based on selected signal.\n
* e.g: ERU0_ETL3_INPUTA_P2_7.
* @param input_b input signal for path B of ERSx(Event request source, x = [0 to 3]) unit.\n
* Refer XMC_ERU_ETL_INPUT_B_t for valid value or xmc1_eru_map.h/xmc4_eru_map.h file where the mapping of
* the input is done based on selected signal.\n
* e.g: ERU0_ETL0_INPUTB_P2_0.
*
* @return None
*
* \par<b>Description:</b><br>
* Configures the event source for path A and path B in with selected \a input_a and \a input_b respectively.<br>
* \par
* These values are set during initialization in XMC_ERU_ETL_Init(). Call this to change the input, as needed later in
* the program. According to the ports/peripheral selected, the event source has to be changed.
*/
void XMC_ERU_ETL_SetInput(XMC_ERU_t *const eru,
const uint8_t channel,
const XMC_ERU_ETL_INPUT_A_t input_a,
const XMC_ERU_ETL_INPUT_B_t input_b);
/**
* @param eru A constant pointer to XMC_ERU_t, pointing to the ERU base address.
* @param channel ERU_ETLx(Event trigger logic unit) channel.
* Range : [0 to 3]
* @param source input path combination along with polarity for event generation by ERSx(Event request source) unit.
* Refer @ref XMC_ERU_ETL_SOURCE_t enum for valid input values.
*
* @return None
*
* \par<b>Description:</b><br>
* Select input path combination along with polarity for event generation by setting (SS, NA, NB) bits in
* ERSx(Event request source) unit <br>
* \par
* The signal ERSxO is generated from the selection and this is connected to ETLx(Event trigger logic,
* x = [0 to 3]) for further action. These values are set during initialization in XMC_ERU_ETL_Init(). Call this to
* change the source, as needed later in the program.
*/
void XMC_ERU_ETL_SetSource(XMC_ERU_t *const eru,
const uint8_t channel,
const XMC_ERU_ETL_SOURCE_t source);
/**
* @param eru A constant pointer to XMC_ERU_t, pointing to the ERU base address.
* @param channel ERU_ETLx(Event trigger logic unit) channel.
* Range : [0 to 3]
* @param edge_detection event trigger edge.
* Refer @ref XMC_ERU_ETL_EDGE_DETECTION_t enum for valid values.
*
* @return None
*
* \par<b>Description:</b><br>
* Configure event trigger edge/s by setting (RE, FE) bits of EXICONx(x = [0 to 3]) register.<br>
* \par
* Rising edge, falling edge or either edges can be selected to generate the event.These values are set during
* initialization in XMC_ERU_ETL_Init(). Call this to change the trigger edge, as needed later in the program.
*/
void XMC_ERU_ETL_SetEdgeDetection(XMC_ERU_t *const eru,
const uint8_t channel,
const XMC_ERU_ETL_EDGE_DETECTION_t edge_detection);
/**
* @param eru A constant pointer to XMC_ERU_t, pointing to the ERU base address.
* @param channel ERU_ETLx(Event trigger logic unit) channel.
* Range : [0 to 3]
*
* @return XMC_ERU_ETL_EDGE_DETECTION_t indicate which egde/s is configured for event generation
*
* \par<b>Description:</b><br>
* Return event trigger edge/s by reading (RE, FE) bits of EXICONx(x = [0 to 3]) register.<br>
* \par
* Rising edge, falling edge or either edges can be selected to generate the event.
* Call this to get the configured trigger edge. */
XMC_ERU_ETL_EDGE_DETECTION_t XMC_ERU_ETL_GetEdgeDetection(XMC_ERU_t *const eru,
const uint8_t channel);
/**
* @param eru A constant pointer to XMC_ERU_t, pointing to the ERU base address.
* @param channel ERU_ETLx(Event trigger logic unit) channel.
* Range : [0 to 3]
*
* @return None
*
* \par<b>Description:</b><br>
* Set the status flag bit(FL) in EXICONx(x = [0 to 3]).<br>
* \par
* The status flag indicates that the configured event has occurred. This status flag is used in Pattern match detection
* by OGUy(Output gating unit, y = [0 to 3]).
* \par
* \par<b>Related APIs:</b><BR>
* XMC_ERU_ETL_ClearStatusFlag(), XMC_ERU_ETL_GetStatusFlag()
*/
__STATIC_INLINE void XMC_ERU_ETL_SetStatusFlag(XMC_ERU_t *const eru, const uint8_t channel)
{
XMC_ASSERT("XMC_ERU_ETL_SetStatusFlag:Invalid Module Pointer", XMC_ERU_CHECK_MODULE_PTR(eru));
XMC_ASSERT("XMC_ERU_ETL_SetStatusFlag:Invalid Channel Number", (channel < 4U));
eru->EXICON_b[channel].FL = true;
}
/**
* @param eru A constant pointer to XMC_ERU_t, pointing to the ERU base address.
* @param channel ERU_ETLx(Event trigger logic unit) channel.
* Range : [0 to 3]
*
* @return None
*
* \par<b>Description:</b><br>
* Set the status flag bit(FL) in EXICONx(x = [0 to 3]).<br>
* \par
* If auto clear of the status flag is not enabled by detection of the opposite edge of the event edge, this API clears
* the Flag. SO that next event is considered as new event.
* \par<b>Related APIs:</b><BR>
* XMC_ERU_ETL_SetStatusFlag(), XMC_ERU_ETL_GetStatusFlag()
*/
__STATIC_INLINE void XMC_ERU_ETL_ClearStatusFlag(XMC_ERU_t *const eru, const uint8_t channel)
{
XMC_ASSERT("XMC_ERU_ETL_ClearStatusFlag:Invalid Module Pointer", XMC_ERU_CHECK_MODULE_PTR(eru));
XMC_ASSERT("XMC_ERU_ETL_ClearStatusFlag:Invalid Channel Number", (channel < 4U));
eru->EXICON_b[channel].FL = false;
}
/**
* @param eru A constant pointer to XMC_ERU_t, pointing to the ERU base address.
* @param channel ERU_ETLx(Event trigger logic unit) channel.
* Range : [0 to 3].
*
* @return uint32_t Current state of the status flag bit(FL). Result is in 32-bit format.
*
* \par<b>Description:</b><br>
* Returns status flag state of \a channel.
* \par
* The function can typically be used to clear the status flag using software, when auto clear is not enabled.
*
* \par<b>Related APIs:</b><BR>
* XMC_ERU_ETL_SetStatusFlag(), XMC_ERU_ETL_ClearStatusFlag()
*/
__STATIC_INLINE uint32_t XMC_ERU_ETL_GetStatusFlag(XMC_ERU_t *const eru, const uint8_t channel)
{
XMC_ASSERT("XMC_ERU_ETL_GetStatusFlag:Invalid Module Pointer", XMC_ERU_CHECK_MODULE_PTR(eru));
XMC_ASSERT("XMC_ERU_ETL_GetStatusFlag:Invalid Channel Number", (channel < 4U));
return (uint32_t)eru->EXICON_b[channel].FL;
}
/**
* @param eru A constant pointer to XMC_ERU_t, pointing to the ERU base address.
* @param channel ERU_ETLx(Event trigger logic unit) channel.
* Range : [0 to 3].
* @param mode Set whether status flag has to be cleared by software or hardware.
* Refer @ref XMC_ERU_ETL_STATUS_FLAG_MODE_t for valid value.
*
* @return None
*
* \par<b>Description:</b><br>
* Set the mode for status flag mode by setting (LD) bit in EXICONx(x = \a channel) register.<br>
* \par
* If SWCTRL is selected, status flag has to be cleared by software. This is typically used for pattern match detection.
* If HWCTRL is selected, status flag is cleared by hardware. If Positive edge is selected as event edge, for negative
* edge status flag is cleared and vice versa.This is typically used for continuous event detection.These values are set
* during initialization in XMC_ERU_ETL_Init(). Call this to change the trigger edge, as needed later in the program.
*
* \par<b>Related APIs:</b><BR>
* XMC_ERU_ETL_ClearStatusFlag(), XMC_ERU_ETL_GetStatusFlag()
*/
void XMC_ERU_ETL_SetStatusFlagMode(XMC_ERU_t *const eru,
const uint8_t channel,
const XMC_ERU_ETL_STATUS_FLAG_MODE_t mode);
/**
* @param eru A constant pointer to XMC_ERU_t, pointing to the ERU base address.
* @param channel ERU_ETLx(Event trigger logic unit) channel.
* Range : [0 to 3].
* @param trigger Output Channel of OGUy(Output gating unit y = [0 to 3]) to be mapped by the trigger pulse
* Refer @ref XMC_ERU_ETL_OUTPUT_TRIGGER_CHANNEL_t for valid value.
*
* @return None
*
* \par<b>Description:</b><br>
* Configure which Channel of OGUy(Output gating unit y = [0 to 3]) to be mapped by the trigger pulse generated by
* ETLx(Event Trigger Logic, x = \a channel) by setting (OCS and PE) bit fields.
* \par
* The trigger pulse is generated for one clock pulse along with the flag status update. This is typically used to
* trigger the ISR for the external events. The configured OGUy(Output gating unit y = [0 to 3]), generates the event
* based on the trigger pulse.If output trigger pulse generation is disabled by XMC_ERU_ETL_DisableOutputTrigger(),
* XMC_ERU_ETL_EnableOutputTrigger() can called to reconfigure. These values are set during initialization in
* XMC_ERU_ETL_Init(). Call this to change the trigger edge, as needed later in the program.
*
* \par<b>Related APIs:</b><BR>
* XMC_ERU_ETL_DisableOutputTrigger()
*/
void XMC_ERU_ETL_EnableOutputTrigger(XMC_ERU_t *const eru,
const uint8_t channel,
const XMC_ERU_ETL_OUTPUT_TRIGGER_CHANNEL_t trigger);
/**
* @param eru A constant pointer to XMC_ERU_t, pointing to the ERU base address.
* @param channel ERU_ETLx(Event trigger logic unit) channel.
* Range : [0 to 3].
*
* @return None
*
* \par<b>Description:</b><br>
* Disables the trigger pulse generation by clearing the (PE) of the EXICONx(x = \a channel).
* \par
* Typically this can used when only pattern match is being used for event generation.
*
* \par<b>Related APIs:</b><BR>
* XMC_ERU_ETL_EnableOutputTrigger()
*/
void XMC_ERU_ETL_DisableOutputTrigger(XMC_ERU_t *const eru, const uint8_t channel);
/* ERU_OGU APIs */
/**
* @param eru A constant pointer to XMC_ERU_t, pointing to the ERU base address
* @param channel ERU_OGUy(Output gating unit) channel
* Range : [0 to 3]
* @param config pointer to constant ERU_OGUy configuration data structure.
* Refer data structure XMC_ERU_OGU_CONFIG_t for detail.
*
* @return None
*
* <b>Description:</b><br>
* Initializes the selected ERU_OGUy \a channel with the \a config structure.<br>
*
* Invokes XMC_ERU_Enable() to enable \a eru module clock. Then configures
* <ul>
* <li>Pattern detection,</li>
* <li>Peripheral trigger input,</li>
* <li>Gating for service request generation</li>
* </ul>.
*/
void XMC_ERU_OGU_Init(XMC_ERU_t *const eru,
const uint8_t channel,
const XMC_ERU_OGU_CONFIG_t *const config);
/**
* @param eru A constant pointer to XMC_ERU_t, pointing to the ERU base address
* @param channel ERU_OGUy(Output gating unit) channel
* Range : [0 to 3]
* @param input ERU_ETLx(x = [0 to 3]), for pattern match detection.
* Refer @ref XMC_ERU_OGU_PATTERN_DETECTION_INPUT_t for valid values. Logical <b>OR</b> combination of the
* enum items can be passed as the input.
*
* @return None
*
* \par<b>Description:</b><br>
* Configures ERU_ETLx(x = [0 to 3]) for pattern match detection by setting IPENx(x = [0 to 3]) and GEEN bits.
* \par
* These bits are dedicated to each channel of the ERU_ETLx(x = [0 to 3]). These values are set during initialization in
* XMC_ERU_OGU_Init(). Call this to change the pattern, as needed later in the program.
*
* \par<b>Related APIs:</b><BR>
* XMC_ERU_OGU_DisablePatternDetection(), XMC_ERU_OGU_GetPatternDetectionStatus()
*/
void XMC_ERU_OGU_EnablePatternDetection(XMC_ERU_t *const eru,
const uint8_t channel,
const XMC_ERU_OGU_PATTERN_DETECTION_INPUT_t input);
/**
* @param eru A constant pointer to XMC_ERU_t, pointing to the ERU base address
* @param channel ERU_OGUy(Output gating unit) channel
* Range : [0 to 3]
*
* @return None
*
* \par<b>Description:</b><br>
* Disable the pattern detection by clearing (GEEN) bit.
* \par
* Typically XMC_ERU_OGU_DisablePatternDetection is used when events has to be generated peripheral triggers.
*
* \par<b>Related APIs:</b><BR>
* XMC_ERU_OGU_EnablePatternDetection(), XMC_ERU_OGU_GetPatternDetectionStatus()
*/
void XMC_ERU_OGU_DisablePatternDetection(XMC_ERU_t *const eru, const uint8_t channel);
/**
* @param eru A constant pointer to XMC_ERU_t, pointing to the ERU base address
* @param channel ERU_OGUy(Output gating unit) channel
* Range : [0 to 3]
*
* @return uint32_t returns the pattern match result. Result is in 32-bit format.
*
* \par<b>Description:</b><br>
* This API returns the pattern match result by reading (PDR) bit.
* \par
* \par<b>Related APIs:</b><BR>
* XMC_ERU_OGU_EnablePatternDetection(), XMC_ERU_OGU_DisablePatternDetection()
*/
__STATIC_INLINE uint32_t XMC_ERU_OGU_GetPatternDetectionStatus(XMC_ERU_t *const eru,
const uint8_t channel)
{
XMC_ASSERT("XMC_ERU_OGU_GetPatternDetectionStatus:Invalid Module Pointer", XMC_ERU_CHECK_MODULE_PTR(eru));
XMC_ASSERT("XMC_ERU_OGU_GetPatternDetectionStatus:Invalid Channel Number", (channel < 4U));
return (uint32_t)eru->EXOCON_b[channel].PDR;
}
/**
* @param eru A constant pointer to XMC_ERU_t, pointing to the ERU base address
* @param channel ERU_OGUy(Output gating unit) channel
* Range : [0 to 3]
* @param peripheral_trigger which peripheral trigger signal is used for event generation.
* Refer @ref XMC_ERU_OGU_PERIPHERAL_TRIGGER_t for the valid values, or
xmc1_eru_map.h/xmc4_eru_map.h file where the mapping of the peripheral input is done based
on input. e.g: ERU0_OGU0_PERIPHERAL_TRIGGER_CCU40_SR0.
*
* @return None
*
* \par<b>Description:</b><br>
* Configures peripheral trigger input, by setting (ISS) bit.
* \par
* Based on the peripheral the input signal has to be selected. These values are set during initialization in
* XMC_ERU_OGU_Init(). Call this to change the input, as needed later in the program.
*
* \par<b>Related APIs:</b><BR>
* XMC_ERU_OGU_DisablePeripheralTrigger()
*/
void XMC_ERU_OGU_EnablePeripheralTrigger(XMC_ERU_t *const eru,
const uint8_t channel,
const XMC_ERU_OGU_PERIPHERAL_TRIGGER_t peripheral_trigger);
/**
* @param eru A constant pointer to XMC_ERU_t, pointing to the ERU base address
* @param channel ERU_OGUy(Output gating unit) channel
* Range : [0 to 3]
*
* @return None
*
* \par<b>Description:</b><br>
* Disables event generation based on peripheral trigger by clearing (ISS) bit.
* \par
* This is typically used when peripheral trigger is no longer need. After calling
* XMC_ERU_OGU_DisablePeripheralTrigger(), XMC_ERU_OGU_EnablePeripheralTrigger() has to be called to reconfigure the
* signals again.
*
* \par<b>Related APIs:</b><BR>
* XMC_ERU_OGU_EnablePeripheralTrigger()
*/
void XMC_ERU_OGU_DisablePeripheralTrigger(XMC_ERU_t *const eru,
const uint8_t channel);
/**
* @param eru A constant pointer to XMC_ERU_t, pointing to the ERU base address
* @param channel ERU_OGUy(Output gating unit) channel
* Range : [0 to 3]
* @param mode gating scheme for service request generation.
* Refer @ref XMC_ERU_OGU_SERVICE_REQUEST_t for valid values.
*
* @return None
*
* \par<b>Description:</b><br>
* Configures the gating scheme for service request generation by setting (GP) bit.<br>
* \par
* Typically this function is used to change the service request generation scheme. These values are set during
* initialization in XMC_ERU_OGU_Init(). Call this to change the gating mode, as needed later in the program.
*
*/
void XMC_ERU_OGU_SetServiceRequestMode(XMC_ERU_t *const eru,
const uint8_t channel,
const XMC_ERU_OGU_SERVICE_REQUEST_t mode);
#ifdef __cplusplus
}
#endif
/**
* @} (end addtogroup ERU)
*/
/**
* @} (end addtogroup XMClib)
*/
#endif /* XMC_ERU_H */