Begin functionality for EXTI callbacks
This commit is contained in:
@@ -34,6 +34,7 @@ set(PROJECT_INCLUDE_DIRECTORIES
|
|||||||
SHAL/Include/Peripheral/Timer/Reg
|
SHAL/Include/Peripheral/Timer/Reg
|
||||||
SHAL/Include/Peripheral/GPIO
|
SHAL/Include/Peripheral/GPIO
|
||||||
SHAL/Include/Peripheral/GPIO/Reg
|
SHAL/Include/Peripheral/GPIO/Reg
|
||||||
|
SHAL/Include/Peripheral/EXT/
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/SHAL/Include
|
${CMAKE_CURRENT_SOURCE_DIR}/SHAL/Include
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
41
SHAL/Include/Peripheral/EXT/SHAL_EXTI_CALLBACK.h
Normal file
41
SHAL/Include/Peripheral/EXT/SHAL_EXTI_CALLBACK.h
Normal 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
|
||||||
@@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
#define AVAILABLE_PORTS 3
|
#define AVAILABLE_PORTS 3
|
||||||
#define PINS_PER_PORT 16
|
#define PINS_PER_PORT 16
|
||||||
|
#define NUM_EXTI_LINES 16
|
||||||
|
|
||||||
#define AVAILABLE_GPIO \
|
#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) \
|
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) \
|
||||||
|
|||||||
@@ -9,6 +9,9 @@
|
|||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include "SHAL_GPIO_REG_F072xB.h"
|
#include "SHAL_GPIO_REG_F072xB.h"
|
||||||
|
#include "SHAL_EXTI_CALLBACK.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
enum class PinMode : uint8_t{
|
enum class PinMode : uint8_t{
|
||||||
INPUT_MODE,
|
INPUT_MODE,
|
||||||
@@ -17,9 +20,21 @@ enum class PinMode : uint8_t{
|
|||||||
ANALOG_MODE,
|
ANALOG_MODE,
|
||||||
INVALID
|
INVALID
|
||||||
};
|
};
|
||||||
|
|
||||||
unsigned long getPinMode(PinMode mode);
|
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
|
//Abstraction of GPIO registers
|
||||||
class GPIO{
|
class GPIO{
|
||||||
|
|
||||||
@@ -42,15 +57,21 @@ private:
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//Init GPIO for normal use
|
||||||
#define initGPIO(GPIO_KEY, PIN_MODE) GPIOManager::get(GPIO_KEY, PIN_MODE)
|
#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
|
//Manages instances of GPIO objects
|
||||||
class GPIOManager{
|
class GPIOManager{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
static GPIO& get(GPIO_Key, PinMode pinMode);
|
static GPIO& get(GPIO_Key, PinMode pinMode);
|
||||||
|
|
||||||
|
static void getInterruptGPIO(GPIO_Key key, TriggerMode mode, EXTICallback callback);
|
||||||
|
|
||||||
GPIOManager() = delete;
|
GPIOManager() = delete;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -59,4 +80,5 @@ inline static GPIO m_gpios[AVAILABLE_PORTS][PINS_PER_PORT] = {{}};
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif //SHMINGO_HAL_SHAL_GPIO_H
|
#endif //SHMINGO_HAL_SHAL_GPIO_H
|
||||||
|
|||||||
@@ -72,4 +72,21 @@ GPIO& GPIOManager::get(GPIO_Key key, PinMode pinMode) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return m_gpios[gpioPort][gpioPin];
|
return m_gpios[gpioPort][gpioPin];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GPIOManager::getInterruptGPIO(GPIO_Key key, TriggerMode mode, EXTICallback callback) {
|
||||||
|
unsigned int gpioPort = getGPIOPortNumber(key);
|
||||||
|
unsigned long gpioPin = getGPIORegister(key).global_offset; //Use existing structs to get offset
|
||||||
|
|
||||||
|
if (m_gpios[gpioPort][gpioPin].m_GPIO_KEY == GPIO_Key::INVALID){
|
||||||
|
m_gpios[gpioPort][gpioPin] = GPIO(key,PinMode::INPUT_MODE); //Hardcode input mode for interrupt
|
||||||
|
}
|
||||||
|
|
||||||
|
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGCOMPEN; //TODO check if this is different across STM32 models, enable EXT
|
||||||
|
|
||||||
|
SHAL_EXTIO_Register EXTILineEnable = getGPIOEXTICR(key);
|
||||||
|
|
||||||
|
*EXTILineEnable.EXT_ICR |= EXTILineEnable.mask; //Set bits to enable correct port on correct line
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
35
SHAL/Src/Peripheral/SHAL_EXTI_CALLBACK.cpp
Normal file
35
SHAL/Src/Peripheral/SHAL_EXTI_CALLBACK.cpp
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
//
|
||||||
|
// Created by Luca on 9/3/2025.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "SHAL_EXTI_CALLBACK.h"
|
||||||
|
|
||||||
|
#if defined(STM32F030x6)
|
||||||
|
#elif defined(STM32F030x8)
|
||||||
|
#elif defined(STM32F031x6)
|
||||||
|
#elif defined(STM32F038xx)
|
||||||
|
#elif defined(STM32F042x6)
|
||||||
|
#elif defined(STM32F048xx)
|
||||||
|
#elif defined(STM32F051x8)
|
||||||
|
#elif defined(STM32F058xx)
|
||||||
|
#elif defined(STM32F070x6)
|
||||||
|
#elif defined(STM32F070xB)
|
||||||
|
#elif defined(STM32F071xB)
|
||||||
|
#elif defined(STM32F072xB)
|
||||||
|
|
||||||
|
DEFINE_MULTI_EXTI_IRQ(0,1);
|
||||||
|
DEFINE_MULTI_EXTI_IRQ(2,3);
|
||||||
|
DEFINE_MULTI_EXTI_IRQ(4,15);
|
||||||
|
|
||||||
|
#elif defined(STM32F078xx)
|
||||||
|
#include "stm32f078xx.h"
|
||||||
|
#elif defined(STM32F091xC)
|
||||||
|
#include "stm32f091xc.h"
|
||||||
|
#elif defined(STM32F098xx)
|
||||||
|
#include "stm32f098xx.h"
|
||||||
|
#elif defined(STM32F030xC)
|
||||||
|
#include "stm32f030xc.h"
|
||||||
|
#else
|
||||||
|
#error "Please select first the target STM32F0xx device used in your application (in stm32f0xx.h file)"
|
||||||
|
#endif
|
||||||
|
|
||||||
Reference in New Issue
Block a user