Add saving cnf in ROM, workink with leds

This commit is contained in:
2026-03-30 18:42:53 +03:00
parent 0b982e5d4d
commit d43458c770
82 changed files with 43899 additions and 41684 deletions

View File

@@ -0,0 +1,46 @@
#ifndef CONFIG_CONSTS_H
#define CONFIG_CONSTS_H
#define RX_TIMEOUT_VALUE_MS 0U
#define TX_TIMEOUT_VALUE_MS 3000U
#define RX_CONTINUOUS_ON 1U
#define RADIO_SYNCWORD_LEN 3U
#define RADIO_WHITENING_SEED 0x01FFU
#define RADIO_CRC_POLY 0x8005U
#define RADIO_CRC_SEED 0xFFFFU
#define UART_DATA_BUFFER_SIZE 220U
#define RADIO_MAX_PAYLOAD_SIZE 220U
#define TX_QUEUE_DEPTH 4U
#define CONFIG_LINE_SIZE 96U
#define CONFIG_ESCAPE_GUARD_MS 800U
// Reserved addresses for configuration
#define FLASH_BASE_ADDR 0x08000000U
#define FLASH_TOTAL_SIZE 0x00040000U // 256 KB
#define FLASH_PAGE_SIZE 0x00000800U // 2 KB
#define CONFIG_FLASH_ADDR (FLASH_BASE_ADDR + FLASH_TOTAL_SIZE - FLASH_PAGE_SIZE)
#define CONFIG_MAGIC 0x43464731UL // "CFG1"
#define LED_PULSE_MS 50U
// Default config values
#define DEFAULT_RF_FREQUENCY 433100000UL
#define DEFAULT_TX_OUTPUT_POWER 14
#define DEFAULT_FSK_FDEV 25000UL
#define DEFAULT_FSK_BITRATE 50000UL
#define DEFAULT_FSK_BANDWIDTH 50000UL
#define DEFAULT_FSK_PREAMBLE_LENGTH 4U
#define DEFAULT_UART_PACKET_TIMEOUT_MS 20U
#define DEFAULT_UART_BAUDRATE 115200U
#define DEFAULT_SYNCWORD {0x91, 0xC4, 0x91}
#endif

View File

@@ -0,0 +1,21 @@
#include "config_defaults.h"
#include <string.h>
void Config_LoadDefaults(BridgeConfig_t *cfg)
{
if (cfg == 0)
{
return;
}
cfg->rf_frequency = DEFAULT_RF_FREQUENCY;
cfg->tx_power = DEFAULT_TX_OUTPUT_POWER;
cfg->fsk_bitrate = DEFAULT_FSK_BITRATE;
cfg->fsk_bandwidth = DEFAULT_FSK_BANDWIDTH;
cfg->fsk_fdev = DEFAULT_FSK_FDEV;
cfg->fsk_preamble_len = DEFAULT_FSK_PREAMBLE_LENGTH;
static const uint8_t default_syncword[3] = DEFAULT_SYNCWORD;
memcpy(cfg->syncword, default_syncword, sizeof(cfg->syncword));
cfg->uart_packet_timeout_ms = DEFAULT_UART_PACKET_TIMEOUT_MS;
cfg->uart_baudrate = DEFAULT_UART_BAUDRATE;
}

View File

@@ -0,0 +1,9 @@
#ifndef CONFIG_DEFAULTS_H
#define CONFIG_DEFAULTS_H
#include "config_types.h"
#include "config_consts.h"
void Config_LoadDefaults(BridgeConfig_t *cfg);
#endif

View File

@@ -0,0 +1,110 @@
#include "config_store.h"
#include "config_defaults.h"
#include "stm32wlxx_hal.h"
#include <string.h>
#include <stdint.h>
typedef struct
{
uint32_t magic;
uint32_t checksum;
BridgeConfig_t cfg;
} FlashConfig_t;
static uint32_t Config_CalcChecksum(const uint8_t *data, uint32_t len)
{
uint32_t sum = 0;
uint32_t i;
for (i = 0; i < len; i++)
{
sum += data[i];
}
return sum;
}
bool Config_Load(BridgeConfig_t *cfg)
{
const FlashConfig_t *stored;
uint32_t calc;
if (cfg == 0)
{
return false;
}
stored = (const FlashConfig_t *)CONFIG_FLASH_ADDR;
if (stored->magic != CONFIG_MAGIC)
{
return false;
}
calc = Config_CalcChecksum((const uint8_t *)&stored->cfg, sizeof(BridgeConfig_t));
if (calc != stored->checksum)
{
return false;
}
memcpy(cfg, &stored->cfg, sizeof(BridgeConfig_t));
return true;
}
bool Config_Save(const BridgeConfig_t *cfg)
{
FlashConfig_t temp;
FLASH_EraseInitTypeDef erase;
uint32_t page_error = 0;
uint32_t addr;
uint32_t i;
const uint64_t *src64;
uint32_t words64_count;
if (cfg == 0)
{
return false;
}
memset(&temp, 0xFF, sizeof(temp));
temp.magic = CONFIG_MAGIC;
memcpy(&temp.cfg, cfg, sizeof(BridgeConfig_t));
temp.checksum = Config_CalcChecksum((const uint8_t *)&temp.cfg, sizeof(BridgeConfig_t));
HAL_FLASH_Unlock();
memset(&erase, 0, sizeof(erase));
erase.TypeErase = FLASH_TYPEERASE_PAGES;
erase.Page = (CONFIG_FLASH_ADDR - FLASH_BASE_ADDR) / FLASH_PAGE_SIZE;
erase.NbPages = 1;
if (HAL_FLASHEx_Erase(&erase, &page_error) != HAL_OK)
{
HAL_FLASH_Lock();
return false;
}
addr = CONFIG_FLASH_ADDR;
src64 = (const uint64_t *)&temp;
words64_count = (sizeof(FlashConfig_t) + 7U) / 8U;
for (i = 0; i < words64_count; i++)
{
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, addr, src64[i]) != HAL_OK)
{
HAL_FLASH_Lock();
return false;
}
addr += 8U;
}
HAL_FLASH_Lock();
return true;
}

View File

@@ -0,0 +1,21 @@
#ifndef CONFIG_STORE_H
#define CONFIG_STORE_H
#ifdef __cplusplus
extern "C" {
#endif
#include "config_types.h"
#include "config_consts.h"
#include <stdbool.h>
bool Config_Load(BridgeConfig_t *cfg);
bool Config_Save(const BridgeConfig_t *cfg);
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -0,0 +1,25 @@
#ifndef CONFIG_TYPES_H
#define CONFIG_TYPES_H
#include "config_consts.h"
#include <stdint.h>
typedef struct
{
uint32_t rf_frequency;
int8_t tx_power;
uint32_t fsk_bitrate;
uint32_t fsk_bandwidth;
uint32_t fsk_fdev;
uint16_t fsk_preamble_len;
uint8_t syncword[RADIO_SYNCWORD_LEN];
uint16_t uart_packet_timeout_ms;
uint32_t uart_baudrate;
} BridgeConfig_t;
#endif