forked from achamaikin/CCSModuleSW30Web
147 lines
16 KiB
Markdown
147 lines
16 KiB
Markdown
---
|
||
name: gbt-to-ccs-port
|
||
overview: Перенос прошивки модуля GBT на CCS с сохранением логики силовой части и веб-интерфейса, интеграцией готового CCS-стека из проекта CS60DC_CCS_STM32 и разделением двух независимых UART-протоколов.
|
||
todos:
|
||
- id: analyze-gbt-project
|
||
content: Просмотреть проект `GbTModuleSW30Web` (main, PSU, CONN, LED, веб/диагностика) и зафиксировать все места, где используется GBT-логика (функции GBT_*, структуры, CAN2 и т.п.).
|
||
status: completed
|
||
- id: extract-ccs-modules
|
||
content: Выделить из `CS60DC_CCS_STM32` полный набор CCS-модулей (cp, serial, charger_ccs, структуры CCS_EDCAN_*) и их зависимости (EDCAN, board, adc_filter) для переноса.
|
||
status: completed
|
||
- id: wire-cp-and-uart3
|
||
content: Спланировать привязку CP (ADC1_IN4 и PWM на PA7) и перенастройку CCS-протокола на USART3 в проекте модуля, учитывая текущую конфигурацию таймеров и UART в `GbTModuleSW30Web`.
|
||
status: completed
|
||
- id: rewrite-main-loop
|
||
content: Спроектировать новое содержимое `main()` и `ED_Delay()` в `GbTModuleSW30Web`, убрав GBT-задачи и интегрировав CCS_SerialLoop, CP_Loop, EDCAN_Loop и существующие PSU/METER/CONN/LED/StopButton задачи.
|
||
status: completed
|
||
- id: clean-gbt-and-keep-can1
|
||
content: Определить, какие файлы/части кода GBT можно удалить или заглушить, при этом оставив инициализацию CAN1 и минимально необходимый код для корректной работы bootloader и EDCAN.
|
||
status: completed
|
||
- id: adapt-web-diagnostics
|
||
content: "Наметить изменения веб-интерфейса и диагностического протокола: заменить источники данных с GBT на CCS-структуры, сохранив максимально существующую функциональность."
|
||
status: in_progress
|
||
- id: define-test-plan
|
||
content: Уточнить и зафиксировать подробный тест-план для стендовой проверки новой CCS-прошивки (переходы состояний CP/EVSE, обмен по USART3, защитные сценарии и регрессия веб/диагностики).
|
||
status: pending
|
||
isProject: false
|
||
---
|
||
|
||
## Цель
|
||
|
||
Сделать новую прошивку для платы модуля, основанную на проекте `GbTModuleSW30Web`, которая:
|
||
|
||
- **полностью избавлена от GBT-логики и GBT-протоколов**,
|
||
- **использует CCS-алгоритмы и протокол** из проекта `[CS60DC_CCS_STM32](CS60DC_CCS_STM32/Core/Src/main.c)`,
|
||
- **сохраняет силовую часть и веб/диагностический функционал** существующей GBT-прошивки,
|
||
- использует **два независимых UART**: существующий (как в GBT) + новый `USART3` под CCS-протокол,
|
||
- сохраняет **инициализацию CAN1 как заглушку**, но не использует старый GBT‑CAN.
|
||
|
||
## Архитектура на целевом проекте
|
||
|
||
- **Базовый проект**: берем за основу прошивку модуля GBT — `[GbTModuleSW30Web](GbTModuleSW30Web/Core/Src/main.c)`.
|
||
- **Источник CCS-логики**: переносим state machine и протокол CCS из `[CS60DC_CCS_STM32](CS60DC_CCS_STM32/Core/Src/main.c)` и связанных файлов:
|
||
- `[Core/Src/serial.c](CS60DC_CCS_STM32/Core/Src/serial.c)` — протокол MCU↔Everest (через UART, сейчас `huart1`),
|
||
- `[Core/Src/cp.c](CS60DC_CCS_STM32/Core/Src/cp.c)` — формирование и измерение CP (PWM+ADC),
|
||
- `[Core/Src/charger_ccs.c](CS60DC_CCS_STM32/Core/Src/charger_ccs.c)` + соответствующие заголовки и типы `CCS_*` и `CCS_EDCAN_*`.
|
||
- **Распределение UART**:
|
||
- существующий UART из GBT‑прошивки **оставляем без изменений** (диагностика / веб / что используется сейчас),
|
||
- **добавляем `USART3` для CCS‑протокола**, берём настройки (baud, parity и т.п.) из `CS60DC_CCS_STM32` (там CCS сейчас сидит на `USART1`, но параметры переносим на `USART3`).
|
||
- **CAN1**:
|
||
- оставляем `MX_CAN1_Init()` и базовую инициализацию как заглушку (по требованию),
|
||
- старые GBT‑обработчики CAN и `GBT_CAN_ReInit()` удаляем или заменяем пустыми/адаптированными вызовами к EDCAN при необходимости.
|
||
- **Силовая часть, реле, измерения**:
|
||
- логика `PSU_*`, `METER_*`, `CONN_*`, `LED_*` и Stop/E‑Stop остаётся из GBT‑проекта,
|
||
- управление главным DC‑контактором остаётся как в `[GbTModuleSW30Web](GbTModuleSW30Web/Core/Src/main.c)` и связанных файлах, но команды/состояния будут приходить из CCS‑логики.
|
||
|
||
## План изменения `main.c` и ядра логики
|
||
|
||
- **Инициализация (start‑up)**:
|
||
- в `[GbTModuleSW30Web/Core/Src/main.c](GbTModuleSW30Web/Core/Src/main.c)` сохраняем логику OpenBLT/VectorBase (`VectorBase_Config()` и т.п.);
|
||
- после стандартной HAL‑инициализации (`HAL_Init`, `HAL_RCC_DeInit`, `SystemClock_Config`, `MX_GPIO_Init` и т.д.)
|
||
- оставляем инициализацию общих периферий: `GPIO`, `ADC1`, `CAN1`, `RTC`, `TIM4` (если используется для других задач), существующие UART (2/5/1) и `USART3`;
|
||
- **убираем GBT‑специфичные инициализации**: `GBT_Init()`, `GBT_SetConfig()`, `GBT_CAN_ReInit()`, прямые вызовы `charger_gbt.h`, `j1939.h` и т.п.;
|
||
- **добавляем CCS‑инициализации** по образцу из `CS60DC_CCS_STM32/Core/Src/main.c`:
|
||
- `ADC_Init()` (если в проект переносится фильтрация АЦП / `adc_filter.c`),
|
||
- `CP_Init()` и первоначальное `CP_SetDuty(100);`,
|
||
- `CCS_Init();`,
|
||
- инициализацию EDCAN/адреса: `EDCAN_Init(SW_GetAddr());` и возможный `CAN_ReInit();`, если EDCAN используется.
|
||
- **Главный цикл**:
|
||
- исходно в GBT‑прошивке основной цикл делает:
|
||
- `PSU_ReadWrite();`, `PSU_Task();`, `METER_CalculateEnergy();`, `CONN_Loop();`, `LED_Write();`, `StopButtonControl();` и несколько `ED_Delay(...)`, в которых вызываются GBT‑таски (`GBT_ChargerTask()`, `GBT_ManageLockMotor()`, `CONN_CC_ReadStateFiltered()` и т.п.);
|
||
- **заменяем содержимое `ED_Delay()` и цикла `while(1)` так, чтобы:**
|
||
- в основном цикле выполнялись:
|
||
- `CCS_SerialLoop();` (как в `[CS60DC_CCS_STM32/Core/Src/main.c](CS60DC_CCS_STM32/Core/Src/main.c)`),
|
||
- `EDCAN_Loop();` (если EDCAN используется для обмена с главным контроллером),
|
||
- `CP_Loop();` (обновление состояния CP и заполнение `CCS_EDCAN_Output.cpState`),
|
||
- существующие `PSU_*`, `METER_*`, `CONN_Loop()`, `LED_Write()`, `StopButtonControl()`;
|
||
- `ED_Delay()` больше **не опирается на GBT‑таски**, а, при необходимости, просто крутит `CCS_SerialLoop()` / `CP_Loop()` и необязательные сервисные задачи.
|
||
|
||
## Интеграция CCS‑протокола в проект модуля
|
||
|
||
- **Перенос файлов CCS**:
|
||
- добавляем в проект модуля исходники и заголовки из `CS60DC_CCS_STM32`:
|
||
- `[Core/Src/cp.c](CS60DC_CCS_STM32/Core/Src/cp.c)` + `Core/Inc/cp.h`,
|
||
- `[Core/Src/serial.c](CS60DC_CCS_STM32/Core/Src/serial.c)` + `Core/Inc/serial.h`,
|
||
- `[Core/Src/charger_ccs.c](CS60DC_CCS_STM32/Core/Src/charger_ccs.c)` + `Core/Inc/charger_ccs.h`,
|
||
- необходимые типы `CCS_*` и `CCS_EDCAN_*` (структуры состояний, входов/выходов, команд).
|
||
- подправляем include‑пути и зависимости под структуру каталогов `GbTModuleSW30Web`.
|
||
- **Привязка к `USART3`**:
|
||
- в перенесённом `serial.c` заменяем все использования `huart1` на `huart3`:
|
||
- глобальный `extern UART_HandleTypeDef huart1;` → `huart3;`,
|
||
- `HAL_UARTEx_ReceiveToIdle_IT(&huart1, ...)` → `&huart3`,
|
||
- `HAL_UART_Transmit(&huart1, ...)` → `&huart3`;
|
||
- обновляем `HAL_UARTEx_RxEventCallback` так, чтобы он реагировал на `huart3`;
|
||
- убеждаемся, что `MX_USART3_UART_Init()` в `GbTModuleSW30Web/Core/Src/usart.c` настроен на тот же baud/формат, что и `USART1` в `CS60DC_CCS_STM32`.
|
||
- **CP‑цепь (CP ADC + PWM на PA7)**:
|
||
- в переносимом `cp.c` уже есть логика расчёта напряжения CP по `ADC_CP_CHANNEL` и управление PWM через `TIM2`;
|
||
- на целевой плате:
|
||
- настраиваем канал ADC, соответствующий `ADC1_IN4`, как `ADC_CP_CHANNEL` в конфигурационных файлах/enum‑ах ADC;
|
||
- убеждаемся, что ножка `PA7` привязана к нужному таймеру (по CubeMX‑конфигу) и совпадает с тем, что ожидает `cp.c` (сейчас TIM2/CH1/CH2) — при необходимости в план добавим правку конфигурации таймера и каналов;
|
||
- оставляем границы состояний CP (A/B/C/D/E/F) и формулы из текущего `cp.c` без изменений, чтобы поведение соответствовало проверенной CCS‑прошивке.
|
||
- **Связка CCS ↔ силовая часть/EDCAN**:
|
||
- `CCS_SerialLoop()` управляет структурами `CCS_EDCAN_Output` и читает `CCS_EDCAN_Input`;
|
||
- в коде модуля (там, где сейчас GBT‑логика связывает CAN/силовую часть с протоколом) заменяем связь на работу с `CCS_EDCAN_*`:
|
||
- измеренные ток/напряжение из силовой части кладём в `CCS_EDCAN_Input.measuredVoltage` и `measuredCurrent`,
|
||
- команды включения/отключения питания (`PSU_ON/OFF/PREPARE`) и ошибки записываем в `CCS_EDCAN_Input.*`,
|
||
- из `CCS_EDCAN_Output` читаем:
|
||
- `enablePSU`/`requestedVoltage`/`requestedCurrent` — для управления источником питания,
|
||
- `connectorState`, `cpState`, `chargingPercentage` — для индикации, логов и веб‑интерфейса.
|
||
|
||
## Удаление GBT и чистка кода
|
||
|
||
- **Удаление GBT‑зависимостей**:
|
||
- в `GbTModuleSW30Web` находим и удаляем/отключаем:
|
||
- `#include "charger_gbt.h"`, `j1939.h`, GBT‑специфические модули блокировки/замка, если они не используются механически;
|
||
- функции `GBT_Init()`, `GBT_ChargerTask()`, `GBT_ManageLockMotor()`, `GBT_SetConfig()`, `GBT_CAN_ReInit()` и т.п.;
|
||
- оставляем общий код, не завязанный именно на GBT (питание, измерения, коннектор, индикация, веб‑сервер, логирование).
|
||
- **CAN**:
|
||
- инициализация `CAN1` (`MX_CAN1_Init()`) должна остаться, чтобы bootloader/система не сломались;
|
||
- если от GBT остался `CAN2`, его можно выключить из конфигурации, если он аппаратно не используется в CCS‑варианте;
|
||
- при необходимости добавляем простую заглушку вместо старых GBT‑обработчиков, чтобы сборка прошла без ошибок.
|
||
|
||
## Сохранение веб‑/диагностического функционала
|
||
|
||
- **Веб‑интерфейс и диагностика**:
|
||
- по вашему требованию **сохраняем весь существующий веб‑функционал `GbTModuleSW30Web`**, только:
|
||
- удаляем/переписываем поля и страницы, завязанные на GBT‑состояния/параметры,
|
||
- вместо GBT‑переменных и структур подставляем данные из `CCS_EDCAN_Output`, `CCS_State`, `CCS_EvInfo` и т.п.;
|
||
- протокол диагностики через существующий UART не меняем по формату, только отключаем GBT‑команды/состояния и, при необходимости, добавляем новые поля/команды под CCS (по согласованию).
|
||
|
||
## Тестирование и критерии приёмки
|
||
|
||
- **Юнит‑/модульные проверки на стенде**:
|
||
- запуск прошивки без подключенного EV — проверка, что станция в состоянии `Unplugged`/`EV_STATE_A_IDLE`, нет перезагрузок и ошибок;
|
||
- подключение EV/эмулятора:
|
||
- проверка переходов CP‑состояний A→B→C, корректных значений напряжения CP,
|
||
- проверка, что `CCS_ConnectorState` и `CCS_EvseState` меняются ожидаемо (Preparing, Charging, Finished и т.п.);
|
||
- проверка обмена по `USART3`:
|
||
- корректный приём/передача пакетов с CRC16,
|
||
- реакция на команды Everest (ENABLE, START/STOP, PWM_DUTY, SET_OUTPUT_VOLTAGE, EV_INFO, EVSE_STATE, KEEP_ALIVE);
|
||
- проверка защиты:
|
||
- ESTOP/StopButton — немедленное отключение выхода и отправка `CCS_SendEmergencyStop()`;
|
||
- таймаут связи с хостом (`last_host_seen`) — перевод в безопасное состояние (отключение PSU, CP duty = 100%, лог `Everest timeout`).
|
||
- **Регрессионные проверки существующей функциональности**:
|
||
- веб‑страницы открываются, основные параметры (напряжение, ток, энергии, состояния коннектора) отображаются корректно;
|
||
- сохранены привычные логи/формат сообщений (насколько возможно) для удобства отладки.
|
||
|