diff --git a/src/modm/platform/gpio/sam/pin.hpp b/src/modm/platform/gpio/sam/pin.hpp index 4f31895cc2..cd9af440a7 100644 --- a/src/modm/platform/gpio/sam/pin.hpp +++ b/src/modm/platform/gpio/sam/pin.hpp @@ -139,17 +139,23 @@ class GpioSet : protected PinCfgMixin return (((PinConfigs::port == port) ? 1u << PinConfigs::pin : 0u) | ...); } - inline static constexpr uint32_t* + template + inline static constexpr volatile uint32_t* getPortReg(size_t offset) { - return (uint32_t*)(&PORT->Group[0]) + offset / sizeof(uint32_t); + if constexpr (port == PortName::A) { + return (uint32_t*)(&PORT->Group[0]) + offset / sizeof(uint32_t); + } + if constexpr (port == PortName::B) { + return (uint32_t*)(&PORT->Group[1]) + offset / sizeof(uint32_t); + } } inline static constexpr void setPortReg(size_t offset) { - if constexpr (mask(PortName::A) != 0) { *getPortReg(offset) = mask(PortName::A); } - if constexpr (mask(PortName::B) != 0) { *getPortReg(offset) = mask(PortName::B); } + if constexpr (mask(PortName::A) != 0) { *getPortReg(offset) = mask(PortName::A); } + if constexpr (mask(PortName::B) != 0) { *getPortReg(offset) = mask(PortName::B); } } template @@ -160,12 +166,12 @@ class GpioSet : protected PinCfgMixin { static_assert(mask(PortName::A) != 0, "Trying to read port which is not in the GpioSet!"); - return *getPortReg(offset) & mask(PortName::A); + return *getPortReg(offset) & mask(PortName::A); } else if constexpr (port == PortName::B) { static_assert(mask(PortName::B) != 0, "Trying to read port which is not in the GpioSet!"); - return *getPortReg(offset) & mask(PortName::A); + return *getPortReg(offset) & mask(PortName::B); } }