**Компилятор:** ```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) ####