RX Flexible Software Package Documentation  Release v1.0.0

 
Event Link Controller (r_elc)

Functions

fsp_err_t R_ELC_Open (elc_ctrl_t *const p_ctrl, elc_cfg_t const *const p_cfg)
 
fsp_err_t R_ELC_Close (elc_ctrl_t *const p_ctrl)
 
fsp_err_t R_ELC_SoftwareEventGenerate (elc_ctrl_t *const p_ctrl, elc_software_event_t event_number)
 
fsp_err_t R_ELC_LinkSet (elc_ctrl_t *const p_ctrl, elc_peripheral_t peripheral, elc_event_t signal)
 
fsp_err_t R_ELC_LinkBreak (elc_ctrl_t *const p_ctrl, elc_peripheral_t peripheral)
 
fsp_err_t R_ELC_Enable (elc_ctrl_t *const p_ctrl)
 
fsp_err_t R_ELC_Disable (elc_ctrl_t *const p_ctrl)
 

Detailed Description

Driver for the ELC peripheral on RX MCUs. This module implements the ELC Interface.

Overview

The event link controller (ELC) uses the event requests generated by various peripheral modules as source signals to connect (link) them to different modules, allowing direct cooperation between the modules without central processing unit (CPU) intervention. The conceptual diagram below illustrates a potential setup where a pin interrupt triggers a timer which later triggers an ADC conversion and CTSU scan, while at the same time a serial communication interrupt automatically starts a data transfer. These tasks would be automatically handled without the need for polling or interrupt management.

r_elc_concept.svg
Event Link Controller Conceptual Diagram

In essence, the ELC is an array of multiplexers to route a wide variety of interrupt signals to a subset of peripheral functions. Events are linked by setting the multiplexer for the desired function to the desired signal (through R_ELC_LinkSet). The diagram below illustrates one peripheral output of the ELC. In this example, a conversion start is triggered for ADC0 Group A when the GPT0 counter overflows:

r_elc_eventset.svg
ELC Example

Features

The ELC HAL module can perform the following functions:

A variety of functions can be activated via events, including:

Note
The available sources and peripherals may differ between devices. A full list of selectable peripherals and events is available in the User's Manual for your device.
Some peripherals have specific settings related to ELC event generation and/or reception. Details on how to enable event functionality for each peripheral are located in the usage notes for the related module(s) as well as in the User's Manual for your device.

Configuration

Note
Event links will be automatically generated based on the selections made in module properties. To view the currently linked events check the Event Links tab in the RX Configuration editor.
Calling R_ELC_Open followed by R_ELC_Enable will automatically link all events shown in the Event Links tab.

To manually link an event to a peripheral at runtime perform the following steps:

  1. Configure the operation of the destination peripheral (including any configuration necessary to receive events)
  2. Use R_ELC_LinkSet to set the desired event link to the peripheral
  3. Use R_ELC_Enable to enable transmission of event signals
  4. Configure the signaling module to output the desired event (typically an interrupt)

To disable the event, either use R_ELC_LinkBreak to clear the link for a specific event or R_ELC_Disable to globally disable event linking.

Note
The ELC module needs no pin, clocking or interrupt configuration; it is merely a mechanism to connect signals between peripherals. However, when linking I/O Ports via the ELC the relevant I/O pins need to be configured as inputs or outputs.

Build Time Configurations for r_elc

The following build time configurations are defined in fsp_cfg/r_elc_cfg.h:

ConfigurationOptionsDefaultDescription
Parameter Checking
  • Default (BSP)
  • Enabled
  • Disabled
Default (BSP) If selected code for parameter checking is included in the build.

Configurations for System > Event Link Controller (r_elc)

This module can be added to the Stacks tab via New Stack > System > Event Link Controller (r_elc).

ConfigurationOptionsDefaultDescription
General > Event Link Option Settings > CMT > CMT1MCU Specific OptionsEvent Link Option Setting Register CMT
General > Event Link Option Settings > CMTW > CMTW0MCU Specific OptionsEvent Link Option Setting Register CMTW
General > Event Link Option Settings > TMR > TMR0MCU Specific OptionsEvent Link Option Setting Register TMR
General > Event Link Option Settings > TMR > TMR1MCU Specific OptionsEvent Link Option Setting Register TMR
General > Event Link Option Settings > TMR > TMR2MCU Specific OptionsEvent Link Option Setting Register TMR
General > Event Link Option Settings > TMR > TMR3MCU Specific OptionsEvent Link Option Setting Register TMR
General > NameELC instance name must be g_elc to match elc_cfg_t data structure created in elc_data.cg_elc Module name. Fixed to g_elc.
Interrupts > ELC1 Interrupt PriorityMCU Specific OptionsSelect the ELC interrupt 1 priority.
Interrupts > ELC2 Interrupt PriorityMCU Specific OptionsSelect the ELC interrupt 2 priority.
Interrupts > ELC3 Interrupt PriorityMCU Specific OptionsSelect the ELC interrupt 3 priority.
Interrupts > ELC4 Interrupt PriorityMCU Specific OptionsSelect the ELC interrupt 4 priority.
Interrupts > CallbackName must be a valid C symbolNULL A user callback function can be provided. If this callback function is provided, it will be called from the interrupt service routine (ISR).

Usage Notes

Limitations

Developers should be aware of the following limitations when using the ELC:

Examples

Basic Example

Below is a basic example of minimal use of event linking in an application.

/* This struct is automatically generated based on the events configured by peripherals in the RX Configuration editor. */
static const elc_cfg_t g_elc_cfg =
{
.link[ELC_PERIPHERAL_GPT_A] = ELC_EVENT_IOPORT_EVENT_C,
.link[ELC_EVENT_IOPORT_EVENT_B] = ELC_EVENT_GPT4_COUNTER_OVERFLOW
};
void elc_basic_example (void)
{
fsp_err_t err = FSP_SUCCESS;
/* Initializes the software and sets the links defined in the control structure. */
err = R_ELC_Open(&g_elc_ctrl, &g_elc_cfg);
/* Handle any errors. This function should be defined by the user. */
assert(FSP_SUCCESS == err);
/* Create or modify a link between a peripheral function and an event source. */
err = R_ELC_LinkSet(&g_elc_ctrl, ELC_PERIPHERAL_ADC0, ELC_EVENT_GPT4_COUNTER_OVERFLOW);
assert(FSP_SUCCESS == err);
/* Globally enable event linking in the ELC. */
err = R_ELC_Enable(&g_elc_ctrl);
assert(FSP_SUCCESS == err);
}

Software-Generated Events

This example demonstrates how to use a software-generated event to signal a peripheral. This can be useful when the desired event source is not supported by the ELC hardware.

/* Interrupt handler for peripheral event not supported by the ELC */
void peripheral_isr (void)
{
fsp_err_t err;
/* Generate an event signal through software to the linked peripheral. */
assert(FSP_SUCCESS == err);
}
void elc_software_event (void)
{
fsp_err_t err = FSP_SUCCESS;
/* Open the module. */
err = R_ELC_Open(&g_elc_ctrl, &g_elc_cfg);
/* Handle any errors. This function should be defined by the user. */
assert(FSP_SUCCESS == err);
/* Link ADC0 conversion start to software event 0. */
err = R_ELC_LinkSet(&g_elc_ctrl, ELC_PERIPHERAL_ADC0, ELC_EVENT_ELC_SOFTWARE_EVENT_0);
assert(FSP_SUCCESS == err);
while (true)
{
/* Application code here. */
}
}

Data Structures

struct  elc_callback_args_t
 
struct  elc_cfg_extend_t
 
struct  elc_instance_ctrl_t
 

Enumerations

enum  elc_operation_option_t
 

Data Structure Documentation

◆ elc_callback_args_t

struct elc_callback_args_t

Event link callback arguments definitions

Data Fields
elc_interrupt_t event ELC interrupt event.
void * p_context Placeholder for user data.

◆ elc_cfg_extend_t

struct elc_cfg_extend_t

Extended configuration for ELC.

Data Fields

elc_operation_option_t cmt1_md
 CMT1 Operation Select (placed at ELOPA[3:2])
 
elc_operation_option_t cmtw0_md
 CMTW0 Operation Select (placed at ELOPB[1:0])
 
elc_operation_option_t tmr0_md
 TMR0 Operation Select (placed at ELOPC[1:0])
 
elc_operation_option_t tmr1_md
 TMR1 Operation Select (placed at ELOPC[3:2])
 
elc_operation_option_t tmr2_md
 TMR2 Operation Select (placed at ELOPD[1:0])
 
elc_operation_option_t tmr3_md
 TMR3 Operation Select (placed at ELOPD[3:2])
 
uint32_t ipl [ELC_INTERRUPT_NUM]
 ELC interrupt priority.
 
IRQn_Type irq [ELC_INTERRUPT_NUM]
 ELC interrupt IRQ number.
 
void(* p_callback )(elc_callback_args_t *p_args)
 Pointer to callback function.
 
void * p_context
 User defined context passed into callback function.
 

◆ elc_instance_ctrl_t

struct elc_instance_ctrl_t

ELC private control block. DO NOT MODIFY. Initialization occurs when R_ELC_Open() is called.

Enumeration Type Documentation

◆ elc_operation_option_t

Event link option operation.

Enumerator
ELC_OPERATION_SELECT_COUNT_START 

Counting is started.

ELC_OPERATION_SELECT_COUNT_RESTART 

Counting is restarted.

ELC_OPERATION_SELECT_COUNTER 

Event counter.

ELC_EVENT_OPERATION_SELECT_DISABLED 

Event output is disabled.

Function Documentation

◆ R_ELC_Open()

fsp_err_t R_ELC_Open ( elc_ctrl_t *const  p_ctrl,
elc_cfg_t const *const  p_cfg 
)

Initialize all the links in the Event Link Controller. Implements elc_api_t::open

The configuration structure passed in to this function includes links for every event source included in the ELC and sets them all at once. To set or clear an individual link use R_ELC_LinkSet and R_ELC_LinkBreak respectively.

Example:

/* Initializes the software and sets the links defined in the control structure. */
err = R_ELC_Open(&g_elc_ctrl, &g_elc_cfg);
Return values
FSP_SUCCESSInitialization was successful
FSP_ERR_ASSERTIONp_ctrl or p_cfg was NULL
FSP_ERR_ALREADY_OPENThe module is currently open

◆ R_ELC_Close()

fsp_err_t R_ELC_Close ( elc_ctrl_t *const  p_ctrl)

Globally disable ELC linking. Implements elc_api_t::close

Return values
FSP_SUCCESSThe ELC was successfully disabled
FSP_ERR_ASSERTIONp_ctrl was NULL
FSP_ERR_NOT_OPENThe module has not been opened

◆ R_ELC_SoftwareEventGenerate()

fsp_err_t R_ELC_SoftwareEventGenerate ( elc_ctrl_t *const  p_ctrl,
elc_software_event_t  event_number 
)

Generate a software event in the Event Link Controller. Implements elc_api_t::softwareEventGenerate

Example:

/* Generate an event signal through software to the linked peripheral. */
assert(FSP_SUCCESS == err);
Return values
FSP_SUCCESSInitialization was successful
FSP_ERR_ASSERTIONInvalid event number or p_ctrl was NULL
FSP_ERR_NOT_OPENThe module has not been opened

◆ R_ELC_LinkSet()

fsp_err_t R_ELC_LinkSet ( elc_ctrl_t *const  p_ctrl,
elc_peripheral_t  peripheral,
elc_event_t  signal 
)

Create a single event link. Implements elc_api_t::linkSet

Example:

/* Create or modify a link between a peripheral function and an event source. */
err = R_ELC_LinkSet(&g_elc_ctrl, ELC_PERIPHERAL_ADC0, ELC_EVENT_GPT4_COUNTER_OVERFLOW);
assert(FSP_SUCCESS == err);
Return values
FSP_SUCCESSInitialization was successful
FSP_ERR_ASSERTIONp_ctrl was NULL
FSP_ERR_NOT_OPENThe module has not been opened

◆ R_ELC_LinkBreak()

fsp_err_t R_ELC_LinkBreak ( elc_ctrl_t *const  p_ctrl,
elc_peripheral_t  peripheral 
)

Break an event link. Implements elc_api_t::linkBreak

Return values
FSP_SUCCESSEvent link broken
FSP_ERR_ASSERTIONp_ctrl was NULL
FSP_ERR_NOT_OPENThe module has not been opened

◆ R_ELC_Enable()

fsp_err_t R_ELC_Enable ( elc_ctrl_t *const  p_ctrl)

Enable the operation of the Event Link Controller. Implements elc_api_t::enable

Return values
FSP_SUCCESSELC enabled.
FSP_ERR_ASSERTIONp_ctrl was NULL
FSP_ERR_NOT_OPENThe module has not been opened

◆ R_ELC_Disable()

fsp_err_t R_ELC_Disable ( elc_ctrl_t *const  p_ctrl)

Disable the operation of the Event Link Controller. Implements elc_api_t::disable

Return values
FSP_SUCCESSELC disabled.
FSP_ERR_ASSERTIONp_ctrl was NULL
FSP_ERR_NOT_OPENThe module has not been opened