From 03dcfd6bbe674acdbc6f23b8ff59aa9dc476dc8a Mon Sep 17 00:00:00 2001 From: Ea-r-th <39779954+Ea-r-th@users.noreply.github.com> Date: Mon, 22 Sep 2025 22:12:57 -0700 Subject: [PATCH] Added analogRead to GPIO --- SHAL/Include/Peripheral/ADC/SHAL_ADC_TYPES.h | 1 + .../GPIO/Reg/SHAL_GPIO_REG_F072xB.h | 73 +++++++++++++++++++ SHAL/Include/Peripheral/GPIO/SHAL_GPIO.h | 17 ++++- .../Include/Peripheral/GPIO/SHAL_GPIO_TYPES.h | 7 +- SHAL/Include/SHAL.h | 2 + SHAL/Src/Peripheral/GPIO/SHAL_GPIO.cpp | 7 ++ 6 files changed, 104 insertions(+), 3 deletions(-) diff --git a/SHAL/Include/Peripheral/ADC/SHAL_ADC_TYPES.h b/SHAL/Include/Peripheral/ADC/SHAL_ADC_TYPES.h index b69f571..bfdcb0c 100644 --- a/SHAL/Include/Peripheral/ADC/SHAL_ADC_TYPES.h +++ b/SHAL/Include/Peripheral/ADC/SHAL_ADC_TYPES.h @@ -6,6 +6,7 @@ #define SHMINGO_HAL_SHAL_ADC_TYPES_H enum class ADC_Channel : uint32_t { + CH0 = ADC_CHSELR_CHSEL0, CH1 = ADC_CHSELR_CHSEL1, CH2 = ADC_CHSELR_CHSEL2, CH3 = ADC_CHSELR_CHSEL3, diff --git a/SHAL/Include/Peripheral/GPIO/Reg/SHAL_GPIO_REG_F072xB.h b/SHAL/Include/Peripheral/GPIO/Reg/SHAL_GPIO_REG_F072xB.h index c12c60a..1888438 100644 --- a/SHAL/Include/Peripheral/GPIO/Reg/SHAL_GPIO_REG_F072xB.h +++ b/SHAL/Include/Peripheral/GPIO/Reg/SHAL_GPIO_REG_F072xB.h @@ -270,6 +270,79 @@ constexpr uint32_t getGPIOPortNumber(const GPIO_Key g){ __builtin_unreachable(); } +constexpr SHAL_GPIO_Port_Info getGPIOPortInfo(GPIO_Key key){ + switch(key){ + case GPIO_Key::A0: + case GPIO_Key::B0: + case GPIO_Key::C0: + return {0,ADC_Channel::CH0}; + case GPIO_Key::A1: + case GPIO_Key::B1: + case GPIO_Key::C1: + return {1,ADC_Channel::CH1}; + case GPIO_Key::A2: + case GPIO_Key::B2: + case GPIO_Key::C2: + return {2,ADC_Channel::CH2}; + case GPIO_Key::A3: + case GPIO_Key::B3: + case GPIO_Key::C3: + return {3,ADC_Channel::CH3}; + case GPIO_Key::A4: + case GPIO_Key::B4: + case GPIO_Key::C4: + return {4,ADC_Channel::CH4}; + case GPIO_Key::A5: + case GPIO_Key::B5: + case GPIO_Key::C5: + return {5,ADC_Channel::CH5}; + case GPIO_Key::A6: + case GPIO_Key::B6: + case GPIO_Key::C6: + return {6,ADC_Channel::CH6}; + case GPIO_Key::A7: + case GPIO_Key::B7: + case GPIO_Key::C7: + return {7,ADC_Channel::CH7}; + case GPIO_Key::A8: + case GPIO_Key::B8: + case GPIO_Key::C8: + return {8,ADC_Channel::CH8}; + case GPIO_Key::A9: + case GPIO_Key::B9: + case GPIO_Key::C9: + return {9,ADC_Channel::CH9}; + case GPIO_Key::A10: + case GPIO_Key::B10: + case GPIO_Key::C10: + return {10,ADC_Channel::CH10}; + case GPIO_Key::A11: + case GPIO_Key::B11: + case GPIO_Key::C11: + return {11,ADC_Channel::CH11}; + case GPIO_Key::A12: + case GPIO_Key::B12: + case GPIO_Key::C12: + return {12,ADC_Channel::CH12}; + case GPIO_Key::A13: + case GPIO_Key::B13: + case GPIO_Key::C13: + return {13,ADC_Channel::CH13}; + case GPIO_Key::A14: + case GPIO_Key::B14: + case GPIO_Key::C14: + return {14,ADC_Channel::CH14}; + case GPIO_Key::A15: + case GPIO_Key::B15: + case GPIO_Key::C15: + return {15,ADC_Channel::CH15}; + case GPIO_Key::NUM_GPIO: + case GPIO_Key::INVALID: + return {0,ADC_Channel::CH0}; + } + __builtin_unreachable(); +} + #endif //SHMINGO_HAL_SHAL_GPIO_REG_F072XB_H diff --git a/SHAL/Include/Peripheral/GPIO/SHAL_GPIO.h b/SHAL/Include/Peripheral/GPIO/SHAL_GPIO.h index 793a597..0213f4a 100644 --- a/SHAL/Include/Peripheral/GPIO/SHAL_GPIO.h +++ b/SHAL/Include/Peripheral/GPIO/SHAL_GPIO.h @@ -10,6 +10,7 @@ #include #include "SHAL_EXTI_CALLBACK.h" +#include "SHAL_ADC.h" @@ -26,6 +27,11 @@ public: void setHigh(); void setLow(); + /// Uses the ADC to read an analog voltage value + /// \param sampleTime The amount of clock cycles to use for the ADC + /// \return ADC result + uint16_t analogRead(ADC_SampleTime sampleTime = ADC_SampleTime::C239); + void setPinMode(PinMode mode) volatile; void setAlternateFunction(GPIO_Alternate_Function AF) volatile; @@ -39,6 +45,8 @@ public: void useAsExternalInterrupt(TriggerMode mode, EXTICallback callback); + + private: friend class GPIOManager; @@ -60,7 +68,7 @@ private: #define GET_GPIO(key) GPIOManager::get(key) -#define GPIO_A +#define SET_ANALOGREAD_ADC(x) GPIOManager::setGPIOADC(x) //Manages instances of SHAL_GPIO objects class GPIOManager{ @@ -69,12 +77,17 @@ public: static SHAL_GPIO& get(GPIO_Key); + static SHAL_ADC getGPIOADC(){ return m_GPIO_ADC;} + + static void setGPIOADC(SHAL_ADC adc){m_GPIO_ADC = adc;} GPIOManager() = delete; private: -inline static SHAL_GPIO m_gpios[AVAILABLE_PORTS][PINS_PER_PORT] = {{}}; + inline static SHAL_GPIO m_gpios[AVAILABLE_PORTS][PINS_PER_PORT] = {{}}; + + inline static SHAL_ADC m_GPIO_ADC = SHAL_ADC(1); }; diff --git a/SHAL/Include/Peripheral/GPIO/SHAL_GPIO_TYPES.h b/SHAL/Include/Peripheral/GPIO/SHAL_GPIO_TYPES.h index 0dcbeb1..5104180 100644 --- a/SHAL/Include/Peripheral/GPIO/SHAL_GPIO_TYPES.h +++ b/SHAL/Include/Peripheral/GPIO/SHAL_GPIO_TYPES.h @@ -6,6 +6,7 @@ #define SHAL_GPIO_TYPES_H #include "SHAL_CORE.h" +#include "SHAL_ADC.h" struct SHAL_EXTIO_Register{ volatile uint32_t* EXT_ICR; @@ -23,6 +24,11 @@ struct SHAL_Peripheral_Register { unsigned long offset; }; +struct SHAL_GPIO_Port_Info{ + uint8_t number; + ADC_Channel ADCChannel; +}; + enum class PinMode : uint8_t{ INPUT_MODE = 0x00, OUTPUT_MODE = 0x01, @@ -67,5 +73,4 @@ enum class TriggerMode : uint8_t{ }; - #endif //SHMINGO_HAL_SHAL_GPIO_TYPES_H diff --git a/SHAL/Include/SHAL.h b/SHAL/Include/SHAL.h index 32edae4..e4342e3 100644 --- a/SHAL/Include/SHAL.h +++ b/SHAL/Include/SHAL.h @@ -14,4 +14,6 @@ #include "SHAL_I2C.h" #include "SHAL_ADC.h" + + #endif diff --git a/SHAL/Src/Peripheral/GPIO/SHAL_GPIO.cpp b/SHAL/Src/Peripheral/GPIO/SHAL_GPIO.cpp index dea9db5..9613ab7 100644 --- a/SHAL/Src/Peripheral/GPIO/SHAL_GPIO.cpp +++ b/SHAL/Src/Peripheral/GPIO/SHAL_GPIO.cpp @@ -107,6 +107,13 @@ void SHAL_GPIO::useAsExternalInterrupt(TriggerMode mode, EXTICallback callback) __enable_irq(); //Enable IRQ just in case } +uint16_t SHAL_GPIO::analogRead(ADC_SampleTime sampleTime) { + + ADC_Channel channel = getGPIOPortInfo(m_GPIO_KEY).ADCChannel; + + return GPIOManager::getGPIOADC().singleConvertSingle(channel,sampleTime); +} + SHAL_GPIO& GPIOManager::get(GPIO_Key key) {