diff options
author | Josh Rahm <joshuarahm@gmail.com> | 2020-11-20 09:55:37 -0700 |
---|---|---|
committer | Josh Rahm <joshuarahm@gmail.com> | 2020-11-20 09:55:37 -0700 |
commit | 3b6018348d51c77f53adca90e498d7bf268c91c9 (patch) | |
tree | 45c52307d48a74b2ae57006d3b40f9a34c61c9ce /02-usart/src/core/irq.c | |
parent | d82837cb93b8675a6e589548e157f31e41aaa039 (diff) | |
download | stm32l4-3b6018348d51c77f53adca90e498d7bf268c91c9.tar.gz stm32l4-3b6018348d51c77f53adca90e498d7bf268c91c9.tar.bz2 stm32l4-3b6018348d51c77f53adca90e498d7bf268c91c9.zip |
Move around the isr_vector files to be more consistent with the C standard and the rest of the project.
Diffstat (limited to '02-usart/src/core/irq.c')
-rw-r--r-- | 02-usart/src/core/irq.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/02-usart/src/core/irq.c b/02-usart/src/core/irq.c new file mode 100644 index 0000000..c9b93c2 --- /dev/null +++ b/02-usart/src/core/irq.c @@ -0,0 +1,83 @@ +#include "core/irq.h" +#include "core/gpio.h" + +#include "arch.h" +#include "delay.h" + +#ifdef ARCH_STM32L4 + +#define IRQ_RESERVED(n) +#define IRQ(name, uname_, n) \ + void WEAK name () { \ + unhandled_isr(n); \ + } +#include "core/isrs.inc" +#undef IRQ_RESERVED +#undef IRQ + +void isr_simple_pin_on() +{ + __IO gpio_port_t* port_b = enable_gpio(GPIO_PORT_B); + gpio_output_pin_t pin3 = set_gpio_pin_output(port_b, PIN_3); + + pin_on(pin3); +} + +#define IRQ_RESERVED(n) 0, +#define IRQ(name, uname_, n) name, +const void* vectors[] __attribute__((section(".vectors"))) = { + (void*)0x2000c000, /* Top of stack at top of sram1. 48k */ +#include "core/isrs.inc" +}; +#undef IRQ_RESERVED +#undef IRQ + +/* Encodes the provided number as a series of flashes on the on-board + * LED. The flashes follow as such: + * + * Before the bits of the code are flashed, a rapid succession of 20 flashes + * followed by a pause will occur indicating that the next 8 flashes indicate + * the bits of the provided code. + * + * Eoch of the next eight flashes indicate either a 1 or 0 depending on the + * length of flash. The first flash is the least-significant bit, the next the + * second least, the third third least, etc. + * + * - A quick flash followed by a long pause indicates a 0 bit. + * - A "long" flash followed by a equally long pause indicates a 1 bit. + */ +void unhandled_isr(uint8_t number) +{ + __IO gpio_port_t* port_b = enable_gpio(GPIO_PORT_B); + gpio_output_pin_t pin3 = set_gpio_pin_output(port_b, PIN_3); + for (;;) { + for (int i = 0; i < 20; ++ i) { + pin_on(pin3); + delay(1000000); + pin_off(pin3); + delay(1000000); + } + delay(50000000); + + int n = number; + for (int i = 0; i < 8; ++ i) { + if (n & 1) { + // LSB is a 1 + pin_on(pin3); + delay(15000000); + pin_off(pin3); + delay(15000000); + } else { + // LSB is a 0 + pin_on(pin3); + delay(1000000); + pin_off(pin3); + delay(29000000); + } + + n >>= 1; + } + } +} + +#endif |