#include "core/isr_vector.h" #include "core/gpio.h" #include "arch.h" #include "delay.h" #ifdef ARCH_STM32L4 #define IRQ_RESERVED(n) #define IRQ(name, n) \ void WEAK name () { \ unhandled_isr(n); \ } #include "core/isrs.i" #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 DEFINE_UNHANDLED_ISR(n) \ int unhandled_isr_##n() \ { \ unhandled_isr(n); \ } /* Flashes wildly. */ void super_flash() { static int pin_on = 0; __IO gpio_port_t* port_b = enable_gpio(GPIO_PORT_B); gpio_output_pin_t pin3 = set_gpio_pin_output(port_b, PIN_3); if (pin_on) { pin_off(pin3); } else { pin_on(pin3); } pin_on = !pin_on; } #define IRQ_RESERVED(n) 0, #define IRQ(name, n) name, const void* vectors[] __attribute__((section(".vectors"))) = { (void*)0x2000c000, /* Top of stack at top of sram1. 48k */ #include "core/isrs.i" }; #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. * * The next eight flashes are indicate either a 1 or 0 depending on the length * of the light being on. 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