mirror of
https://github.com/thelsing/knx.git
synced 2025-01-07 00:05:47 +01:00
8b9ff4fce1
* Add defines for LED, button and serial port To make supporting different board layouts easier, this introduces some new defines: For all platforms: - `KNX_LED` - the programming LED, defaults to `LED_BUILTIN` - `KNX_BUTTON` - the programming button, defaults to `0` For Arduino platforms: - `KNX_DEBUG_SERIAL` - the serial port that is used for debugging, defaults to `Serial` - `KNX_SERIAL` - the serial port used for communication with the TPUART, default depends on platform * GD32 flash workaround Addressing #181 At least some GD32 devices seem to require unlocking the flash twice. As the unlock function exits with `HAL_OK` if the flash is already unlocked, STM32 devices can run the same code without issues. * Add H8I8O and H8C09 configurations to knx-demo Addressing #181 These configurations both serve as examples for the use of these boards and other custom boards that don't use the standard pinout. * Add STM32 unlock target This copies the brute force unlock approach by @pavkriz into a custom target. With this commit, it is possible to automatically unlock e.g. a H8I8O board without leaving the PlatformIO IDE. See #181
72 lines
1.5 KiB
C++
72 lines
1.5 KiB
C++
#include "stm32_platform.h"
|
|
|
|
#ifdef ARDUINO_ARCH_STM32
|
|
#include <EEPROM.h>
|
|
#include "knx/bits.h"
|
|
|
|
#ifndef KNX_SERIAL
|
|
#define KNX_SERIAL Serial2
|
|
#endif
|
|
|
|
Stm32Platform::Stm32Platform()
|
|
#ifndef KNX_NO_DEFAULT_UART
|
|
: ArduinoPlatform(&KNX_SERIAL)
|
|
#endif
|
|
{
|
|
}
|
|
|
|
Stm32Platform::Stm32Platform( HardwareSerial* s) : ArduinoPlatform(s)
|
|
{
|
|
}
|
|
|
|
Stm32Platform::~Stm32Platform()
|
|
{
|
|
delete [] _eepromPtr;
|
|
}
|
|
|
|
uint32_t Stm32Platform::uniqueSerialNumber()
|
|
{
|
|
return HAL_GetUIDw0() ^ HAL_GetUIDw1() ^ HAL_GetUIDw2();
|
|
}
|
|
|
|
void Stm32Platform::restart()
|
|
{
|
|
NVIC_SystemReset();
|
|
}
|
|
|
|
uint8_t * Stm32Platform::getEepromBuffer(uint16_t size)
|
|
{
|
|
// check if the buffer already exists
|
|
if (_eepromPtr == nullptr) // we need to initialize the buffer first
|
|
{
|
|
if (size > E2END + 1)
|
|
{
|
|
fatalError();
|
|
}
|
|
|
|
_eepromSize = size;
|
|
_eepromPtr = new uint8_t[size];
|
|
eeprom_buffer_fill();
|
|
for (uint16_t i = 0; i < size; ++i)
|
|
_eepromPtr[i] = eeprom_buffered_read_byte(i);
|
|
}
|
|
|
|
return _eepromPtr;
|
|
}
|
|
|
|
void Stm32Platform::commitToEeprom()
|
|
{
|
|
if(_eepromPtr == nullptr || _eepromSize == 0)
|
|
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();
|
|
}
|
|
|
|
#endif
|