diff options
author | Josh Rahm <joshuarahm@gmail.com> | 2020-11-20 18:41:49 -0700 |
---|---|---|
committer | Josh Rahm <joshuarahm@gmail.com> | 2020-11-20 19:03:01 -0700 |
commit | fd763486d875968941c77386e23936e817856c8e (patch) | |
tree | ed85ffe2d6c27b502d06aefa5e63244450bb7028 /02-usart/include/core/irq.h | |
parent | 3b6018348d51c77f53adca90e498d7bf268c91c9 (diff) | |
download | stm32l4-fd763486d875968941c77386e23936e817856c8e.tar.gz stm32l4-fd763486d875968941c77386e23936e817856c8e.tar.bz2 stm32l4-fd763486d875968941c77386e23936e817856c8e.zip |
Finally got a peripheral interrupt!
Diffstat (limited to '02-usart/include/core/irq.h')
-rw-r--r-- | 02-usart/include/core/irq.h | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/02-usart/include/core/irq.h b/02-usart/include/core/irq.h index ae1126d..f2fe8d9 100644 --- a/02-usart/include/core/irq.h +++ b/02-usart/include/core/irq.h @@ -16,6 +16,42 @@ typedef enum { #undef IRQ_RESERVED } interrupt_t; +/* Defines a set of interrupts so they may be enabled all at once. */ +typedef struct { + uint32_t sysirqs; /* System iterrupts. */ + uint32_t irqs[8]; +} interrupt_set_t; + +inline static void interrupt_set_add( + interrupt_set_t* interrupt_set, interrupt_t interrupt) +{ + if (interrupt < 16) { + interrupt_set->sysirqs |= 1 << interrupt; + return; + } + + interrupt -= 16; + int loc = interrupt / 32; + int off = interrupt % 32; + + interrupt_set->irqs[loc] |= 1 << off; +} + +inline static void interrupt_set_remove( + interrupt_set_t* interrupt_set, interrupt_t interrupt) +{ + if (interrupt < 16) { + interrupt_set->sysirqs &= ~(1 << interrupt); + return; + } + + interrupt -= 16; + int loc = interrupt / 32; + int off = interrupt % 32; + + interrupt_set->irqs[loc] &= ~(1 << off); +} + /* * The interrupt service routines. These link in the function `main` as the * main function. @@ -28,6 +64,26 @@ extern const void* vectors[]; */ void unhandled_isr(uint8_t val); -void isr_simple_pin_on(); +#define enable_interrupt(val) \ + {interrupt_set_t itrset = { 0 }; \ + interrupt_set_add(&itrset, val); \ + enable_interrupts(&itrset);} + +#define disable_interrupt(val) \ + {interrupt_set_t itrset = { 0 }; \ + interrupt_set_add(&itrset, val); \ + disable_interrupts(&itrset);} + +/* + * Enables the provided interrupt. Note that if the interrupt is one of the + * system interrupts (first 16) this function has no effect because those + * interrupts are always enabled. + */ +void enable_interrupts(interrupt_set_t* interrupts); + +/* + * Enables the provided interrupt + */ +void disable_interrupts(interrupt_set_t* interrupts); #endif /* CORE_IRQ_H_ */ |