12#ifndef PICO_MAX_SHARED_IRQ_HANDLERS
13#define _PICO_MAX_SHARED_IRQ_HANDLERS 4
15#define PICO_MAX_SHARED_IRQ_HANDLERS (_PICO_MAX_SHARED_IRQ_HANDLERS + 2)
17#define PICO_MAX_SHARED_IRQ_HANDLERS _PICO_MAX_SHARED_IRQ_HANDLERS
22#ifndef PICO_DISABLE_SHARED_IRQ_HANDLERS
23#define PICO_DISABLE_SHARED_IRQ_HANDLERS 0
27#ifndef PICO_VTABLE_PER_CORE
28#define PICO_VTABLE_PER_CORE 0
35#include "hardware/regs/intctrl.h"
37#include "pico/platform/cpu_regs.h"
173#ifndef PICO_DEFAULT_IRQ_PRIORITY
174#define PICO_DEFAULT_IRQ_PRIORITY 0x80
177#define PICO_LOWEST_IRQ_PRIORITY 0xff
178#define PICO_HIGHEST_IRQ_PRIORITY 0x00
181#ifndef PICO_SHARED_IRQ_HANDLER_DEFAULT_ORDER_PRIORITY
182#define PICO_SHARED_IRQ_HANDLER_DEFAULT_ORDER_PRIORITY 0x80
185#define PICO_SHARED_IRQ_HANDLER_HIGHEST_ORDER_PRIORITY 0xff
186#define PICO_SHARED_IRQ_HANDLER_LOWEST_ORDER_PRIORITY 0x00
189#ifndef PARAM_ASSERTIONS_ENABLED_HARDWARE_IRQ
190#ifdef PARAM_ASSERTIONS_ENABLED_IRQ
191#define PARAM_ASSERTIONS_ENABLED_HARDWARE_IRQ PARAM_ASSERTIONS_ENABLED_IRQ
193#define PARAM_ASSERTIONS_ENABLED_HARDWARE_IRQ 0
208static inline void check_irq_param(__unused uint num) {
209 invalid_params_if(HARDWARE_IRQ, num >= PICO_NUM_VTABLE_IRQS);
474 *((
volatile uint32_t *) (PPB_BASE + M0PLUS_NVIC_ICPR_OFFSET)) = (1u << ((uint32_t) (int_num & 0x1F)));
475#elif defined(__riscv)
477 hazard3_irqarray_clear(RVCSR_MEIFA_OFFSET, int_num / 16, 1u << (int_num % 16));
479 nvic_hw->icpr[int_num/32] = 1 << (int_num % 32);
563bool user_irq_is_claimed(uint irq_num);
565void __unhandled_user_irq(
void);
568enum riscv_vector_num {
569 RISCV_VEC_MACHINE_EXCEPTION = 0,
570 RISCV_VEC_MACHINE_SOFTWARE_IRQ = 3,
571 RISCV_VEC_MACHINE_TIMER_IRQ = 7,
572 RISCV_VEC_MACHINE_EXTERNAL_IRQ = 11,
579static inline void irq_assign_to_ns(uint irq_num,
bool ns) {
580 check_irq_param(irq_num);
581 if (ns) nvic_hw->itns[irq_num >> 5] |= 1u << (irq_num & 0x1fu);
582 else nvic_hw->itns[irq_num >> 5] &= ~(1u << (irq_num & 0x1fu));
uint32_t irq_get_mask(void)
Get the current enabled mask on the executing core.
Definition irq.c:129
bool irq_is_enabled(uint num)
Determine if a specific interrupt is enabled on the executing core.
Definition irq.c:66
void user_irq_unclaim(uint irq_num)
Mark a user IRQ as no longer used on the calling core.
Definition irq.c:736
static void irq_clear(uint int_num)
Clear a specific interrupt on the executing core.
Definition irq.h:472
void irq_set_pending(uint num)
Force an interrupt to be pending on the executing core.
Definition irq.c:137
irq_handler_t irq_get_exclusive_handler(uint num)
Get the exclusive interrupt handler for an interrupt on the executing core.
Definition irq.c:281
irq_handler_t irq_get_vtable_handler(uint num)
Get the current IRQ handler for the specified IRQ from the currently installed hardware vector table ...
Definition irq.c:256
uint irq_get_priority(uint num)
Get specified interrupt's priority.
Definition irq.c:657
uint32_t irq_get_mask_n(uint n)
Get the current enabled mask on the executing core.
Definition irq.c:133
void irq_set_enabled(uint num, bool enabled)
Enable or disable a specific interrupt on the executing core.
Definition irq.c:60
void(* irq_handler_t)(void)
Interrupt handler function type.
Definition irq.h:206
bool irq_has_handler(uint num)
Determine if there is an installed IRQ handler for the given interrupt number.
Definition irq.c:261
void user_irq_claim(uint irq_num)
Claim ownership of a user IRQ on the calling core.
Definition irq.c:732
int user_irq_claim_unused(bool required)
Claim ownership of a free user IRQ on the calling core.
Definition irq.c:740
void irq_set_priority(uint num, uint8_t hardware_priority)
Set specified interrupt's priority.
Definition irq.c:640
void irq_remove_handler(uint num, irq_handler_t handler)
Remove a specific interrupt handler for the given irq number on the executing core.
Definition irq.c:521
void irq_set_mask_n_enabled(uint n, uint32_t mask, bool enabled)
Enable/disable multiple interrupts on the executing core.
Definition irq.c:112
bool irq_has_shared_handler(uint num)
Determine if the current IRQ andler for the given interrupt number is shared.
Definition irq.c:242
void irq_set_mask_enabled(uint32_t mask, bool enabled)
Enable/disable multiple interrupts on the executing core.
Definition irq.c:108
void irq_add_shared_handler(uint num, irq_handler_t handler, uint8_t order_priority)
Add a shared interrupt handler for an interrupt on the executing core.
Definition irq.c:405
void irq_set_exclusive_handler(uint num, irq_handler_t handler)
Set an exclusive interrupt handler for an interrupt on the executing core.
Definition irq.c:267
void runtime_init_per_core_irq_priorities(void)
Perform IRQ priority initialization for the current core.
Definition irq.c:704