Реализовать наносекундное управление IGBT для HOPE STM32G474 и клиент обмена с проверкой версии и записанных параметров. Расширить Android/JNI API DEIF, настройки и локальную симуляцию; добавить тесты и документацию.
45 lines
7.5 KiB
C
45 lines
7.5 KiB
C
#ifndef SET_IGBT_REALTIME_H /* Исключает повторное объявление интерфейса аппаратного IGBT версии 4. */
|
|
#define SET_IGBT_REALTIME_H /* Отделяет наносекундный протокол от прежней миллисекундной модели версии 3. */
|
|
#include "set_regmap.h" /* Использует общие коды ошибок и ABI библиотеки регистров. */
|
|
#ifdef __cplusplus /* Сохраняет совместимость общего C-интерфейса с потребителями C++. */
|
|
extern "C" { /* Запрещает изменение имён экспортируемых функций компилятором C++. */
|
|
#endif /* Завершает условное начало C ABI. */
|
|
#define SET_IGBT_RT_CHANNELS 8u /* Число независимых входных и выходных трактов стенда. */
|
|
#define SET_IGBT_RT_WORDS 112u /* Сохраняет размер окна: заголовок 16 слов и восемь каналов по 12 слов. */
|
|
#define SET_IGBT_RT_MIN_NS 50u /* Минимальный программируемый интервал 50 нс оставляет запас относительно трёх тактов HRTIM при 160 МГц. */
|
|
#define SET_IGBT_RT_MAX_NS 60000u /* Максимальные 60000 нс помещаются в 16-битный регистр протокола. */
|
|
typedef struct { /* Задания одного канала; времена всегда выражены целыми наносекундами. */
|
|
uint16_t flags, mode, on_delay, on_width, off_delay, off_width; /* Биты TX/RX/инверсии, режим ответа и времена начала/ширины ACK для двух фронтов. */
|
|
uint16_t tx_width, edges, fault_width, compensation; /* Длительность физического TX, маска ON/OFF, длительность FAULT и измеренная компенсация входного тракта, нс. */
|
|
} set_igbt_rt_channel; /* Независимый аппаратный канал не содержит миллисекундных счётчиков. */
|
|
typedef struct { /* Полное задание применяется одной завершающей командой после записи полей. */
|
|
uint16_t enabled, source, tx, fault; /* Разрешение выходов, 0=внешний Vin/ACK, 1=физический генератор TX, маски удержания TX и неисправностей. */
|
|
set_igbt_rt_channel channel[SET_IGBT_RT_CHANNELS]; /* Восемь одинаковых настроек хранятся отдельно от работающего оборудования. */
|
|
} set_igbt_rt_config; /* Подготовленные настройки не меняют уже работающие таймеры до применения. */
|
|
typedef struct { /* Снимок получает фактические уровни и диагностические счётчики аппаратного порта. */
|
|
uint8_t tx, rx, busy; /* Вход Vin/выход TX, выход ACK/вход Vstat и маска выполняемых одиночных импульсов. */
|
|
uint16_t count[SET_IGBT_RT_CHANNELS], overrun[SET_IGBT_RT_CHANNELS]; /* Счётчики принятых фронтов и потерь захвата по каждому каналу, по модулю 65536. */
|
|
} set_igbt_rt_snapshot; /* Чтение снимка не запускает импульсы и не сбрасывает накопленные события. */
|
|
typedef struct { /* Аппаратный порт выполняет фронты таймерами; общий модуль только проверяет и маршрутизирует команды. */
|
|
unsigned (*selected)(void *); /* Возвращает ненулевое значение только для подтверждённого режима IGBT платы. */
|
|
unsigned (*apply)(void *, const set_igbt_rt_config *); /* Настраивает весь проверенный профиль; ошибка должна оставлять прежнее оборудование без изменения. */
|
|
unsigned (*pulse)(void *, uint8_t); /* Одновременно проверяет и запускает выбранные биты физического TX; длительность отмеряет оборудование. */
|
|
void (*levels)(void *, uint8_t); /* Выставляет постоянные уровни TX только после проверки отсутствия выполняемых импульсов. */
|
|
void (*stop)(void *); /* Немедленно отключает аппаратные триггеры и переводит все восемь выходов в ноль. */
|
|
void (*sample)(void *, set_igbt_rt_snapshot *); /* Снимает уровни, занятость и счётчики без формирования фронтов программными задержками. */
|
|
void (*clear)(void *); /* Сбрасывает только счётчики диагностики, сохраняя настройки и работу таймеров. */
|
|
} set_igbt_rt_port; /* Переносимый слой не зависит от HAL, ОС или частоты опроса GUI. */
|
|
typedef struct { /* Единственный экземпляр сервиса принадлежит вызывающему аппаратному проекту. */
|
|
set_igbt_rt_config staged, active; /* Подготовленный и реально применённый профили предотвращают изменение времён посреди записи регистров. */
|
|
set_igbt_rt_port port; /* Копия таблицы callbacks живёт столько же, сколько сам сервис. */
|
|
void *context; /* Непрозрачное состояние аппаратного порта передаётся каждому callback без владения памятью. */
|
|
} set_igbt_rt; /* Сервис не выделяет динамическую память и не обслуживает наносекундные сроки из основного цикла. */
|
|
PCAN_ABI_API void set_igbt_rt_init(set_igbt_rt *, const set_igbt_rt_port *, void *); /* Создаёт выключенный профиль 1SP: задержка 250 нс, ACK 700 нс, TX 10000 нс. */
|
|
PCAN_ABI_API unsigned set_igbt_rt_validate(const set_igbt_rt_config *); /* Проверяет все восемь каналов до изменения оборудования. */
|
|
PCAN_ABI_API unsigned set_igbt_rt_read(void *, uint16_t, uint16_t, uint16_t *); /* Читает окно версии 4; смещения и число слов заданы в 16-битных регистрах. */
|
|
PCAN_ABI_API unsigned set_igbt_rt_write(void *, uint16_t, uint16_t); /* Записывает задание либо выполняет явную команду пуска, останова или сброса счётчиков. */
|
|
#ifdef __cplusplus /* Закрывает C ABI только при компиляции заголовка как C++. */
|
|
} /* Завершает блок внешних C-объявлений. */
|
|
#endif /* Завершает условную поддержку C++. */
|
|
#endif /* Завершает защиту заголовка аппаратного IGBT. */
|