From 147a3942ad36ec1e1f5409782ecc08ba38ac1a70 Mon Sep 17 00:00:00 2001 From: etrinh Date: Thu, 2 Apr 2020 18:09:53 +0200 Subject: [PATCH] Add priliminar Arduino STM32 port --- src/knx/bits.h | 2 +- src/knx/group_object.h | 2 +- src/knx_facade.cpp | 2 ++ src/knx_facade.h | 9 +++++++++ src/stm32_platform.cpp | 43 ++++++++++++++++++++++++++++++++++++++++++ src/stm32_platform.h | 25 ++++++++++++++++++++++++ 6 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 src/stm32_platform.cpp create mode 100644 src/stm32_platform.h diff --git a/src/knx/bits.h b/src/knx/bits.h index ec12e9a..6a2b771 100644 --- a/src/knx/bits.h +++ b/src/knx/bits.h @@ -34,7 +34,7 @@ uint32_t digitalRead(uint32_t dwPin); typedef void (*voidFuncPtr)(void); void attachInterrupt(uint32_t pin, voidFuncPtr callback, uint32_t mode); -#elif ARDUINO_ARCH_SAMD +#elif ARDUINO_ARCH_SAMD || ARDUINO_ARCH_STM32 #include #define htons(x) ( (((x)<<8)&0xFF00) | (((x)>>8)&0xFF) ) #define ntohs(x) htons(x) diff --git a/src/knx/group_object.h b/src/knx/group_object.h index 0e71b96..96499e9 100644 --- a/src/knx/group_object.h +++ b/src/knx/group_object.h @@ -19,7 +19,7 @@ enum ComFlag class GroupObject; -#ifdef __linux__ +#if __has_include() #include typedef std::function GroupObjectUpdatedHandler; #else diff --git a/src/knx_facade.cpp b/src/knx_facade.cpp index 45cdbcc..e79ccec 100644 --- a/src/knx_facade.cpp +++ b/src/knx_facade.cpp @@ -22,6 +22,8 @@ #elif ARDUINO_ARCH_ESP32 // predefined global instance for IP only KnxFacade knx; +#elif ARDUINO_ARCH_STM32 + KnxFacade knx; #elif __linux__ // no predefined global instance #define ICACHE_RAM_ATTR diff --git a/src/knx_facade.h b/src/knx_facade.h index c59b600..8611c02 100644 --- a/src/knx_facade.h +++ b/src/knx_facade.h @@ -18,6 +18,9 @@ #define LED_BUILTIN 13 #include "esp32_platform.h" #include "knx/bau57B0.h" +#elif ARDUINO_ARCH_STM32 + #include "stm32_platform.h" + #include "knx/bau57B0.h" #else #define LED_BUILTIN 0 #include "linux_platform.h" @@ -331,8 +334,14 @@ template class KnxFacade : private SaveRestore // predefined global instance for IP only extern KnxFacade knx; #elif ARDUINO_ARCH_ESP32 +<<<<<<< Updated upstream // predefined global instance for IP only extern KnxFacade knx; +======= +extern KnxFacade knx; +#elif ARDUINO_ARCH_STM32 +extern KnxFacade knx; +>>>>>>> Stashed changes #elif __linux__ // no predefined global instance #endif diff --git a/src/stm32_platform.cpp b/src/stm32_platform.cpp new file mode 100644 index 0000000..b9db3c7 --- /dev/null +++ b/src/stm32_platform.cpp @@ -0,0 +1,43 @@ +#include "stm32_platform.h" + +#ifdef ARDUINO_ARCH_STM32 +#include +#include "knx/bits.h" + +Stm32Platform::Stm32Platform() : ArduinoPlatform(&Serial2), eepromPtr(nullptr), eepromSize(0) +{ +} + +Stm32Platform::Stm32Platform( HardwareSerial* s) : ArduinoPlatform(s), eepromPtr(nullptr), eepromSize(0) +{ +} + +Stm32Platform::~Stm32Platform() +{ + delete [] eepromPtr; +} + +void Stm32Platform::restart() +{ + println("restart"); + NVIC_SystemReset(); +} + +uint8_t * Stm32Platform::getEepromBuffer(uint16_t size) +{ + delete [] eepromPtr; + eepromPtr = new uint8_t[size]; + for (uint16_t i = 0; i < size; ++i) + eepromPtr[i] = EEPROM[i]; + return eepromPtr; +} + +void Stm32Platform::commitToEeprom() +{ + if(eepromPtr == nullptr) + return; + for (uint16_t i = 0; i < eepromSize; ++i) + EEPROM.update(i, eepromPtr[i]); +} + +#endif diff --git a/src/stm32_platform.h b/src/stm32_platform.h new file mode 100644 index 0000000..17062f3 --- /dev/null +++ b/src/stm32_platform.h @@ -0,0 +1,25 @@ +#ifdef ARDUINO_ARCH_STM32 +#include "arduino_platform.h" + + +class Stm32Platform : public ArduinoPlatform +{ + using ArduinoPlatform::_mulitcastAddr; + using ArduinoPlatform::_mulitcastPort; +public: + Stm32Platform(); + Stm32Platform( HardwareSerial* s); + ~Stm32Platform(); + + // basic stuff + void restart(); + + //memory + uint8_t* getEepromBuffer(uint16_t size); + void commitToEeprom(); +private: + uint8_t *eepromPtr; + uint16_t eepromSize; +}; + +#endif