#ifndef STM32U5_HAL_EXTI_HPP #define STM32U5_HAL_EXTI_HPP #include "global_variable.h" #include "prepherials.h" #include "reg_exti_gen.h" class Exti { public: EXTI_TypeDef *ins; reg_exti_t *reg; void (*callback)() = nullptr; public: Exti() = default; void setup() { // enable clock RCC->APB3ENR |= RCC_APB3ENR_SYSCFGEN; // enable interrupt NVIC_EnableIRQ(EXTI0_IRQn); reg = (reg_exti_t *) EXTI; ins = (EXTI_TypeDef *) EXTI; } void init(int line, int mode, int trigger) { // set mode } // falling edge or rising edge void set_trigger(int line, int trigger, void(*_callback)()) { NVIC_EnableIRQ(EXTI2_IRQn); reg->ftsr1.ft2 = 1; reg->imr1.im2 = 1; reg->r1.exti16_23 = 1; // pb 1 as interrupt callback = _callback; } void interrupt() { uint32_t tmp = ins->FPR1; reg->fpr1.fpif2 = 1; if (callback != nullptr) callback(); } }; #endif