diff --git a/examples/knx-demo/platformio.ini b/examples/knx-demo/platformio.ini index a706ccb..1924630 100644 --- a/examples/knx-demo/platformio.ini +++ b/examples/knx-demo/platformio.ini @@ -100,3 +100,50 @@ lib_deps = build_flags = -DMASK_VERSION=0x07B0 -Wno-unknown-pragmas + +;--- STM32/GD32 --- +[env:h8i8o] +platform = ststm32 +board = genericSTM32F103CB +framework = arduino +; We consider that the this projects is opened within its project directory +; while working with VS Code. +lib_extra_dirs = ../../../ + +lib_deps = + knx + +build_flags = + -DENABLE_HWSERIAL1 + -DPIN_SERIAL1_TX=PA9 + -DPIN_SERIAL1_RX=PA10 + -DKNX_SERIAL=Serial1 + -DKNX_BUTTON=PA11 + -DKNX_LED=PA12 + -DMASK_VERSION=0x07B0 + -Wno-unknown-pragmas + +extra_scripts = ../scripts/stm32rdu.py + +[env:h8c09] +platform = ststm32 +board = genericSTM32F103CB +framework = arduino +; We consider that the this projects is opened within its project directory +; while working with VS Code. +lib_extra_dirs = ../../../ + +lib_deps = + knx + +build_flags = + -DENABLE_HWSERIAL1 + -DPIN_SERIAL1_TX=PA9 + -DPIN_SERIAL1_RX=PA10 + -DKNX_SERIAL=Serial1 + -DKNX_BUTTON=PB0 + -DKNX_LED=PB5 + -DMASK_VERSION=0x07B0 + -Wno-unknown-pragmas + +extra_scripts = ../scripts/stm32rdu.py diff --git a/examples/scripts/stm32rdu.py b/examples/scripts/stm32rdu.py new file mode 100755 index 0000000..d0c5400 --- /dev/null +++ b/examples/scripts/stm32rdu.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python +from subprocess import run +from datetime import datetime, timedelta +from os.path import expanduser + +ocddir = expanduser("~/.platformio/packages/tool-openocd/") +chip = "stm32f1x" + +def unlock(*args, **kwargs): + print("Please connect the board within the next two minutes.") + endtime = datetime.now() + timedelta(minutes = 1) + ret = 1 + while ret != 0 and datetime.now() < endtime: + ret = run(["bin/openocd", "-f", "interface/stlink.cfg", "-f", "target/" + chip + ".cfg", "-c", "init", "-c", "reset halt", "-c", chip + " unlock 0", "-c", "reset halt", "-c", "exit"], cwd = ocddir).returncode + if ret != 0: + print("Timeout") + return ret + +try: + Import("env") +except NameError: + import sys + if len(sys.argv) > 1: + chip = sys.argv[1] + if len(sys.argv) > 2: + ocddir = sys.argv[2] + unlock(None, None) +else: + ocddir = env.PioPlatform().get_package_dir("tool-openocd") + options = env.GetProjectOptions() + for option in options: + if "unlock_chip" == option[0]: + chip = option[1] + env.AddCustomTarget("unlock", None, unlock) diff --git a/src/arduino_platform.cpp b/src/arduino_platform.cpp index 8c58dfb..62ab8a9 100644 --- a/src/arduino_platform.cpp +++ b/src/arduino_platform.cpp @@ -7,7 +7,7 @@ #endif #ifndef KNX_NO_PRINT -Stream* ArduinoPlatform::SerialDebug = &Serial; +Stream* ArduinoPlatform::SerialDebug = &KNX_DEBUG_SERIAL; #endif ArduinoPlatform::ArduinoPlatform() : _knxSerial(nullptr) @@ -22,13 +22,13 @@ void ArduinoPlatform::fatalError() { while (true) { -#ifdef LED_BUILTIN +#ifdef KNX_LED static const long LED_BLINK_PERIOD = 200; if ((millis() % LED_BLINK_PERIOD) > (LED_BLINK_PERIOD / 2)) - digitalWrite(LED_BUILTIN, HIGH); + digitalWrite(KNX_LED, HIGH); else - digitalWrite(LED_BUILTIN, LOW); + digitalWrite(KNX_LED, LOW); #endif } } diff --git a/src/arduino_platform.h b/src/arduino_platform.h index 3ef5047..29d846e 100644 --- a/src/arduino_platform.h +++ b/src/arduino_platform.h @@ -2,6 +2,10 @@ #include "Arduino.h" +#ifndef KNX_DEBUG_SERIAL +#define KNX_DEBUG_SERIAL Serial +#endif + class ArduinoPlatform : public Platform { public: diff --git a/src/esp32_platform.cpp b/src/esp32_platform.cpp index c6a600b..f6c4812 100644 --- a/src/esp32_platform.cpp +++ b/src/esp32_platform.cpp @@ -6,9 +6,13 @@ #include "knx/bits.h" +#ifndef KNX_SERIAL +#define KNX_SERIAL Serial1 +#endif + Esp32Platform::Esp32Platform() #ifndef KNX_NO_DEFAULT_UART - : ArduinoPlatform(&Serial1) + : ArduinoPlatform(&KNX_SERIAL) #endif { } @@ -55,10 +59,10 @@ void Esp32Platform::setupMultiCast(uint32_t addr, uint16_t port) { IPAddress mcastaddr(htonl(addr)); - Serial.printf("setup multicast addr: %s port: %d ip: %s\n", mcastaddr.toString().c_str(), port, + KNX_DEBUG_SERIAL.printf("setup multicast addr: %s port: %d ip: %s\n", mcastaddr.toString().c_str(), port, WiFi.localIP().toString().c_str()); uint8_t result = _udp.beginMulticast(mcastaddr, port); - Serial.printf("result %d\n", result); + KNX_DEBUG_SERIAL.printf("result %d\n", result); } void Esp32Platform::closeMultiCast() @@ -83,7 +87,7 @@ int Esp32Platform::readBytesMultiCast(uint8_t * buffer, uint16_t maxLen) if (len > maxLen) { - Serial.printf("udp buffer to small. was %d, needed %d\n", maxLen, len); + KNX_DEBUG_SERIAL.printf("udp buffer to small. was %d, needed %d\n", maxLen, len); fatalError(); } diff --git a/src/esp_platform.cpp b/src/esp_platform.cpp index 67bcef1..b74dedd 100644 --- a/src/esp_platform.cpp +++ b/src/esp_platform.cpp @@ -7,9 +7,13 @@ #include "knx/bits.h" +#ifndef KNX_SERIAL +#define KNX_SERIAL Serial +#endif + EspPlatform::EspPlatform() #ifndef KNX_NO_DEFAULT_UART - : ArduinoPlatform(&Serial) + : ArduinoPlatform(&KNX_SERIAL) #endif { } @@ -55,10 +59,10 @@ void EspPlatform::setupMultiCast(uint32_t addr, uint16_t port) _multicastPort = port; IPAddress mcastaddr(_multicastAddr); - Serial.printf("setup multicast addr: %s port: %d ip: %s\n", mcastaddr.toString().c_str(), port, + KNX_DEBUG_SERIAL.printf("setup multicast addr: %s port: %d ip: %s\n", mcastaddr.toString().c_str(), port, WiFi.localIP().toString().c_str()); uint8 result = _udp.beginMulticast(WiFi.localIP(), mcastaddr, port); - Serial.printf("result %d\n", result); + KNX_DEBUG_SERIAL.printf("result %d\n", result); } void EspPlatform::closeMultiCast() @@ -83,7 +87,7 @@ int EspPlatform::readBytesMultiCast(uint8_t * buffer, uint16_t maxLen) if (len > maxLen) { - Serial.printf("udp buffer to small. was %d, needed %d\n", maxLen, len); + KNX_DEBUG_SERIAL.printf("udp buffer to small. was %d, needed %d\n", maxLen, len); fatalError(); } diff --git a/src/knx_facade.h b/src/knx_facade.h index f3369c9..9d12182 100644 --- a/src/knx_facade.h +++ b/src/knx_facade.h @@ -48,13 +48,20 @@ #else #if !defined(LED_BUILTIN) #define LED_BUILTIN 5 // see GPIO_PinConfig gpioPinConfigs[] - #endif +#endif #include "cc1310_platform.h" #ifndef KNX_NO_AUTOMATIC_GLOBAL_INSTANCE extern void buttonUp(); #endif #endif +#ifndef KNX_LED + #define KNX_LED LED_BUILTIN +#endif +#ifndef KNX_BUTTON + #define KNX_BUTTON 0 +#endif + typedef const uint8_t* (*RestoreCallback)(const uint8_t* buffer); typedef uint8_t* (*SaveCallback)(uint8_t* buffer); typedef void (*IsrFunctionPtr)(); @@ -405,8 +412,8 @@ template class KnxFacade : private SaveRestore ProgLedOnCallback _progLedOnCallback = 0; ProgLedOffCallback _progLedOffCallback = 0; uint32_t _ledPinActiveOn = LOW; - uint32_t _ledPin = LED_BUILTIN; - uint32_t _buttonPin = 0; + uint32_t _ledPin = KNX_LED; + uint32_t _buttonPin = KNX_BUTTON; SaveCallback _saveCallback = 0; RestoreCallback _restoreCallback = 0; volatile bool _toggleProgMode = false; diff --git a/src/rp2040_arduino_platform.cpp b/src/rp2040_arduino_platform.cpp index 2dcb9f2..7392223 100644 --- a/src/rp2040_arduino_platform.cpp +++ b/src/rp2040_arduino_platform.cpp @@ -43,10 +43,13 @@ A RAM-buffered Flash can be use by defining USE_RP2040_LARGE_EEPROM_EMULATION #error "KNX_FLASH_OFFSET must be multiple of 4096" #endif +#ifndef KNX_SERIAL +#define KNX_SERIAL Serial1 +#endif RP2040ArduinoPlatform::RP2040ArduinoPlatform() #ifndef KNX_NO_DEFAULT_UART - : ArduinoPlatform(&Serial1) + : ArduinoPlatform(&KNX_SERIAL) #endif { #ifndef USE_RP2040_EEPROM_EMULATION diff --git a/src/samd_platform.cpp b/src/samd_platform.cpp index e5633dc..fc85645 100644 --- a/src/samd_platform.cpp +++ b/src/samd_platform.cpp @@ -12,9 +12,13 @@ #error "KNX_FLASH_SIZE must be multiple of 1024" #endif +#ifndef KNX_SERIAL +#define KNX_SERIAL Serial1 +#endif + SamdPlatform::SamdPlatform() #ifndef KNX_NO_DEFAULT_UART - : ArduinoPlatform(&Serial1) + : ArduinoPlatform(&KNX_SERIAL) #endif { #ifndef USE_SAMD_EEPROM_EMULATION diff --git a/src/stm32_platform.cpp b/src/stm32_platform.cpp index 5e3a88c..fd6ea37 100644 --- a/src/stm32_platform.cpp +++ b/src/stm32_platform.cpp @@ -4,9 +4,13 @@ #include #include "knx/bits.h" +#ifndef KNX_SERIAL +#define KNX_SERIAL Serial2 +#endif + Stm32Platform::Stm32Platform() #ifndef KNX_NO_DEFAULT_UART - : ArduinoPlatform(&Serial2) + : ArduinoPlatform(&KNX_SERIAL) #endif { } @@ -44,7 +48,7 @@ uint8_t * Stm32Platform::getEepromBuffer(uint16_t size) _eepromPtr = new uint8_t[size]; eeprom_buffer_fill(); for (uint16_t i = 0; i < size; ++i) - _eepromPtr[i] = eeprom_buffered_read_byte(i); + _eepromPtr[i] = eeprom_buffered_read_byte(i); } return _eepromPtr; @@ -56,6 +60,11 @@ void Stm32Platform::commitToEeprom() return; for (uint16_t i = 0; i < _eepromSize; ++i) eeprom_buffered_write_byte(i, _eepromPtr[i]); + // For some GD32 chips, the flash needs to be unlocked twice + // and the first call will fail. If the first call is + // successful, the second one (inside eeprom_buffer_flush) + // does nothing. + HAL_FLASH_Unlock(); eeprom_buffer_flush(); }