**Компилятор:**
```bash
/gcc-arm-none-eabi-9-2020-q2-update
```
arm-none-eabi-gcc (GNU Arm Embedded Toolchain 9-2020-q2-update) 9.3.1 20200408 (release)
##### DEBUG UART
    USART1 (PB6 - Tx, PB7 - Rx)
Отладочный порт пересекается с рабочим портом модема. В боевой прошивке нужно отключать вывод DEBUG. Ключ при сборке "DEBUG".
##### UART Port_1 RS485 #2
    USART3 (PD8 - Tx, PD9 - Rx)    
##### Карта памяти
    Sector 0: 0x0800 0000 - 0x0800 3FFF (16кБт)
    Sector 1: 0x0800 4000 - 0x0800 7FFF (16кБт) - Основные настройки (SETTINGS)
    Sector 2: 0x0800 8000 - 0x0800 BFFF (16кБт) - Системные настройки (SETTINGS_SYS)
    Sector 3: 0x0800 C000 - 0x0800 FFFF (16кБт)
    Sector 4: 0x0801 8000 - 0x0801 FFFF (64кБт)
    Sector 5: 0x0802 0000 - 0x0803 FFFF (128кБт)
    Sector 6: 0x0804 0000 - 0x0805 FFFF (128кБт)
    ............................................
    Sector 11: 0x080E 0000 - 0x080F FFFF (128кБт)
    
#### Настройки
##### Логика установки/загрузки настроек
- После рестарта контроллера стартует бутлоадер. До проверки флагов обновления бутлоадер проверяет CRC общей структуры настроек. Если контрольная сумма не совпадает, то происходит установка дефолтных значений общей структуры настроек.
- После старта основной программы (далее FW) загружаются системные настройки. Предварительно проверяется CRC и контрольное слово. Если CRC или слово не совпадают, то прошиваются дефолтные значения системных настроек.
- Далее загружается основная структура настроек. Проверяется CRC и контрольное слово и если нужно прошиваются дефолтные значения.
##### Общие настройки (FW + IAP)
```sh
// Установить параметры сетевого подключения по умолчанию
void SETTINGS_SetWebParamsDef(void)
{
    strcpy(sSettings.sWebParams.ip, "192.168.0.254");
    strcpy(sSettings.sWebParams.gate, "192.168.0.1");
    strcpy(sSettings.sWebParams.mask, "255.255.255.0");
    strcpy(sSettings.sWebParams.dns1, "8.8.8.8");
    strcpy(sSettings.sWebParams.dns2, "8.8.4.4");
    sSettings.sWebParams.dhcpEnable = 0;
}

void SETTINGS_SetInfoDef(void)
{
  strcpy(sSettings.sInfo.productionData, "00.00.00 00:00");
  strcpy(sSettings.sInfo.mac, DEVICE_MAC); // "EC-4C-4D-00-90-01"
  strcpy(sSettings.sInfo.serialNumber, DEVICE_SERIAL); // "7030000"
  sSettings.sInfo.id = 0;
  strcpy(sSettings.sInfo.location, "");
  strcpy(sSettings.sInfo.owner, "");
  strcpy(sSettings.sInfo.comments, "");
  strcpy(sSettings.sInfo.incharge, "");
}

void SETTINGS_SetGSMDef(void)
{
    for(uint8_t i = 0; i < NUM_GSM; i++)
    {
        sSettings.sGSM[i].Enabled = true;
        sSettings.sGSM[i].prior = 0;
        sSettings.sGSM[i].type_profile = MEGAFON;
        strcpy(sSettings.sGSM[i].ip_test, "8.8.8.8");
        strcpy(sSettings.sGSM[i].APNaddr, "internet");
        strcpy(sSettings.sGSM[i].APNlogin, "");
        strcpy(sSettings.sGSM[i].APNpass, "");
        strcpy(sSettings.sGSM[i].msisdn, "");
        sSettings.sGSM[i].timeout = 30;
        sSettings.sGSM[i].period_test = 100;
        sSettings.sGSM[i].num_bad_connect = 3;
        sSettings.sGSM[i].modem_mode = AUTOMATIC;
        
    }
    sSettings.sGSM[0].prior = 3;
    sSettings.sGSM[1].prior = 2;
}
```
    
##### Системные настройки (только FW)
```sh
typedef struct
{
  char  mac[MAC_LEN];     // MAC адрес
  char  serial[SER_LEN];  // Серийный номер
  char  customer[CUST_LEN]; // Производитель
  char  proddate[PROD_LEN]; // Дата производства
  char  testState[16];      // Статус тестирования
  uint32_t controlword;     // Контрольное слово
  uint32_t crc;             // CRC
} SYS_t;
```
##### Основная структура настроек состоит из следующих структур:
```
  FLAGS_t       sFlags;
  ETHERNET_t    sEthernet;      //настройка подключения Ethernet 
  SERVER_t      sServer;
  PROXY_t       sProxy;
  AUTH_t        sAuth[MAX_WEB_USERS];
  PORTGW_t      sPortGw[NUM_PORTGW];        // Настройки прозрачного порта
  SNTP_t        sSNTP;   
  PSD_t         sPSD;   
  uint16_t      settVer;       // Версия структуры настроек 
  uint32_t      controlWorld;  // Слово для контроля целостности структуры настроек
  uint32_t      sCRC;
``` 
##### Загрузка
###### До старта загрузочной задачи
- Сохранение флагов причин перезагрузки (флаги пока не используются)
- Инициализация GPIO
- USB switch для работы RNDIS
- Инициализация USART
- Запуск Watchdog
- Инициализация jSON hooks
###### Действия в загрузочной задаче
- Звуковой сигнал buzzer
- Генератор случайных чисел
- Таймер для расчета производительности FreeRTOS
- Запуск таймера Uptime
- Инициализация SPI2, мьютекса для SPI2
- Погасить все LED на сдвиговым регистре (LED уровня GSM сигнала)
- Установка мультиплексора в режим отключения ПСД
- Инициализация кнопок и запуск таска
- Анализ нажатия кнопки "MODE". Если кнопка нажата, то переход в Bootloader.
- Загрузка настроек
- Переинициализация всех USART
- Монтирование файловой системы
- Запуск измерений ADC и Power Manager
- Запуск задачи управления LED
- Запуск задачи отправки UDP анонсов
- Запуск задачи Connection Manager
- Запуск задач прозрачных портов
- Запуск Задачи PSD (параллельная диспетчеризация)
- Запуск RTC
- Запуск MQTT
- Запуск Монитора
- Сброс BootTry
##### Индикация
  - Мигает красным диодом "Сервер" до установки сетевых параметорв на эапе тестирования кроме "T2_OK".
##### MODEM UART
    USART2 (PD5 - Tx, PD6 - Rx)
##### Таймеры
 - TIM4 - на 1Гц для счетчика uptime 
 - TIM5 - на 10кГц для загрузки FreeRTOS
 - TIM13 - сброс внешнего Watchdog таймера
 - TIM14 - триггер для АЦП
##### Конфигурация проекта
 - #define SOFTWARE_WATCHDOG (common_config.h) - сброс watchdog в отдельном таске
 - MQTT_CLIENT - MQTT клиент
##### Кнопки. Логика работы
 - Кнопка SET "Установка"
    Простое нажатие на статусе T0OK - гасит LED "Состояние" и начинает отправку UDP анонсов.
    Нажатие 15 секунд - перезагрузка
 - Кнопка MODE "Режим"
    Нажатие 30 секунд - установка дефолтных настроек ethernet, сохранение и перезагрузка.
    При перезагрузке и при зажатой кнопке MODE контроллер переходит в резим Bootloader.
##### TODO
 - Макросы в settings_api.c
 - Вернуть дефолтные настройки (settings_api.c)
####


