SAM4SD32 (SAM4S-EK2)
Loading...
Searching...
No Matches
pio_handler.h File Reference

Parallel Input/Output (PIO) interrupt handler for SAM. More...

Go to the source code of this file.

Functions

void pio_capture_handler_set (void(*p_handler)(Pio *))
 Set a capture interrupt handler for all PIO.
void pio_handler_process (Pio *p_pio, uint32_t ul_id)
 Process an interrupt request on the given PIO controller.
uint32_t pio_handler_set (Pio *p_pio, uint32_t ul_id, uint32_t ul_mask, uint32_t ul_attr, void(*p_handler)(uint32_t, uint32_t))
 Set an interrupt handler for the provided pins.
uint32_t pio_handler_set_pin (uint32_t ul_pin, uint32_t ul_flag, void(*p_handler)(uint32_t, uint32_t))
void pio_handler_set_priority (Pio *p_pio, IRQn_Type ul_irqn, uint32_t ul_priority)
 Initialize PIO interrupt management logic.

Detailed Description

Parallel Input/Output (PIO) interrupt handler for SAM.

Copyright (c) 2011-2018 Microchip Technology Inc. and its subsidiaries.

\cond ASF_LICENSE

Definition in file pio_handler.h.

Function Documentation

◆ pio_capture_handler_set()

void pio_capture_handler_set ( void(* p_handler )(Pio *))

Set a capture interrupt handler for all PIO.

The handler will be called with the triggering PIO as its parameter as soon as an interrupt is detected.

Parameters
p_handlerInterrupt handler function pointer.

Definition at line 174 of file pio_handler.c.

175{
176 pio_capture_handler = p_handler;
177}
static void(* pio_capture_handler)(Pio *)
Definition pio_handler.c:69

References pio_capture_handler.

◆ pio_handler_process()

void pio_handler_process ( Pio * p_pio,
uint32_t ul_id )

Process an interrupt request on the given PIO controller.

Parameters
p_pioPIO controller base address.
ul_idPIO controller ID.

Definition at line 79 of file pio_handler.c.

80{
81 uint32_t status;
82 uint32_t i;
83
84 /* Read PIO controller status */
85 status = pio_get_interrupt_status(p_pio);
86 status &= pio_get_interrupt_mask(p_pio);
87
88 /* Check pending events */
89 if (status != 0) {
90 /* Find triggering source */
91 i = 0;
92 while (status != 0) {
93 /* Source is configured on the same controller */
94 if (gs_interrupt_sources[i].id == ul_id) {
95 /* Source has PIOs whose statuses have changed */
96 if ((status & gs_interrupt_sources[i].mask) != 0) {
98 gs_interrupt_sources[i].mask);
99 status &= ~(gs_interrupt_sources[i].mask);
100 }
101 }
102 i++;
103 if (i >= MAX_INTERRUPT_SOURCES) {
104 break;
105 }
106 }
107 }
108
109 /* Check capture events */
110#if (SAM3S || SAM4S || SAM4E)
113 pio_capture_handler(p_pio);
114 }
115 }
116#endif
117}
uint32_t pio_get_interrupt_status(const Pio *p_pio)
Read and clear PIO interrupt status.
Definition pio.c:601
uint32_t pio_get_interrupt_mask(const Pio *p_pio)
Read PIO interrupt mask.
Definition pio.c:613
uint32_t pio_capture_enable_flag
Definition pio.c:1033
static struct s_interrupt_source gs_interrupt_sources[MAX_INTERRUPT_SOURCES]
Definition pio_handler.c:62
#define MAX_INTERRUPT_SOURCES
Maximum number of interrupt sources that can be defined.
Definition pio_handler.c:45

References gs_interrupt_sources, s_interrupt_source::mask, MAX_INTERRUPT_SOURCES, pio_capture_enable_flag, pio_capture_handler, pio_get_interrupt_mask(), and pio_get_interrupt_status().

◆ pio_handler_set()

uint32_t pio_handler_set ( Pio * p_pio,
uint32_t ul_id,
uint32_t ul_mask,
uint32_t ul_attr,
void(* p_handler )(uint32_t, uint32_t) )

Set an interrupt handler for the provided pins.

The provided handler will be called with the triggering pin as its parameter as soon as an interrupt is detected.

Parameters
p_pioPIO controller base address.
ul_idPIO ID.
ul_maskPins (bit mask) to configure.
ul_attrPins attribute to configure.
p_handlerInterrupt handler function pointer.
Returns
0 if successful, 1 if the maximum number of sources has been defined.

Definition at line 132 of file pio_handler.c.

134{
135 uint8_t i;
136 struct s_interrupt_source *pSource;
137
139 return 1;
140
141 /* Check interrupt for this pin, if already defined, redefine it. */
142 for (i = 0; i <= gs_ul_nb_sources; i++) {
143 pSource = &(gs_interrupt_sources[i]);
144 if (pSource->id == ul_id && pSource->mask == ul_mask) {
145 break;
146 }
147 }
148
149 /* Define new source */
150 pSource->id = ul_id;
151 pSource->mask = ul_mask;
152 pSource->attr = ul_attr;
153 pSource->handler = p_handler;
154 if (i == gs_ul_nb_sources + 1) {
156 }
157
158 /* Configure interrupt mode */
159 pio_configure_interrupt(p_pio, ul_mask, ul_attr);
160
161 return 0;
162}
void pio_configure_interrupt(Pio *p_pio, const uint32_t ul_mask, const uint32_t ul_attr)
Configure the given interrupt source.
Definition pio.c:538
static uint32_t gs_ul_nb_sources
Definition pio_handler.c:65
Describes a PIO interrupt source, including the PIO instance triggering the interrupt and the associa...
Definition pio_handler.c:51
void(* handler)(const uint32_t, const uint32_t)
Definition pio_handler.c:57

References s_interrupt_source::attr, gs_interrupt_sources, gs_ul_nb_sources, s_interrupt_source::handler, s_interrupt_source::id, s_interrupt_source::mask, MAX_INTERRUPT_SOURCES, and pio_configure_interrupt().

◆ pio_handler_set_pin()

uint32_t pio_handler_set_pin ( uint32_t ul_pin,
uint32_t ul_flag,
void(* p_handler )(uint32_t, uint32_t) )

◆ pio_handler_set_priority()

void pio_handler_set_priority ( Pio * p_pio,
IRQn_Type ul_irqn,
uint32_t ul_priority )

Initialize PIO interrupt management logic.

Parameters
p_pioPIO controller base address.
ul_irqnNVIC line number.
ul_priorityPIO controller interrupts priority.

Definition at line 274 of file pio_handler.c.

275{
276 uint32_t bitmask = 0;
277
278 bitmask = pio_get_interrupt_mask(p_pio);
279 pio_disable_interrupt(p_pio, 0xFFFFFFFF);
281 NVIC_DisableIRQ(ul_irqn);
282 NVIC_ClearPendingIRQ(ul_irqn);
283 NVIC_SetPriority(ul_irqn, ul_priority);
284 NVIC_EnableIRQ(ul_irqn);
285 pio_enable_interrupt(p_pio, bitmask);
286}
void pio_disable_interrupt(Pio *p_pio, const uint32_t ul_mask)
Disable a given interrupt source, with no added side effects.
Definition pio.c:589
void pio_enable_interrupt(Pio *p_pio, const uint32_t ul_mask)
Enable the given interrupt source.
Definition pio.c:578

References pio_disable_interrupt(), pio_enable_interrupt(), pio_get_interrupt_mask(), and pio_get_interrupt_status().