Begin functionality for EXTI callbacks

This commit is contained in:
2025-09-05 21:21:35 -07:00
parent 64fb4e4a23
commit 8b4402e4c8
6 changed files with 120 additions and 3 deletions

View File

@@ -0,0 +1,41 @@
/**
******************************************************************************
* @file SHAL_TIM.h
* @author Luca Lizaranzu
* @brief Callbacks for external interrupts
******************************************************************************
*/
#ifndef SHMINGO_HAL_SHAL_EXTI_CALLBACK_H
#define SHMINGO_HAL_SHAL_EXTI_CALLBACK_H
#include "SHAL_CORE.h"
#include "SHAL_GPIO_REG_F072xB.h"
#define DEFINE_EXTI_IRQ(EXTI_Channel) \
extern "C" void EXTI##EXTI_Channel##_IRQHandler(void) { \
if (EXTI->PR & (1 << EXTI_Channel)) { \
EXTI->PR |= (1 << EXTI_Channel); /*clear flag */ \
auto cb = EXTI_callbacks[EXTI_Channel]; \
if (cb) cb(); \
}; \
};
#define DEFINE_MULTI_EXTI_IRQ(EXTI_Channel_Min, EXTI_Channel_Max) \
extern "C" void EXTI##EXTI_Channel_Max##_##EXTI_Channel_Min##_IRQHandler(void) { \
for(uint8_t line = EXTI_Channel_Min; line <= EXTI_Channel_Max; line++){ \
if (EXTI->PR & (1 << line)) { \
EXTI->PR |= (1 << line); /*clear flag */ \
auto cb = EXTI_callbacks[line]; \
if (cb) cb(); \
}; \
} \
};
typedef void (*EXTICallback)(); //Typedef for callback function
[[maybe_unused]] static EXTICallback EXTI_callbacks[NUM_EXTI_LINES] = {nullptr}; //Timer IRQ Callback table
void registerEXTICallback(GPIO_Key key, EXTICallback callback);
#endif //SHMINGO_HAL_SHAL_EXTI_CALLBACK_H

View File

@@ -12,6 +12,7 @@
#define AVAILABLE_PORTS 3
#define PINS_PER_PORT 16
#define NUM_EXTI_LINES 16
#define AVAILABLE_GPIO \
X(A0) X(A1) X(A2) X(A3) X(A4) X(A5) X(A6) X(A7) X(A8) X(A9) X(A10) X(A11) X(A12) X(A13) X(A14) X(A15) \

View File

@@ -9,6 +9,9 @@
#include <cassert>
#include "SHAL_GPIO_REG_F072xB.h"
#include "SHAL_EXTI_CALLBACK.h"
enum class PinMode : uint8_t{
INPUT_MODE,
@@ -17,9 +20,21 @@ enum class PinMode : uint8_t{
ANALOG_MODE,
INVALID
};
unsigned long getPinMode(PinMode mode);
enum class TriggerMode : uint8_t{
RISING_EDGE,
FALLING_EDGE,
RISING_FALLING_EDGE
};
unsigned long getTriggerMode(TriggerMode mode);
//Abstraction of GPIO registers
class GPIO{
@@ -42,15 +57,21 @@ private:
};
//Init GPIO for normal use
#define initGPIO(GPIO_KEY, PIN_MODE) GPIOManager::get(GPIO_KEY, PIN_MODE)
//Init GPIO for use as an external interrupt
#define useGPIOAsInterrupt(GPIO_KEY, Trigger_Mode, Callback) GPIOManager::getInterruptGPIO(GPIO_KEY, Trigger_Mode, Callback)
//Manages instances of GPIO objects
class GPIOManager{
public:
static GPIO& get(GPIO_Key, PinMode pinMode);
static void getInterruptGPIO(GPIO_Key key, TriggerMode mode, EXTICallback callback);
GPIOManager() = delete;
private:
@@ -59,4 +80,5 @@ inline static GPIO m_gpios[AVAILABLE_PORTS][PINS_PER_PORT] = {{}};
};
#endif //SHMINGO_HAL_SHAL_GPIO_H