aboutsummaryrefslogtreecommitdiff
path: root/02-usart/src/core/irq.c
diff options
context:
space:
mode:
Diffstat (limited to '02-usart/src/core/irq.c')
-rw-r--r--02-usart/src/core/irq.c83
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