#include #include #include "exti.h" #include "registers.h" #include "stm32h747xx.h" exti_t *exti_init(EXTI_TypeDef *exti, SYSCFG_TypeDef *syscfg) { exti_t* exti_periph = (exti_t*)malloc(sizeof(exti_t)); exti_periph->exti = exti; exti_periph->syscfg = syscfg; return exti_periph; } void exti_external_interrupt(exti_t *exti, uint8_t line, uint8_t gpio) { // TODOA; general uint8_t index = line >> 2; uint8_t pos = (line & 0x3) * 4; volatile uint32_t *exticr = exti->syscfg->EXTICR; reg_write_bits_pos(exticr + index, gpio, pos, 0x0F); } void exti_rising_interrupt(exti_t *exti, uint8_t line) { reg_write_bits_pos(&exti->exti->RTSR1, 1, line, 1); reg_write_bits_pos(&exti->exti->FTSR1, 0, line, 1); reg_write_bits_pos(&exti->exti->IMR1, 1, line, 1); } void exti_falling_interrupt(exti_t *exti, uint8_t line) { reg_write_bits_pos(&exti->exti->FTSR1, 1, line, 1); reg_write_bits_pos(&exti->exti->RTSR1, 0, line, 1); reg_write_bits_pos(&exti->exti->IMR1, 1, line, 1); } void exti_disable_interrupt(exti_t *exti, uint8_t line) { reg_write_bits_pos(&exti->exti->IMR1, 0, line, 1); } IRQn_Type exti_irq_idx(uint8_t line) { switch (line) { case 0: return EXTI0_IRQn; case 1: return EXTI1_IRQn; case 2: return EXTI2_IRQn; case 3: return EXTI3_IRQn; case 4: return EXTI4_IRQn; case 5: case 6: case 7: case 8: case 9: return EXTI9_5_IRQn; case 10: case 11: case 12: case 13: case 14: case 15: return EXTI15_10_IRQn; default: return -1; } } void exti_nvic_setup(exti_t *exti, uint8_t line) { IRQn_Type idx = exti_irq_idx(line); NVIC_SetPriority(idx, 2); NVIC_EnableIRQ(idx); }