blob: 70fce9905fb4ecf68136561035ab5b1b68946706 [file] [log] [blame]
#include "cape/digital.h"
#include <STM32F2XX.h>
#include "cape/util.h"
static void digital_capture_default(void) {}
void digital_capture_0P(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_0N(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_1P(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_1N(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_2P(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_2N(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_3P(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_3N(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_4P(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_4N(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_5P(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_5N(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_6P(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_6N(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_7P(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_7N(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_8P(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_8N(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_9P(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_9N(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_10P(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_10N(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_11P(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_11N(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_12P(void) ALIAS_WEAK(digital_capture_default);
void digital_capture_12N(void) ALIAS_WEAK(digital_capture_default);
void EXTI2_IRQHandler(void) {
uint32_t inputs = GPIOB->IDR;
EXTI->PR = EXTI_PR_PR2;
if (inputs & (1 << 2)) {
digital_capture_11N();
} else {
digital_capture_11P();
}
}
void EXTI4_IRQHandler(void) {
uint32_t inputs = GPIOC->IDR;
EXTI->PR = EXTI_PR_PR4;
if (inputs & (1 << 4)) {
digital_capture_0N();
} else {
digital_capture_0P();
}
}
static void EXTI5_Handler(uint32_t inputs) {
if (inputs & (1 << 5)) {
digital_capture_1N();
} else {
digital_capture_1P();
}
}
static void EXTI7_Handler(uint32_t inputs) {
if (inputs & (1 << 7)) {
digital_capture_10N();
} else {
digital_capture_10P();
}
}
static void EXTI8_Handler(uint32_t inputs) {
if (inputs & (1 << 8)) {
digital_capture_7N();
} else {
digital_capture_7P();
}
}
static void EXTI9_Handler(uint32_t inputs) {
if (inputs & (1 << 9)) {
digital_capture_6N();
} else {
digital_capture_6P();
}
}
void EXTI9_5_IRQHandler(void) {
uint32_t a_inputs = GPIOA->IDR, b_inputs = GPIOB->IDR, c_inputs = GPIOC->IDR;
uint32_t exti = __clz(EXTI->PR);
EXTI->PR = (1 << 31) >> exti;
switch (exti) {
case 31 - 5:
EXTI5_Handler(c_inputs);
break;
case 31 - 7:
EXTI7_Handler(a_inputs);
break;
case 31 - 8:
EXTI8_Handler(b_inputs);
break;
case 31 - 9:
EXTI9_Handler(b_inputs);
break;
}
}
static void EXTI10_Handler(uint32_t inputs) {
if (inputs & (1 << 10)) {
digital_capture_5N();
} else {
digital_capture_5P();
}
}
static void EXTI11_Handler(uint32_t inputs) {
if (inputs & (1 << 11)) {
digital_capture_9N();
} else {
digital_capture_9P();
}
}
static void EXTI12_Handler(uint32_t inputs) {
if (inputs & (1 << 12)) {
digital_capture_8N();
} else {
digital_capture_8P();
}
}
static void EXTI13_Handler(uint32_t inputs) {
if (inputs & (1 << 13)) {
digital_capture_2N();
} else {
digital_capture_2P();
}
}
static void EXTI14_Handler(uint32_t inputs) {
if (inputs & (1 << 14)) {
digital_capture_3N();
} else {
digital_capture_3P();
}
}
static void EXTI15_Handler(uint32_t inputs) {
if (inputs & (1 << 15)) {
digital_capture_4N();
} else {
digital_capture_4P();
}
}
void EXTI15_10_IRQHandler(void) {
uint32_t a_inputs = GPIOA->IDR, b_inputs = GPIOB->IDR, c_inputs = GPIOC->IDR;
uint32_t exti = __clz(EXTI->PR);
EXTI->PR = (1 << 31) >> exti;
switch (exti) {
case 31 - 10:
EXTI10_Handler(b_inputs);
break;
case 31 - 11:
EXTI11_Handler(a_inputs);
break;
case 31 - 12:
EXTI12_Handler(a_inputs);
break;
case 31 - 13:
EXTI13_Handler(c_inputs);
break;
case 31 - 14:
EXTI14_Handler(c_inputs);
break;
case 31 - 15:
EXTI15_Handler(c_inputs);
break;
}
}
static void init_exti(int exti, int port) {
EXTI_set(exti, port);
EXTI->IMR |= 1 << exti;
EXTI->RTSR |= 1 << exti;
EXTI->FTSR |= 1 << exti;
}
void digital_init(void) {
init_exti(2, 1);
init_exti(4, 2);
init_exti(5, 2);
init_exti(7, 0);
init_exti(8, 1);
init_exti(9, 1);
init_exti(10, 1);
init_exti(11, 0);
init_exti(12, 0);
init_exti(13, 2);
init_exti(14, 2);
init_exti(15, 2);
NVIC_SetPriority(EXTI2_IRQn, 1);
NVIC_EnableIRQ(EXTI2_IRQn);
NVIC_SetPriority(EXTI4_IRQn, 1);
NVIC_EnableIRQ(EXTI4_IRQn);
NVIC_SetPriority(EXTI9_5_IRQn, 1);
NVIC_EnableIRQ(EXTI9_5_IRQn);
NVIC_SetPriority(EXTI15_10_IRQn, 1);
NVIC_EnableIRQ(EXTI15_10_IRQn);
}