18 KiB
Универсальное адресное пространство эмуляторов
Общий код находится в templates/c/set-protocol. Прошивка платы задаёт память,
GPIO и аппаратные callbacks; протокол и модели не включают STM32/HAL/USB/ОС,
не выделяют heap и не читают системное время. Все вызовы одного экземпляра
сериализуются главным циклом или блокировкой вызывающего.
Слои и точка расширения
set_regmap.h/.c: таблица непересекающихся регионов и общий вызовset_regmap_request(map, function, address, value, out, capacity, &count). Function 3 читаетvalueслов, function 6 пишет одно слово.set_emu_ump,set_emu_tms,set_emu_igbt,set_wavegen: независимые экземпляры моделей. Callbacks получают относительный offset, а не внешний адрес. Один модуль можно разместить несколько раз по разным адресам.set_emu_server: готовая композиция для текущего стенда, режим УМП/2812, подготовка настроек с применением через 500 тиков.set_regmap_rtuиset_regmap_can: готовые транспортные кодеки над одной картой.set_emu_server_rtu/canдополнительно сохраняют legacy поведение стенда. USB CDC, UART, TCP или иной поток только доставляет полный RTU-кадр. Другой протокол разбирает собственную оболочку и вызываетset_regmap_request.
Вызов с неизвестной функцией возвращает 1; неизвестный адрес, RO-запись,
чтение через границу региона — 2; неверное значение или размер буфера — 3;
ошибка аппаратного порта — 4; занятый модуль — 6. При ошибке count=0.
Длина успешного чтения равна запрошенной, запись возвращает адрес/значение.
Максимум — 124 слова. RTU-обёртка требует буфер 253 байта до выполнения команды;
CAN — 124 слова. Недостаточный буфер не может выполнить запись без ответа.
При ошибке содержимое выходного буфера не используется.
set_regmap_init проверяет границы 16-битного пространства, пересечения,
права и callbacks. Таблица и состояния принадлежат вызывающему и должны жить
дольше карты. После регистрации таблица неизменна; для изменения карты
инициализируйте её заново в момент, когда нет обслуживаемых запросов.
Каталог и стандартная карта
Каталог доступен на адресе 0 через любой транспорт.
| Слово заголовка | Значение |
|---|---|
| 0 | 0x5345, сигнатура SE |
| 1 | версия каталога 1 |
| 2 | количество регионов |
| 3 | начало дескрипторов: 8 |
| 4 | длина дескриптора: 8 |
| 5 | максимум слов в одном чтении: 124 |
| 6, 7 | резерв: 0 |
Дескриптор: kind, version, instance, base, words, flags, 0, 0.
Flags: bit0 чтение, bit1 запись. Права описывают возможности региона;
отдельные регистры внутри могут быть только для чтения. Пропуски внутри
региона возвращают ошибку, если модуль их не поддерживает.
| Kind | Стандартный адрес | Размер | Модуль |
|---|---|---|---|
| 1 | 0x1000 | 0x17C | УМП: статус, окно, онлайн |
| 2 | 0x1200 | 36 | управление, конфигурация и indexed capability |
| 3 | 0x1300 | 8 | генератор DAC |
| 4 | 0x1400 | 112 | IGBT, версия 3 |
| 5 | 0x1500 | 80 | 2812 через регистры |
| 6 | 0x2000 | capacity × 40 | архив/банк УМП |
| 7 | 0xA000 | wave capacity | таблица DAC |
Эта карта — готовая композиция, а не требование к новым платам.
set_regmap позволяет выбирать адреса, подмножество и несколько экземпляров
модуля; каталог сообщает фактическую карту. Настройка UART и выбор УМП/2812
принадлежат только готовому set_emu_server. Максимальная ёмкость УМП
в этой карте — 819 записей на банк; текущая STM32 использует 800.
В режиме 2812 прямое обращение к регистрам УМП возвращает busy, legacy RTU/CAN к этим диапазонам игнорируются для совместимости. Остальные сервисы и каталог доступны. Регистры управления 2812 принимают запись только в режиме 2812. Чтение его состояния не запускает модель.
IGBT
Предыдущий локальный диапазон IGBT 0x1300 конфликтовал с DAC. Его alias сохранить нельзя: он обращается к генератору. Используйте каталог kind=4 или новый стандартный адрес 0x1400.
| Offset | Назначение |
|---|---|
| 0, 1 | 0x4947, версия 3 |
| 2 | enable 0/1; выключение сразу очищает состояние RX и ожидаемые ACK |
| 3 | чтение последнего TX; запись подготовленной TX-маски |
| 4 | RX-маска |
| 5 | резерв 0 |
| 6 | FAULT-маска 0…255 |
| 7 | задержка ACK 0…1000 мс |
| 8 | ширина ACK 1…255 мс |
| 9 | счётчик фронтов modulo 65536; запись 0 сбрасывает |
| 10 | число каналов 8 |
| 11 | один шаг модели = 1 мс |
| 12 | источник TX: 0 переданные GPIO, 1 подготовленная маска |
| 13 | подготовленная TX-маска, чтение/запись |
| 14 | запись маски запуска одиночного TX; чтение 0 |
| 15 | длина записи канала: 12 слов |
Версия 3 сохраняет первые 14 регистров. Общие delay/width при записи устанавливают значения для всех каналов; при чтении показывают последнее общее задание, а не поканальные значения. Полное состояние: FC03 0x1400 / 112 слов. Запуск TX требует enabled=1, source=1, разрешённого TX канала и низкого TX; повторный запуск высокого TX отвергается кодом 6. Длительность отсчитывает сама модель, не клиент COM. Ручная запись TX отменяет все текущие TX-импульсы. Выключение эмуляции отменяет импульсы и сбрасывает их TX; статическое задание TX сохраняется. PB остаются входами: тестовый TX — внутренняя подстановка, физическая обратная связь RX выводится на PC0…PC7.
Поканальные регистры: 0x1410 + 12 * channel, channel=0…7.
| Offset канала | Значение |
|---|---|
| 0 | flags: bit0 разрешение TX, bit1 разрешение RX, bit2 ACK active-low |
| 1 | RX mode: 0 ACK, 1 физический 0, 2 физическая 1, 3 пропуск ACK |
| 2, 3 | задержка ACK ON 0…1000 мс, ширина 1…1000 мс |
| 4, 5 | задержка ACK OFF 0…1000 мс, ширина 1…1000 мс |
| 6 | одиночный TX: 1…60000 мс |
| 7 | маска фронтов для ACK: bit0 ON, bit1 OFF |
| 8 | ширина FAULT 1…60000 мс; 0 — удержание до снятия FAULT |
| 9 | RO счётчик фронтов канала, modulo 65536 |
| 10, 11 | RO оставшаяся задержка / длительность ACK в мс |
Изменение flags/mode отменяет ожидаемый и активный ACK канала. Отключённый RX и выключенная модель всегда дают физический 0. Инверсия применяется к автоматическому ответу и idle при пропуске ACK; ручные уровни 0/1 не инвертируются. Сброс общего счётчика сбрасывает и канальные. FAULT моделирует длинный/удерживаемый ответ после фронта; это не модель Vce, Vge, DESAT, внутренней защиты или блокировки конкретного силового драйвера.
set_igbt_tick(state, pins) получает маску входов от порта платы.
Фронт на тике T запускает ACK на T+delay. Повторный фронт до начала ACK
перезапускает задержку; это определённая модельная обработка слишком частых команд.
Каждый из восьми каналов независим. FAULT удерживает RX после его активации;
снятие FAULT освобождает только ранее аварийные каналы и сохраняет обычные ACK.
Чтобы TX через регистры не перезаписывался GPIO, выберите source=1.
Текущая IGBT-модель имеет шаг 1 мс. Она проверяет логическую последовательность Vin/Vstat, но не воспроизводит ACK 250/380 нс и ширины профилей 1SP/1SD в DSLogic. Такую аппаратную точность нельзя получить переносом модели или вызовом из SysTick: для неё требуется отдельный быстрый аппаратный порт и соответствующая модель времени.
2812
Состояние едино для legacy CMD_STD и адресного API:
| Offset | Назначение |
|---|---|
| 0, 1 | 0x544D, версия 1 |
| 2, 3, 4 | running, частота и задание (int16 ×100 Гц) |
| 8…11 | четыре подготовленных analog int16 |
| 12…17 | шесть подготовленных управляющих байт (значение 0…255) |
| 18 | записать 1: атомарно применить подготовленную команду |
| 32…45 | 28 байт дискретов; младший байт слова — первый байт |
| 46…79 | 34 аналоговых int16 |
| остальные | чтение 0 |
Модель остаётся упрощённой BALZAM_7: Go, выбор remote, Setspeed, разгон 10 Гц/с и синтетическая телеметрия. Legacy CMD_STD имеет отдельный адрес 2812, запрос 18 и ответ 101 байт, с проверкой CRC до изменения состояния. Буфер ответа менее 101 байта запрещает выполнение команды.
УМП и DAC
УМП сохраняет прежние записи по 40 слов, банк/архив, фронтовой триггер,
постинтервал 1000 мс и indexed-чтение без изменения курсора. Два разных
буфера по capacity*40 слов предоставляет плата. Размещение SRAM/CCM
не является частью библиотеки.
DAC использует прежний set_wave_port с start/stop, транзакционную загрузку,
commit, чтение таблицы и запрет изменений при работе. Регистровые callbacks
и прежний set_wave_rtu вызывают одну реализацию. До повторного init вызывающий
останавливает аппаратный вывод; библиотека не угадывает текущее состояние DMA.
Обёртки и новая плата
Пример: ports/example-emulator/service.c. Он регистрирует два экземпляра IGBT и показывает прямой, RTU и CAN вызов. Порт новой платы должен:
- Создать состояния и таблицу регионов, вызвать init и проверить результат.
- Предоставить буферы и аппаратный DAC-порт, если нужен генератор.
- Передавать реальные тики и входы; читать результат модели и обновлять GPIO.
- Доставлять запросы через выбранную оболочку в одну карту, сериализуя доступ.
CAN-envelope совместим с UMP: BE address/value/0x1F00/token/function. Идентификаторы CAN и маршрутизацию задаёт порт. Ответ делится по два слова, нечётное чтение дополняется нулём до чётного числа; клиент отбрасывает последнее слово по длине исходного запроса. Токен 1…255; один незавершённый ответ на соединение. Проверенная копия слов хранится до отправки всех фрагментов.
set_emu_stream — только сборщик известных запросов FC03/FC06 и CMD_STD,
по одному экземпляру на поток. Он принимает монотонные uint32 миллисекунды,
сохраняет кадр между USB-пакетами, сбрасывает незавершённый после паузы >1000 мс
и восстанавливается после плохого CRC. Это не универсальный Modbus-парсер
FC16/FC23: для другого формата нужна другая тонкая оболочка.
Сборка и проверки
C99-ядро подключается через setprotocol_static/DLL, определения публичного
API экспортируются через PCAN_ABI_API. Включить set_regmap.h или
set_emu_server.h. Для иной архитектуры проверить наличие uint8/16/32_t;
существующий 16-битный C28x octet-порт UMP остаётся отдельным, этот новый
байтовый API пока не проверен TI-компилятором.
test_emulator_services.c проверяет каталог, пересечения, границы и короткие
буферы, два экземпляра, переназначение адресов, RTU/CAN/stream, совместное
состояние 2812 и DAC, длинные задержки IGBT и освобождение FAULT.
Существующие тесты прошивки дополнительно проверяют архив УМП, USB-фрагментацию,
смену режима/адресов и совместимость с декодерами SETGUI.
Выбор единственного эмулятора
В SETGUI: «Эмулятор → Настройки STM → Тип эмулятора», затем «Применить в STM и проверить» и «Открыть управление эмулятором». Конфигурация версии 3: режим 0 — УМП, 1 — 2812, 2 — IGBT, 3 — ЦАП. Регистр 0x1219 подготавливает режим; 0x1218 = 0xA55A применяет его через 500 мс после подтверждения. Статус FC03 0x1210 / 10 слов содержит версию 3, действующий режим в слове 8 и подготовленный в слове 9.
При смене режима останавливаются TIM6/DMA/DAC, ЦАП устанавливается в ноль, IGBT отключается и его выходы обнуляются, 2812 сбрасывается, УМП останавливается. Новый режим не запускается автоматически. Для IGBT нужно явно включить эмуляцию; для ЦАП заново загрузить таблицу и дать команду пуска. Повторное применение того же режима не прерывает текущую работу. Записи невыбранным IGBT/ЦАП/2812 отклоняются с кодом 6; чтение статуса и явные команды остановки IGBT/ЦАП доступны. Настройки связи доступны всегда. После сброса выбран УМП, IGBT выключен, ЦАП не запущен.