# Проект 166 для CCS 12 Настройки перенесены из проекта 167. Имя проекта в CCS: `Balsam_166`. ## Импорт и сборка 1. В CCS выберите **Project → Import CCS Projects** и укажите эту папку (`166/UKSSTMS320F28335`). 2. Импортируйте проект без **Copy projects into workspace**: исходники и библиотеки подключены из родительской папки по относительным путям. 3. Выберите конфигурацию **Debug** и выполните **Build Project**. Используется TI C2000 Compiler **22.6.1.LTS**, TMS320F28335, FPU32 и COFF ABI. Сохранены настройки компиляции, линковки и преобразования прошивки из 167. Исходники берутся из `166/Source`, linker-файл — `166/F28335.cmd`. Файл `28335_RAM_lnk.cmd`, как и в 167, исключён из сборки. Результаты сборки находятся в `166/Bin`: `UKSSTMS320F28335.out`, `UKSSTMS320F28335.hex` (Intel HEX) и `UKSSTMS320F28335_.bin`. Рядом с BIN создаются `<имя>.bin.manifest.json` и `<имя>.bin.sha256`. Build ID содержит восемь символов: восемь цифр ревизии либо семь цифр и `+` при изменённых исходниках или общей библиотеке. При недоступном Git общий контракт 167 использует `NOGIT000`; для выпуска следует проверить ревизии `source` и `templates` в манифесте. Время паспорта хранится в UTC. Prebuild `prepare_identity.py` использует тот же генератор firmware-info, что 167, но product равен `Balsam-166-PM35`. Единственный источник версии — `firmware_version.h`; первый выпуск с паспортом имеет версию **1.0.0**. Обязательный `generated/firmware_identity.h` создаётся до компиляции. Postbuild `build_identity.py` использует hex2000 из выбранного компилятора CCS, общий манифест и SHA-256, затем независимо проверяет наличие ровно одного соответствующего 12-словного паспорта в SCI8. Старый OUT без паспорта или BIN с чужими полями не публикуется. Превышение границы параметров EEPROM **32508 байт** также останавливает выпуск. Архивы сохраняются локально в `UKSSTMS320F28335/Debug/firmware`; записи в репозиторий GUI нет. `build_bin.bat` сохраняет ручную точку входа для уже скомпилированного OUT, но теперь также требует его совпадения с паспортом соответствующего prebuild. Простая конверсия старой прошивки не может создать ей достоверную версию. Карта линковки остаётся в корне 166, карта конверсии — в `166/Bin`. ## Проверка прошивки в SetGUI Из 167 точечно перенесён контракт firmware-info v1: FC03, адрес **0x1200**, **12 регистров**, версия, дата UTC и Build ID. Чтение доступно также через существующий служебный CAN; запись в паспорт запрещена. Технологическая карта, логгер v4 с записью 12 слов, управление и CAN ID не меняются. В GUI выберите модель **«Бальзам-166 · ПМ35»**, новый BIN и оставьте рядом его `.bin.manifest.json`. После записи EEPROM перезапустите плату и нажмите чтение версии: продолжающая работать старая прошивка ещё не имеет окна 0x1200 и отвечает `Modbus 2`. Надпись CRC OK при записи подтверждает запись EEPROM, а версия начнёт читаться после запуска нового образа. Сравнение версий и SHA-256 манифеста не является измерением SHA всей памяти платы. `python tests/firmware_identity/run_test.py` проверяет реальные обработчики RS/CAN, все слова паспорта, CRC, частичные чтения, границы, запрет записи, сохранность старой карты и логгера. Отдельно проверяются устаревшие и повреждённые SCI8, предел EEPROM и действующий анализатор манифеста SetGUI. Проверено: импорт и полная сборка **Debug** в CCS **12.7.1** с компилятором **22.6.1.LTS**, включая генерацию HEX/BIN, завершились без ошибок. Есть шесть предупреждений в существующих `peripher.c` и `measure.c` (преобразование знака, выход результата за диапазон и отсутствие перевода строки в конце файла). Проверка на устройстве не выполнялась. Перенос паспорта дополнительно проверен полной пересборкой и линковкой TI C2000 **22.6.0.LTS** и host-тестами под GCC с оптимизацией O3. Проверенный SCI8 BIN занимает **30248 байт**, запас до параметров EEPROM — **2260 байт**. Совпадение встроенного паспорта, манифеста и результата штатного анализатора SetGUI проверено программно; обмен новой прошивки с физической платой требует её установки и перезапуска. Конфигурация **Release** перенесена из 167 без изменений и не проверялась; для сборки прошивки используйте **Debug**. ## Телеметрия CAN: heartbeat, изменения и повтор 1,3 с Для всех Mode технологические пакеты выбранных масками регистров R0–R127 передаются при первом снимке, изменении любого из трёх слов или через 1300 мс после последнего успешного CAN ACK этого пакета. Неудачная попытка не обновляет подтверждённый снимок. Конечные пакеты карты дополняются нулями за R127. Сканирование изменений идёт по Timer1 с шагом 20 мс; готовая очередь выдаётся по мере освобождения mailbox, без ожидания нового периода между её кадрами. Фактическую отправку могут задержать занятая шина, ошибки и работа main. Heartbeat отправляется независимо раз в секунду: адрес `0x0100`, затем три 16-битных слова — счётчик секунд, Mode, Desk. После задержки main отправляется последнее значение, без очереди пропущенных секундных кадров. Ноль в `Cancount[0]` или `Cancount[1]` по-прежнему отключает данные соответствующей маски. Любое ненулевое значение включает новый режим изменения/1300 мс; прежний числовой делитель периода больше не используется. Heartbeat остаётся включённым при отключённых потоках данных. Параметры EEPROM не переносятся. После ошибки TX новая попытка разрешается через секунду без ожидания в цикле. Проверка без CAN-адаптера: `python tests/can_telemetry/run_test.py`.