diff --git a/c/firmware-info/tools/identity.py b/c/firmware-info/tools/identity.py index 5d7fd0c..fd01f92 100644 --- a/c/firmware-info/tools/identity.py +++ b/c/firmware-info/tools/identity.py @@ -13,6 +13,7 @@ import json import os from pathlib import Path import subprocess +import tempfile # Резервирует номер сборки через временный файл на том же диске, как общий итератор ветки 166. def git_state(repository: Path) -> dict: @@ -36,20 +37,46 @@ def git_state(repository: Path) -> dict: def write_atomic(path: Path, text: str): path.parent.mkdir(parents=True, exist_ok=True) temporary = path.with_name(path.name + ".tmp") - temporary.write_text(text, encoding="utf-8", newline="\n") + with open(temporary, "w", encoding="utf-8", newline="\n") as stream: # Сохраняет UTF-8 и LF также на Python 3.8, где Path.write_text ещё не принимает newline. + stream.write(text) # Полностью записывает заголовок или паспорт перед атомарной заменой целевого файла. temporary.replace(path) -def prepare(repository: Path, templates: Path, config: Path, output: Path) -> dict: - settings = json.loads(config.read_text(encoding="utf-8")) - version = settings["version"] - if (len(version) != 3 or any(type(v) is not int for v in version) - or not all(0 <= v <= limit for v, limit in zip(version, (255, 255, 999)))): - raise ValueError("version must be [major 0..255, minor 0..255, patch 0..999]") +def next_version(version): # Повторяет общий итератор 166 и переносит переполнение младшего разряда в старший. + result = list(version) # Не изменяет исходный номер до проверки полного переполнения. + for index, limit in ((2, 999), (1, 255), (0, 255)): # Контракт firmware-info v1 допускает patch 0..999 и major/minor 0..255. + if result[index] < limit: # Выбирает младший разряд, который ещё допускает увеличение. + result[index] += 1 # Занимает следующий номер попытки сборки ровно один раз. + return result # Возвращает новый номер с сохранёнными старшими и обнулёнными переполненными младшими разрядами. + result[index] = 0 # Переносит единицу к следующему разряду при достижении предела текущего. + raise ValueError("Firmware version exhausted at 255.255.999") # Не допускает повторного использования версии после полного переполнения контракта. + + +def prepare(repository: Path, templates: Path, config: Path, output: Path) -> dict: # Формирует один паспорт текущей попытки после сохранения номера автоматической сборки. + settings = json.loads(config.read_text(encoding="utf-8-sig")) # Принимает исходный JSON в UTF-8, включая старые файлы Windows с BOM. + version = settings["version"] # Начальный номер берётся из единственного сохраняемого источника проекта. + if not isinstance(version, list) or len(version) != 3 or any(type(value) is not int or not 0 <= value <= limit for value, limit in zip(version, (255, 255, 999))): # Проверяет три целых разряда и пределы протокола до изменения JSON. + raise ValueError("version must be [major 0..255, minor 0..255, patch 0..999]") # Останавливает prebuild при неверном формате счётчика. + if type(settings.get("increment_version", False)) is not bool: # Старые проекты сохраняют ручной режим; автоматический требует настоящего логического true. + raise ValueError("increment_version must be true or false") # Не принимает строки и числа вместо явной настройки счётчика. for field in ("product", "target"): if not isinstance(settings.get(field), str) or not settings[field].strip(): raise ValueError(f"missing {field}") - source, dependency = git_state(repository), git_state(templates) + if settings.get("increment_version", False): # Увеличение выполняется только при подготовке основного проекта, а не при упаковке RAM, CAN и Flash. + version = settings["version"] = next_version(version) # Один вычисленный номер используется исходным JSON, генерируемым заголовком и паспортом. + with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", newline="\n", dir=config.parent, prefix=".firmware-version-", delete=False) as stream: # Временный файл рядом с JSON позволяет атомарную замену счётчика на том же диске. + temporary = Path(stream.name) # Запоминает только собственный файл для очистки при отказе сохранения. + try: # Ошибка записи должна сохранить исходный JSON и удалить незавершённый временный файл. + stream.write(json.dumps(settings, ensure_ascii=False, indent=2) + "\n") # Сохраняет новый номер и все дополнительные настройки проекта в UTF-8. + except BaseException: # Освобождает собственный файл также при прерывании процесса записи. + stream.close() # Windows разрешает удалить временный файл после закрытия его дескриптора. + temporary.unlink() # Удаляет только незавершённый файл этой попытки резервирования номера. + raise # Возвращает исходную ошибку вместо продолжения сборки с несохранённой версией. + try: # Номер должен быть надёжно занят до генерации выходов и начала компиляции. + temporary.replace(config) # Атомарно фиксирует счётчик, чтобы следующая попытка не повторила номер при последующей ошибке сборки. + finally: # При неудачной замене исходный JSON остаётся прежним, а собственный временный файл очищается. + temporary.unlink(missing_ok=True) # После успешного переименования файла уже нет; Python 3.8 поддерживает missing_ok. + source, dependency = git_state(repository), git_state(templates) # Отмечает изменённый счётчик в происхождении текущего выпуска после резервирования номера. # A clean application built with a modified templates checkout is dirty too. known = source["commit"] is not None and dependency["commit"] is not None dirty = bool(source["dirty"] or dependency["dirty"]) diff --git a/c/protocan-boot/.gitignore b/c/protocan-boot/.gitignore new file mode 100644 index 0000000..01b5059 --- /dev/null +++ b/c/protocan-boot/.gitignore @@ -0,0 +1,8 @@ +# Результаты отдельных конфигураций CCS воспроизводятся установленным TI compiler. +/projects/ccs/*/Debug/ +/projects/ccs/*/Release/ +# Служебные локальные настройки IDE и launch не входят в переносимый проект. +/projects/ccs/*/.settings/ +/projects/ccs/*/.launches/ +# Python cache не является исходником общего модуля или проекта. +**/__pycache__/ diff --git a/c/protocan-boot/CMakeLists.txt b/c/protocan-boot/CMakeLists.txt index 2548300..523ad00 100644 --- a/c/protocan-boot/CMakeLists.txt +++ b/c/protocan-boot/CMakeLists.txt @@ -1,6 +1,6 @@ -# РЎР±РѕСЂРєР° библиотеки protocan_boot. Состав РёСЃС…РѕРґРЅРёРєРѕРІ Рё публичные include-пути задают -# подключение Рє проекту потребителя. Файл также собирает Рё регистрирует хостовые проверки; -# запускать РёС… следует через CTest РёР· каталога СЃР±РѕСЂРєРё. +# Общая C99-библиотека ProtoCAN Boot и аппаратно независимые host-тесты. +# Каждый контроллер сохраняет собственное состояние и отдельный аппаратный порт. +# Дополнительные проекты CCS находятся в projects/ccs и не требуют CMake для TI-сборки. cmake_minimum_required(VERSION 3.13) project(protocan_boot C) @@ -17,7 +17,7 @@ else() target_compile_options(protocan_boot PRIVATE -Wall -Wextra -Wpedantic) endif() -option(PCAN_BOOT_BUILD_TESTS "Собирать тесты ProtoCAN boot" ON) +option(PCAN_BOOT_BUILD_TESTS "Собирать тесты ProtoCAN Boot" ON) # Не включает host-модели в код MCU. if(PCAN_BOOT_BUILD_TESTS) enable_testing() add_executable(test_pcan_boot tests/test_pcan_boot.c) @@ -45,3 +45,12 @@ if(PCAN_BOOT_BUILD_TESTS) add_test(NAME f28335_store_${width} COMMAND test_f28335_store_${width}) endforeach() endif() + +if(PCAN_BOOT_BUILD_TESTS) # Подключает настоящий аппаратно независимый драйвер NOR F2812 и регрессию длительного BUSY. + add_executable(test_f2812_nor tests/test_f2812_nor.c src/pcan_boot.c ports/tms320f2812/nor_flash.c ports/tms320f2812/boot_store.c) # Компилирует production-код вместе с x16 моделью чипа. + target_compile_definitions(test_f2812_nor PRIVATE PCAN_BOOT_WIDE_BYTES BOOT2812_HOST) # Октеты C28x широкие; подменяется только физическая шина памяти. + add_test(NAME f2812_nor COMMAND test_f2812_nor) # Регистрирует проверки CRC, SCI8, границ, manifest и отказов NOR. + add_executable(test_pcan_busy tests/test_pcan_busy.c src/pcan_boot.c) # Использует тот же codec, который обслуживает длинные аппаратные операции. + target_compile_definitions(test_pcan_busy PRIVATE PCAN_BOOT_WIDE_BYTES) # Проверяет wire-статус при 16-битном представлении октета C28x. + add_test(NAME pcan_busy COMMAND test_pcan_busy) # Регистрирует проверку продления session при живом прогрессе erase. +endif() # Включение библиотек без тестов не добавляет host-модель в прошивку. diff --git a/c/protocan-boot/README.md b/c/protocan-boot/README.md index b1bb5c7..9aa74e8 100644 --- a/c/protocan-boot/README.md +++ b/c/protocan-boot/README.md @@ -180,8 +180,14 @@ ctest --test-dir build --output-on-failure ## F28335 / большая EEPROM -[Порт M95M02](ports/tms320f28335/README.md) подключён в `tms_periph/periph_167`. +[Порт M95M02](ports/tms320f28335/README.md) подключён в `28335_periph`, ветка 167. Использует отдельный Flash-загрузчик и два слота EEPROM по 130560 байт. Реализованы readback/CRC, проверка SCI8, журнал метаданных, пробный запуск, CONFIRM/откат, PING/discovery и сервисный паспорт. Первичная установка Flash- загрузчика и выбор Flash boot описаны в README порта. + +## Самостоятельные проекты CCS + +Готовые проекты **F28335_CAN_AB** (M95M02) и **F2812_CAN_NOR** (AM29LV800BT), +включая необходимые файлы поддержки TI, находятся в `projects/ccs`. +[Импорт, сборка, карты памяти и установка](projects/README.md). diff --git a/c/protocan-boot/include/pcan_boot.h b/c/protocan-boot/include/pcan_boot.h index cf9f7a9..8fc830e 100644 --- a/c/protocan-boot/include/pcan_boot.h +++ b/c/protocan-boot/include/pcan_boot.h @@ -52,7 +52,8 @@ typedef enum { PCAN_BOOT_CMD_PING = 0x0CU, PCAN_BOOT_CMD_CAPABILITIES = 0x0DU, PCAN_BOOT_CMD_DEVICE_NAME = 0x0EU, - PCAN_BOOT_CMD_MEMORY_INFO = 0x0FU + PCAN_BOOT_CMD_MEMORY_INFO = 0x0FU, /* Сохраняет существующий номер постраничного паспорта памяти. */ + PCAN_BOOT_CMD_SELECT_MEMORY = 0x10U /* Выбирает 0=штатное хранилище, 1=внутренняя Flash до передачи метаданных. */ } pcan_boot_command_t; typedef enum { @@ -127,6 +128,7 @@ typedef struct { /** Optional precise result, replacing legacy boolean verify_image. */ pcan_boot_status_t (*verify_status)(void *user, pcan_boot_byte_t slot, const pcan_boot_manifest_t *manifest); + pcan_boot_status_t (*select_memory)(void *user, pcan_boot_byte_t memory, pcan_boot_config_t *config); /* Необязательный порт явно переключает назначение образа до ERASE; старые порты возвращают INVALID_COMMAND. */ } pcan_boot_port_t; typedef struct { @@ -164,6 +166,9 @@ bool pcan_boot_process(pcan_boot_t *boot, uint32_t can_id, /** Call regularly with a wrapping monotonic millisecond clock. */ void pcan_boot_poll(pcan_boot_t *boot, uint32_t now_ms); +uint32_t pcan_boot_crc32_update(uint32_t crc, const pcan_boot_byte_t *data, size_t length); /* Общий потоковый CRC32 для readback аппаратных хранилищ; начальное состояние равно нулю. */ +bool pcan_boot_report_busy(pcan_boot_t *boot, pcan_boot_byte_t command, uint32_t now_ms); /* Долгие аппаратные операции сообщают BUSY тем же codec и той же session, что обычный ответ. */ + /** Переносимые операции с 29-битным ProtoCAN ID. */ uint32_t pcan_boot_make_id(pcan_boot_byte_t priority, pcan_boot_byte_t route, pcan_boot_byte_t device_type, pcan_boot_byte_t device_id, diff --git a/c/protocan-boot/ports/tms320f2812/README.md b/c/protocan-boot/ports/tms320f2812/README.md new file mode 100644 index 0000000..5f59dc9 --- /dev/null +++ b/c/protocan-boot/ports/tms320f2812/README.md @@ -0,0 +1,15 @@ +# F2812 / AM29LV800BT + +Самостоятельный проект, карта NOR, параметры CAN, установка и ограничения +описаны в [общей инструкции CCS](../../projects/README.md). + +- `boot2812.h` — физические CPU word-адреса и отдельная совместимость F2812; +- `nor_flash.c` — x16 AMD driver с ID, ограниченными program/sector erase, + DQ7/DQ5 polling, readback и BUSY; +- `boot_store.c` — упаковка октетов, проверка всей SCI8-таблицы, CRC32, + публикация manifest последними magic-словами, проверенная загрузка RAM; +- `projects/ccs/f2812/board.c` — подтверждённые линии CPLD и XINTF ПМ67; +- `projects/ccs/f2812/main.c` — независимые eCAN/IRQ/очередь/main F2812. + +Протокол и CRC повторно используются из `src/pcan_boot.c`. EEPROM отсутствует; +код F28335 и его A/B-журнал не подключаются к этому проекту. diff --git a/c/protocan-boot/ports/tms320f2812/boot2812.h b/c/protocan-boot/ports/tms320f2812/boot2812.h new file mode 100644 index 0000000..5025d04 --- /dev/null +++ b/c/protocan-boot/ports/tms320f2812/boot2812.h @@ -0,0 +1,24 @@ +#ifndef BOOT2812_H /* Исключает повторное объявление профиля NOR-загрузчика F2812. */ +#define BOOT2812_H /* Отделяет основной контроллер ПМ67 от периферийного F28335. */ +#include "../../include/pcan_boot.h" /* Использует существующий ProtoCAN codec и представление октетов C28x. */ +#define BOOT2812_NOR_BASE 0x100000UL /* CPU word-адрес AM29LV800BT взят из START_ADR_FLASH действующего flash_tools.h платы. */ +#define BOOT2812_IMAGE_WORD 0x160000UL /* Новый CAN-образ занимает три полных верхних обычных сектора, выше старого образа и данных FPGA. */ +#define BOOT2812_IMAGE_BYTES 0x30000UL /* Три сектора по 0x8000 слов дают 196608 октетов полезного SCI8. */ +#define BOOT2812_META_WORD 0x17E000UL /* Последний top-boot сектор начинается после областей 16K/4K/4K слов и содержит 8192 слова. */ +#define BOOT2812_PRODUCT 0x2812U /* Отдельный Product Type запрещает запись образа F28335 в основной контроллер F2812. */ +#define BOOT2812_DEVICE_TYPE 3U /* Тип загрузчика остаётся в том же адресном классе ProtoCAN, что F28335. */ +#define BOOT2812_DEVICE_ID 6U /* Отдельный ID 6 исключает совпадение с существующим F28335 на адресе 3/7. */ +#define BOOT2812_RECOVERY_MS 3000UL /* После reset загрузчик три секунды принимает ENTER_BOOT до автоматического запуска сохранённого образа. */ +unsigned long Boot2812_Now(void); /* Возвращает монотонные миллисекунды Timer1 для CAN и ограниченных ожиданий NOR. */ +void Boot2812_Busy(void); /* Во время долгого стирания сообщает BUSY через общий codec и обслуживает аппаратный TX ACK. */ +void Boot2812_BoardInit(void); /* Настраивает действующие линии CPLD и XINTF платы ПМ67. */ +bool Boot2812_NorIdentify(void); /* До первого erase требует AMD manufacturer 0001 и top-boot device 22DA. */ +unsigned int Boot2812_NorRead(unsigned long word); /* Читает одно 16-битное слово по CPU-адресу внешней NOR. */ +bool Boot2812_NorProgram(unsigned long word, unsigned int value); /* Программирует только зарезервированные CAN-области и проверяет прочитанный результат. */ +bool Boot2812_NorErase(unsigned long word); /* Принимает только начала трёх секторов образа и одного сектора метаданных. */ +bool Boot2812_Erase(void *user, pcan_boot_byte_t slot); /* Удаляет публикацию до стирания единственного CAN-слота. */ +bool Boot2812_Write(void *user, pcan_boot_byte_t slot, uint32_t offset, const pcan_boot_byte_t *data, pcan_boot_byte_t length); /* Сохраняет октеты ProtoCAN в x16 NOR младшим байтом вперёд. */ +pcan_boot_status_t Boot2812_Verify(void *user, pcan_boot_byte_t slot, const pcan_boot_manifest_t *image); /* Проверяет CRC прочитанной NOR и все CPU-адреса SCI8 до COMMIT. */ +bool Boot2812_Commit(void *user, pcan_boot_byte_t slot, const pcan_boot_manifest_t *image); /* Публикует manifest только после повторной проверки всей внешней Flash. */ +bool Boot2812_Load(uint32_t *entry); /* Читает действующий manifest, проверяет образ и переносит только разрешённую RAM. */ +#endif /* Завершает интерфейс самостоятельного NOR-порта F2812. */ diff --git a/c/protocan-boot/ports/tms320f2812/boot_store.c b/c/protocan-boot/ports/tms320f2812/boot_store.c new file mode 100644 index 0000000..8d9f701 --- /dev/null +++ b/c/protocan-boot/ports/tms320f2812/boot_store.c @@ -0,0 +1,105 @@ +#include "boot2812.h" /* Использует отдельные адреса и совместимость внешней NOR F2812. */ +static unsigned int octet(uint32_t offset) /* Читает октет файла SCI8 из x16 NOR, где младший октет хранится первым. */ +{ /* Поток CAN остаётся независимым от sizeof(char) на C28x. */ + unsigned int word = Boot2812_NorRead(BOOT2812_IMAGE_WORD + offset / 2UL); /* Преобразует смещение в октетах в CPU word-адрес слота. */ + return (offset & 1UL) ? word >> 8 : word & 255U; /* Передаёт младшие восемь бит октета без знакового расширения. */ +} /* Все дальнейшие поля таблицы собираются из того же порядка октетов. */ +static unsigned int u16(uint32_t offset) /* Восстанавливает слово TI boot table в little endian. */ +{ /* Вызывается только после проверки достаточной длины соответствующего поля. */ + return octet(offset) | (octet(offset + 1UL) << 8); /* Два октета соответствуют одному слову C28x. */ +} /* Завершает чтение длины секции или данных программы. */ +static uint32_t address_at(uint32_t offset) /* Адрес TI SCI8 содержит старшее 16-битное слово перед младшим. */ +{ /* Этот порядок отличается от обычного u32 little endian метаданных ProtoCAN. */ + return ((uint32_t)u16(offset) << 16) | u16(offset + 2UL); /* Внутри каждого слова по-прежнему сохраняется little endian. */ +} /* Возвращает CPU-адрес, измеряемый в словах. */ +static bool allowed(uint32_t first, uint32_t end) /* Разрешает только реальную RAM приложения и исключает RAM работающего загрузчика. */ +{ /* Новое приложение не должно загружать инициализированные секции в L1 или RAM InitFlash до перехода в runtime. */ + return end > first && ((first >= 0x8000UL && end <= 0x8F00UL) || (first >= 0x3F8000UL && end <= 0x3FA000UL) || (first >= 0x80000UL && end <= 0x100000UL)); /* L0 до ramfuncs, полный H0 и внешняя SRAM зоны 2; периферия, NOR, стек и внутренние Flash запрещены. */ +} /* Проверки входа и всех секций выполняются до первой записи приложения в RAM. */ +static bool table(uint32_t size, bool copy, uint32_t *entry) /* Проверяет целиком SCI8 и при повторном проходе переносит данные в RAM. */ +{ /* Устойчивость загрузчика не зависит от адресов, заявленных принимаемым файлом. */ + uint32_t starts[64], ends[64], offset = 22UL, address, end; /* Лимит 64 секции ограничивает стек и число сравнений перекрытий. */ + unsigned int sections = 0U, count, i; bool entry_loaded = false; /* Требует, чтобы точка входа реально находилась среди загружаемых слов. */ + if (size < 24UL || (size & 1UL) || u16(0UL) != 0x08AAU) return false; /* Ключ SCI8 AA08, чётный размер и терминатор обязательны. */ + *entry = address_at(18UL); /* После ключа и восьми резервных слов находится CPU word-адрес C runtime. */ + while (offset + 2UL <= size) { /* Поле count читается только при наличии обоих октетов. */ + count = u16(offset); offset += 2UL; /* Размер секции выражен в 16-битных словах, а не октетах файла. */ + if (!count) return offset == size && entry_loaded; /* Запрещает хвост, незавершённую таблицу и entry вне payload. */ + if (sections == 64U || size - offset < 4UL) return false; /* Не допускает переполнения ограниченных массивов или усечённого адреса. */ + address = address_at(offset); offset += 4UL; end = address + count; /* Восстанавливает исключающую верхнюю границу CPU-диапазона секции. */ + if (!allowed(address, end) || (uint32_t)count * 2UL > size - offset) return false; /* Проверяет адреса и полный payload до обращения к RAM назначения. */ + for (i = 0; i < sections; ++i) if (address < ends[i] && starts[i] < end) return false; /* Даже правильно переданная CRC не разрешает две секции поверх одного слова. */ + starts[sections] = address; ends[sections++] = end; /* Сохраняет уже проверенный диапазон для следующих секций. */ + if (*entry >= address && *entry < end) entry_loaded = true; /* Подтверждает наличие исполняемого слова по адресу входа. */ + if (copy) { /* Этот проход выполняется только после полной read-only проверки всего образа. */ + for (i = 0; i < count; ++i) { /* Переносит ровно заявленные и предварительно проверенные слова секции. */ +#if defined(BOOT2812_HOST) /* Аппаратная модель проверяет тот же диапазон без записи по адресам процесса ПК. */ + extern void NorModel_LoadWord(uint32_t target, unsigned int value); /* Модель сохраняет каждое слово переноса для независимой проверки. */ + NorModel_LoadWord(address + i, u16(offset + (uint32_t)i * 2UL)); /* Подменяет только шину RAM назначения. */ +#else /* На F2812 CPU-адреса уже выражены в 16-битных словах. */ + *(volatile unsigned int *)(address + i) = u16(offset + (uint32_t)i * 2UL); /* Записывает секцию только в разрешённую RAM приложения. */ +#endif /* Завершает аппаратную запись либо её host-модель. */ + } /* Завершает перенос текущей секции. */ + } /* После проверочного прохода RAM остаётся нетронутой. */ + offset += (uint32_t)count * 2UL; /* Пропускает полезные октеты до следующего count. */ + } /* Исчерпание файла без терминатора означает неполный образ. */ + return false; /* Не запускает незавершённую таблицу. */ +} /* Образ с ошибкой не публикуется как запускаемый. */ +bool Boot2812_Erase(void *user, pcan_boot_byte_t slot) /* Реализует single-slot подготовку внешней NOR. */ +{ /* Существующие legacy-образы и FPGA ниже 160000 не входят в новый CAN-раздел. */ + unsigned long sector; (void)user; /* Перебирает только три полных обычных сектора нового образа. */ + if (slot || !Boot2812_NorIdentify() || !Boot2812_NorErase(BOOT2812_META_WORD)) return false; /* Сначала удаляет marker старого CAN-образа; при обрыве стирания сохраняется recovery. */ + for (sector = BOOT2812_IMAGE_WORD; sector < BOOT2812_IMAGE_WORD + BOOT2812_IMAGE_BYTES / 2UL; sector += 0x8000UL) if (!Boot2812_NorErase(sector)) return false; /* Геометрия x16 допускает erase только по границам обычных секторов 32K слов. */ + return true; /* Ядро ProtoCAN разрешает DATA только после полного успешного стирания слота. */ +} /* EEPROM-операции и несуществующий второй слот отсутствуют. */ +bool Boot2812_Write(void *user, pcan_boot_byte_t slot, uint32_t offset, const pcan_boot_byte_t *data, pcan_boot_byte_t length) /* Упаковывает поступившие октеты в x16 слова NOR. */ +{ /* В одном вызове записывается не более одного classic CAN кадра. */ + unsigned int i, word; (void)user; /* Счётчик относится к октетам кадра, адрес NOR отдельно делится на два. */ + if (slot || !length || length > 8U || (offset & 1UL) || offset > BOOT2812_IMAGE_BYTES || length > BOOT2812_IMAGE_BYTES - offset) return false; /* Не допускает выхода из слота либо продолжения слова с неверного октета. */ + for (i = 0; i < length; i += 2U) { /* Последовательные 8-октетные блоки начинаются на границе x16 слова. */ + word = (data[i] & 255U) | ((i + 1U < length ? data[i + 1U] & 255U : 255U) << 8); /* Неполное последнее слово сохраняет FF в незанятом старшем октете. */ + if (!Boot2812_NorProgram(BOOT2812_IMAGE_WORD + (offset + i) / 2UL, word)) return false; /* Аппаратный драйвер проверяет и допустимый адрес, и результат записи каждого слова. */ + } /* Завершает сохранение текущего CAN-блока. */ + return true; /* ACK означает проверенную запись, а не только получение кадра. */ +} /* CRC ядра продвигается только после успешного возврата этого callback. */ +pcan_boot_status_t Boot2812_Verify(void *user, pcan_boot_byte_t slot, const pcan_boot_manifest_t *image) /* Перепроверяет CRC непосредственно из сохранённой NOR. */ +{ /* Потоковая CRC при приёме не заменяет аппаратный readback полного файла. */ + uint32_t offset, crc = 0UL, entry; pcan_boot_byte_t bytes[32]; unsigned int count, i; (void)user; /* Небольшой буфер не требует размещать весь образ во внутренней RAM F2812. */ + if (slot || image->image_size < 24UL || image->image_size > BOOT2812_IMAGE_BYTES || (image->image_size & 1UL)) return PCAN_BOOT_STATUS_INVALID_SIZE; /* SCI8 должен целиком помещаться в выделенных трёх секторах и содержать целые слова. */ + if (image->product_type != BOOT2812_PRODUCT || image->hardware_revision_min > 1U || image->hardware_revision_max < 1U) return PCAN_BOOT_STATUS_WRONG_DEVICE; /* Образ F28335 или несовместимого изделия не становится загрузочным. */ + for (offset = 0; offset < image->image_size; offset += count) { /* Проверяет каждый фактически сохранённый октет ровно один раз. */ + count = image->image_size - offset < 32UL ? (unsigned int)(image->image_size - offset) : 32U; /* Последний буфер ограничен реальной длиной без FF-дополнения CAN. */ + for (i = 0; i < count; ++i) bytes[i] = octet(offset + i); /* Читает данные из NOR, а не из приёмной очереди CAN. */ + crc = pcan_boot_crc32_update(crc, bytes, count); /* Использует общий CRC32 ProtoCAN без дублирования полинома в аппаратном порту. */ + Boot2812_Busy(); /* Большой файл сохраняет ответы клиента при длинной проверке на реальном CPU. */ + } /* Завершает вычисление CRC readback. */ + if (crc != image->image_crc32) return PCAN_BOOT_STATUS_CRC_ERROR; /* Различает повреждение памяти и ошибку структуры SCI8. */ + return table(image->image_size, false, &entry) ? PCAN_BOOT_STATUS_OK : PCAN_BOOT_STATUS_INVALID_STATE; /* Все адреса, перекрытия, терминатор и entry проверяются до COMMIT. */ +} /* До успеха verifier никакие слова приложения не переносятся в RAM. */ +bool Boot2812_Commit(void *user, pcan_boot_byte_t slot, const pcan_boot_manifest_t *image) /* Публикует загрузочный manifest последней операцией после readback. */ +{ /* Формат из 12 слов фиксирован и не зависит от sizeof C-структуры. */ + unsigned int words[12], i; /* Два magic-слова, версия формата, размер, CRC, версия FW и контроль manifest. */ + pcan_boot_byte_t bytes[20]; uint32_t crc; /* CRC первых десяти слов защищает размер и контрольную сумму самого образа. */ + if (Boot2812_Verify(user, slot, image) != PCAN_BOOT_STATUS_OK) return false; /* Не публикует файл, испорченный после предыдущего VERIFY. */ + words[0] = 0x2812U; words[1] = 0xCA7EU; words[2] = 1U; words[3] = 0U; /* Magic 2812/CA7E и версия 1 отличают новый CAN manifest от прежних данных платы. */ + words[4] = (unsigned int)(image->image_size & 0xFFFFUL); words[5] = (unsigned int)(image->image_size >> 16); /* Длина выражена октетами и хранится младшим словом первой. */ + words[6] = (unsigned int)(image->image_crc32 & 0xFFFFUL); words[7] = (unsigned int)(image->image_crc32 >> 16); /* Сохраняет точную CRC всего полученного файла. */ + words[8] = (unsigned int)(image->firmware_version & 0xFFFFUL); words[9] = (unsigned int)(image->firmware_version >> 16); /* Версия кандидата не подменяется версией постоянного загрузчика. */ + for (i = 0; i < 10U; ++i) { bytes[2U * i] = words[i] & 255U; bytes[2U * i + 1U] = words[i] >> 8; } /* Wire-представление manifest использует октеты независимо от ширины C28x char. */ + crc = pcan_boot_crc32_update(0UL, bytes, 20U); words[10] = (unsigned int)(crc & 0xFFFFUL); words[11] = (unsigned int)(crc >> 16); /* CRC manifest не позволяет принять частично записанные поля размера и CRC образа. */ + for (i = 2U; i < 12U; ++i) if (!Boot2812_NorProgram(BOOT2812_META_WORD + i, words[i])) return false; /* Сначала записывает все поля, пока оба magic-слова ещё равны FF. */ + if (!Boot2812_NorProgram(BOOT2812_META_WORD + 1UL, words[1])) return false; /* Второе magic-слово фиксируется после полного тела manifest. */ + return Boot2812_NorProgram(BOOT2812_META_WORD, words[0]); /* Первое magic записывается последним: потеря питания раньше оставляет recovery. */ +} /* Повтор COMMIT обрабатывает идемпотентный автомат общего ядра. */ +bool Boot2812_Load(uint32_t *entry) /* Проверяет опубликованный образ после reset перед переносом в RAM приложения. */ +{ /* Пустой или повреждённый manifest оставляет прибор в постоянном CAN recovery. */ + unsigned int words[12], i; pcan_boot_byte_t bytes[20]; uint32_t crc; pcan_boot_manifest_t image; /* Сериализованные поля читаются явно, без memcpy по ABI структуры. */ + for (i = 0; i < 12U; ++i) words[i] = Boot2812_NorRead(BOOT2812_META_WORD + i); /* Читает только фиксированные 24 октета manifest. */ + if (words[0] != 0x2812U || words[1] != 0xCA7EU || words[2] != 1U || words[3]) return false; /* Не интерпретирует старые данные Flash либо неполный commit как запускаемый файл. */ + for (i = 0; i < 10U; ++i) { bytes[2U * i] = words[i] & 255U; bytes[2U * i + 1U] = words[i] >> 8; } /* Восстанавливает то же октетное представление, что защищалось при COMMIT. */ + crc = pcan_boot_crc32_update(0UL, bytes, 20U); /* Проверяет метаданные до использования объявленной ими длины. */ + if (crc != ((uint32_t)words[10] | ((uint32_t)words[11] << 16))) return false; /* Повреждённый размер не может вывести чтение за пределы CAN-слота. */ + image.image_size = (uint32_t)words[4] | ((uint32_t)words[5] << 16); image.image_crc32 = (uint32_t)words[6] | ((uint32_t)words[7] << 16); /* Размер и CRC файла восстанавливаются только после успешной CRC manifest. */ + image.firmware_version = (uint32_t)words[8] | ((uint32_t)words[9] << 16); image.product_type = BOOT2812_PRODUCT; image.hardware_revision_min = image.hardware_revision_max = 1U; /* Профиль образа был проверен до публикации manifest. */ + return Boot2812_Verify(0, 0U, &image) == PCAN_BOOT_STATUS_OK && table(image.image_size, true, entry); /* Сначала полный read-only проход, затем перенос и только после успеха разрешение вызова entry. */ +} /* Не загружает старые flat BIN автоматически: новый проект использует проверяемую SCI8-таблицу. */ diff --git a/c/protocan-boot/ports/tms320f2812/nor_flash.c b/c/protocan-boot/ports/tms320f2812/nor_flash.c new file mode 100644 index 0000000..0b5ff51 --- /dev/null +++ b/c/protocan-boot/ports/tms320f2812/nor_flash.c @@ -0,0 +1,69 @@ +#include "boot2812.h" /* Ограничивает аппаратный драйвер разделами обновления конкретного профиля ПМ67. */ +#if defined(BOOT2812_HOST) /* Host-модель воспроизводит команды NOR без обращения к физическим CPU-адресам. */ +extern unsigned int NorModel_Read(unsigned long word); /* Модель отдаёт данные, ID и аппаратные биты готовности чипа. */ +extern void NorModel_Write(unsigned long word, unsigned int value); /* Модель принимает настоящую последовательность unlock/program/erase драйвера. */ +#define NOR_READ(word) NorModel_Read(word) /* Подменяет только чтение шины, сохраняя алгоритм драйвера. */ +#define NOR_WRITE(word, value) NorModel_Write(word, value) /* Подменяет физическую запись при проверке границ и отказов. */ +#else /* Production использует 16-битную параллельную XINTF-шину. */ +#define NOR_READ(word) (*(volatile unsigned int *)(word)) /* Один CPU-адрес C28x соответствует одному x16 слову AM29LV800BT. */ +#define NOR_WRITE(word, value) (*(volatile unsigned int *)(word) = (value)) /* Volatile сохраняет каждый командный цикл AMD в исходном порядке. */ +#endif /* Завершает выбор физической шины либо модели. */ +static void reset_read(void) /* Выводит чип из autoselect либо неудачной операции в обычный режим чтения. */ +{ /* Reset не стирает слова памяти и допустим по любому адресу чипа. */ + NOR_WRITE(BOOT2812_NOR_BASE, 0x00F0U); /* F0 — Read/Reset из таблицы команд AMD Am29LV800B. */ +} /* Все ошибки возвращают NOR в состояние, пригодное для следующей recovery-сессии. */ +static void unlock(unsigned int command) /* Выполняет общий префикс x16-команд согласно datasheet AMD. */ +{ /* Адреса ниже являются смещениями в словах, а не октетными AAA/555 режима x8. */ + NOR_WRITE(BOOT2812_NOR_BASE + 0x555UL, 0x00AAU); /* Первый unlock-цикл AA по смещению 555h в режиме x16. */ + NOR_WRITE(BOOT2812_NOR_BASE + 0x2AAUL, 0x0055U); /* Второй unlock-цикл 55 по смещению 2AAh. */ + NOR_WRITE(BOOT2812_NOR_BASE + 0x555UL, command); /* Третий цикл выбирает autoselect, программирование либо начало стирания. */ +} /* Последующий цикл данных или адрес сектора выполняет вызывающая операция. */ +unsigned int Boot2812_NorRead(unsigned long word) /* Читает только физический диапазон установленной NOR ёмкостью 1 МиБ. */ +{ /* Верхняя исключающая граница равна BASE + 512K слов. */ + return word >= BOOT2812_NOR_BASE && word < BOOT2812_NOR_BASE + 0x80000UL ? NOR_READ(word) : 0xFFFFU; /* Вне чипа не создаёт шинного чтения по неизвестному адресу. */ +} /* Возвращает полное x16 слово без перестановки октетов. */ +bool Boot2812_NorIdentify(void) /* Идентификация обязательна перед разрешением изменяющих операций. */ +{ /* Не подменяет top-boot геометрию похожим bottom-boot или NAND-чипом. */ + unsigned int maker, device; /* Хранит два слова autoselect, прежде чем вернуть чип к чтению. */ + reset_read(); unlock(0x0090U); /* 90h включает чтение manufacturer/device ID после обычного unlock. */ + maker = NOR_READ(BOOT2812_NOR_BASE); device = NOR_READ(BOOT2812_NOR_BASE + 1UL); /* AMD: offset 0 содержит 0001, offset 1 — 22DA для Am29LV800BT x16. */ + reset_read(); /* Обычные чтения образа после проверки не должны видеть таблицу autoselect. */ + return maker == 0x0001U && device == 0x22DAU; /* Отличающийся чип получает отказ до первого sector erase. */ +} /* Не выполняет разрушительных пробных записей для определения типа памяти. */ +static bool wait_word(unsigned long word, unsigned int expected, unsigned long timeout) /* Ограничивает DQ7/DQ5 polling временем и числом проходов. */ +{ /* DQ7 отражает готовность программируемого старшего бита; DQ5 требует завершающего повторного чтения. */ + unsigned long started = Boot2812_Now(), budget = 50000000UL; /* Итерационный предел обеспечивает выход даже при остановленном Timer1. */ + unsigned int value; /* Снимок status считывается один раз на основной проход. */ + do { /* Не вызывает никаких функций из программируемой внешней NOR: код загрузчика находится во внутренней Flash. */ + value = NOR_READ(word); /* Читает именно адрес программирования либо начало стираемого сектора. */ + if ((value & 0x0080U) == (expected & 0x0080U)) return NOR_READ(word) == expected; /* После совпадения DQ7 подтверждает все 16 бит результата. */ + if (value & 0x0020U) { /* DQ5 сообщает превышение внутреннего времени алгоритма AMD. */ + if ((NOR_READ(word) & 0x0080U) == (expected & 0x0080U)) return NOR_READ(word) == expected; /* Повтор исключает нормальное завершение операции одновременно с чтением DQ5. */ + break; /* После подтверждённой ошибки больше не ждёт неопределённое время. */ + } /* Завершает трактовку аппаратного статуса текущего прохода. */ + Boot2812_Busy(); /* Долгое стирание продолжает давать клиенту живой ответ и не блокирует CAN ISR. */ + } while (--budget && Boot2812_Now() - started < timeout); /* Беззнаковое вычитание сохраняет корректность при переполнении миллисекунд. */ + reset_read(); /* Отказ возвращает чип в режим чтения перед следующей recovery-попыткой. */ + return false; /* Не сообщает успех по одному окончанию тайм-аута. */ +} /* Завершает ограниченное ожидание аппаратной операции. */ +bool Boot2812_NorProgram(unsigned long word, unsigned int value) /* Программирует только выделенный CAN-образ либо manifest. */ +{ /* Старые данные приложения, FPGA и остальные сектора чипа не входят в разрешённые диапазоны. */ + unsigned int before; /* Предварительное чтение исключает попытку перевода NOR-бита из нуля в единицу. */ + if (!((word >= BOOT2812_IMAGE_WORD && word < BOOT2812_IMAGE_WORD + BOOT2812_IMAGE_BYTES / 2UL) || (word >= BOOT2812_META_WORD && word < BOOT2812_META_WORD + 0x2000UL))) return false; /* Проверяет word-адрес до любого unlock или командного цикла. */ + before = NOR_READ(word); /* Проверяет текущее содержимое перед началом операции. */ + if (before == value) return true; /* Повтор одинакового блока не выполняет лишнее программирование. */ + if ((before & value) != value) return false; /* Бит 0→1 требует отдельного sector erase и не должен маскироваться чтением старого слова. */ + unlock(0x00A0U); NOR_WRITE(word, value); /* A0 запускает word program; следующий цикл содержит адрес и полные 16 бит данных. */ + return wait_word(word, value, 100UL); /* Сто миллисекунд дают ограниченный запас для программирования одного слова. */ +} /* Каждый успех означает фактическое совпадение прочитанного слова. */ +bool Boot2812_NorErase(unsigned long word) /* Не принимает произвольный адрес или команду полного стирания чипа. */ +{ /* Обновление ограничено секторами 12/13/14 и последним top-boot сектором 18. */ + unsigned long i, count = word == BOOT2812_META_WORD ? 0x2000UL : 0x8000UL; /* AM29LV800BT: обычный сектор 32K слов, последний boot-сектор 8K слов. */ + if (!(word == BOOT2812_IMAGE_WORD || word == BOOT2812_IMAGE_WORD + 0x8000UL || word == BOOT2812_IMAGE_WORD + 0x10000UL || word == BOOT2812_META_WORD)) return false; /* Только точные разрешённые начала секторов исключают округление в соседнюю область. */ + unlock(0x0080U); /* 80h начинает шеститактовую последовательность Sector Erase AMD. */ + NOR_WRITE(BOOT2812_NOR_BASE + 0x555UL, 0x00AAU); NOR_WRITE(BOOT2812_NOR_BASE + 0x2AAUL, 0x0055U); /* Повторяет вторую unlock-пару перед выбором сектора. */ + NOR_WRITE(word, 0x0030U); /* 30h по sector address выбирает один сектор; команда Chip Erase 10h отсутствует. */ + if (!wait_word(word, 0xFFFFU, 20000UL)) return false; /* Ограничивает ожидание двадцатью секундами с периодическими BUSY-ответами. */ + for (i = 0; i < count; ++i) if (NOR_READ(word + i) != 0xFFFFU) return false; /* Проверяет всю стёртую область, а не только её первое слово. */ + return true; /* Разрешает запись лишь после полного аппаратного readback сектора. */ +} /* При сбое сохранённый manifest уже недействителен, загрузчик остаётся в recovery. */ diff --git a/c/protocan-boot/ports/tms320f28335/README.md b/c/protocan-boot/ports/tms320f28335/README.md index 3d45984..952f98c 100644 --- a/c/protocan-boot/ports/tms320f28335/README.md +++ b/c/protocan-boot/ports/tms320f28335/README.md @@ -1,18 +1,55 @@ # F28335 + M95M02: CAN, отдельный загрузчик и A/B -Реализация состоит из Flash-загрузчика `periph_167/Bootloader`, переносимого +Реализация состоит из Flash-загрузчика `projects/ccs/f28335`, переносимого `f28335_boot_store.c`, аппаратного `f28335_boot_hw.c` и адаптера -`f28335_can_boot.c`. Приложение подключает их через `Source/Internal/can_boot.c`. +`f28335_can_boot.c`. Приложение подключает общий `f28335_can_application.c` +прямой ссылкой linked resource из templates в CCS Debug/Release. В сборке `EEPROM_M95M02=0` CAN Boot отключён. Для установленной M95M02 — значение 1. ## Адрес и формат -Device Type **3**, Device ID **7**, имя **F28335-M95M02**, Product **0x2833**, HW **1**. +Адрес определяется физическим номером **PERIPH 0–31** по новой Excel-таблице: +Type = 1 + PERIPH / 16 (целая часть), Device ID = PERIPH mod 16. +**УМП1 — 1/5, УМП2 — 1/6, задатчик — 1/8**. Product **0x2833**, HW **1** +описывают существующую аппаратную совместимость F28335 и не являются CAN-адресом. +Имена паспорта для назначенных плат — `UMP1`, `UMP2`, `Zadatchik`. +Приложение передаёт Mode в `F28335CanBoot_Init(Mode)`. Загрузчик независимо +читает те же активные низким уровнем GPIO21/20/22/51 с весами 1/2/4/8 и базой 1. +Поэтому существующие перемычки ПМ35 задают номера 1–16; номера 0 и 17–31 +поддерживаются адресным контрактом, но требуют другого источника физического номера. +Общий адрес 3/7 больше не принимается. Чужие адреса отбрасываются аппаратным +mailbox, ISR и ядром до записи EEPROM, включая данные A/B и управляющие команды. В приложении FW берётся из `firmware_version.h`, формат `major<<24 | minor<<16 | patch`; для версии 1.1.2 это `0x01010002`. Загрузчик сообщает версию подтверждённого образа из журнала, при отсутствии такого образа — 0. Версия кандидата передаётся в BEGIN_COMPAT. CAN **250000 бит/с**, Extended ID, окно **16 блоков по 8 октетов**. -ENTER_BOOT для session=1: `0x13790102`, STATUS: `0x1B7C0102`. +Для задатчика и session=1: ENTER_BOOT `0x11890102`, STATUS `0x198C0102`. + +## Общий запуск Flash и резервной EEPROM + +Сектор A и аппаратный boot `0x33FFF6` принадлежат постоянному загрузчику. +Flash-приложение использует `[0x300000,0x338000)`: первые 16 слов — описание +FAB1, остальные — собственные LOAD-секции. `f28335_flash_app.c` проверяет +magic/version, entry, границы, инверсию entry, маркеры и CRC32 IEEE всего +диапазона после заголовка, включая промежутки, заполненные `0xFFFF`. +Python-контракт `python/protocan/f28335_flash.py` заполняет зарезервированные +32 октета COFF по смещению, подтверждённому TI OFD, после линковки. + +Загрузчик даёт трёхсекундное окно CAN, затем запускает исправную внутреннюю +Flash в приоритете. Отсутствующая/повреждённая Flash ведёт к прежнему выбору +EEPROM A/B с trial/CONFIRM/rollback. ENTER_BOOT удерживает CAN recovery. +Handoff running=`0xFE` обозначает проверенную внутреннюю Flash; 0/1 — EEPROM +A/B, `0xFF` — отсутствие запущенного приложения. Flash-приложение обслуживает +PING и ENTER_BOOT, но не подменяет подтверждение EEPROM-кандидата. +Обновление EEPROM по CAN не меняет приоритет исправной Flash после reset. + +RS Flash должен стирать только B–H, публиковать FAB1 после проверки остальных +данных и запрещать любые адреса сектора A. В SETGUI соответствующие JTAG +маски задаются явными TI `FlashSectorA..H`: A для установки boot, B–H для +приложения. Полное стирание чипа внешним программатором не ограничивается linker. +Старая самостоятельная Flash-сборка с codestart `0x33FFF6` несовместима с этим +размещением и не должна передаваться как обновление приложения. + Образ — SCI8 BIN (`AA 08`), чётная длина от 24 до **130560 байт** включительно. Числа в протоколе little endian. Адреса внутри SCI8: сначала старшее 16-битное @@ -106,7 +143,7 @@ Python API: `protocan.can_boot.CanBootServices` — запросы и разбо ## Аппаратная интеграция MBOX3 — адресные входящие Boot; MBOX4 — ответы; MBOX6 — точный broadcast discovery. -MBOX0..2 сохраняют legacy/UMP, MBOX5 остаётся heartbeat. ISR помещает сообщения +MBOX0..2 сохраняют legacy/UMP, MBOX5 загрузчик не использует. ISR помещает сообщения в очередь на 31 кадр. Чужие адреса, RTR и неподходящие типы отбрасываются до очереди. При переполнении/потере mailbox сессия отменяется; повторная запись начинается заново. SPI-драйвер загрузчика имеет ограничение ожидания байта и WIP, 24-битный адрес, @@ -118,7 +155,31 @@ SPI-драйвер загрузчика имеет ограничение ожи Его RAM — 0xE000..0xFFFF; стек — 0x400..0x7FF. Приложение M95M02 использует 0x8000..0xD7FF для кода, 0xD800..0xDFFF для констант/инициализации, 0xE000..0xFFFF для .ebss после перехода в C runtime. Linker резервирует -NOINIT handoff в обоих проектах. CAN не содержит операций записи внутренней Flash. +NOINIT handoff в обоих проектах. TI Flash API временно использует RAM +`0x8000..0x97FF` до запуска приложения. В обновлённом постоянном загрузчике +CAN также записывает внутреннюю Flash приложения B–H; сектор A защищён. + +## Внутренняя Flash по CAN + +После ENTER_BOOT клиент явно отправляет SELECT_MEMORY (`0x10`, DLC=1, +DATA[0]=1) до BEGIN_IMAGE/BEGIN_COMPAT. Новая сессия по умолчанию использует +EEPROM A/B, поэтому старые клиенты сохраняют прежнее поведение. Выбор памяти +после метаданных запрещён; старый boot отвечает INVALID_COMMAND до ERASE. +CAPABILITIES bit 12 обозначает поддержку записи внутренней Flash. + +Flash SCI8 с FAB1 передаётся в неактивный EEPROM-слот как staging. VERIFY +проверяет CRC32 EEPROM, таблицу, непересекающиеся адреса только B–H и FAB1/CRC +будущей Flash. COMMIT повторяет проверку staging, вызывает официальный TI API +со стиранием `0x00FE`, пишет и проверяет данные порциями до 128 слов, публикует +FAB1 последним и проверяет CRC физической Flash. ACK COMMIT приходит после +записи; клиент даёт до 180 секунд и затем отправляет отдельный REBOOT. +EEPROM active и параметры сохраняются; прежний неактивный образ заменяется staging. + +В SETGUI: «Прошивка → CAN / ProtoCAN Boot → ProtoCAN: память прошивки → +Внутренняя Flash F28335», файл `*_flash_rs.bin` существующего выпуска. +Сначала требуется обновить постоянный `F28335_CAN_AB.out` через JTAG с маской +только сектора A. В Debug/Release подключён установленный TI Flash API v2.10; +его код и таблицы копируются в RAM перед занятостью общего банка Flash A–H. ## Первичная установка @@ -126,10 +187,13 @@ NOINIT handoff в обоих проектах. CAN не содержит опе Старые BIN/OUT автоматически не заменены. Приложение должно содержать интеграцию READY/CONFIRM, иначе на следующем reset оно останется неподтверждённым кандидатом. 2. Собрать отдельный загрузчик TI C2000 COFF compiler: - `Bootloader/build.ps1 -CompilerRoot <путь-к-ti-cgt-c2000>`. - Результат — `Bootloader/build/F28335_CAN_AB.out` и MAP. -3. Один раз установить этот OUT через JTAG и выбрать аппаратный Flash boot - согласно схеме платы. Не загружать поверх него старый application OUT с + `python c/protocan-boot/projects/build.py --device f28335 --compiler <путь-к-ti-cgt-c2000>`. + Результат — `projects/ccs/f28335/Debug/F28335_CAN_AB.out` и MAP. +3. Установить обновлённый OUT через JTAG и выбрать аппаратный Flash boot + согласно схеме платы. При переходе с общего адреса 3/7 обновить и приложение, + и загрузчик: старый загрузчик не перейдёт на новый адрес после reset сам. + В SETCAN выбрать «Прошивка → CAN / ProtoCAN Boot → Устройство PERIPH» + и нужное назначение. Не загружать поверх загрузчика старый application OUT с секцией codestart во Flash. 4. После reset пустая EEPROM или старая разметка автоматически ведут в CAN recovery. Передать новое приложение через ProtoCAN Boot, дождаться пробного запуска и @@ -145,8 +209,10 @@ NOINIT handoff в обоих проектах. CAN не содержит опе ядро, приложение/загрузчик, wide-octet режим, журнал, обрыв публикации на каждом из 69 возможных положений, пробный запуск, CONFIRM, откат, SCI8 и границы памяти. Python-тесты проверяют клиентские запросы, паспорт, фильтрацию ответов и лимит A/B. -Проверка синтаксиса использует настоящие DSP2833x headers. Сборка TI/CCS, -раскладка итогового MAP и физические CAN/SPI/reset на плате ещё не подтверждены. +Проверка синтаксиса использует настоящие DSP2833x headers. Импорт и сборка TI/CCS, +раскладка MAP и реальные COFF LOAD-адреса проверены; физические CAN/SPI/reset +на плате требуют стендовой проверки. Отдельные проекты и команды сборки описаны +в [инструкции CCS](../../projects/README.md). CRC32 защищает от повреждения, криптографической подписи и anti-rollback по версии в этом порту нет. Удалённый CONFIRM подтверждает готовность приложения, @@ -154,3 +220,13 @@ CRC32 защищает от повреждения, криптографичес Аппаратный формат SPI boot описан в [TI Boot ROM Reference Guide](https://e2e.ti.com/cfs-file/__key/communityserver-discussions-components-files/171/2742.Boot-ROM.pdf). В A/B-схеме ROM выбирает Flash, а разбор EEPROM выполняет этот загрузчик. + +Проект предоставляет `f28335_can_application_config.h` в include paths. +Он задаёт `F28335_CAN_BOOT_APPLICATION_ENABLED` (0/1) и при включённом модуле +`F28335_CAN_BOOT_FIRMWARE_VERSION` из версии приложения. В 167 это ручной +`firmware_version.h`; профиль включён только при M95M02 без `FLASH_BOOT`. +Локальный `Source/Internal/can_boot.c` содержит только `F28335Boot_Quiesce` +со штатной остановкой нагрузки. Общие `.c` повторно включать в него не нужно: +они компилируются единственным linked resource общей библиотеки. +Постоянный Flash-загрузчик по-прежнему собирается отдельным проектом +`projects/ccs/f28335` и не линкуется в RAM-приложение. diff --git a/c/protocan-boot/ports/tms320f28335/f28335_boot_platform.h b/c/protocan-boot/ports/tms320f28335/f28335_boot_platform.h index facd3b3..e0d7bc9 100644 --- a/c/protocan-boot/ports/tms320f28335/f28335_boot_platform.h +++ b/c/protocan-boot/ports/tms320f28335/f28335_boot_platform.h @@ -1,6 +1,7 @@ #ifndef F28335_BOOT_PLATFORM_H #define F28335_BOOT_PLATFORM_H #include "f28335_boot_store.h" +#include "f28335_flash_app.h" /* Общий handoff различает EEPROM A/B, защищённое Flash-приложение и неизвестный запуск. */ #ifndef F28335_BOOT_LOADER #define F28335_BOOT_LOADER 0 #endif diff --git a/c/protocan-boot/ports/tms320f28335/f28335_can_application.c b/c/protocan-boot/ports/tms320f28335/f28335_can_application.c new file mode 100644 index 0000000..f7fe30b --- /dev/null +++ b/c/protocan-boot/ports/tms320f28335/f28335_can_application.c @@ -0,0 +1,10 @@ +#include "f28335_can_application_config.h" /* Получает от проекта разрешение CAN A/B и версию приложения; этот конфигурационный заголовок должен находиться в include paths CCS. */ +#ifndef F28335_CAN_BOOT_APPLICATION_ENABLED /* Отсутствующее аппаратное решение нельзя трактовать как разрешение записи служебных областей EEPROM. */ +#error "Define F28335_CAN_BOOT_APPLICATION_ENABLED in f28335_can_application_config.h" /* Останавливает сборку до появления приложения с неполной интеграцией загрузчика. */ +#endif /* Завершает проверку обязательного конфигурационного признака проекта. */ +#if F28335_CAN_BOOT_APPLICATION_ENABLED /* Самостоятельный Flash-образ и платы без M95M02 исключают весь CAN A/B-код на этапе компиляции. */ +#include "../../src/pcan_boot.c" /* Компилирует единственный автомат команд ProtoCAN Boot с его штатными сессиями, CRC32 и проверкой последовательности пакетов. */ +#include "f28335_boot_store.c" /* Подключает общий A/B-журнал, readback, проверку SCI8 и выбор подтверждённого слота той же версии templates. */ +#include "f28335_boot_hw.c" /* Предоставляет SPI EEPROM, watchdog и согласованный handoff между приложением и постоянным Flash-загрузчиком. */ +#include "f28335_can_boot.c" /* В режиме приложения обслуживает вход в boot и READY/CONFIRM, сохраняя служебные mailbox 3/4/6 отдельно от технологического CAN. */ +#endif /* Постоянный загрузчик собирается отдельным CCS-проектом templates с F28335_BOOT_LOADER=1, а не этим прикладным модулем. */ diff --git a/c/protocan-boot/ports/tms320f28335/f28335_can_boot.c b/c/protocan-boot/ports/tms320f28335/f28335_can_boot.c index 5cbd7a4..4f1b80f 100644 --- a/c/protocan-boot/ports/tms320f28335/f28335_can_boot.c +++ b/c/protocan-boot/ports/tms320f28335/f28335_can_boot.c @@ -8,6 +8,21 @@ * Сброс сессии не удаляет active/pending из EEPROM. */ static pcan_boot_t boot; static f28335_boot_store_t store; +static unsigned int healthy; /* Результат открытия EEPROM-журнала известен также функции выбора назначения Flash. */ +#if F28335_BOOT_LOADER && F28335_CAN_FLASH_UPDATE /* Flash API доступен только постоянному загрузчику с явной поддержкой обновления B–H. */ +#include "f28335_flash_update.h" /* Подключает проверку Flash SCI8 и аппаратный writer с сохранением сектора A. */ +#include "f28335_flash_update.c" /* Общий алгоритм компилируется с тем же pcan_boot и разметкой, что этот порт. */ +static f28335_flash_update_t flash_update; /* Индекс и кеш занимают ограниченную внутреннюю RAM без загрузки приложения поверх boot. */ +static unsigned int flash_selected, flash_staging; /* Явная цель Flash использует только неактивный EEPROM-слот как временное хранилище. */ +static pcan_boot_status_t select_memory(void *u, pcan_boot_byte_t memory, pcan_boot_config_t *cfg) /* Выбирает назначение до BEGIN_IMAGE, сохраняя прежний EEPROM-путь по умолчанию. */ +{ /* Изменения конфигурации разрешены только при исправном EEPROM-журнале. */ + (void)u; if (!healthy) return PCAN_BOOT_STATUS_FLASH_ERROR; /* Ошибка чтения журнала запрещает выбор staging поверх неизвестного active. */ + if (memory > 1U) return PCAN_BOOT_STATUS_INVALID_COMMAND; /* Единственные определённые цели: 0=EEPROM A/B и 1=внутренняя Flash. */ + flash_selected = memory; flash_update.valid = false; /* Новая цель отменяет прежнее разрешение программирования. */ + cfg->slot_count = memory ? 1U : 2U; cfg->active_slot = memory ? 0U : store.active; /* CAN Flash использует один логический слот A, EEPROM сохраняет выбор неактивного A/B. */ + return PCAN_BOOT_STATUS_OK; /* Физический staging будет инвалидирован лишь при последующей команде ERASE. */ +} /* Никакие данные Flash или EEPROM при выборе цели не изменяются. */ +#endif /* Приложение и старые host-модели не подключают Flash API. */ /* Кольцевая очередь: ISR производит кадры, main потребляет. Из 32 элементов * используется 31, чтобы head==tail однозначно означало пустую очередь. * Долгие операции SPI запрещены внутри обработчика CAN. */ @@ -16,9 +31,10 @@ static struct { uint32_t id; unsigned int dlc; pcan_boot_byte_t data[8]; } queue /* reset_requested только планирует reset; Service ждёт завершения TX. * ready сообщает об окончании старта приложения, confirmed — о сохранённом * подтверждении слота. healthy отражает результат открытия журнала при Init. */ -static unsigned int reset_requested,reset_session,ready,healthy,confirmed; +static unsigned int reset_requested,reset_session,ready,confirmed; /* Состояние перехода и подтверждения приложения отделено от доступности EEPROM. */ static uint32_t sent_at,ready_at; static unsigned int main_passes; +static unsigned int addressed; /* Разрешает обслуживание только после проверки номера PERIPH и установки согласованных фильтров CAN. */ static int tx_busy,tx_canceling; /* Один исходящий mailbox исключает перезапись ещё передаваемого ответа. * MDL содержит первые четыре октета, MDH — следующие четыре, младшим вперёд. @@ -48,9 +64,19 @@ static bool transmit(void *u, uint32_t id, const pcan_boot_byte_t *d, pcan_boot_ * эти callbacks возвращают отказ, даже если им удастся передать команду записи. * ERASE для EEPROM означает инвалидирование manifest выбранного слота. */ static bool erase(void *u,pcan_boot_byte_t slot) -{ (void)u; return F28335_BOOT_LOADER && healthy && f28335_boot_prepare(&store,slot); } +{ /* ERASE подготавливает staging; внутренняя Flash остаётся неизменной до VERIFY и COMMIT. */ +#if F28335_BOOT_LOADER && F28335_CAN_FLASH_UPDATE /* Новая цель не меняет прежний формат EEPROM A/B. */ + if (flash_selected) { flash_update.valid = false; flash_staging = store.active == 0U ? 1U : 0U; return healthy && f28335_boot_prepare(&store, flash_staging); } /* Инвалидирует только неактивный слот, сохраняя подтверждённый резерв и параметры. */ +#endif /* В остальных сборках остаётся штатная подготовка EEPROM-слота. */ + (void)u; return F28335_BOOT_LOADER && healthy && f28335_boot_prepare(&store,slot); /* Обычный CAN-клиент сохраняет прежний путь обновления RAM-приложения. */ +} /* Подготовка не вызывает TI Flash_Erase. */ static bool write_block(void *u,pcan_boot_byte_t slot,uint32_t offset,const pcan_boot_byte_t *d,pcan_boot_byte_t n) -{ (void)u; return F28335_BOOT_LOADER && healthy && f28335_boot_write(&store,slot,offset,d,n); } +{ /* CAN ISR только ставит данные в очередь; запись staging выполняет main. */ +#if F28335_BOOT_LOADER && F28335_CAN_FLASH_UPDATE /* Запись Flash-файла использует тот же проверенный EEPROM writer. */ + if (flash_selected) return healthy && f28335_boot_write(&store, flash_staging, offset, d, n); /* Логический DATA_A направляется в выбранный неактивный физический слот. */ +#endif /* Обычные A/B-данные сохраняют исходную адресацию. */ + (void)u; return F28335_BOOT_LOADER && healthy && f28335_boot_write(&store,slot,offset,d,n); /* Не допускает записи из прикладной сборки. */ +} /* Внутренняя Flash ещё не затронута. */ /* Проверка включает CRC EEPROM и структуру SCI8. Сейчас отказ этого слоя * кодируется CRC_ERROR как общий отказ проверки образа; причины внутри * парсера SCI8 отдельными статусами протокола не различаются. */ @@ -58,10 +84,21 @@ static pcan_boot_status_t verify(void *u,pcan_boot_byte_t slot,const pcan_boot_m { (void)u; if(!F28335_BOOT_LOADER || !healthy) return PCAN_BOOT_STATUS_INVALID_STATE; +#if F28335_BOOT_LOADER && F28335_CAN_FLASH_UPDATE /* Для внутренней Flash нужен собственный допустимый диапазон SCI8 и обязательный FAB1. */ + if (flash_selected) return f28335_flash_update_validate(&flash_update, &store.io, flash_staging ? F28335_AB_SLOT_B : F28335_AB_SLOT_A, m) ? PCAN_BOOT_STATUS_OK : PCAN_BOOT_STATUS_CRC_ERROR; /* Повторно читает EEPROM и проверяет транспортную CRC, таблицу и CRC будущей Flash до erase. */ +#endif /* RAM SCI8 проходит прежнюю проверку приложения EEPROM. */ return f28335_boot_verify(&store,slot,m,0)?PCAN_BOOT_STATUS_OK:PCAN_BOOT_STATUS_CRC_ERROR; } static bool commit(void *u,pcan_boot_byte_t slot,const pcan_boot_manifest_t *m) -{ (void)u; return F28335_BOOT_LOADER && healthy && f28335_boot_commit(&store,slot,m); } +{ /* COMMIT выполняет фактическую запись только после подтверждённой проверки образа. */ +#if F28335_BOOT_LOADER && F28335_CAN_FLASH_UPDATE /* Постоянный boot остаётся вне обновляемых секторов B–H. */ + if (flash_selected) { /* Синхронный TI API может работать дольше обычного интервала CAN, не создавая pending EEPROM. */ + bool result = healthy && F28335Boot_FlashProgram(&flash_update); /* Итог зависит от erase, каждой порции readback и полной CRC физической Flash. */ + boot.now_ms = F28335Boot_Now(); boot.last_activity_ms = boot.now_ms; return result; /* Обновляет срок сессии после аппаратной операции, чтобы штатный REBOOT не был отклонён из-за времени записи. */ + } /* Ошибка записи оставляет постоянный boot доступным для нового сеанса. */ +#endif /* Обычное обновление EEPROM сохраняет trial/CONFIRM. */ + (void)u; return F28335_BOOT_LOADER && healthy && f28335_boot_commit(&store,slot,m); /* Публикует только RAM-образ в исходном журнале A/B. */ +} /* Итоговый статус и отдельный REBOOT отправляет существующее ядро ProtoCAN. */ /* Подтверждение принадлежит приложению после READY. Загрузчик не может * подтвердить кандидата сам: иначе исчезнет смысл проверки пробного запуска. * Разрешение кормления watchdog из ISR открываем только после записи журнала. */ @@ -82,9 +119,14 @@ static unsigned int enter(void *u,pcan_boot_byte_t session) { (void)u; if(!healthy) return 2; - if(F28335_BOOT_LOADER) return 0; + if(F28335_BOOT_LOADER) { /* Постоянный загрузчик открывает сессию без дополнительного reset. */ +#if F28335_CAN_FLASH_UPDATE /* Каждая новая сессия должна начинаться со штатного EEPROM-назначения. */ + if (boot.state == PCAN_BOOT_STATE_IDLE) (void)select_memory(0, 0U, &boot.config); /* Повторный ENTER текущей сессии не меняет уже выбранную Flash. */ +#endif /* Старые сборки не используют переключение назначения. */ + return 0; /* Ядро отправит адресный ACK готовности. */ + } /* Прикладной handoff проверяется ниже. */ /* No destructive fallback on boards still starting through the SPI ROM. */ - if(F28335Boot_RunningSlot()>1 || !confirmed) return 2; + if((F28335Boot_RunningSlot()>1 && F28335Boot_RunningSlot()!=F28335_BOOT_FLASH_SLOT) || !confirmed) return 2; /* Только handoff общего загрузчика разрешает переход из EEPROM либо защищённой внутренней Flash; старый SPI-ROM старт остаётся запрещён. */ reset_session=session; reset_requested=1; return 1; } static void info32(pcan_boot_byte_t *p,uint32_t v) @@ -95,18 +137,21 @@ static void info32(pcan_boot_byte_t *p,uint32_t v) * 2 — active/pending/attempted/healthy/тайм-аут, 3 — область параметров. */ static bool info(void *u,pcan_boot_byte_t command,pcan_boot_byte_t page,pcan_boot_byte_t *out) { - static const char name[]=F28335_CAN_BOOT_DEVICE_NAME; - unsigned int i,index; (void)u; + const char *name=boot.config.device_type==1U && boot.config.device_id==8U?"Zadatchik":boot.config.device_type==1U && boot.config.device_id==5U?"UMP1":boot.config.device_type==1U && boot.config.device_id==6U?"UMP2":F28335_CAN_BOOT_DEVICE_NAME; /* Паспорт различает три назначенных Excel устройства; резервные номера сохраняют аппаратное имя. */ + unsigned int i,index,name_size=(unsigned int)strlen(name)+1U; (void)u; /* Длина включает завершающий NUL, чтобы последняя страница имени однозначно завершала чтение. */ if(command==PCAN_BOOT_CMD_CAPABILITIES && page==0) { /* bits: ping, discovery, identity, name, memory, A/B, confirm, rollback, * separate loader, session timeout, readback, SCI8 validation. */ - info32(out,(F28335_BOOT_LOADER || F28335Boot_RunningSlot()<2)?0xFFFUL:0x1FUL); - info32(out+4,F28335_AB_SLOT_BYTES); return true; + info32(out,(F28335_BOOT_LOADER || F28335Boot_RunningSlot()<2 || F28335Boot_RunningSlot()==F28335_BOOT_FLASH_SLOT)?0xFFFUL:0x1FUL); /* Flash-приложение с достоверным handoff поддерживает вход в постоянный CAN Boot так же, как подтверждённый EEPROM-образ. */ +#if F28335_BOOT_LOADER && F28335_CAN_FLASH_UPDATE /* Дополнительный бит сообщает клиенту поддержку явной внутренней Flash. */ + out[1] |= 0x10U; /* Бит 12 общего little-endian capability word означает SELECT_MEMORY и запись B–H. */ +#endif /* Старые приложения продолжают сообщать прежние возможности. */ + info32(out+4,F28335_AB_SLOT_BYTES); return true; /* Максимальная длина одинакова для staging Flash и EEPROM A/B. */ } if(command==PCAN_BOOT_CMD_DEVICE_NAME) { - if((unsigned int)page*8U>=sizeof(name)) return false; + if((unsigned int)page*8U>=name_size) return false; /* Страница после конца выбранного имени не является допустимой частью паспорта. */ for(i=0;i<8;++i) { index=(unsigned int)page*8U+i; - out[i]=index=F28335_CAN_BOOT_PERIPH_COUNT) return; /* Номер вне Excel-диапазона 0–31 не подменяется общим адресом и не открывает запись другой платы. */ memset(&cfg,0,sizeof(cfg)); memset(&port,0,sizeof(port)); io.read=F28335Boot_Read; io.write=F28335Boot_Write; io.user=0; healthy=f28335_boot_open(&store,&io); - cfg.device_type=F28335_CAN_BOOT_DEVICE_TYPE; cfg.device_id=F28335_CAN_BOOT_DEVICE_ID; + cfg.device_type=1U+periph_id/16U; cfg.device_id=periph_id%16U; /* Excel: PERIPH 0–15 → Type 1, 16–31 → Type 2; младшие четыре бита задают Device ID. */ cfg.product_type=F28335_CAN_BOOT_PRODUCT; cfg.hardware_revision=1; #if F28335_BOOT_LOADER cfg.firmware_version=store.active<2?store.image[store.active].firmware_version:0; @@ -139,15 +186,20 @@ void F28335CanBoot_Init(void) cfg.firmware_version=F28335_CAN_BOOT_FIRMWARE_VERSION; #endif head=tail=overflow=reset_requested=reset_session=ready=main_passes=0; tx_busy=tx_canceling=0; - confirmed=healthy && running<2 && store.active==running && store.pending==F28335_AB_NONE; + confirmed=running==F28335_BOOT_FLASH_SLOT || (healthy && running<2 && store.active==running && store.pending==F28335_AB_NONE); /* Flash уже проверена CRC постоянным boot; пробное подтверждение требуется только EEPROM-кандидату. */ cfg.active_slot=store.active; cfg.slot_count=2; cfg.max_image_size=F28335_AB_SLOT_BYTES; cfg.ack_window=16; cfg.session_timeout_ms=30000UL; +#if F28335_BOOT_LOADER && F28335_CAN_FLASH_UPDATE /* После reset никакое случайное содержимое RAM не выбирает внутреннюю Flash. */ + flash_selected = 0U; flash_staging = F28335_AB_NONE; flash_update.valid = false; /* Возвращает исходную цель и отменяет разрешение записи предыдущей сессии. */ + port.select_memory = select_memory; /* Новая команда доступна только сборке с реально подключённым TI API. */ +#endif /* Приложение отвечает только через постоянный загрузчик после handoff. */ port.send=transmit; port.erase_slot=erase; port.write_slot=write_block; port.verify_status=verify; port.set_pending_slot=commit; port.reboot=reboot; port.confirm_running_slot=confirm; port.enter_boot=enter; port.can_reboot=can_reboot; port.service_info=info; if(!pcan_boot_init(&boot,&cfg,&port,0)) return; + addressed=1U; /* Дальнейшие ISR, основной цикл и handoff используют только успешно созданную адресную конфигурацию. */ EALLOW; /* Меняем только MBOX3/4/6: маска 88=8+16+64. MBOX0..2 — старый обмен, * MBOX5 — heartbeat. Приём broadcast выделен в отдельный точный mailbox, @@ -181,8 +233,8 @@ static void receive_box(volatile struct MBOX *box,uint32_t mask) type=pcan_boot_id_msg_type(id); if(!(box->MSGID.all&0x80000000UL) || pcan_boot_id_route(id)!=0 || (type!=9 && type!=10 && type!=11 && type!=13) || - !((pcan_boot_id_device_type(id)==F28335_CAN_BOOT_DEVICE_TYPE && - pcan_boot_id_device_id(id)==F28335_CAN_BOOT_DEVICE_ID) || + !((pcan_boot_id_device_type(id)==boot.config.device_type && /* Сравнивает тип именно этой платы, а не прежнюю общую константу 3. */ + pcan_boot_id_device_id(id)==boot.config.device_id) || /* Отбрасывает команды соседних PERIPH ещё до очереди и любых операций EEPROM. */ (type==13 && pcan_boot_id_device_type(id)==7 && pcan_boot_id_device_id(id)==15 && pcan_boot_id_msg_body(id)==0))) { ECanaRegs.CANRMP.all=mask; return; } if(next==tail) overflow=1; @@ -199,6 +251,7 @@ static void receive_box(volatile struct MBOX *box,uint32_t mask) void F28335CanBoot_RxISR(void) { + if(!addressed) return; /* Неверный или ещё не настроенный номер PERIPH не должен принимать даже оставшиеся флаги RX. */ receive_box(&ECanaMboxes.MBOX3,8UL); receive_box(&ECanaMboxes.MBOX6,64UL); } @@ -214,9 +267,11 @@ unsigned int F28335CanBoot_WatchdogAllowed(void) /* Неблокирующий диспетчер относительно ожидания CAN: вызывать в каждом проходе main. * Сами callbacks проверки/записи EEPROM синхронные. Порядок здесь важен: * проба приложения -> завершение TX -> reset -> poll -> ошибки RX -> один кадр. */ +unsigned int F28335CanBoot_Active(void) { return addressed && (boot.state!=PCAN_BOOT_STATE_IDLE || reset_requested); } /* Открытый ENTER_BOOT удерживает recovery; диагностический PING не меняет приоритет Flash и EEPROM. */ void F28335CanBoot_Service(void) { uint32_t now=F28335Boot_Now(); + if(!addressed) return; /* Не обслуживает старую RAM-сессию после отказа повторной инициализации адреса. */ if(!F28335_BOOT_LOADER && ready && !confirmed && healthy && F28335Boot_RunningSlot()<2) { /* A trial must keep executing main, not merely a timer ISR. */ /* После 100 проходов main и 5 секунд пробуем сохранить CONFIRM. @@ -261,15 +316,16 @@ void F28335CanBoot_Service(void) * или CRC незавершённой передачи: данные сессии через reset не сохраняются. */ void F28335CanBoot_Resume(unsigned int session) { - if(F28335_BOOT_LOADER && session && session<256) - (void)pcan_boot_process(&boot,pcan_boot_make_id(1,0, - F28335_CAN_BOOT_DEVICE_TYPE,F28335_CAN_BOOT_DEVICE_ID,9,(session<<8)|2),0,0); + if(addressed && F28335_BOOT_LOADER && session && session<256) /* Восстанавливает только допустимую сессию адресованного загрузчика после reset. */ + (void)pcan_boot_process(&boot,pcan_boot_make_id(1,0, /* ACK относится к тому же физическому PERIPH, который принимал ENTER_BOOT в приложении. */ + boot.config.device_type,boot.config.device_id,9,(session<<8)|2),0,0); /* MsgType 9, команда 2 и исходный SessionID сохраняют протокол handoff. */ } #else void F28335CanBoot_EarlyInit(void) {} -void F28335CanBoot_Init(void) {} +void F28335CanBoot_Init(unsigned int periph_id) { (void)periph_id; } /* Сборка без M95M02 не занимает CAN-адрес и не открывает сервис записи. */ void F28335CanBoot_RxISR(void) {} void F28335CanBoot_Service(void) {} +unsigned int F28335CanBoot_Active(void) { return 0U; } /* Профиль без M95M02 не создаёт CAN-сеанс и не удерживает старт общего загрузчика. */ void F28335CanBoot_Ready(void) {} unsigned int F28335CanBoot_WatchdogAllowed(void) { return 1; } void F28335CanBoot_Resume(unsigned int session) { (void)session; } diff --git a/c/protocan-boot/ports/tms320f28335/f28335_can_boot.h b/c/protocan-boot/ports/tms320f28335/f28335_can_boot.h index 17b44db..59476e8 100644 --- a/c/protocan-boot/ports/tms320f28335/f28335_can_boot.h +++ b/c/protocan-boot/ports/tms320f28335/f28335_can_boot.h @@ -9,8 +9,7 @@ #endif /* Адрес ProtoCAN состоит из Device Type (3 бита) и Device ID (4 бита). * ProductType — отдельный код совместимости прошивки; это не CAN ID и не RS-адрес. */ -#define F28335_CAN_BOOT_DEVICE_TYPE 3U -#define F28335_CAN_BOOT_DEVICE_ID 7U +#define F28335_CAN_BOOT_PERIPH_COUNT 32U /* Лист «Интерфейс протокола», строки 45–76: PERIPH 0–31 занимают два типа по 16 экземпляров. */ #define F28335_CAN_BOOT_PRODUCT 0x2833U #define F28335_CAN_BOOT_DEVICE_NAME "F28335-M95M02" /* Порядок интеграции приложения: @@ -18,10 +17,11 @@ * таймера и EEPROM; Ready после старта прикладных подсистем; Service в main. * RxISR вызывается из CAN ISR, WatchdogAllowed проверяется перед кормлением * watchdog таймерным ISR. Resume применяется только отдельным загрузчиком. */ -void F28335CanBoot_Init(void); +void F28335CanBoot_Init(unsigned int periph_id); /* Принимает физический номер PERIPH: 5 — УМП1, 6 — УМП2, 8 — задатчик; общий адрес для всех плат исключён. */ void F28335CanBoot_EarlyInit(void); void F28335CanBoot_RxISR(void); void F28335CanBoot_Service(void); +unsigned int F28335CanBoot_Active(void); /* Удерживает загрузчик в CAN recovery после ENTER_BOOT, не запуская приложение по окончании стартового окна. */ void F28335CanBoot_Ready(void); void F28335CanBoot_Resume(unsigned int session); unsigned int F28335CanBoot_WatchdogAllowed(void); diff --git a/c/protocan-boot/ports/tms320f28335/f28335_flash_app.c b/c/protocan-boot/ports/tms320f28335/f28335_flash_app.c new file mode 100644 index 0000000..ac5dbd5 --- /dev/null +++ b/c/protocan-boot/ports/tms320f28335/f28335_flash_app.c @@ -0,0 +1,26 @@ +#include "f28335_flash_app.h" /* Использует ту же границу сектора A и формат описания, что сборщик и RS-программатор. */ +bool f28335_flash_app_validate(f28335_flash_read_word_t read_word, void *user, uint32_t *entry) /* Не обращается к EEPROM и подходит для постоянного загрузчика и проверки staging RAM. */ +{ /* Никакие адреса из непроверенного заголовка не используются для чтения до проверки границ. */ + uint16_t header[F28335_FLASH_APP_HEADER_WORDS], word, octet, bit, i; /* Малый локальный буфер хранит 16 слов описания FAB1. */ + uint32_t address, start, end, expected, crc = 0xFFFFFFFFUL, target, inverse; /* CRC32 IEEE начинается со всех единиц и инвертируется после последнего октета. */ + if (!read_word || !entry) return false; /* Отсутствующий источник или выходной указатель не должен вызывать обращение к памяти. */ + for (i = 0; i < F28335_FLASH_APP_HEADER_WORDS; ++i) header[i] = read_word(user, F28335_FLASH_APP_START + i); /* Читает только фиксированное описание в секторе H. */ + if (header[0] != 0x4146U || header[1] != 0x3142U || header[2] != 1U || header[3] != F28335_FLASH_APP_HEADER_WORDS || header[14] != 0x5AA5U || header[15] != 0xA55AU) return false; /* Физические октеты ASCII FAB1, версия 1, размер и два маркера отличают завершённый образ от стёртого либо старого Flash. */ + target = (uint32_t)header[4] | ((uint32_t)header[5] << 16); /* Точка входа хранится младшим 16-битным словом вперёд внутри описания. */ + start = (uint32_t)header[6] | ((uint32_t)header[7] << 16); /* Нижняя граница защищённого CRC диапазона должна начинаться сразу после описания. */ + end = (uint32_t)header[8] | ((uint32_t)header[9] << 16); /* Верхняя граница является исключённым адресом слова, а не длиной в байтах. */ + expected = (uint32_t)header[10] | ((uint32_t)header[11] << 16); /* Сохранённая CRC32 рассчитана по физическим октетам всех слов диапазона. */ + inverse = (uint32_t)header[12] | ((uint32_t)header[13] << 16); /* Инверсия адреса выявляет частичную публикацию управляющих полей. */ + if (start != F28335_FLASH_APP_DATA || end <= start || end > F28335_FLASH_APP_STOP || target < start || target >= end || inverse != ~target) return false; /* Запрещает RAM, сектор загрузчика, пустой код и случайные адреса из повреждённого описания. */ + for (address = start; address < end; ++address) { /* Проверяет также стёртые промежутки между LOAD-секциями, чтобы JTAG и RS давали одинаковое содержимое. */ + word = read_word(user, address); /* Получает одно 16-битное слово из Flash либо из модели staging SCI8. */ + for (i = 0; i < 2U; ++i) { /* Каждый адрес C28x содержит два физических октета: сначала младший, затем старший. */ + octet = (word >> (8U * i)) & 255U; /* Маска отделяет октет независимо от 16-битного char TI. */ + crc ^= octet; /* Добавляет очередной октет в отражённое состояние CRC32 IEEE. */ + for (bit = 0; bit < 8U; ++bit) crc = (crc & 1UL) ? ((crc >> 1) ^ 0xEDB88320UL) : (crc >> 1); /* 0xEDB88320 — отражённый полином IEEE 802.3, совпадающий с zlib.crc32. */ + } /* Завершает обработку обоих октетов текущего слова. */ + } /* Завершает чтение только внутри области приложения ниже сектора A. */ + if ((crc ^ 0xFFFFFFFFUL) != expected) return false; /* Повреждённое или частично записанное приложение остаётся недоступным для запуска. */ + *entry = target; /* Публикует точку старта только после подтверждения всех адресов и данных. */ + return true; /* Разрешает загрузчику запустить именно проверенную Flash-программу. */ +} /* Ошибка никогда не меняет EEPROM, Flash или сохранённый выходной адрес. */ diff --git a/c/protocan-boot/ports/tms320f28335/f28335_flash_app.h b/c/protocan-boot/ports/tms320f28335/f28335_flash_app.h new file mode 100644 index 0000000..94741e3 --- /dev/null +++ b/c/protocan-boot/ports/tms320f28335/f28335_flash_app.h @@ -0,0 +1,11 @@ +#ifndef F28335_FLASH_APP_H /* Защищает общий контракт Flash-приложения от повторного объявления. */ +#define F28335_FLASH_APP_H /* Один заголовок используется загрузчиком, RS-проверкой и host-тестами. */ +#include "../../include/pcan_boot.h" /* Получает переносимые 16- и 32-битные типы и bool для C28x и ПК. */ +#define F28335_FLASH_APP_START 0x300000UL /* Первые 16 слов сектора H содержат описание FAB1, а не аппаратный boot. */ +#define F28335_FLASH_APP_HEADER_WORDS 16U /* Размер описания равен 32 октетам при 16-битном адресуемом слове C28x. */ +#define F28335_FLASH_APP_DATA 0x300010UL /* Код и Flash LOAD-секции следуют после служебного описания. */ +#define F28335_FLASH_APP_STOP 0x338000UL /* Начало сектора A является исключённой границей приложения. */ +#define F28335_BOOT_FLASH_SLOT 0xFEU /* Отдельный handoff отличает внутреннюю Flash от EEPROM A/B и неизвестного SPI-ROM запуска. */ +typedef uint16_t (*f28335_flash_read_word_t)(void *user, uint32_t address); /* Callback читает одно физическое слово без предположения о памяти host-тестов. */ +bool f28335_flash_app_validate(f28335_flash_read_word_t read_word, void *user, uint32_t *entry); /* Проверяет описание, границы и CRC32 до передачи управления приложению. */ +#endif /* Завершает единый контракт защищённой области Flash-приложения. */ diff --git a/c/protocan-boot/ports/tms320f28335/f28335_flash_update.c b/c/protocan-boot/ports/tms320f28335/f28335_flash_update.c new file mode 100644 index 0000000..ed4182b --- /dev/null +++ b/c/protocan-boot/ports/tms320f28335/f28335_flash_update.c @@ -0,0 +1,86 @@ +#include "f28335_flash_update.h" /* Разделяет проверяемый алгоритм и аппаратные вызовы TI Flash API. */ +#include /* Явно очищает состояние источника перед разбором нового SCI8. */ +static unsigned int octet(f28335_flash_update_t *s, uint32_t offset) /* Читает октет через страничный кеш, исключая SPI-транзакцию на каждый байт CRC. */ +{ /* Все смещения ограничены фактической длиной принятого файла. */ + if (offset >= s->length) { s->fault = true; return 0U; } /* Обрезанное поле не превращается в данные за концом staging. */ + if (!s->cache_size || offset < s->cache_at || offset - s->cache_at >= s->cache_size) { /* Загружает новую страницу только при выходе за текущую. */ + s->cache_at = offset & ~255UL; /* Выравнивает смещение на страницу из 256 физических октетов. */ + s->cache_size = s->length - s->cache_at > 256UL ? 256U : (unsigned int)(s->length - s->cache_at); /* Последнее чтение не включает паддинг CAN за концом образа. */ + if (!s->io.read(s->io.user, s->base + s->cache_at, s->cache, s->cache_size)) { s->fault = true; s->cache_size = 0U; return 0U; } /* Любой неполный аппаратный обмен запрещает erase. */ + } /* После заполнения кеша извлечение октета не обращается к SPI. */ + return s->cache[offset - s->cache_at] & 255U; /* Маска сохраняет восьмибитный wire-формат на C28x. */ +} /* Завершает ограниченное чтение октета. */ +static uint16_t word(f28335_flash_update_t *s, uint32_t offset) /* SCI8 передаёт младший октет каждого 16-битного слова первым. */ +{ /* Объединяет два октета только через проверяемый источник. */ + unsigned int low = octet(s, offset); /* Явный порядок вызовов не зависит от порядка вычисления операндов компилятором. */ + return (uint16_t)(low | (octet(s, offset + 1UL) << 8)); /* Восстанавливает одно слово CPU из двух октетов SCI8. */ +} /* Завершает декодирование слова. */ +static uint32_t address_at(f28335_flash_update_t *s, uint32_t offset) /* Адрес таблицы TI содержит старшее слово перед младшим. */ +{ /* Порядок слов адреса отличается от порядка октетов внутри слова. */ + uint32_t high = word(s, offset); /* Читает старшие 16 бит адреса раньше младших. */ + return (high << 16) | word(s, offset + 2UL); /* Получает CPU word-address без перевода в байты. */ +} /* Завершает восстановление адреса SCI8. */ +static uint16_t image_word(void *user, uint32_t address) /* Предоставляет общему валидатору будущий вид Flash, включая стёртые промежутки. */ +{ /* Отсортированный индекс позволяет проверять весь CRC-диапазон последовательно. */ + f28335_flash_update_t *s = user; f28335_flash_section_t *p; /* Контекст содержит только предварительно проверенные секции. */ + if (s->cursor >= s->count || address < s->section[s->cursor].address) s->cursor = 0U; /* Возврат от заголовка к началу диапазона корректно перематывает индекс. */ + while (s->cursor < s->count) { /* Пропускает только секции, целиком лежащие перед запрошенным словом. */ + p = &s->section[s->cursor]; /* Обращается к существующему элементу проверенного индекса. */ + if (address < p->address) return 0xFFFFU; /* Flash_Erase оставляет незагружаемый промежуток заполненным единицами. */ + if (address - p->address < p->words) return word(s, p->offset + 2UL * (address - p->address)); /* Переводит смещение слов секции в октеты SCI8. */ + ++s->cursor; /* Следующий запрос не должен повторно сканировать уже пройденную секцию. */ + } /* После последней секции остаётся только стёртая Flash. */ + return 0xFFFFU; /* CRC учитывает также завершающий промежуток диапазона FAB1. */ +} /* Сам этот callback никогда не читает аппаратную Flash. */ +bool f28335_flash_update_validate(f28335_flash_update_t *s, const f28335_boot_io_t *io, uint32_t base, const pcan_boot_manifest_t *m) /* Проверяет транспорт, таблицу, допустимые адреса и FAB1 перед erase. */ +{ /* Любая ошибка оставляет объект непригодным для программирования. */ + uint32_t offset = 22UL, crc = 0UL, entry, checked_entry, bytes; unsigned int i, j, headers = 0U, have_entry = 0U; /* Заголовок SCI8 занимает 11 слов, то есть 22 октета. */ + f28335_flash_section_t p; bool ended = false; /* Временная секция нужна для вставки в отсортированный индекс. */ + if (!s || !io || !io->read || !m) return false; /* Не разыменовывает отсутствующие callbacks и manifest. */ + memset(s, 0, sizeof(*s)); s->io = *io; s->base = base; s->length = m->image_size; s->crc = m->image_crc32; /* Отбрасывает кеш и разрешение записи предыдущего образа. */ + if (s->length < 24UL || (s->length & 1UL) || s->length > F28335_AB_SLOT_BYTES || word(s, 0UL) != 0x08AAU) return false; /* Принимает только полный чётный SCI8 в пределах staging-слота. */ + for (offset = 0UL; offset < s->length; offset += bytes) { /* Независимо проверяет фактически записанную EEPROM, а не только принятые CAN-кадры. */ + bytes = s->length - offset > 256UL ? 256UL : s->length - offset; /* Делит чтение на ограниченные страницы без выхода за файл. */ + if (!s->io.read(s->io.user, base + offset, s->cache, (unsigned int)bytes)) return false; /* Аппаратная ошибка запрещает последующий erase. */ + crc = pcan_boot_crc32_update(crc, s->cache, (size_t)bytes); /* Использует общий CRC32 IEEE, совпадающий с клиентом SETGUI. */ + } /* Все октеты staging включены в транспортную CRC32. */ + s->cache_size = 0U; if (crc != s->crc) return false; /* Сбрасывает кеш после прямого чтения и отклоняет повреждённую EEPROM. */ + entry = address_at(s, 18UL); offset = 22UL; /* Точка входа следует после ключа и восьми резервных слов SCI8. */ + if (entry < F28335_FLASH_APP_DATA || entry >= F28335_FLASH_APP_STOP) return false; /* Запуск разрешён только из приложения ниже постоянного сектора A. */ + while (offset + 2UL <= s->length) { /* Для каждой секции сначала проверяет наличие поля длины. */ + p.words = word(s, offset); offset += 2UL; /* Длина секции выражена адресуемыми словами C28x. */ + if (!p.words) { ended = offset == s->length; break; } /* Нулевой терминатор обязан завершать файл без лишнего хвоста. */ + if (s->count == F28335_AB_MAX_SECTIONS || offset + 4UL > s->length) return false; /* Не допускает переполнение индекса либо обрезанный адрес секции. */ + p.address = address_at(s, offset); offset += 4UL; p.offset = offset; bytes = 2UL * p.words; /* Хранит CPU-адрес и байтовое смещение полезных данных отдельно. */ + if (bytes > s->length - offset || p.address < F28335_FLASH_APP_START || p.address >= F28335_FLASH_APP_STOP || p.words > F28335_FLASH_APP_STOP - p.address) return false; /* Исключает RAM, сектор A, CSM, OTP и выход за конец staging. */ + if (p.address == F28335_FLASH_APP_START) { if (p.words < F28335_FLASH_APP_HEADER_WORDS) return false; ++headers; } /* Полные 16 слов FAB1 должны публиковаться одной заключительной операцией. */ + if (entry >= p.address && entry - p.address < p.words) have_entry = 1U; /* Код entry обязан присутствовать именно в принятой таблице. */ + for (i = 0U; i < s->count; ++i) if (p.address < s->section[i].address + s->section[i].words && s->section[i].address < p.address + p.words) return false; /* Повторное программирование пересекающихся диапазонов запрещено. */ + for (j = s->count; j && s->section[j - 1U].address > p.address; --j) s->section[j] = s->section[j - 1U]; /* Сортирует индекс по адресу независимо от порядка секций в SCI8. */ + s->section[j] = p; ++s->count; offset += bytes; /* Запоминает непересекающуюся секцию и переходит к следующему заголовку. */ + } /* Структура файла полностью разобрана без записи Flash. */ + if (!ended || headers != 1U || !have_entry || s->fault) return false; /* Требует терминатор, единственный FAB1 и фактический исполняемый entry. */ + s->cursor = 0U; if (!f28335_flash_app_validate(image_word, s, &checked_entry) || s->fault || checked_entry != entry) return false; /* Общий валидатор проверяет magic, границы, инверсию entry и CRC будущей Flash. */ + s->entry = entry; s->valid = true; return true; /* Разрешает программирование только после всех независимых проверок. */ +} /* Ошибка проверки не меняет текущую Flash и журнал активной EEPROM. */ +bool f28335_flash_update_program(f28335_flash_update_t *s, const f28335_flash_ops_t *ops) /* Выполняет запись B–H только из полностью проверенного staging. */ +{ /* Заголовок FAB1 фиксируется после успешной проверки каждой порции данных. */ + uint16_t buffer[128]; unsigned int i, j, n; uint32_t at, left, entry; pcan_boot_manifest_t m; f28335_boot_io_t io; /* Одна порция содержит не более 128 слов, то есть 256 физических октетов. */ + if (!s || !s->valid || !ops || !ops->erase || !ops->program || !ops->read) return false; /* Неполный аппаратный контракт не должен начать стирание. */ + memset(&m, 0, sizeof(m)); m.image_size = s->length; m.image_crc32 = s->crc; io = s->io; at = s->base; /* Сохраняет исходные параметры перед полной повторной проверкой EEPROM. */ + if (!f28335_flash_update_validate(s, &io, at, &m)) return false; /* Изменение staging между VERIFY и COMMIT обнаруживается до первого erase. */ + s->valid = false; if (!ops->erase(ops->user)) return false; /* Одно разрешение записи расходуется до изменения Flash; повтор после отказа требует нового VERIFY. */ + for (i = 0U; i < s->count; ++i) { /* Программирует обычные данные каждой непересекающейся секции. */ + at = s->section[i].address; left = s->section[i].words; /* CPU-курсор и остаток выражены словами. */ + if (at == F28335_FLASH_APP_START) { at += F28335_FLASH_APP_HEADER_WORDS; left -= F28335_FLASH_APP_HEADER_WORDS; } /* Пропускает FAB1 до подтверждения всех остальных данных. */ + while (left) { /* Большие секции разбивает на порции рабочего буфера. */ + n = left > 128UL ? 128U : (unsigned int)left; /* Последняя порция может быть короче 128 слов. */ + for (j = 0U; j < n; ++j) buffer[j] = word(s, s->section[i].offset + 2UL * (at + j - s->section[i].address)); /* Распаковывает слова непосредственно из staging EEPROM. */ + if (s->fault || !ops->program(ops->user, at, buffer, n)) return false; /* Ошибка чтения, записи или readback оставляет FAB1 неопубликованным. */ + at += n; left -= n; /* Продвигает курсоры только после подтверждённой порции. */ + } /* Завершает запись данных секции. */ + } /* Все обычные слова уже записаны и проверены аппаратным портом. */ + for (i = 0U; i < F28335_FLASH_APP_HEADER_WORDS; ++i) buffer[i] = image_word(s, F28335_FLASH_APP_START + i); /* Собирает единственное проверенное описание FAB1 для заключительной записи. */ + if (s->fault || !ops->program(ops->user, F28335_FLASH_APP_START, buffer, F28335_FLASH_APP_HEADER_WORDS)) return false; /* Публикует описание только после успешной записи остальных секций. */ + return f28335_flash_app_validate(ops->read, ops->user, &entry) && entry == s->entry; /* Итоговый успех требует общей CRC уже физической Flash, а не только поблочного сравнения. */ +} /* Решение о CAN-подтверждении и перезапуске остаётся существующему протоколу. */ diff --git a/c/protocan-boot/ports/tms320f28335/f28335_flash_update.h b/c/protocan-boot/ports/tms320f28335/f28335_flash_update.h new file mode 100644 index 0000000..3fa5c66 --- /dev/null +++ b/c/protocan-boot/ports/tms320f28335/f28335_flash_update.h @@ -0,0 +1,20 @@ +#ifndef F28335_FLASH_UPDATE_H /* Один контракт объединяет проверку CAN-образа и аппаратную запись внутренней Flash. */ +#define F28335_FLASH_UPDATE_H /* Исключает повторное объявление структур при подключении аппаратного порта. */ +#include "f28335_boot_store.h" /* Использует существующий побайтовый доступ к staging-слоту EEPROM и manifest ProtoCAN. */ +#include "f28335_flash_app.h" /* Получает границы приложения B–H и проверку завершающего описания FAB1. */ +typedef struct { uint32_t address, offset; uint16_t words; } f28335_flash_section_t; /* Адрес CPU считается словами, смещение SCI8 — октетами, длина секции — словами. */ +typedef struct { /* Хранит проверенный индекс SCI8, не размещая целый образ во внутренней RAM загрузчика. */ + f28335_boot_io_t io; uint32_t base, length, crc, entry; /* Источник EEPROM, начало staging, точная длина, транспортная CRC32 и подтверждённый entry. */ + f28335_flash_section_t section[F28335_AB_MAX_SECTIONS]; /* Лимит 64 совпадает с ограничением выпуска SCI8 и ограничивает расход RAM. */ + unsigned int count, cursor, cache_size; bool fault, valid; /* Курсор ускоряет последовательную CRC; fault запрещает принятие неполного чтения EEPROM. */ + uint32_t cache_at; pcan_boot_byte_t cache[256]; /* Одна страница M95M02 содержит 256 физических октетов, даже при 16-битном char C28x. */ +} f28335_flash_update_t; /* Объект принадлежит только main постоянного загрузчика, а не CAN ISR. */ +typedef struct { /* Аппаратные операции отделены от формата SCI8 для испытаний обрыва и ошибок TI API. */ + bool (*erase)(void *user); /* Стирает только секторы B–H, сохраняя сектор A с постоянным загрузчиком. */ + bool (*program)(void *user, uint32_t address, uint16_t *data, unsigned int words); /* Записывает и проверяет одну порцию слов по допустимому CPU-адресу. */ + f28335_flash_read_word_t read; void *user; /* Чтение физической Flash подтверждает общий FAB1/CRC после последней записи. */ +} f28335_flash_ops_t; /* Никаких неявных операций reset или изменения EEPROM-журнала здесь нет. */ +bool f28335_flash_update_validate(f28335_flash_update_t *s, const f28335_boot_io_t *io, uint32_t base, const pcan_boot_manifest_t *m); /* Полностью проверяет staging до первого стирания Flash. */ +bool f28335_flash_update_program(f28335_flash_update_t *s, const f28335_flash_ops_t *ops); /* Повторяет проверку, пишет данные и публикует FAB1 последним. */ +bool F28335Boot_FlashProgram(f28335_flash_update_t *s); /* Аппаратная реализация подключает официальный TI Flash API только в постоянном загрузчике. */ +#endif /* Завершает защиту интерфейса CAN-обновления внутренней Flash. */ diff --git a/c/protocan-boot/projects/README.md b/c/protocan-boot/projects/README.md new file mode 100644 index 0000000..5558558 --- /dev/null +++ b/c/protocan-boot/projects/README.md @@ -0,0 +1,156 @@ +# Отдельные проекты CCS: F28335 и F2812 + +Весь комплект находится внутри `templates/c/protocan-boot`: проекты CCS, +исходники загрузчиков, аппаратные порты, linker command files, необходимая +поддержка TI, CLI-сборка, тесты и документация. Зависимости от исходников +`28335_periph` и `BALZAM_167` при сборке отсутствуют. Требуется установленный +TI C2000 compiler с поддержкой **COFF ABI**; проверена версия **22.6.0.LTS**. + +| Проект CCS | Контроллер | Обновляемая память | Схема | +| --- | --- | --- | --- | +| `ccs/f28335` — `F28335_CAN_AB` | TMS320F28335 | M95M02, 256 КиБ | A/B, trial, CONFIRM, rollback | +| `ccs/f2812` — `F2812_CAN_NOR` | TMS320F2812 / ПМ67 | AM29LV800BT-70EI, 1 МиБ, x16 | Один выделенный NOR-слот, проверяемый manifest, CAN recovery | + +F2812 не использует EEPROM. Его карта, GPIO, частота CAN, допустимые адреса +приложения и состояние протокола отделены от F28335. + +## Открытие в Code Composer Studio + +1. **Project → Import CCS Projects**, каталог поиска — `c/protocan-boot/projects/ccs`. +2. Выбрать `F28335_CAN_AB` и `F2812_CAN_NOR`. Оставить проекты в исходном + расположении: **не включать Copy projects into workspace**, поскольку + переносимые ссылки `PCAN_ROOT` ведут к общей библиотеке выше проектов. +3. Выбрать **Debug** либо **Release**, затем **Build Project**. Оба проекта + содержат собственные `.project`, `.cproject`, `.ccsproject`. +4. OUT/MAP появятся в `ccs/<контроллер>//`. + +В `targetConfigs` сохранены существующие конфигурации Sauris SAU510: +F28335 — Iso Plus v.2, F2812 — Iso Plus. Для другого адаптера выбрать свой +Connection в Target Configuration. Компиляция и импорт не подключаются к JTAG +и не программируют плату. + +Для отдельных workspace с ограниченными правами CCS допускает переменную +`TI_APPDATA_DIR` с доступным для записи каталогом. Это служебный cache IDE, +он не относится к исходникам загрузчиков. + +## Сборка без запуска IDE + +Из корня **templates**: + +```powershell +python c/protocan-boot/projects/build.py --device f28335 +python c/protocan-boot/projects/build.py --device f2812 +python c/protocan-boot/projects/build.py --device f28335 --configuration Release +python c/protocan-boot/projects/build.py --device f2812 --configuration Release +``` + +Можно передать `--compiler <каталог-ti-cgt-c2000>` и `--output <каталог>`. +Скрипт читает состав исходников и настройки из этих же CCS-проектов, полностью +пересобирает их и проверяет реальные COFF LOAD-адреса официальным `ofd2000`. +Проверка отклоняет загружаемый RAM-код без Flash LOAD, пересечения, отсутствующие +boot branch/C entry, запись CSM/OTP и посторонних внутренних секторов. +Рядом с OUT сохраняются MAP, `build.log` и manifest с SHA-256. + +Результаты: + +- `ccs/f28335/Debug/F28335_CAN_AB.out`; +- `ccs/f2812/Debug/F2812_CAN_NOR.out`. + +OUT — постоянный загрузчик для первоначальной установки через JTAG во +**внутреннюю Flash** соответствующего TMS. Образ самого приложения передаётся +по CAN в его внешнюю память. Для автоматического запуска должен быть выбран +внутренний Flash boot; у ПМ67 необходимо также учитывать штатную логику CPLD +выбора источника reset/boot из `big_dsp_module` платы. + +## F28335 / M95M02 + +Проект использует существующий порт и формат журнала без изменения адресов: +**PERIPH 0–31: Type = 1 + PERIPH / 16, Device ID = PERIPH mod 16**. +УМП1 — **1/5**, УМП2 — **1/6**, задатчик — **1/8**. +Product **0x2833**, HW **1**, CAN **250000 бит/с**. Приложение и загрузчик +используют один аппаратный номер платы; прежний общий адрес **3/7** отменён. +Код загрузчика — внутренний сектор A `0x338000..0x33FF7F`, boot — `0x33FFF6`. +Слоты M95M02 имеют по **130560 октетов**, параметры — прежние 258 октетов +по адресу `0x3FEFC`. Приложение загружается в RAM ниже CPU word-адреса `0xE000`. + +После установки постоянного загрузчика новое приложение 167 передаётся +существующим клиентом SETGUI **CAN / ProtoCAN Boot**. Оно обязано содержать +hooks READY/CONFIRM и watchdog: пример интеграции реализован в ветке 167. +Без CONFIRM следующий reset возвращает подтверждённый active. +Полная последовательность — [документация порта F28335](../ports/tms320f28335/README.md). + +## F2812 / AM29LV800BT + +Профиль: **Device Type 3, Device ID 6, Product 0x2812, HW 1, +CAN 250000 бит/с, SYSCLKOUT 150 МГц**. CAN находится на **GPIOF6 TX / GPIOF7 RX**. +F2812 использует программную арифметику `rts2800_ml.lib`; F28335 — FPU32 +и `rts2800_fpu32.lib`. + +Внутренний сектор A загрузчика: `0x3F6000..0x3F7F7F`, boot — `0x3F7FF6`. +Внешняя NOR подключена по **CPU word-адресу `0x100000`**. Новый CAN-раздел +задан явно в `ports/tms320f2812/boot2812.h`: + +| Область | CPU word-адреса включительно | Размер | +| --- | --- | ---: | +| Существующая нижняя область: прежние образы/параметры/FPGA | `0x100000..0x15FFFF` | 768 КиБ | +| Новый SCI8 CAN-образ: обычные сектора 12/13/14 | `0x160000..0x177FFF` | **192 КиБ** | +| Неизменяемые этим загрузчиком top-boot сектора 15/16/17 | `0x178000..0x17DFFF` | 48 КиБ | +| Новый manifest: последний top-boot сектор 18 | `0x17E000..0x17FFFF` | 16 КиБ | + +Это **новое явное размещение CAN-образа**, а не автоматическое определение +свободного места в уже заполненном чипе. Перед первоначальной установкой +согласовать эти два выделенных участка с фактической картой NOR конкретной +платы. В известном исходнике FPGA начинается с `0x130000`, а новый CAN-слот +находится выше; драйвер не изменяет ничего ниже `0x160000` и в секторах 15–17. + +После reset доступно **3 секунды** для ENTER_BOOT. Открытая сессия удерживает +загрузчик; пустой/повреждённый manifest оставляет CAN recovery постоянно. +Для обновления уже работающего приложения нужно войти в это окно после reset; +приложение F2812 само по себе пока не получает обработчик ENTER_BOOT от добавления +отдельного проекта загрузчика. + +Перед записью требуется AMD manufacturer **`0x0001`**, device **`0x22DA`**. +Сначала стирается сектор manifest, затем три сектора образа. Запись проверяет +каждое слово. VERIFY повторно читает NOR, проверяет CRC32, SCI8, entry, +перекрытия и запрещённые назначения. COMMIT повторяет проверку, сохраняет +manifest с собственной CRC, два magic-слова публикуются последними. +Стирание сообщает BUSY каждые 250 мс, продлевая живую сессию. + +Это single-slot схема: при обрыве обновления последнего CAN-образа остаётся +recovery, автоматический A/B rollback для F2812 не заявляется. Полное стирание +NOR, запись внутренней Flash по CAN и программирование FPGA отсутствуют. + +Образ приложения — **TI SCI8 `AA 08`**, максимум **196608 октетов**. Старый +flat BIN основного контроллера автоматически не мигрируется. Допустимый payload: + +- L0 `0x8000..0x8EFF`; +- H0 `0x3F8000..0x3F9FFF`; +- внешняя SRAM zone2 `0x80000..0xFFFFF`. + +Стек M1, L1 `0x9000..0x9FFF`, RAM InitFlash `0x8F00..0x8FFF`, периферия, +внутренняя Flash и NOR не допускаются как назначения SCI8. `.ebss` приложения +может занять L1 после перехода в его C runtime; инициализированный payload +работающую RAM загрузчика перезаписывать не должен. Настройка приложения +F2812/его linker — отдельная от импорта загрузчика операция. + +Геометрия x16, ID и команды AA/55/A0/80/30/F0 взяты из +[оригинального datasheet AMD Am29LV800B](https://cms.nacsemi.com/content/AuthDatasheets/FASLS02690-1.pdf). +Аппаратные GPIO/CPLD и XINTF-тайминги перенесены из действующих +`big_dsp_module.c` / `flash_tools.c` ПМ67, без зависимости от этих файлов при сборке. + +## Проверки + +```powershell +$env:CC = 'C:/msys64/ucrt64/bin/gcc.exe' +python c/protocan-boot/tests/run_tests.py +``` + +Проверяются протокол, CRC, сессии/BUSY, A/B F28335 с trial/rollback/CONFIRM, +NOR F2812 с настоящими AMD command cycles, ID, readback, запрещёнными секторами, +обрывами COMMIT, повреждением CRC/SCI8 и тайм-аутом DQ7. +Вариант с CMake/CTest также поддерживается. + +Подтверждены реальные import/build обоих проектов в CCS 12.3, CLI-сборки +Debug/Release TI 22.6 COFF и проверки секций OUT. Физические JTAG/CAN/XINTF, +режим boot и поведение конкретной платы при отключении питания требуют стенда; +физическое программирование этим комплектом автоматически не выполнялось. diff --git a/c/protocan-boot/projects/build.py b/c/protocan-boot/projects/build.py new file mode 100644 index 0000000..0cd3b0a --- /dev/null +++ b/c/protocan-boot/projects/build.py @@ -0,0 +1,86 @@ +"""Сборка отдельных CCS-проектов ProtoCAN для F28335/M95M02 и F2812/AM29LV800BT.""" # Требует только Python и установленный TI C2000 COFF compiler. +import argparse # Разбирает выбранный контроллер, конфигурацию и пути toolchain. +import base64 # Читает настоящие программируемые данные COFF из официального OFD XML. +import hashlib # Связывает собранный OUT с контрольной суммой в локальном build manifest. +import json # Сохраняет точные команды, происхождение исходников и результаты проверки. +from pathlib import Path # Разрешает все зависимости внутри templates относительно расположения проекта. +import subprocess # Вызывает установленный TI compiler без shell-интерполяции аргументов. +import xml.etree.ElementTree as ET # Использует действующие .project/.cproject как источник состава и опций сборки. + +ROOT = Path(__file__).resolve().parents[1] # Корень protocan-boot содержит codec, порты, проекты и vendored TI support. +DEFAULT_COMPILER = Path("C:/ti/ccs1230/ccs/tools/compiler/ti-cgt-c2000_22.6.0.LTS") # Сохраняет проверенную версию установленного C2000 COFF compiler. + + +def settings(device, configuration, compiler): # Читает те же исходники и пути, которые получает импортированный проект CCS. + project = ROOT / "projects/ccs" / device # Каждое семейство контроллера имеет собственный Eclipse projectDescription. + config = next(item for item in ET.parse(project / ".cproject").findall(".//configuration") if item.get("name") == configuration) # Не подменяет Debug настройками Release или другого устройства. + options = {item.get("superClass", "").rsplit(".", 1)[-1]: item for item in config.findall("folderInfo/toolChain/tool/option")} # Собирает только параметры общего folderInfo без переопределений отдельных файлов. + macros = {"${PROJECT_ROOT}": str(project), "${PROJECT_LOC}": str(project), "${CG_TOOL_ROOT}": str(compiler)} # Разрешает только известные пути, не выполняя shell-подстановки. + def values(name): # Возвращает listOptionValue после подстановки локальных макросов CCS. + result = [] # Порядок include paths и библиотек остаётся тем же, что в проекте. + for item in options[name].findall("listOptionValue"): # Обрабатывает каждое явное значение текущей конфигурации. + value = item.get("value", "") # Отсутствующее значение не превращается в имя неизвестного каталога. + for macro, replacement in macros.items(): value = value.replace(macro, replacement) # Ограничивает подстановки определёнными выше путями. + if "${" in value: raise ValueError("Unresolved CCS macro: " + value) # Останавливает сборку вместо поиска случайной зависимости на машине. + result.append(value) # Добавляет параметр в исходном порядке конфигурации CCS. + return result # Возвращает обычные аргументы без скрытых изменений окружения. + sources = sorted(project.glob("*.c")) + sorted(project.glob("*.asm")) # Локальные production-исходники проекта компилируются вместе с аппаратным портом. + commands = sorted(project.glob("*.cmd")) # Каждый проект имеет собственную разметку памяти соответствующего F28xx. + for link in ET.parse(project / ".project").findall(".//linkedResources/link"): # Добавляет только explicit linkedResources из templates. + uri = link.findtext("locationURI", "") # Все общие исходники привязаны к переменной PCAN_ROOT. + if not uri.startswith("PCAN_ROOT/"): raise ValueError("Unsupported linked resource: " + uri) # Не допускает зависимость от старого firmware checkout или абсолютного чужого пути. + path = ROOT / uri.removeprefix("PCAN_ROOT/") # Разрешает vendor и общие исходники внутри переносимого protocan-boot. + if path.suffix.lower() in (".c", ".asm"): sources.append(path) # Заголовки не компилируются самостоятельными единицами трансляции. + elif path.suffix.lower() == ".cmd": commands.append(path) # Подключает оригинальное TI размещение регистров выбранного контроллера. + flags = ["-v28", "-ml", "-mt", "--abi=coffabi", "-O" + options["OPT_LEVEL"].get("value").rsplit(".", 1)[-1], "--opt_for_speed=" + options["OPT_FOR_SPEED"].get("value").rsplit(".", 1)[-1], "--gen_func_subsections=on"] # Повторяет архитектуру COFF, большие адреса, оптимизацию и сборку отдельных функций проекта CCS. + if device == "f28335": flags.append("--float_support=fpu32") # Только F28335 имеет используемый аппаратный FPU32. + flags += ["--include_path=" + value for value in values("INCLUDE_PATH")] + ["--define=" + value for value in values("DEFINE")] # Передаёт конкретные аппаратные заголовки и profile defines без потери различий между контроллерами. + if configuration == "Debug": flags.append("-g") # Debug OUT сохраняет символы для пошагового JTAG-анализа загрузчика. + return project, config.get("artifactName"), flags, sources, commands, values("LIBRARY"), values("SEARCH_PATH") # Возвращает полный воспроизводимый набор исходников и linker inputs. + + +def verify(device, image, compiler): # Проверяет реальные секции OUT после линковки, а не только текст соседнего MAP. + xml = ET.fromstring(subprocess.check_output([str(compiler / "bin/ofd2000.exe"), "-x", str(image)])) # Официальный декодер TI читает COFF текущей завершившейся сборки. + coff = xml.find(".//ti_coff") # Загружать через JTAG разрешено именно executable C2000 COFF. + if coff is None or coff.findtext("file_header/exec") != "true" or coff.findtext("file_header/target_id") != "0x9d": raise ValueError("Expected executable C2000 COFF") # Не подписывает чужой объект, ELF либо незалинкованный файл. + first, end, boot = (0x338000, 0x33FF80, 0x33FFF6) if device == "f28335" else (0x3F6000, 0x3F7F80, 0x3F7FF6) # Адреса внутренних секторов A и аппаратных boot-переходов различаются между F28335/F2812. + loaded = set() # Повторная загрузка одного физического слова из двух секций запрещена. + for section in coff.findall("section"): # Рассматривает только реальные данные секций после линковки. + address = int(section.findtext("virtual_addr", "0"), 0); raw = section.findtext("raw_data") # COFF virtual_addr обозначает LOAD, physical_addr — RUN копируемых ramfuncs. + if raw is None or section.findtext("copy") == "true" or section.findtext("name") == ".adc_cal": continue # Исключает только явные COPY/отладочные секции, BSS без raw_data и заводскую ADC-калибровку; загружаемый RAM-код обязан иметь Flash LOAD. + data = base64.b64decode(raw) # Читает точные октеты программируемого содержимого из COFF, а не считает по объявленному размеру. + if len(data) % 2 or not (first <= address < address + len(data) // 2 <= end or address == boot and len(data) == 4): raise ValueError("Loaded section outside bootloader Flash: " + str(section.findtext("name"))) # Защищает OTP, CSM, внешнюю NOR/EEPROM и остальные внутренние секторы. + for word in range(address, address + len(data) // 2): # Контролирует физические 16-битные слова всех программируемых секций. + if word in loaded: raise ValueError("Overlapping load sections") # Даже совпадающие данные не разрешают неоднозначную разметку OUT. + loaded.add(word) # Фиксирует фактически загружаемый диапазон текущего результата. + entry = int(coff.findtext("optional_file_header/entry_point", "0"), 0) # Извлекает реальную точку входа C runtime из заголовка файла. + if entry not in loaded or boot not in loaded or boot + 1 not in loaded: raise ValueError("Missing loaded C entry or codestart") # JTAG OUT обязан одновременно содержать C startup и аппаратный Flash boot переход. + return {"entry_word": entry, "boot_word": boot, "loaded_words": len(loaded)} # Эти проверенные значения входят в build manifest рядом с SHA-256. + + +def build(device, configuration, compiler, output=None): # Полностью собирает один из двух самостоятельных проектов без установки на плату. + compiler = compiler.resolve(); project, name, flags, sources, commands, libraries, searches = settings(device, configuration, compiler) # Использует абсолютный toolchain и актуальную конфигурацию CCS. + output = (output or project / configuration).resolve(); output.mkdir(parents=True, exist_ok=True) # Генерирует результаты только в каталоге выбранной сборки. + objects = [] # В линковку входят только успешно пересобранные исходники текущего вызова. + with (output / "build.log").open("w", encoding="utf-8") as log: # Журнал содержит полный набор команд и диагностику TI. + def run(command): # Не продолжает сборку после ошибки компилятора или linker. + log.write(json.dumps([str(arg) for arg in command], ensure_ascii=False) + "\n"); log.flush() # Сохраняет команду до запуска процесса без исполнения как shell-кода. + subprocess.run([str(arg) for arg in command], cwd=project, stdout=log, stderr=subprocess.STDOUT, check=True) # Ненулевой статус исключает публикацию ложного успешного результата. + for source in sources: # Все локальные и linked TI-файлы пересобираются для выбранного контроллера. + obj = output / (source.stem + ".obj"); run([compiler / "bin/cl2000.exe", *flags, "-c", "--output_file=" + str(obj), source]); objects.append(obj) # Объекты F2812 soft-float и F28335 FPU32 не смешиваются. + image = output / (name + ".out") # Имя результата совпадает с artifactName импортированного CCS-проекта. + link = [compiler / "bin/cl2000.exe", "-v28", "--abi=coffabi"] + (["--float_support=fpu32"] if device == "f28335" else []) # Linker ABI и FPU точно соответствуют скомпилированным объектам. + run([*link, "-z", "--rom_model", "--entry_point=_c_int00", "--stack_size=0x3f0", "--warn_sections", "--reread_libs", "-m" + str(image.with_suffix(".map")), "-o", image, *["--search_path=" + value for value in searches], *commands, *objects, *["-l" + value for value in libraries]]) # Подключает только собственный linker и оригинальные peripheral sections выбранного MCU. + checked = verify(device, image, compiler) # Физические LOAD-адреса, boot branch и C entry проверяются после каждой CLI-сборки. + manifest = {"device": device, "configuration": configuration, "sha256": hashlib.sha256(image.read_bytes()).hexdigest(), "sources": {str(path.relative_to(ROOT)): hashlib.sha256(path.read_bytes()).hexdigest() for path in sources}, **checked} # Связывает OUT с конкретными исходниками и результатом проверки карты. + image.with_suffix(".out.manifest.json").write_text(json.dumps(manifest, indent=2, ensure_ascii=False) + "\n", encoding="utf-8") # Не изменяет версии приложения или данные физической памяти. + return image # Вызывающий явно решает, когда устанавливать OUT через JTAG. + + +if __name__ == "__main__": # Импорт для проверки проектов не запускает compiler автоматически. + parser = argparse.ArgumentParser(description=__doc__) # Описывает два самостоятельных проекта и отсутствие программирования платы. + parser.add_argument("--device", choices=("f2812", "f28335"), required=True) # Не допускает случайной сборки для другого контроллера. + parser.add_argument("--configuration", choices=("Debug", "Release"), default="Debug") # Повторяет имена управляемых конфигураций CCS. + parser.add_argument("--compiler", type=Path, default=DEFAULT_COMPILER) # Поддерживает другую установленную версию TI с COFF ABI. + parser.add_argument("--output", type=Path) # Разрешает изолированную проверочную сборку без загрязнения импортированного CCS-проекта. + args = parser.parse_args(); print(build(args.device, args.configuration, args.compiler, args.output)) # Сообщает конкретный успешно проверенный OUT, не инициируя JTAG. diff --git a/c/protocan-boot/projects/ccs/f2812/.ccsproject b/c/protocan-boot/projects/ccs/f2812/.ccsproject new file mode 100644 index 0000000..335c4fd --- /dev/null +++ b/c/protocan-boot/projects/ccs/f2812/.ccsproject @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/c/protocan-boot/projects/ccs/f2812/.cproject b/c/protocan-boot/projects/ccs/f2812/.cproject new file mode 100644 index 0000000..412be58 --- /dev/null +++ b/c/protocan-boot/projects/ccs/f2812/.cproject @@ -0,0 +1,306 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/c/protocan-boot/projects/ccs/f2812/.project b/c/protocan-boot/projects/ccs/f2812/.project new file mode 100644 index 0000000..49210b8 --- /dev/null +++ b/c/protocan-boot/projects/ccs/f2812/.project @@ -0,0 +1,106 @@ + + + + F2812_CAN_NOR + + Отдельный постоянный загрузчик ProtoCAN для F2812 + + + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + + + + + + + + com.ti.ccstudio.core.ccsNature + + org.eclipse.cdt.core.cnature + + org.eclipse.cdt.core.ccnature + + org.eclipse.cdt.managedbuilder.core.managedBuildNature + + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + + + + ti/DSP281x_CpuTimers.c + + 1 + + PCAN_ROOT/vendor/ti/f2812/source/DSP281x_CpuTimers.c + + + + + ti/DSP281x_GlobalVariableDefs.c + + 1 + + PCAN_ROOT/vendor/ti/f2812/source/DSP281x_GlobalVariableDefs.c + + + + + ti/DSP281x_PieCtrl.c + + 1 + + PCAN_ROOT/vendor/ti/f2812/source/DSP281x_PieCtrl.c + + + + + ti/DSP281x_SysCtrl.c + + 1 + + PCAN_ROOT/vendor/ti/f2812/source/DSP281x_SysCtrl.c + + + + + ti/DSP281x_usDelay.asm + + 1 + + PCAN_ROOT/vendor/ti/f2812/source/DSP281x_usDelay.asm + + + + + DSP281x_Headers_nonBIOS.cmd + + 1 + + PCAN_ROOT/vendor/ti/f2812/cmd/DSP281x_Headers_nonBIOS.cmd + + + + + + + + PCAN_ROOT + + $%7BPARENT-3-PROJECT_LOC%7D + + + diff --git a/c/protocan-boot/projects/ccs/f2812/F2812_CAN_NOR.cmd b/c/protocan-boot/projects/ccs/f2812/F2812_CAN_NOR.cmd new file mode 100644 index 0000000..d47c8ac --- /dev/null +++ b/c/protocan-boot/projects/ccs/f2812/F2812_CAN_NOR.cmd @@ -0,0 +1,28 @@ +MEMORY /* Постоянный загрузчик F2812 хранится во внутренней Flash, обновляемые данные — во внешней AM29LV800BT. */ +{ /* Адреса указаны в 16-битных словах C28x, независимо от размера файлов CAN. */ +PAGE 0: /* Исполняемый код и его копируемая RAM-часть. */ + FLASHA : origin = 0x3F6000, length = 0x001F80 /* Сектор A исключает зарезервированные слова CSM в верхних 128 словах. */ + BEGIN : origin = 0x3F7FF6, length = 0x000002 /* Аппаратный Flash boot F2812 начинает длинный переход из двух слов. */ + RAMFUNCS : origin = 0x008F00, length = 0x000100 /* Последние 256 слов L0 содержат InitFlash и исключены из SCI8 payload приложения. */ + RESET : origin = 0x3FFFC0, length = 0x000002 /* ROM reset не программируется при установке загрузчика. */ +PAGE 1: /* Рабочая RAM постоянно работающего загрузчика не должна входить в загружаемый файл. */ + RAMM0 : origin = 0x000050, length = 0x0003B0 /* Исключает первые 80 слов Boot ROM scratch. */ + RAMM1 : origin = 0x000400, length = 0x000400 /* Отдельный стек на 1024 слова совпадает с аппаратным банком M1. */ + RAMDATA : origin = 0x009000, length = 0x001000 /* Банк L1 хранит очередь CAN и состояния загрузчика до перехода в приложение. */ +} /* Верхний H0 и внешняя SRAM остаются доступны payload приложения. */ +SECTIONS /* Ни одна загружаемая секция OUT не записывается во внешнюю NOR автоматически. */ +{ /* Все команды программирования NOR исполняются из внутреннего сектора A. */ + codestart : > BEGIN, PAGE = 0 /* Направляет аппаратный boot в watchdog-safe C startup. */ + .text : > FLASHA, PAGE = 0 /* Размещает общий ProtoCAN, driver NOR и проверку SCI8 в постоянной Flash. */ + .fast_run : > FLASHA, PAGE = 0 /* Штатный DSP281x_usDelay вызывается ещё из InitSysCtrl до копирования ramfuncs, поэтому его LOAD/RUN должны сразу находиться во Flash. */ + .cinit : > FLASHA, PAGE = 0 /* Таблицы ROM-модели инициализируют состояние до main. */ + .pinit : > FLASHA, PAGE = 0 /* Сохраняет стандартный startup для возможных статических конструкторов. */ + .econst : > FLASHA, PAGE = 0 /* Константы не расходуют ограниченную RAM L1. */ + .switch : > FLASHA, PAGE = 0 /* Таблицы switch остаются доступны во время erase внешнего чипа. */ + ramfuncs : LOAD = FLASHA, RUN = RAMFUNCS, LOAD_START(_RamfuncsLoadStart), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart), PAGE = 0 /* InitFlash копируется в внутреннюю RAM до изменения таймингов Flash. */ + .stack : > RAMM1, PAGE = 1 /* Стек не пересекает RAM назначения проверяемого образа. */ + .ebss : > RAMDATA, PAGE = 1 /* Состояния очереди и текущей сессии исключены из разрешённых SCI8 адресов. */ + .esysmem : > RAMDATA, PAGE = 1 /* Поддерживает стандартную секцию runtime, хотя алгоритм не требует heap. */ + .fast_vars1 : > RAMDATA, PAGE = 1 /* Подключает штатный HSPCLK выбранного TI SDK без размещения случайной orphan-секции. */ + .reset : > RESET, PAGE = 0, TYPE = DSECT /* Не выдаёт ROM reset за программируемую часть OUT. */ +} /* Не создаёт секции OTP или паролей CSM. */ diff --git a/c/protocan-boot/projects/ccs/f2812/board.c b/c/protocan-boot/projects/ccs/f2812/board.c new file mode 100644 index 0000000..e19e090 --- /dev/null +++ b/c/protocan-boot/projects/ccs/f2812/board.c @@ -0,0 +1,30 @@ +#include "DSP281x_Device.h" /* Использует оригинальные TI определения GPIO и XINTF F2812. */ +#include "../../../ports/tms320f2812/boot2812.h" /* Получает отдельный аппаратный профиль внешней NOR ПМ67. */ +static void operation(unsigned int a, unsigned int b, unsigned int c, unsigned int d) /* Повторяет управляющую защёлку CPLD из big_dsp_module.c штатной платы. */ +{ /* GPIOA13/A14/A15 и GPIOB13 задают код, GPIOB15 формирует строб. */ + EALLOW; /* Разрешает запись системных GPIO платы. */ + GpioDataRegs.GPADAT.bit.GPIOA13 = a; GpioDataRegs.GPADAT.bit.GPIOA14 = b; /* Первые два бита аппаратной команды соответствуют oper_mode1/2. */ + GpioDataRegs.GPADAT.bit.GPIOA15 = c; GpioDataRegs.GPBDAT.bit.GPIOB13 = d; /* Третий и четвёртый биты повторяют штатный write_oper. */ + asm(" NOP"); GpioDataRegs.GPBDAT.bit.GPIOB15 = 0; /* Снимает строб после установки всех четырёх битов команды. */ + asm(" RPT #2 || NOP"); GpioDataRegs.GPBDAT.bit.GPIOB15 = 1; /* Даёт защёлке время установления и формирует активный фронт. */ + asm(" RPT #2 || NOP"); GpioDataRegs.GPBDAT.bit.GPIOB15 = 0; /* Возвращает строб в исходное состояние с выдержкой как в рабочем драйвере. */ + asm(" RPT #2 || NOP"); EDIS; /* Завершает длительность импульса до следующей команды CPLD. */ +} /* Команда не изменяет выбранные аппаратные boot-перемычки контроллера. */ +void Boot2812_BoardInit(void) /* Настраивает подтверждённую схему ПМ67 с AM29LV800BT на XINTF zone6. */ +{ /* Значения линий взяты из setup_oper_line/init_flash/xintf_zone6and7_timing действующего проекта BALZAM_167. */ + EALLOW; /* GPIO mux/direction и XINTF изменяются в разрешённом защищённом контексте. */ + GpioMuxRegs.GPAMUX.bit.C1TRIP_GPIOA13 = 0; GpioMuxRegs.GPAMUX.bit.C2TRIP_GPIOA14 = 0; GpioMuxRegs.GPAMUX.bit.C3TRIP_GPIOA15 = 0; /* Выбирает GPIO для трёх командных линий CPLD вместо функций event manager. */ + GpioMuxRegs.GPBMUX.bit.C4TRIP_GPIOB13 = 0; GpioMuxRegs.GPBMUX.bit.C6TRIP_GPIOB15 = 0; /* Освобождает четвёртый бит команды и строб CPLD. */ + GpioMuxRegs.GPADIR.bit.GPIOA13 = 1; GpioMuxRegs.GPADIR.bit.GPIOA14 = 1; GpioMuxRegs.GPADIR.bit.GPIOA15 = 1; /* Переводит командные линии A в выходы, как рабочий драйвер платы. */ + GpioMuxRegs.GPBDIR.bit.GPIOB13 = 1; GpioMuxRegs.GPBDIR.bit.GPIOB15 = 1; /* Разрешает выдачу четвёртого бита и импульса защёлки. */ + XintfRegs.XINTCNF2.bit.XTIMCLK = 1; XintfRegs.XINTCNF2.bit.WRBUFF = 0; /* XTIMCLK=SYSCLKOUT/2; отключённая буферизация сохраняет порядок unlock-циклов AMD. */ + XintfRegs.XINTCNF2.bit.CLKOFF = 0; XintfRegs.XINTCNF2.bit.CLKMODE = 0; XintfRegs.XINTCNF2.bit.MPNMC = 0; /* Повторяет штатный режим XCLKOUT и микроконтроллерный boot платы. */ + XintfRegs.XTIMING6.bit.XWRLEAD = 3; XintfRegs.XTIMING6.bit.XWRACTIVE = 7; XintfRegs.XTIMING6.bit.XWRTRAIL = 3; /* Времена записи NOR повторяют проверенный flash_tools/init_flash платы в единицах XTIMCLK. */ + XintfRegs.XTIMING6.bit.XRDLEAD = 3; XintfRegs.XTIMING6.bit.XRDACTIVE = 3; XintfRegs.XTIMING6.bit.XRDTRAIL = 3; /* Времена чтения соответствуют штатному профилю AM29LV800BT-70EI. */ + XintfRegs.XTIMING6.bit.X2TIMING = 0; XintfRegs.XTIMING6.bit.USEREADY = 0; XintfRegs.XTIMING6.bit.READYMODE = 0; XintfRegs.XTIMING6.bit.XSIZE = 3; /* Выбирает 16-битную зону без внешнего READY и без дополнительного удвоения тактов. */ + XintfRegs.XTIMING2.bit.XWRLEAD = 3; XintfRegs.XTIMING2.bit.XWRACTIVE = 7; XintfRegs.XTIMING2.bit.XWRTRAIL = 3; /* Консервативный x16 режим внешней SRAM позволяет загружать приложение в zone2. */ + XintfRegs.XTIMING2.bit.XRDLEAD = 3; XintfRegs.XTIMING2.bit.XRDACTIVE = 7; XintfRegs.XTIMING2.bit.XRDTRAIL = 3; /* Удлинённое чтение SRAM не зависит от коротких прикладных таймингов. */ + XintfRegs.XTIMING2.bit.X2TIMING = 0; XintfRegs.XTIMING2.bit.USEREADY = 0; XintfRegs.XTIMING2.bit.READYMODE = 0; XintfRegs.XTIMING2.bit.XSIZE = 3; /* Не включает неподтверждённую линию READY платы. */ + asm(" RPT #7 || NOP"); EDIS; /* Сбрасывает pipeline после изменения XINTF до первого внешнего чтения. */ + operation(1U, 1U, 1U, 1U); operation(1U, 0U, 1U, 0U); operation(0U, 0U, 0U, 0U); /* Штатные select_nothing, select_strob_67_for_flash, select_work_with_flash выбирают CPU-доступ к NOR. */ +} /* Изменение схемы CPLD требует отдельного профиля платы, а не другого размера EEPROM. */ diff --git a/c/protocan-boot/projects/ccs/f2812/boot_store.c b/c/protocan-boot/projects/ccs/f2812/boot_store.c new file mode 100644 index 0000000..e825b09 --- /dev/null +++ b/c/protocan-boot/projects/ccs/f2812/boot_store.c @@ -0,0 +1 @@ +#include "../../../ports/tms320f2812/boot_store.c" /* Подключает проверку SCI8 и публикацию NOR manifest без копирования кода в проект CCS. */ diff --git a/c/protocan-boot/projects/ccs/f2812/codestart.asm b/c/protocan-boot/projects/ccs/f2812/codestart.asm new file mode 100644 index 0000000..b69fe2f --- /dev/null +++ b/c/protocan-boot/projects/ccs/f2812/codestart.asm @@ -0,0 +1,12 @@ + .ref _c_int00 ; Стандартный COFF startup применяет .cinit и вызывает main после отключения раннего watchdog. + .sect "codestart" ; Boot ROM передаёт управление двухсловному переходу по аппаратному адресу слова 0x33FFF6. + LB flash_boot_start ; Переходит к короткой подготовке C28x во Flash, сохраняя точный размер аппаратного входа два слова. + .text ; Последовательность взята из штатного TI DSP2833x_CodeStartBranch.asm и размещается в секторе основного кода. +flash_boot_start: ; Отключает watchdog до возможной длительной обработки таблиц инициализации C, а не только после входа в main. + SETC OBJMODE ; Выбирает C28x object mode, требуемый стандартным COFF startup процессора F28335. + EALLOW ; Разрешает запись защищённого регистра WDCR перед запуском C runtime. + MOVZ DP, #7029h>>6 ; Адрес слова WDCR=0x7029 из карты F28335; DP выбирает соответствующую страницу по 64 слова. + MOV @7029h, #0068h ; Значение 0x0068 содержит контрольные биты WDCHK=101 и WDDIS=1, как официальный TI startup. + EDIS ; Возвращает защиту системных регистров перед переходом в библиотечную инициализацию. + LB _c_int00 ; Применяет штатную ROM-модель инициализации и затем запускает текущий main 167. + .end ; Завершает модуль, не добавляя произвольных данных рядом с CSM-паролями сектора A. diff --git a/c/protocan-boot/projects/ccs/f2812/main.c b/c/protocan-boot/projects/ccs/f2812/main.c new file mode 100644 index 0000000..880a3f0 --- /dev/null +++ b/c/protocan-boot/projects/ccs/f2812/main.c @@ -0,0 +1,114 @@ +#include "DSP281x_Device.h" /* Использует оригинальные регистры F2812, не подменяя их заголовками F28335. */ +#include "DSP281x_Examples.h" /* Подключает штатные PLL, watchdog, PIE и CpuTimers выбранного TI SDK. */ +#include "../../../ports/tms320f2812/boot2812.h" /* Выбирает отдельные NOR, Product Type и ProtoCAN-адрес F2812. */ +#include /* Инициализирует все состояния независимо от прежнего содержимого .ebss. */ +static pcan_boot_t boot; /* Этот экземпляр относится только к ПМ67/F2812 и не делит состояние с F28335. */ +static volatile unsigned int head, tail, overflow; /* ISR публикует готовые элементы очереди только после заполнения всех полей. */ +static struct { uint32_t id; unsigned int dlc; pcan_boot_byte_t data[8]; } queue[32]; /* Очередь на 31 кадр принимает окно из 16 блоков во время NOR-операций main. */ +static unsigned int tx_busy, reset_requested, operation_active, current_command; /* Отделяет физическое TX ACK, запрос reset и текущую долгую команду. */ +static uint32_t sent_at, busy_at; /* Миллисекундные отметки ограничивают TX и частоту BUSY-ответов. */ +unsigned long Boot2812_Now(void) /* Все тайм-ауты порта работают от одного Timer1. */ +{ /* Прямой счётчик C28x имеет ту же ширину, что uint32_t. */ + return CpuTimer1.InterruptCount; /* Период Timer1 ниже установлен в одну миллисекунду. */ +} /* Беззнаковые разности сохраняют корректность через переполнение. */ +interrupt void boot_tick(void) /* Прямое прерывание Timer1 не обращается к коду приложения. */ +{ /* Долгие erase/verify не должны замораживать часы либо приём CAN. */ + CpuTimer1.InterruptCount++; KickDog(); /* Миллисекундный tick и штатное обслуживание watchdog загрузчика выполняются даже во время polling NOR. */ +} /* Поведение watchdog загружаемого приложения задаёт его собственный startup. */ +static void receive(volatile struct MBOX *box, uint32_t mask) /* Копирует один Extended кадр выделенного mailbox в очередь. */ +{ /* Wire-парсер и запись памяти выполняются позднее общим ядром в main. */ + unsigned int next = (head + 1U) & 31U, i, type; uint32_t id, low, high; /* Индексы кольца ограничены 32 элементами независимо от содержимого CAN. */ + if (!(ECanaRegs.CANRMP.all & mask)) return; /* Не читает старое содержимое mailbox без нового RX-флага. */ + id = box->MSGID.all & 0x1FFFFFFFUL; type = pcan_boot_id_msg_type(id); /* Получает 29-битный ID и тип через общий codec. */ + if ((box->MSGID.all & 0x80000000UL) && !box->MSGCTRL.bit.RTR && pcan_boot_id_route(id) == 0U && (type == 9U || type == 10U || type == 13U) && ((pcan_boot_id_device_type(id) == BOOT2812_DEVICE_TYPE && pcan_boot_id_device_id(id) == BOOT2812_DEVICE_ID) || (type == 13U && pcan_boot_id_device_type(id) == 7U && pcan_boot_id_device_id(id) == 15U && !pcan_boot_id_msg_body(id)))) { /* Допускает только адресный Boot и точное discovery; чужие приборы и RTR не занимают очередь. */ + if (next == tail) overflow = 1U; /* Потеря кадра отменит сессию, а не разрешит незаметно неполный файл. */ + else { /* Сначала формирует весь элемент, затем публикует новый head. */ + queue[head].id = id; queue[head].dlc = box->MSGCTRL.bit.DLC; /* Сохраняет фактические ID и длину для проверок общего ядра. */ + low = box->MDL.all; high = box->MDH.all; /* Два 32-битных снимка не смешивают октеты разных чтений регистров. */ + for (i = 0; i < 4U; ++i) { queue[head].data[i] = (low >> (i * 8U)) & 255U; queue[head].data[i + 4U] = (high >> (i * 8U)) & 255U; } /* DBO=0 передаёт младшие октеты MDL/MDH первыми. */ + head = next; /* Публикация после копирования исключает чтение main частично заполненного элемента. */ + } /* Завершает формирование очередного элемента кольца. */ + } /* Остальные кадры не изменяют никакие состояния протокола. */ + ECanaRegs.CANRMP.all = mask; /* Подтверждает только собственный прочитанный mailbox. */ +} /* В ISR отсутствуют erase, write, CRC и загрузка приложения. */ +interrupt void boot_can_rx(void) /* Использует отдельный аппаратный CAN F2812 на GPIOF6/F7. */ +{ /* Оба служебных RX mailbox относятся к одной линии ECAN0INTA. */ + receive(&ECanaMboxes.MBOX3, 8UL); receive(&ECanaMboxes.MBOX6, 64UL); /* Mailbox 3 принимает адресные кадры, 6 — broadcast discovery. */ + PieCtrlRegs.PIEACK.all = 0x0100U; /* ACK9 открывает группу PIE9 для следующего CAN IRQ. */ +} /* Возвращает управление прерванному main без обращения к прикладным каналам ПМ67. */ +static void tx_poll(void) /* Подтверждает физическую передачу, прежде чем разрешить следующий ответ или reset. */ +{ /* Ошибка шины ограничена четвертью секунды и не приводит к бесконечному ожиданию. */ + if (!tx_busy) return; /* Свободный mailbox не требует чтения старых ACK. */ + if (ECanaRegs.CANTA.all & 16UL) { ECanaRegs.CANTA.all = 16UL; tx_busy = 0U; } /* Снимает только фактический ACK ответа mailbox 4. */ + else if (Boot2812_Now() - sent_at >= 250UL) { /* Истёкшее ожидание не разрешает выполнить ранее заказанный reset. */ + ECanaRegs.CANTRR.all = 16UL; reset_requested = 0U; /* Запрашивает отмену и сохраняет управление recovery-загрузчику. */ + if (ECanaRegs.CANAA.all & 16UL) { ECanaRegs.CANAA.all = 16UL; tx_busy = 0U; } /* Не перезаписывает mailbox до подтверждённого завершения отмены. */ + } /* Поздний ACK после запроса отмены также не восстанавливает сброшенный reset_requested. */ +} /* Состояние передачи не зависит от относительного порядка BUSY и окончательного ответа. */ +static bool transmit(void *user, uint32_t id, const pcan_boot_byte_t *data, pcan_boot_byte_t dlc) /* Реализует физический ответ без дублирования формата ProtoCAN. */ +{ /* Вызывается только из main или синхронного NOR callback, никогда из RX ISR. */ + unsigned int i; uint32_t low = 0UL, high = 0UL, started = Boot2812_Now(), budget = 1000000UL; (void)user; /* Ограничение проходов сохраняет выход при остановленном Timer1. */ + while (tx_busy && --budget && Boot2812_Now() - started < 250UL) tx_poll(); /* Даёт предыдущему BUSY физически уйти, прежде чем отправить окончательный OK. */ + if (tx_busy || dlc > 8U) return false; /* Не теряет неподтверждённый ответ перезаписью регистров. */ + for (i = 0; i < dlc; ++i) { if (i < 4U) low |= (uint32_t)(data[i] & 255U) << (8U * i); else high |= (uint32_t)(data[i] & 255U) << (8U * (i - 4U)); } /* Упаковывает октеты C28x в MDL/MDH при DBO=0. */ + EALLOW; ECanaRegs.CANME.all &= ~16UL; /* Идентификатор TX изменяется только при отключённом mailbox. */ + ECanaMboxes.MBOX4.MSGID.all = 0x80000000UL | id; ECanaMboxes.MBOX4.MSGCTRL.all = dlc; /* IDE=1 включает Extended формат, длина сохраняется из codec. */ + ECanaMboxes.MBOX4.MDL.all = low; ECanaMboxes.MBOX4.MDH.all = high; /* Фиксирует все данные до подачи запроса передачи. */ + ECanaRegs.CANTA.all = 16UL; ECanaRegs.CANAA.all = 16UL; ECanaRegs.CANME.all |= 16UL; ECanaRegs.CANTRS.all = 16UL; EDIS; /* Удаляет старые ACK и запускает один новый аппаратный ответ. */ + sent_at = Boot2812_Now(); tx_busy = 1U; /* Следующий ответ и REBOOT ждут фактический CAN ACK. */ + return true; /* Ядро считает кадр принятым аппаратным передатчиком. */ +} /* Wire-содержимое сформировано только общим ProtoCAN codec. */ +void Boot2812_Busy(void) /* Долгие erase и проверки продолжают сообщать состояние текущей команды. */ +{ /* Функция не извлекает новые команды из очереди и не допускает вложенный процессинг сессии. */ + uint32_t now = Boot2812_Now(); tx_poll(); /* Подтверждает ранее отправленный BUSY по фактическому TX ACK. */ + if (operation_active && !tx_busy && now - busy_at >= 250UL) { busy_at = now; (void)pcan_boot_report_busy(&boot, current_command, now); } /* Ответ каждые 250 мс удерживает клиент живым при секундном стирании NOR. */ +} /* Финальный статус после callback отправит обычное ядро. */ +static void request_reset(void *user) /* Команда REBOOT не сбрасывает аппарат до передачи её статусного ответа. */ +{ /* Аппаратный reset выполнит main после освобождения TX mailbox. */ + (void)user; reset_requested = 1U; /* Не вызывает watchdog непосредственно из callback codec. */ +} /* Потеря TX ACK отменяет этот запрос в tx_poll. */ +static void can_init(void) /* Отдельные clock/GPIO F2812 не используют настройки F28335. */ +{ /* SYSCLKOUT=150 МГц при штатных XCLKIN=30 МГц и PLLCR=10 в включённом TI SDK. */ + EALLOW; GpioMuxRegs.GPFMUX.bit.CANTXA_GPIOF6 = 1; GpioMuxRegs.GPFMUX.bit.CANRXA_GPIOF7 = 1; /* Назначение CAN берётся из оригинального DSP281x_ECan.c. */ + ECanaRegs.CANTIOC.all = 8UL; ECanaRegs.CANRIOC.all = 8UL; ECanaRegs.CANME.all = 0UL; /* Включает CAN-функции и отключает mailbox до полной настройки. */ + ECanaRegs.CANMC.all = 0x3080UL; /* SCB/CCR/ABO выбирают eCAN, режим настройки и автоматическое восстановление шины. */ + while (!ECanaRegs.CANES.bit.CCE) {} /* Ожидает разрешения аппаратуры менять CANBTC. */ + ECanaRegs.CANBTC.all = (29UL << 16) | 0x017AUL; /* F2812: 150 МГц/(BRP+1=30)/(1+16+3 tq)=250000 бит/с, SJW=2 tq. */ + ECanaRegs.CANMC.all &= ~0x1000UL; while (ECanaRegs.CANES.bit.CCE) {} /* Выходит из режима настройки перед включением приёма. */ + ECanaMboxes.MBOX3.MSGID.all = 0xC0000000UL | pcan_boot_make_id(0U, 0U, BOOT2812_DEVICE_TYPE, BOOT2812_DEVICE_ID, 0U, 0U); /* AME/IDE и адресный фильтр отделяют выбранный прибор от остальных узлов CAN. */ + ECanaLAMRegs.LAM3.all = 0x100FFFFFUL; ECanaMboxes.MBOX3.MSGCTRL.all = 8UL; /* Игнорирует priority/type/body при аппаратном отборе; точные типы проверяет ISR/codec. */ + ECanaMboxes.MBOX6.MSGID.all = 0xC0000000UL | pcan_boot_make_id(0U, 0U, 7U, 15U, 13U, 0U); /* Broadcast разрешён только для discovery, а не для стирания/программирования. */ + ECanaLAMRegs.LAM6.all = 0x10000000UL; ECanaMboxes.MBOX6.MSGCTRL.all = 0UL; ECanaMboxes.MBOX4.MSGCTRL.all = 0UL; /* Фильтр discovery игнорирует только priority; зарезервированные биты MSGCTRL очищены. */ + ECanaRegs.CANMD.all = 72UL; ECanaRegs.CANMIL.all = 0UL; ECanaRegs.CANMIM.all = 72UL; /* RX 3/6 и TX4 работают на линии ECAN0INTA; остальных mailbox нет. */ + ECanaRegs.CANRMP.all = 0xFFFFFFFFUL; ECanaRegs.CANRML.all = 0xFFFFFFFFUL; ECanaRegs.CANTA.all = 0xFFFFFFFFUL; /* Удаляет старые флаги перед первым разрешением IRQ. */ + ECanaRegs.CANGIF0.all = 0xFFFFFFFFUL; ECanaRegs.CANGIM.all = 1UL; ECanaRegs.CANME.all = 88UL; /* Включает только три настроенных mailbox и прерывание линии 0. */ + PieVectTable.ECAN0INTA = &boot_can_rx; PieCtrlRegs.PIEIER9.bit.INTx5 = 1; EDIS; IER |= M_INT9; /* Подключает короткий постоянный RX ISR группы PIE9. */ +} /* Конфигурация и состояние ПМ35/F28335 остаются независимыми. */ +void main(void) /* Запускается аппаратным внутренним Flash boot F2812 через 3F7FF6. */ +{ /* Прежний внешний flat-образ не переписывается автоматически и не заменяет проверенную SCI8-таблицу. */ + pcan_boot_config_t config; pcan_boot_port_t port; uint32_t started, entry; unsigned int tried = 0U; /* Небольшие настройки и адрес входа помещаются в постоянный стек M1. */ + InitSysCtrl(); DINT; IER = 0U; IFR = 0U; /* Настраивает PLL=150 МГц и исключает старые IRQ до создания собственных векторов. */ + memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, &RamfuncsLoadEnd - &RamfuncsLoadStart); InitFlash(); /* Штатная InitFlash выполняется из RAM, пока весь остальной код хранится во внутренней Flash A. */ + InitPieCtrl(); InitCpuTimers(); Boot2812_BoardInit(); /* Подготавливает PIE/Timer1 и доступ к подтверждённой AM29LV800BT через CPLD. */ + head = tail = overflow = tx_busy = reset_requested = operation_active = current_command = 0U; sent_at = busy_at = 0UL; /* Явно очищает COFF .ebss и очередь до включения CAN IRQ. */ + memset(&config, 0, sizeof(config)); memset(&port, 0, sizeof(port)); /* Не оставляет неопределённые callbacks нового публичного API. */ + config.device_type = BOOT2812_DEVICE_TYPE; config.device_id = BOOT2812_DEVICE_ID; config.product_type = BOOT2812_PRODUCT; config.hardware_revision = 1U; /* Отдельный адрес 3/6 и Product 2812 отличают основной контроллер от F28335. */ + config.active_slot = 0U; config.slot_count = 1U; config.max_image_size = BOOT2812_IMAGE_BYTES; config.ack_window = 16U; config.session_timeout_ms = 30000UL; /* Single-slot отражает NOR-раздел без ложного обещания A/B-отката. */ + port.send = transmit; port.erase_slot = Boot2812_Erase; port.write_slot = Boot2812_Write; port.verify_status = Boot2812_Verify; port.set_pending_slot = Boot2812_Commit; port.reboot = request_reset; /* Алгоритм ProtoCAN вызывает только аппаратные операции внешней NOR. */ + if (!pcan_boot_init(&boot, &config, &port, 0)) for (;;) {} /* Ошибка конфигурации не разрешает произвольную запись памяти. */ + ConfigCpuTimer(&CpuTimer1, 150.0F, 1000.0F); EALLOW; PieVectTable.XINT13 = &boot_tick; EDIS; /* PLL выбранного TI SDK даёт 150 МГц; 1000 мкс соответствуют миллисекундным тайм-аутам протокола. */ + CpuTimer1Regs.TCR.all = 0x4020U; IER |= M_INT13; can_init(); PieCtrlRegs.PIECRTL.bit.ENPIE = 1; EINT; started = Boot2812_Now(); /* Начинает трёхсекундное окно recovery только после готовности физического CAN. */ + for (;;) { /* Постоянный main обслуживает запись и автоматически запускает только подтверждённый manifest. */ + tx_poll(); pcan_boot_poll(&boot, Boot2812_Now()); KickDog(); /* Тайм-ауты сессии, discovery и watchdog не зависят от очередного окна данных. */ + if (!tx_busy && reset_requested) { DINT; EALLOW; SysCtrlRegs.WDCR = 0x0028U; EDIS; for (;;) {} } /* После физического ACK REBOOT запускает аппаратный watchdog reset без старых ISR. */ + if (overflow || (ECanaRegs.CANRML.all & 72UL)) { overflow = 0U; ECanaRegs.CANRML.all = 72UL; tail = head; pcan_boot_abort(&boot); } /* Потеря mailbox/очереди отменяет сессию и требует передачи заново. */ + if (!tx_busy && tail != head) { /* Обрабатывает один целиком сформированный ISR элемент за проход. */ + current_command = pcan_boot_id_msg_type(queue[tail].id) == 9U ? pcan_boot_id_msg_body(queue[tail].id) & 255U : 0U; operation_active = 1U; /* BUSY содержит именно команду, которая выполняется сейчас. */ + (void)pcan_boot_process(&boot, queue[tail].id, queue[tail].data, queue[tail].dlc); operation_active = 0U; tail = (tail + 1U) & 31U; /* Производственный codec проверяет session/порядок/CRC и вызывает NOR callbacks только в main. */ + } /* Пока TX занят, очередь сохраняет все следующие кадры окна. */ + if (!tried && !tx_busy && boot.state == PCAN_BOOT_STATE_IDLE && Boot2812_Now() - started >= BOOT2812_RECOVERY_MS) { /* ENTER_BOOT удерживает загрузчик; без сессии допускается автоматический запуск сохранённого CAN-образа. */ + tried = 1U; /* Пустой или испорченный manifest не должен проверяться заново на каждом такте main. */ + if (Boot2812_NorIdentify() && Boot2812_Load(&entry)) { DINT; IER = 0U; IFR = 0U; CpuTimer1Regs.TCR.bit.TSS = 1; ECanaRegs.CANMIM.all = 0UL; ((void (*)(void))entry)(); for (;;) {} } /* Запускает только полностью проверенную RAM-таблицу; приложение само создаст свои ISR и C runtime. */ + } /* При отказе остаётся доступен CAN recovery без EEPROM. */ + } /* Ни один путь не исполняет код из стираемой внешней NOR. */ +} /* Завершение загрузчика выполняется только аппаратным reset либо проверенным переходом в приложение. */ diff --git a/c/protocan-boot/projects/ccs/f2812/nor_flash.c b/c/protocan-boot/projects/ccs/f2812/nor_flash.c new file mode 100644 index 0000000..dde47de --- /dev/null +++ b/c/protocan-boot/projects/ccs/f2812/nor_flash.c @@ -0,0 +1 @@ +#include "../../../ports/tms320f2812/nor_flash.c" /* Собирает канонический драйвер AM29LV800BT из templates, сохраняя hardware callbacks отдельно от протокола. */ diff --git a/c/protocan-boot/projects/ccs/f2812/shared_boot.c b/c/protocan-boot/projects/ccs/f2812/shared_boot.c new file mode 100644 index 0000000..7c877f4 --- /dev/null +++ b/c/protocan-boot/projects/ccs/f2812/shared_boot.c @@ -0,0 +1 @@ +#include "../../../src/pcan_boot.c" /* Подключает общий ProtoCAN codec, сессии и CRC32 без второй реализации протокола. */ diff --git a/c/protocan-boot/projects/ccs/f2812/targetConfigs/TMS320F2812.ccxml b/c/protocan-boot/projects/ccs/f2812/targetConfigs/TMS320F2812.ccxml new file mode 100644 index 0000000..4b062df --- /dev/null +++ b/c/protocan-boot/projects/ccs/f2812/targetConfigs/TMS320F2812.ccxml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/c/protocan-boot/projects/ccs/f28335/.ccsproject b/c/protocan-boot/projects/ccs/f28335/.ccsproject new file mode 100644 index 0000000..44f2f89 --- /dev/null +++ b/c/protocan-boot/projects/ccs/f28335/.ccsproject @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/c/protocan-boot/projects/ccs/f28335/.cproject b/c/protocan-boot/projects/ccs/f28335/.cproject new file mode 100644 index 0000000..f49a6c4 --- /dev/null +++ b/c/protocan-boot/projects/ccs/f28335/.cproject @@ -0,0 +1,326 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/c/protocan-boot/projects/ccs/f28335/.project b/c/protocan-boot/projects/ccs/f28335/.project new file mode 100644 index 0000000..c1b7273 --- /dev/null +++ b/c/protocan-boot/projects/ccs/f28335/.project @@ -0,0 +1,115 @@ + + + + F28335_CAN_AB + + Отдельный постоянный загрузчик ProtoCAN для F28335 + + + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + + + + + + + + com.ti.ccstudio.core.ccsNature + + org.eclipse.cdt.core.cnature + + org.eclipse.cdt.core.ccnature + + org.eclipse.cdt.managedbuilder.core.managedBuildNature + + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + + + + ti/DSP2833x_ADC_cal.asm + + 1 + + PCAN_ROOT/vendor/ti/f28335/source/DSP2833x_ADC_cal.asm + + + + + ti/DSP2833x_CpuTimers.c + + 1 + + PCAN_ROOT/vendor/ti/f28335/source/DSP2833x_CpuTimers.c + + + + + ti/DSP2833x_GlobalVariableDefs.c + + 1 + + PCAN_ROOT/vendor/ti/f28335/source/DSP2833x_GlobalVariableDefs.c + + + + + ti/DSP2833x_PieCtrl.c + + 1 + + PCAN_ROOT/vendor/ti/f28335/source/DSP2833x_PieCtrl.c + + + + + ti/DSP2833x_SysCtrl.c + + 1 + + PCAN_ROOT/vendor/ti/f28335/source/DSP2833x_SysCtrl.c + + + + + ti/DSP2833x_usDelay.asm + + 1 + + PCAN_ROOT/vendor/ti/f28335/source/DSP2833x_usDelay.asm + + + + + DSP2833x_Headers_nonBIOS.cmd + + 1 + + PCAN_ROOT/vendor/ti/f28335/cmd/DSP2833x_Headers_nonBIOS.cmd + + + + + + + + PCAN_ROOT + + $%7BPARENT-3-PROJECT_LOC%7D + + + diff --git a/c/protocan-boot/projects/ccs/f28335/F28335_CAN_AB.cmd b/c/protocan-boot/projects/ccs/f28335/F28335_CAN_AB.cmd new file mode 100644 index 0000000..b6ba0a7 --- /dev/null +++ b/c/protocan-boot/projects/ccs/f28335/F28335_CAN_AB.cmd @@ -0,0 +1,32 @@ +MEMORY /* Отделяет постоянный загрузчик от адресов RAM payload приложения 167. */ +{ /* Все адреса и длины указаны в 16-битных словах CPU C28x. */ +PAGE 0: /* Исполняемые секции и их Flash LOAD-адреса. */ + FLASHA : origin = 0x338000, length = 0x007F80 /* Сектор A до зарезервированной CSM-области содержит постоянный загрузчик. */ + BEGIN : origin = 0x33FFF6, length = 0x000002 /* Два слова аппаратного Flash boot перехода; пароли CSM не выделяются. */ + RAMFUNCS : origin = 0x00F800, length = 0x000800 /* Верхние 2048 слов RAM загрузчика нужны InitFlash и не входят в SCI8 payload приложения. */ + RAMAPI : origin = 0x008000, length = 0x001800 /* 6144 слова временно принадлежат TI Flash API; приложение использует эту RAM только после выхода загрузчика. */ + ADC_CAL : origin = 0x380080, length = 0x000009 /* Заводская калибровка TI используется без записи/стирания. */ + RESET : origin = 0x3FFFC0, length = 0x000002 /* Аппаратный reset находится в ROM и не программируется. */ +PAGE 1: /* Рабочие данные не пересекают код RAM-приложения ниже E000. */ + BOOT_SHARED : origin = 0x000050, length = 0x000008 /* Общие с приложением восемь слов NOINIT handoff после ROM scratch 0..4F. */ + RAMM0 : origin = 0x000058, length = 0x0003A8 /* Малый банк доступен служебным неинициализированным данным. */ + RAMM1 : origin = 0x000400, length = 0x000400 /* Стек на 1024 слова не меняет расположение при переходе в приложение. */ + RAMDATA : origin = 0x00E000, length = 0x001800 /* 6144 слова store/очереди; приложение использует их только после перехода в C startup. */ +} /* Завершает физическую карту постоянного загрузчика. */ +SECTIONS /* Не выделяет ни одного загружаемого слова в RAM приложения. */ +{ /* Инициализированные Flash-секции остаются в секторе A. */ + codestart : > BEGIN, PAGE = 0 /* Аппаратный переход передаёт управление watchdog-safe C startup. */ + flash_api : { -lFlash28335_API_V210.lib(.text) -lFlash28335_API_V210.lib(.econst) } LOAD = FLASHA, RUN = RAMAPI, LOAD_START(_FlashApiLoadStart), LOAD_END(_FlashApiLoadEnd), RUN_START(_FlashApiRunStart), PAGE = 0 /* Код и таблицы TI API выполняются из RAM, пока общий банк Flash занят изменением B–H. */ + .text : > FLASHA, PAGE = 0 /* Весь постоянный алгоритм и библиотеки исполняются из Flash A. */ + .cinit : > FLASHA, PAGE = 0 /* Таблицы ROM-модели подготавливают данные загрузчика до main. */ + .pinit : > FLASHA, PAGE = 0 /* Сохраняет стандартный порядок C runtime, если компилятор создаст эту секцию. */ + .econst : > FLASHA, PAGE = 0 /* Константы протокола и имена сервиса не расходуют рабочую RAM. */ + .switch : > FLASHA, PAGE = 0 /* Таблицы переходов находятся в постоянной области загрузчика. */ + ramfuncs : LOAD = FLASHA, RUN = RAMFUNCS, LOAD_START(_RamfuncsLoadStart), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart), PAGE = 0 /* InitFlash копируется до изменения настроек самой Flash. */ + .boot_shared : > BOOT_SHARED, PAGE = 1, TYPE = NOINIT /* Не обнуляет session/slot, полученные через watchdog reset. */ + .stack : > RAMM1, PAGE = 1 /* Стек не пересекает ни handoff, ни загружаемые секции SCI8. */ + .ebss : > RAMDATA, PAGE = 1 /* Размещает очередь, журнал и структуры драйвера вне RAM payload. */ + .esysmem : > RAMDATA, PAGE = 1 /* Поддерживает стандартную секцию runtime без использования heap в алгоритме. */ + .reset : > RESET, PAGE = 0, TYPE = DSECT /* Reset-вектор ROM описывается, но не попадает в программируемый OUT. */ + .adc_cal : > ADC_CAL, PAGE = 0, TYPE = NOLOAD /* Сохраняет заводские данные ADC TI при установке загрузчика. */ +} /* Не создаёт секций CSM, OTP или паролей. */ diff --git a/c/protocan-boot/projects/ccs/f28335/codestart.asm b/c/protocan-boot/projects/ccs/f28335/codestart.asm new file mode 100644 index 0000000..b69fe2f --- /dev/null +++ b/c/protocan-boot/projects/ccs/f28335/codestart.asm @@ -0,0 +1,12 @@ + .ref _c_int00 ; Стандартный COFF startup применяет .cinit и вызывает main после отключения раннего watchdog. + .sect "codestart" ; Boot ROM передаёт управление двухсловному переходу по аппаратному адресу слова 0x33FFF6. + LB flash_boot_start ; Переходит к короткой подготовке C28x во Flash, сохраняя точный размер аппаратного входа два слова. + .text ; Последовательность взята из штатного TI DSP2833x_CodeStartBranch.asm и размещается в секторе основного кода. +flash_boot_start: ; Отключает watchdog до возможной длительной обработки таблиц инициализации C, а не только после входа в main. + SETC OBJMODE ; Выбирает C28x object mode, требуемый стандартным COFF startup процессора F28335. + EALLOW ; Разрешает запись защищённого регистра WDCR перед запуском C runtime. + MOVZ DP, #7029h>>6 ; Адрес слова WDCR=0x7029 из карты F28335; DP выбирает соответствующую страницу по 64 слова. + MOV @7029h, #0068h ; Значение 0x0068 содержит контрольные биты WDCHK=101 и WDDIS=1, как официальный TI startup. + EDIS ; Возвращает защиту системных регистров перед переходом в библиотечную инициализацию. + LB _c_int00 ; Применяет штатную ROM-модель инициализации и затем запускает текущий main 167. + .end ; Завершает модуль, не добавляя произвольных данных рядом с CSM-паролями сектора A. diff --git a/c/protocan-boot/projects/ccs/f28335/flash_update.c b/c/protocan-boot/projects/ccs/f28335/flash_update.c new file mode 100644 index 0000000..aae9388 --- /dev/null +++ b/c/protocan-boot/projects/ccs/f28335/flash_update.c @@ -0,0 +1,33 @@ +#include "DSP2833x_Device.h" /* Предоставляет реальные типы C28x, частоту SYSCLKOUT, CSM и маскирование IRQ. */ +#include "../../../ports/tms320f28335/f28335_flash_update.h" /* Подключает проверяемый алгоритм staging SCI8 и аппаратный контракт записи. */ +#include "Flash2833x_API_Library.h" /* Использует официальный TI Flash API v2.10 для F28335, а не запись Flash обычным указателем. */ +#include /* Копирует код и таблицы TI API из постоянного сектора A во внутреннюю RAM до операции Flash. */ +extern Uint16 FlashApiLoadStart, FlashApiLoadEnd, FlashApiRunStart; /* Символы LOAD/RUN задаёт linker в адресуемых словах CPU. */ +static FLASH_ST flash_status; /* Диагностика TI хранится во внутренней RAM во время стирания и программирования. */ +static bool erase_flash(void *user) /* Стирает только область приложения, сохраняя постоянный загрузчик. */ +{ /* Даже IRQ из сектора A запрещены, поскольку F28335 имеет общий банк Flash для A–H. */ + Uint16 saved, status; (void)user; /* Сохраняет прежнее состояние IRQ и точный результат TI API. */ + saved = __disable_interrupts(); status = Flash_Erase(0x00FEU, &flash_status); __restore_interrupts(saved); /* Бит 0 — сектор A; маска FE выбирает только B–H согласно TI API v2.10. */ + return status == STATUS_SUCCESS; /* Ошибка erase запрещает любую последующую публикацию FAB1. */ +} /* После возврата TI API банк Flash снова доступен коду постоянного загрузчика. */ +static bool program_flash(void *user, uint32_t address, uint16_t *data, unsigned int words) /* Записывает и проверяет одну ограниченную порцию Flash. */ +{ /* Аппаратный слой повторно защищает сектор A независимо от валидатора SCI8. */ + Uint16 saved, status; (void)user; /* Результат API и маска IRQ не размещаются в обновляемой Flash. */ + if (!words || address < F28335_FLASH_APP_START || address >= F28335_FLASH_APP_STOP || words > F28335_FLASH_APP_STOP - address) return false; /* Не допускает даже частичного выхода за B–H, включая CSM и аппаратный boot. */ + saved = __disable_interrupts(); status = Flash_Program((Uint16 *)address, data, words, &flash_status); /* Во время программирования процессор выполняет только скопированный в RAM TI API. */ + if (!status) status = Flash_Verify((Uint16 *)address, data, words, &flash_status); /* Проверяет фактические слова до подтверждения этой порции. */ + __restore_interrupts(saved); return status == STATUS_SUCCESS; /* Возвращает исходное состояние IRQ даже при отказе записи или readback. */ +} /* Общий writer опубликует FAB1 лишь после успешной записи остальных порций. */ +static uint16_t read_flash(void *user, uint32_t address) /* Читает физическую Flash для итоговой проверки FAB1/CRC. */ +{ /* Этот callback вызывается только после окончания аппаратных операций TI API. */ + (void)user; return *(volatile Uint16 *)address; /* Адрес уже ограничен общим валидатором диапазоном приложения B–H. */ +} /* Программирование не подменяется чтением staging EEPROM. */ +bool F28335Boot_FlashProgram(f28335_flash_update_t *s) /* Единственная точка фактической записи внутренней Flash из CAN COMMIT. */ +{ /* Постоянный загрузчик может вернуться к CAN recovery при любой ошибке. */ + f28335_flash_ops_t ops; /* Аппаратные операции передаются проверяемому транспортно-независимому writer. */ + if (CsmRegs.CSMSCR.bit.SECURE) return false; /* Защищённый CSM запрещает стирание до любого вызова TI API. */ + memcpy(&FlashApiRunStart, &FlashApiLoadStart, &FlashApiLoadEnd - &FlashApiLoadStart); /* API и его константы должны быть в RAM даже при сохранении сектора A. */ + Flash_CPUScaleFactor = (Uint32)(1048576.0L * (200.0L * (long double)SYSCLKOUT / 1000000000.0L)); /* Формула TI IQ20 использует реальную частоту SYSCLKOUT в герцах. */ + Flash_CallbackPtr = 0; ops.erase = erase_flash; ops.program = program_flash; ops.read = read_flash; ops.user = 0; /* Исключает callback во Flash во время занятости общего банка A–H. */ + return f28335_flash_update_program(s, &ops); /* Итоговый ACK COMMIT появляется только после CRC физической Flash; REBOOT остаётся отдельной командой клиента. */ +} /* Постоянный boot, handoff и EEPROM-параметры не программируются. */ diff --git a/c/protocan-boot/projects/ccs/f28335/main.c b/c/protocan-boot/projects/ccs/f28335/main.c new file mode 100644 index 0000000..fa829d2 --- /dev/null +++ b/c/protocan-boot/projects/ccs/f28335/main.c @@ -0,0 +1,127 @@ +#include "DSP2833x_Device.h" /* Использует действующую частоту и штатную карту регистров той же платы 167. */ +#include "DSP2833x_Examples.h" /* Предоставляет InitSysCtrl, InitPieCtrl, InitFlash и управление Timer1. */ +#include "../../../ports/tms320f28335/f28335_can_boot.h" /* Подключает адрес, сервисы и очередь существующего загрузчика. */ +#include "../../../ports/tms320f28335/f28335_boot_platform.h" /* Использует общий handoff, SPI и энергонезависимый A/B-журнал. */ +#include /* Копирует ramfuncs до настройки времен доступа Flash. */ +extern Uint16 RamfuncsLoadStart, RamfuncsLoadEnd, RamfuncsRunStart; /* Адреса LOAD/RUN задаёт отдельный linker загрузчика в словах C28x. */ +static f28335_boot_store_t image_store; /* Журнал загрузки остаётся в RAM E000..FFFF до перехода в приложение. */ +interrupt void boot_tick(void) /* Timer1 продолжает миллисекундные тайм-ауты общего CAN/SPI порта. */ +{ /* Этот ISR принадлежит постоянному загрузчику, а не кандидату приложения. */ + CpuTimer1.InterruptCount++; /* Один тик равен одной миллисекунде согласно ConfigCpuTimer ниже. */ + ServiceDog(); /* Длительные CRC/SPI операции загрузчика не должны сбрасывать аппарат во время обновления. */ +} /* Возвращает управление основному циклу загрузчика. */ +interrupt void boot_can_rx(void) /* CAN IRQ выполняет только короткий перенос принятых кадров в общую очередь. */ +{ /* Запись EEPROM, CRC и публикация pending остаются в главном цикле. */ + F28335CanBoot_RxISR(); /* Читает только выделенные mailbox 3 и 6 существующего адаптера. */ + PieCtrlRegs.PIEACK.all = 0x0100U; /* Бит 8 подтверждает группу PIE9, в которой находится ECAN0INTA. */ +} /* Позволяет принять следующее окно CAN, пока main занят SPI. */ +static void boot_can_init(void) /* Настраивает тот же физический CAN-A и 250 кбит/с, что приложение 167. */ +{ /* Загрузчик не использует прикладные mailbox 0..2 и не меняет адрес общего порта. */ + Uint32 shadow; /* Защищённые eCAN-регистры изменяются только полными 32-битными обращениями. */ + EALLOW; /* Разрешает настройку мультиплексора, eCAN и таблицы векторов. */ + GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 1; /* GPIO30 служит CANRXA, как в штатном InitCan проекта. */ + GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 1; /* GPIO31 служит CANTXA того же трансивера. */ + ECanaRegs.CANTIOC.all = 8UL; /* Бит TXFUNC включает функцию CAN у выхода контроллера. */ + ECanaRegs.CANRIOC.all = 8UL; /* Бит RXFUNC включает аппаратный вход CAN. */ + ECanaRegs.CANME.all = 0UL; /* Изменяет mailbox и фильтры только при выключенных ящиках. */ + ECanaRegs.CANMIM.all = 0UL; /* Ни один старый mailbox не должен создавать IRQ во время настройки. */ + ECanaRegs.CANMIL.all = 0UL; /* Направляет служебные mailbox на ECAN0INTA группы PIE9. */ + ECanaRegs.CANMC.all = 0x00003080UL; /* SCB=1 выбирает eCAN, ABO=1 автоматическое восстановление, CCR=1 режим настройки битового времени; SRES остаётся нулём. */ + while (!ECanaRegs.CANES.bit.CCE) {} /* Не пишет CANBTC до аппаратного подтверждения режима настройки. */ + shadow = ((Uint32)(CLKMULT * 3L - 1L) << 16) | 0x0000017AUL; /* BRP=CLKMULT*3-1, SJW=1, TSEG1=15, TSEG2=2 как в приложении: 250000 бит/с при текущем SYSCLKOUT. */ + ECanaRegs.CANBTC.all = shadow; /* Передаёт параметры одним 32-битным обращением к eCAN. */ + ECanaRegs.CANMC.all &= ~0x00001000UL; /* Снимает CCR после настройки тактов CAN. */ + while (ECanaRegs.CANES.bit.CCE) {} /* Ждёт возврата контроллера к обычной работе перед включением фильтров. */ + ECanaRegs.CANTA.all = 0xFFFFFFFFUL; /* Удаляет старые TX ACK, которые не относятся к новой сессии. */ + ECanaRegs.CANRMP.all = 0xFFFFFFFFUL; /* Удаляет старые RX-флаги до включения IRQ. */ + ECanaRegs.CANRML.all = 0xFFFFFFFFUL; /* Начинает контроль потери mailbox с чистого состояния. */ + ECanaRegs.CANGIF0.all = 0xFFFFFFFFUL; /* Снимает накопленные флаги линии CAN0. */ + ECanaRegs.CANGIM.all = 1UL; /* I0EN разрешает mailbox IRQ по линии 0; ошибки не требуют прикладного ISR. */ + PieVectTable.ECAN0INTA = &boot_can_rx; /* Использует постоянный обработчик загрузчика вместо кода RAM-приложения. */ + PieCtrlRegs.PIEIER9.bit.INTx5 = 1; /* Разрешает ECAN0INTA в группе PIE9. */ + EDIS; /* Возвращает защиту аппаратной конфигурации. */ + IER |= M_INT9; /* Разрешает группе CAN доставлять IRQ ядру после общего EINT. */ +} /* Общий порт затем настроит адресные mailbox 3/4/6. */ +static unsigned int boot_periph_id(void) /* Повторяет аппаратное чтение Mode из peripher.c, чтобы после reset адрес загрузчика совпадал с приложением. */ +{ /* Четыре активных низким уровнем перемычки существующей ПМ35 задают номера 1–16. */ + unsigned int periph_id; /* Номер является ID PERIPH из Excel, а не уменьшенным на единицу индексом старого CAN. */ + EALLOW; /* Разрешает настройку только четырёх входов адресных перемычек. */ + GpioCtrlRegs.GPAMUX2.bit.GPIO20=0; /* GPIO20 работает входом адреса с весом 2, как в get_Mode приложения. */ + GpioCtrlRegs.GPAMUX2.bit.GPIO21=0; /* GPIO21 работает входом адреса с весом 1, а не альтернативной периферией. */ + GpioCtrlRegs.GPAMUX2.bit.GPIO22=0; /* GPIO22 работает входом адреса с весом 4. */ + GpioCtrlRegs.GPBMUX2.bit.GPIO51=0; /* GPIO51 работает входом адреса с весом 8. */ + GpioCtrlRegs.GPADIR.bit.GPIO20=0; /* Запрещает выходной драйвер, чтобы загрузчик не воздействовал на перемычку. */ + GpioCtrlRegs.GPADIR.bit.GPIO21=0; /* Оставляет младшую адресную перемычку входом. */ + GpioCtrlRegs.GPADIR.bit.GPIO22=0; /* Оставляет третий разряд аппаратного номера входом. */ + GpioCtrlRegs.GPBDIR.bit.GPIO51=0; /* Оставляет старшую перемычку входом порта B. */ + EDIS; /* Восстанавливает защиту конфигурации GPIO до чтения физического номера. */ + periph_id=1U+!GpioDataRegs.GPADAT.bit.GPIO21; /* Штатный Mode начинается с 1; замкнутая GPIO21 добавляет единицу. */ + periph_id+=2U*!GpioDataRegs.GPADAT.bit.GPIO20; /* Замкнутая GPIO20 добавляет два к номеру платы. */ + periph_id+=4U*!GpioDataRegs.GPADAT.bit.GPIO22; /* Замкнутая GPIO22 добавляет четыре к номеру платы. */ + periph_id+=8U*!GpioDataRegs.GPBDAT.bit.GPIO51; /* Замкнутая GPIO51 добавляет восемь; аппаратный диапазон заканчивается на 16. */ + return periph_id; /* Общий CAN-порт преобразует номер 16 в Type 2 / Device 0 согласно Excel. */ +} /* Приложение и recovery используют один и тот же физический адрес без общего значения 3/7. */ +static bool ram_word(void *user, uint32_t address, uint16_t value) /* Аппаратная запись одного слова уже проверенной таблицы SCI8. */ +{ /* Повторяет нижнюю защиту RAM даже при ошибке вызывающего слоя. */ + (void)user; /* Контекст не нужен для единственной внутренней RAM данного F28335. */ + if (address < 0x8000UL || address >= 0xE000UL) return false; /* Не позволяет таблице затронуть периферию, handoff, стек или RAM загрузчика. */ + *(volatile Uint16 *)address = value; /* Адрес измеряется в 16-битных словах C28x, значение уже декодировано из SCI8. */ + return true; /* Сообщает полную запись слова, а не частичное выполнение секции. */ +} /* После загрузки всех слов общий store вернёт проверенную точку входа. */ +static uint16_t flash_word(void *user, uint32_t address) /* Читает только фиксированный заголовок и проверенный диапазон приложения ниже сектора A. */ +{ /* Загрузчик остаётся во Flash A, поэтому чтение H–B не меняет выполняемый код. */ + (void)user; /* Единственная внутренняя Flash не требует отдельного контекста источника. */ + return *(volatile Uint16 *)address; /* C28x адресует Flash 16-битными словами; разбиение на октеты выполняет общий валидатор CRC. */ +} /* Никакая запись или стирание Flash при выборе источника запуска не выполняется. */ +static void start_application(uint32_t entry, unsigned int source) /* Передаёт управление Flash либо EEPROM только после проверки соответствующего образа. */ +{ /* Останавливает собственные IRQ до C startup приложения, который заново настроит периферию и рабочую RAM. */ + DINT; IER = 0U; IFR = 0U; /* Старые прерывания не должны войти в очередь или стек завершённого загрузчика. */ + CpuTimer1Regs.TCR.bit.TSS = 1; /* Прекращает миллисекундные IRQ до запуска прикладного InitSysCtrl. */ + ECanaRegs.CANMIM.all = 0UL; /* Не доставляет CAN IRQ во время смены векторов приложения. */ + F28335Boot_SetRunning(source); /* Сохраняет достоверный источник: 0/1 для EEPROM A/B либо FE для проверенной Flash. */ + ((void (*)(void))entry)(); /* Вызывает watchdog-safe startup Flash или проверенную точку C runtime RAM-образа. */ + for (;;) {} /* Ошибочный возврат приложения не использует перезаписанное состояние загрузчика. */ +} /* Возврат к boot происходит только аппаратным reset с согласованным handoff. */ +void F28335Boot_Quiesce(void) /* Перед повторным входом загрузчика его собственные IRQ будут отключены общим Reset. */ +{ /* Силовые выходы загрузчик не включает; прикладная остановка выполняется до входа в него. */ + CpuTimer2Regs.TCR.bit.TSS = 1; /* Удерживает старый SPI Timer2 остановленным перед watchdog reset. */ +} /* Общий аппаратный слой сохранит session и включит watchdog. */ +void main(void) /* Постоянный загрузчик запускается аппаратным Flash boot по адресу 33FFF6. */ +{ /* Пустая EEPROM и неподтверждённый кандидат оставляют доступным CAN recovery. */ + f28335_boot_io_t io; /* Доступ к M95M02 предоставляет существующий переносимый SPI-порт. */ + unsigned int slot, session, periph_id; /* Слот, сессия handoff и физический номер PERIPH сохраняются отдельно от адресов памяти. */ + uint32_t entry, started; /* Адрес запуска измеряется словами CPU; started хранит миллисекунды стартового окна CAN. */ + InitSysCtrl(); /* Повторяет PLL и SYSCLKOUT проекта 167, отключая watchdog на раннем старте. */ + DINT; /* Не использует IRQ до настройки таблицы векторов и Timer1. */ + IER = 0U; IFR = 0U; /* Исключает доставку старых прерываний после watchdog reset. */ + memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, &RamfuncsLoadEnd - &RamfuncsLoadStart); /* Переносит InitFlash в RAM до изменения времен доступа Flash. */ + InitFlash(); /* Настраивает доступ к постоянному коду по штатной процедуре TI. */ + InitPieCtrl(); /* Очищает разрешения и флаги всех групп PIE перед установкой двух собственных векторов. */ + InitCpuTimers(); /* Останавливает Timer0/1/2 и сбрасывает их управляющие структуры. */ + ConfigCpuTimer(&CpuTimer1, SYSCLKOUT / 1000000L, 1000UL); /* Период 1000 мкс даёт единый миллисекундный tick для протокола и SPI WIP. */ + EALLOW; PieVectTable.XINT13 = &boot_tick; EDIS; /* Привязывает прямое прерывание Timer1 к постоянному ISR загрузчика. */ + CpuTimer1Regs.TCR.all = 0x4020U; /* Разрешает прерывание Timer1 и запускает счётчик, как приложение 167. */ + IER |= M_INT13; /* Разрешает миллисекундные прерывания ядра. */ + periph_id=boot_periph_id(); /* Читает реальные перемычки до адресных mailbox и до ответа на ENTER_BOOT после reset. */ + boot_can_init(); /* Настраивает трансивер и физическую скорость до общих фильтров и первой передачи. */ + session = F28335Boot_RequestedSession(); /* Потребляет только достоверный запрос приложения с magic и XOR-контролем. */ + F28335CanBoot_Init(periph_id); /* Открывает журнал и адресные Boot mailbox только для физического PERIPH данной платы. */ + PieCtrlRegs.PIECTRL.bit.ENPIE = 1; /* Разрешает таблицу PIE после записи обоих используемых векторов. */ + EINT; /* Приём окна CAN продолжается во время синхронных SPI-транзакций main. */ + if (session) F28335CanBoot_Resume(session); /* Отвечает ENTER_BOOT после reset с той же session и остаётся в recovery. */ + else { /* Обычный reset даёт CAN окно, затем предпочитает проверенную внутреннюю Flash и использует EEPROM как резерв. */ + started = F28335Boot_Now(); /* Отсчитывает три секунды от готового CAN, а не от начала настройки PLL и SPI. */ + while ((uint32_t)(F28335Boot_Now()-started)<3000UL && !F28335CanBoot_Active()) { F28335CanBoot_Service(); ServiceDog(); } /* ENTER_BOOT удерживает recovery; обычный PING не изменяет выбранный источник запуска. */ + F28335CanBoot_Service(); /* Разбирает кадр на границе трёхсекундного окна до последней проверки активного сеанса. */ + if (!F28335CanBoot_Active()) { /* Не запускает основную или резервную программу поверх открытого сеанса CAN Boot. */ + if (f28335_flash_app_validate(flash_word, 0, &entry)) start_application(entry, F28335_BOOT_FLASH_SLOT); /* Flash приоритетна только при правильном FAB1, допустимых адресах и совпавшей CRC всех LOAD-секций. */ + io.read = F28335Boot_Read; io.write = F28335Boot_Write; io.user = 0; /* Передаёт store ту же аппаратную реализацию, что обслуживает CAN. */ + if (f28335_boot_open(&image_store, &io) && f28335_boot_select(&image_store, &slot) && slot < 2U && f28335_boot_load(&image_store, slot, ram_word, 0, &entry)) { /* Проверяет CRC/SCI8, сохраняет attempted до пробного запуска и копирует только допустимую RAM. */ + start_application(entry, slot); /* Резервный EEPROM-образ получает прежние trial/CONFIRM и автоматический откат A/B. */ + } /* При ошибке чтения, CRC, таблицы или журнала не выполняет неизвестный entry. */ + F28335CanBoot_Init(periph_id); /* При переходе в recovery перечитывает журнал, сохраняя прежний физический адрес платы. */ + } /* Открытый CAN-сеанс сохраняет метаданные, выбранный слот и подтверждения без повторного Init. */ + } /* Завершает выбор между адресным входом и обычным запуском приложения. */ + F28335Boot_SetRunning(F28335_AB_NONE); /* Отмечает режим загрузчика, сохраняя уже восстановленную session в RAM автомата. */ + for (;;) { F28335CanBoot_Service(); ServiceDog(); } /* Обслуживает обновления и остаётся доступным при пустой/повреждённой EEPROM. */ +} /* Нормальный выход выполняется только через запуск RAM-приложения либо watchdog reset. */ diff --git a/c/protocan-boot/projects/ccs/f28335/shared_boot.c b/c/protocan-boot/projects/ccs/f28335/shared_boot.c new file mode 100644 index 0000000..733eb5d --- /dev/null +++ b/c/protocan-boot/projects/ccs/f28335/shared_boot.c @@ -0,0 +1,5 @@ +#include "../../../src/pcan_boot.c" /* Подключает единственный общий автомат ProtoCAN Boot и CRC32. */ +#include "../../../ports/tms320f28335/f28335_boot_store.c" /* Использует проверенный A/B-журнал, readback, SCI8 и откат. */ +#include "../../../ports/tms320f28335/f28335_flash_app.c" /* Проверяет FAB1 и CRC приложения ниже сектора A перед выбором основного Flash либо резервной EEPROM. */ +#include "../../../ports/tms320f28335/f28335_boot_hw.c" /* Подключает те же SPI, watchdog и handoff, что RAM-приложение. */ +#include "../../../ports/tms320f28335/f28335_can_boot.c" /* F28335_BOOT_LOADER=1 разрешает запись слотов только постоянному загрузчику. */ diff --git a/c/protocan-boot/projects/ccs/f28335/targetConfigs/TMS320F28335.ccxml b/c/protocan-boot/projects/ccs/f28335/targetConfigs/TMS320F28335.ccxml new file mode 100644 index 0000000..d074222 --- /dev/null +++ b/c/protocan-boot/projects/ccs/f28335/targetConfigs/TMS320F28335.ccxml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/c/protocan-boot/src/pcan_boot.c b/c/protocan-boot/src/pcan_boot.c index 2748d03..607fd63 100644 --- a/c/protocan-boot/src/pcan_boot.c +++ b/c/protocan-boot/src/pcan_boot.c @@ -89,6 +89,17 @@ static bool send_status(pcan_boot_t *boot, pcan_boot_byte_t command, pcan_boot_b return send_frame(boot, PCAN_BOOT_MSG_STATUS, body, data, 8U); } +uint32_t pcan_boot_crc32_update(uint32_t crc, const pcan_boot_byte_t *data, size_t length) /* Публичный readback использует тот же полином и отражение, что приём DATA. */ +{ /* Не создаёт второго аппаратно зависимого варианта CRC в портах NOR/EEPROM. */ + return crc32_update(crc, data, length); /* Продолжает ранее полученное состояние либо начинает с нуля. */ +} /* Сохраняет существующую wire-совместимость всех портов. */ +bool pcan_boot_report_busy(pcan_boot_t *boot, pcan_boot_byte_t command, uint32_t now_ms) /* Позволяет синхронному erase отвечать, пока аппаратная операция ещё не завершена. */ +{ /* Порт вызывает функцию только в контексте main с живым экземпляром сессии. */ + if (boot == NULL) return false; /* Не обращается к неинициализированному экземпляру аппаратного порта. */ + boot->now_ms = boot->last_activity_ms = now_ms; /* Продвижение erase/verify считается живой активностью: длинная операция не должна сама истечь по тайм-ауту сессии. */ + return send_status(boot, command, PCAN_BOOT_STATUS_BUSY); /* Номер следующего блока и CRC берутся из настоящего состояния ядра. */ +} /* Окончательный OK/ошибку по завершении callback отправляет обычный автомат. */ + /* IDENTIFY имеет отдельный тип сообщения DISCOVERY и Body=1. Он доступен * без открытия сессии, поэтому обнаружение устройства не должно запускать обновление. */ static bool send_identity(pcan_boot_t *boot) @@ -205,7 +216,7 @@ static bool process_control(pcan_boot_t *boot, uint16_t body, pcan_boot_byte_t command = (pcan_boot_byte_t)(body & 0xFFU); if (dlc != ((command == PCAN_BOOT_CMD_BEGIN_IMAGE || command == PCAN_BOOT_CMD_BEGIN_COMPAT) ? 8U : - (command == PCAN_BOOT_CMD_DEVICE_NAME || command == PCAN_BOOT_CMD_MEMORY_INFO) ? 1U : 0U)) { + (command == PCAN_BOOT_CMD_DEVICE_NAME || command == PCAN_BOOT_CMD_MEMORY_INFO || command == PCAN_BOOT_CMD_SELECT_MEMORY) ? 1U : 0U)) { /* Выбор памяти имеет ровно один октет и не может читать отсутствующий payload. */ return send_status(boot, command, PCAN_BOOT_STATUS_INVALID_SIZE); } if (command == PCAN_BOOT_CMD_PING) { @@ -258,6 +269,13 @@ static bool process_control(pcan_boot_t *boot, uint16_t body, boot->last_activity_ms=boot->now_ms; switch (command) { + case PCAN_BOOT_CMD_SELECT_MEMORY: { /* Явное назначение Flash не меняет поведение прежних клиентов без этой команды. */ + pcan_boot_status_t status; /* Точный отказ порта передаётся клиенту без подмены успешным ACK. */ + if (boot->state != PCAN_BOOT_STATE_METADATA || boot->have_image || boot->have_compat) return send_status(boot, command, PCAN_BOOT_STATUS_INVALID_STATE); /* После начала метаданных, приёма либо проверки запрещает менять цель записи. */ + if (!boot->port.select_memory) return send_status(boot, command, PCAN_BOOT_STATUS_INVALID_COMMAND); /* Старый загрузчик отклоняет новую цель до ERASE и передачи образа. */ + status = boot->port.select_memory(boot->port_user, data[0], &boot->config); /* Порт проверяет поддержку выбранной физической памяти и задаёт её режим. */ + return send_status(boot, command, status); /* Ответ защищён исходной адресацией и текущей ненулевой сессией. */ + } /* Остальные команды используют выбранную конфигурацию слотов. */ case PCAN_BOOT_CMD_BEGIN_IMAGE: if(boot->state==PCAN_BOOT_STATE_READY_TO_ERASE && boot->manifest.image_size==get_u32(data) && boot->manifest.image_crc32==get_u32(data+4)) return send_status(boot,command,PCAN_BOOT_STATUS_OK); diff --git a/c/protocan-boot/tests/f28335_stubs/DSP2833x_Device.h b/c/protocan-boot/tests/f28335_stubs/DSP2833x_Device.h index 00842d5..bd2cf58 100644 --- a/c/protocan-boot/tests/f28335_stubs/DSP2833x_Device.h +++ b/c/protocan-boot/tests/f28335_stubs/DSP2833x_Device.h @@ -9,5 +9,5 @@ static struct { struct MBOX MBOX3, MBOX4, MBOX6; } ECanaMboxes; static struct { struct test_reg CANME,CANMD,CANRMP,CANRML,CANMIM,CANTA,CANAA,CANTRS,CANTRR; } ECanaRegs; static struct { struct test_reg LAM3,LAM6; } ECanaLAMRegs; static struct { unsigned long InterruptCount; } CpuTimer1; -static struct { unsigned WDCR; } SysCtrlRegs; +/* Watchdog/reset моделируются callbacks; неиспользуемая глобальная копия SysCtrlRegs не требуется. */ #endif diff --git a/c/protocan-boot/tests/run_tests.py b/c/protocan-boot/tests/run_tests.py index 5180dea..0abe1ee 100644 --- a/c/protocan-boot/tests/run_tests.py +++ b/c/protocan-boot/tests/run_tests.py @@ -12,16 +12,18 @@ if not cc: store = 'ports/tms320f28335/f28335_boot_store.c' cases = [ ('core', [], ['src/pcan_boot.c', 'tests/test_pcan_boot.c']), + ('busy', ['-DPCAN_BOOT_WIDE_BYTES'], ['src/pcan_boot.c', 'tests/test_pcan_busy.c']), # Длительный NOR erase с BUSY продлевает session и сохраняет wire-поля ответа. ('store_native', [], [store, 'tests/test_f28335_boot_store.c']), ('store_wide', ['-DPCAN_BOOT_WIDE_BYTES'], [store, 'tests/test_f28335_boot_store.c']), ('loader', ['-DPCAN_BOOT_WIDE_BYTES'], [store, 'src/pcan_boot.c', 'tests/test_f28335_can_boot.c']), ('application', ['-DPCAN_BOOT_WIDE_BYTES', '-DF28335_BOOT_LOADER=0'], [store, 'src/pcan_boot.c', 'tests/test_f28335_can_boot.c']), + ('f2812_nor', ['-DPCAN_BOOT_WIDE_BYTES', '-DBOOT2812_HOST'], ['src/pcan_boot.c', 'ports/tms320f2812/nor_flash.c', 'ports/tms320f2812/boot_store.c', 'tests/test_f2812_nor.c']), # Проверяет настоящий AMD driver, NOR manifest, SCI8 и восстановление после обрывов записи. ] with tempfile.TemporaryDirectory(prefix='f28335-ab-') as tmp: for name, defines, sources in cases: exe = Path(tmp) / (name + '.exe') - subprocess.run([cc, '-std=c99', '-Wall', '-Wextra', '-Werror', '-Iinclude', + subprocess.run([cc, '-std=c99', '-Wall', '-Wextra', '-Werror', '-Wno-misleading-indentation', '-Iinclude', # GCC допускает существующие однострочные циклы старых аппаратных моделей без подавления остальных ошибок. '-Itests/f28335_stubs', *defines, *sources, '-o', str(exe)], cwd=root, check=True) sample = os.environ.get('F28335_SAMPLE_IMAGE') if name == 'store_wide' else None subprocess.run([str(exe), *([sample] if sample else [])], check=True, timeout=30) diff --git a/c/protocan-boot/tests/test_f2812_nor.c b/c/protocan-boot/tests/test_f2812_nor.c new file mode 100644 index 0000000..08ac4ff --- /dev/null +++ b/c/protocan-boot/tests/test_f2812_nor.c @@ -0,0 +1,83 @@ +#include "../ports/tms320f2812/boot2812.h" /* Проверяет реальные callbacks NOR и общий ProtoCAN codec в wide-octet режиме. */ +#include /* Любое нарушение границ, публикации или CRC завершает тест ошибкой. */ +#include /* Модель физической x16 памяти использует ровно 16 бит на слово даже на ПК. */ +#include /* Сообщает результат поведенческих сценариев без физического JTAG. */ +#include /* Подготавливает память и отдельные структуры C-ядра перед серией. */ +static uint16_t memory[0x80000]; /* AM29LV800BT содержит 512K слов x16, то есть 1 МиБ. */ +static unsigned int state, selected, bad_id, erases, programmed, busy_calls, loaded_words, stuck; /* Состояния относятся только к модели командной шины AMD. */ +static long budget = -1; /* Отрицательное значение разрешает записи, ноль моделирует исчезновение питания перед очередным word program. */ +static unsigned long clock_ms; /* Детерминированные часы позволяют проверить ограниченный выход из polling. */ +unsigned long Boot2812_Now(void) { return clock_ms++; } /* Продвигает миллисекунды без зависимости теста от wall clock ПК. */ +void Boot2812_Busy(void) { ++busy_calls; } /* Подтверждает, что длительное ожидание вызывает разрешённый сервис BUSY. */ +void NorModel_LoadWord(uint32_t target, unsigned int value) /* Получает только реальные записи валидатора в разрешённую RAM приложения. */ +{ /* Тестовый образ ниже содержит пять слов H0. */ + assert(target >= 0x3F8000UL && target < 0x3F8005UL); assert(value == 0U); ++loaded_words; /* Неверный адрес либо повреждённый payload не может скрыться в аппаратной заглушке. */ +} /* Запись в адресное пространство процесса ПК отсутствует. */ +unsigned int NorModel_Read(unsigned long word) /* Имитирует обычное чтение либо режим autoselect чипа. */ +{ /* Все обращения обязаны оставаться внутри установленной физической NOR. */ + assert(word >= BOOT2812_NOR_BASE && word < BOOT2812_NOR_BASE + 0x80000UL); /* Выход на соседнюю XINTF-память является ошибкой драйвера. */ + if (selected) return word == BOOT2812_NOR_BASE ? (bad_id ? 2U : 1U) : 0x22DAU; /* Модель отличает правильный AMD от неподходящего производителя. */ + if (stuck && word >= BOOT2812_IMAGE_WORD) return 0U; /* DQ7=0/DQ5=0 удерживают erase busy до программного тайм-аута. */ + return memory[word - BOOT2812_NOR_BASE]; /* Возвращает настоящие 16-битные данные модели. */ +} /* Чтение не выполняет скрытых записей и не исправляет повреждённые данные. */ +void NorModel_Write(unsigned long word, unsigned int value) /* Проверяет настоящий unlock state machine драйвера, а не принимает готовые запросы erase. */ +{ /* Командные адреса трактуются как x16 смещения согласно datasheet AMD. */ + assert(word >= BOOT2812_NOR_BASE && word < BOOT2812_NOR_BASE + 0x80000UL); /* Любой командный цикл ограничен физическим чипом. */ + if (state == 3U) { /* После A0 следующий цикл обязательно содержит программируемое слово данных. */ + if (budget != 0) { memory[word - BOOT2812_NOR_BASE] &= (uint16_t)value; ++programmed; if (budget > 0) --budget; } /* NOR программирует только переходы 1→0; обрыв питания оставляет прежнее слово. */ + state = 0U; return; /* Программирование одного слова завершает командную последовательность. */ + } /* Значение F0 в payload не должно ошибочно интерпретироваться как отдельная команда Reset. */ + if (value == 0xF0U) { state = selected = 0U; return; } /* Reset возвращает обычное чтение независимо от предыдущей незавершённой команды. */ + if (state == 0U) { assert(word == BOOT2812_NOR_BASE + 0x555UL && value == 0xAAU); state = 1U; } /* Первый unlock-цикл проверяется вместе с адресом. */ + else if (state == 1U) { assert(word == BOOT2812_NOR_BASE + 0x2AAUL && value == 0x55U); state = 2U; } /* Второй цикл исключает ошибочную x8 адресацию. */ + else if (state == 2U) { /* Третий цикл выбирает только одну из поддерживаемых безопасных команд. */ + assert(word == BOOT2812_NOR_BASE + 0x555UL); /* Командный регистр находится по x16 смещению 555h. */ + if (value == 0x90U) { selected = 1U; state = 0U; } /* Autoselect не изменяет содержимое памяти. */ + else if (value == 0xA0U) state = 3U; /* Следующий цикл будет word program. */ + else { assert(value == 0x80U); state = 4U; } /* Стирание требует второй unlock-пары, а не одного произвольного слова. */ + } /* Завершает декодирование третьего такта AMD. */ + else if (state == 4U) { assert(word == BOOT2812_NOR_BASE + 0x555UL && value == 0xAAU); state = 5U; } /* Проверяет четвёртый цикл Sector Erase. */ + else if (state == 5U) { assert(word == BOOT2812_NOR_BASE + 0x2AAUL && value == 0x55U); state = 6U; } /* Проверяет пятый цикл Sector Erase. */ + else { /* Шестой цикл выбирает только разрешённый отдельный сектор. */ + unsigned long count = word == BOOT2812_META_WORD ? 0x2000UL : 0x8000UL, i; /* Модель различает обычные и последние top-boot сектора. */ + assert(value == 0x30U); assert(word == BOOT2812_META_WORD || word == BOOT2812_IMAGE_WORD || word == BOOT2812_IMAGE_WORD + 0x8000UL || word == BOOT2812_IMAGE_WORD + 0x10000UL); /* Запрещает Chip Erase и любые соседние секторы legacy/FPGA. */ + for (i = 0; i < count; ++i) memory[word - BOOT2812_NOR_BASE + i] = 0xFFFFU; /* Реально стирает все слова выбранного сектора модели. */ + ++erases; state = 0U; /* Сохраняет число аппаратных sector erase для проверки отказов до разрушительных циклов. */ + } /* Завершает разрешённую операцию command bus. */ +} /* Модель не предоставляет драйверу обходного пути прямой записи массива. */ +static pcan_boot_byte_t image[40]; /* Небольшой полный SCI8: заголовок 22, секция 6+10, терминатор 2 октета. */ +static pcan_boot_manifest_t manifest; /* Metadata используют те же размеры и совместимость, что настоящий клиент. */ +static void make_image(void) /* Создаёт независимо определённый SCI8 с entry=3F8000 и пятью нулевыми словами H0. */ +{ /* Нулевой payload облегчает точную проверку каждого перенесённого слова. */ + memset(image, 0, sizeof(image)); image[0] = 0xAAU; image[1] = 8U; image[18] = 0x3FU; image[21] = 0x80U; image[22] = 5U; image[24] = 0x3FU; image[27] = 0x80U; /* Адрес TI передаётся старшим словом вперёд, внутри слова — little endian. */ + memset(&manifest, 0, sizeof(manifest)); manifest.image_size = 40UL; manifest.image_crc32 = pcan_boot_crc32_update(0UL, image, 40U); /* Начальная CRC вычисляется общим codec по независимому массиву файла. */ + manifest.product_type = BOOT2812_PRODUCT; manifest.hardware_revision_min = manifest.hardware_revision_max = 1U; /* Проверяет исключительно совместимый профиль F2812. */ +} /* Последующие сценарии меняют данные с новой CRC, чтобы отделить ошибки структуры от ошибок передачи. */ +static void save_image(void) /* Заполняет слоты через настоящие production callbacks, а не memcpy в образ. */ +{ /* Каждая порция соответствует одному восьмиоктетному CAN DATA. */ + unsigned int i; assert(Boot2812_Erase(0, 0U)); /* Перед каждой полной передачей удаляет marker и три полных сектора образа. */ + for (i = 0; i < 40U; i += 8U) assert(Boot2812_Write(0, 0U, i, image + i, 8U)); /* Проверяет упаковку октетов и readback каждого x16 слова. */ +} /* Только после завершения записи разрешены VERIFY и COMMIT. */ +int main(void) /* Проверяет драйвер, SCI8, publication и независимость соседних данных платы. */ +{ /* Все операции используют модель, физический CAN/JTAG не открывается. */ + unsigned long i; uint32_t entry; unsigned int before, cut; /* Счётчики контролируют защищённые диапазоны и обрывы manifest. */ + for (i = 0; i < 0x80000UL; ++i) memory[i] = 0x5AA5U; make_image(); /* Заполняет весь чип контрольным значением, включая старые данные и FPGA. */ + bad_id = 1U; before = erases; assert(!Boot2812_Erase(0, 0U) && erases == before); bad_id = 0U; /* Неподходящий производитель блокируется до первого sector erase. */ + assert(!Boot2812_NorErase(0x100000UL) && !Boot2812_NorErase(BOOT2812_IMAGE_WORD + 1UL)); /* Не разрешает старую область либо адрес внутри разрешённого сектора вместо его точного начала. */ + assert(!Boot2812_NorProgram(0x130000UL, 0U)); /* FPGA-образ запрещён даже при ошибочном прямом вызове нижнего драйвера. */ + save_image(); assert(Boot2812_Verify(0, 0U, &manifest) == PCAN_BOOT_STATUS_OK); /* Реальный NOR readback и формат SCI8 должны совпасть с входом. */ + assert(!Boot2812_Load(&entry)); assert(Boot2812_Commit(0, 0U, &manifest)); loaded_words = 0U; assert(Boot2812_Load(&entry) && entry == 0x3F8000UL && loaded_words == 5U); /* До COMMIT загрузка запрещена, после него переносятся ровно проверенные слова H0. */ + before = programmed; assert(!Boot2812_NorProgram(BOOT2812_IMAGE_WORD, 0xFFFFU) && programmed == before); /* Перевод 0→1 отклоняется без лишней попытки аппаратного program. */ + for (cut = 0; cut <= 12U; ++cut) { /* Проверяет публикацию при обрыве на каждом месте manifest из двенадцати слов. */ + bool committed; save_image(); budget = (long)cut; committed = Boot2812_Commit(0, 0U, &manifest); budget = -1; /* Останавливает только циклы NOR word program, не подменяя механизм публикации. */ + loaded_words = 0U; assert(Boot2812_Load(&entry) == committed); /* Незавершённая публикация остаётся recovery; полностью опубликованный образ запускается. */ + } /* Предыдущие legacy-данные всё время остаются за пределами разрешённого erase. */ + save_image(); memory[BOOT2812_IMAGE_WORD - BOOT2812_NOR_BASE + 15UL] ^= 1U; assert(Boot2812_Verify(0, 0U, &manifest) == PCAN_BOOT_STATUS_CRC_ERROR); /* Порча физической NOR обнаруживается независимо от принятой потоковой CRC. */ + make_image(); image[18] = 0U; image[21] = 0x90U; image[24] = 0U; image[27] = 0x90U; manifest.image_crc32 = pcan_boot_crc32_update(0UL, image, 40U); save_image(); /* Формирует целостную, но опасную секцию в L1 работающего загрузчика. */ + assert(Boot2812_Verify(0, 0U, &manifest) == PCAN_BOOT_STATUS_INVALID_STATE && !Boot2812_Commit(0, 0U, &manifest)); /* Корректная CRC не разрешает перезапись очереди и состояния сессии. */ + make_image(); stuck = 1U; before = busy_calls; assert(!Boot2812_NorErase(BOOT2812_IMAGE_WORD) && busy_calls > before); stuck = 0U; /* Постоянный DQ7 busy даёт ограниченный отказ и вызывает живой сервис BUSY. */ + for (i = 0; i < 0x60000UL; ++i) assert(memory[i] == 0x5AA5U); /* Сохраняет весь нижний участок старого firmware, параметров и FPGA, а не одну контрольную точку. */ + for (i = 0x78000UL; i < 0x7E000UL; ++i) assert(memory[i] == 0x5AA5U); /* Промежуточные top-boot сектора 15/16/17 также не стираются. */ + puts("F2812 NOR: AMD commands, ID, bounds, CRC, SCI8, torn commit, timeout and legacy/FPGA preservation: OK"); /* Перечисляет программно проверенные свойства аппаратного порта. */ + return 0; /* Успех означает завершение всех граничных и отказных сценариев. */ +} /* Политика аппаратного boot/CPLD дополнительно проверяется на реальной плате. */ diff --git a/c/protocan-boot/tests/test_f28335_can_boot.c b/c/protocan-boot/tests/test_f28335_can_boot.c index 2c2ac74..9d1bc6a 100644 --- a/c/protocan-boot/tests/test_f28335_can_boot.c +++ b/c/protocan-boot/tests/test_f28335_can_boot.c @@ -12,34 +12,64 @@ void ServiceDog(void); static unsigned char memory[0x40000]; static unsigned int running=255,resets,reset_arg,dog_feeds; static int fail_write; +static unsigned int write_calls; /* Счётчик аппаратных записей доказывает, что чужие CAN-команды не касаются EEPROM. */ void ServiceDog(void) { ++dog_feeds; } bool F28335Boot_Read(void *u,uint32_t a,pcan_boot_byte_t *p,unsigned int n) { unsigned i; (void)u; assert(a+n<=sizeof(memory)); for(i=0;i>(i*8))&255; } +static void address_isolation(void) /* Проверяет все 32 назначения Excel, аппаратный RX-фильтр и защиту записи от соседних плат. */ +{ /* Одна модель последовательно представляет каждый физический PERIPH и получает команды всем остальным. */ + unsigned int periph,peer,type,command_id,before=write_calls; /* Сохраняет счётчик записи до проверки, чтобы обнаружить любой побочный эффект чужого кадра. */ + for(periph=0U;periph<32U;++periph) { /* Покрывает обе границы Type 1/2 и все четырёхбитные Device ID. */ + F28335CanBoot_Init(periph); /* Тот же production Init используется RAM-приложением и Flash recovery. */ + assert(addressed && boot.config.device_type==1U+periph/16U && boot.config.device_id==periph%16U); /* Сверяет независимую ожидаемую раскладку Excel со всей конфигурацией устройства. */ + assert((ECanaMboxes.MBOX3.MSGID.all&0x07F00000UL)==((uint32_t)(1U+periph/16U)<<24|((uint32_t)(periph%16U)<<20))); /* Проверяет аппаратный фильтр, а не только программный parser. */ + for(peer=0U;peer<32U;++peer) { /* Включает пары задатчик↔УМП1/УМП2 и совпадающий Device ID в другом Type. */ + if(peer==periph) continue; /* Собственный адрес должен обслуживаться штатными сценариями ниже, поэтому здесь проверяются только чужие. */ + for(type=9U;type<=11U;++type) { /* Проверяет управляющий сервис и оба пространства данных слотов A/B. */ + for(command_id=2U;command_id<=9U;++command_id) { /* ENTER, метаданные, ERASE, VERIFY, COMMIT, CONFIRM и REBOOT должны игнорировать чужой адрес. */ + uint32_t id=pcan_boot_make_id(1,0,1U+peer/16U,peer%16U,type,type==9U?0x100U|command_id:0U); /* Формирует реальный 29-битный запрос соседнему PERIPH с ненулевой сессией. */ + assert(!pcan_boot_process(&boot,id,0,0)); /* Ядро не должно подтверждать или выполнять команду, адресованную другой плате. */ + ECanaRegs.CANRMP.all=8UL; ECanaMboxes.MBOX3.MSGID.all=0x80000000UL|id; /* Моделирует доставку чужого кадра железом вопреки аппаратному фильтру. */ + ECanaMboxes.MBOX3.MSGCTRL.all=0U; ECanaMboxes.MBOX3.MSGCTRL.bit.DLC=0U; ECanaMboxes.MBOX3.MSGCTRL.bit.RTR=0U; /* Исключает RTR как причину отказа, проверяя именно адрес. */ + F28335CanBoot_RxISR(); assert(head==0U && tail==0U && !tx_busy); /* Дополнительная ISR-защита не ставит чужую команду в очередь и не отправляет ответ. */ + } /* Завершает проверку изменяющих команд для выбранного пространства MsgType. */ + } /* Завершает проверку данных A/B и управляющего сервиса соседа. */ + } /* Переходит к следующему чужому номеру без перезаписи модели EEPROM. */ + assert(!pcan_boot_process(&boot,pcan_boot_make_id(1,0,3,7,9,0x102),0,0)); /* Прежний общий адрес 3/7 больше не разрешает вход в загрузчик ни одной платы. */ + } /* Заканчивает проверку уникальности всей таблицы PERIPH. */ + F28335CanBoot_Init(32U); assert(!addressed && !(ECanaRegs.CANME.all&88UL)); /* Недопустимый номер выключает Boot mailbox вместо перехода на общий адрес. */ + F28335CanBoot_Resume(1U); F28335CanBoot_Service(); assert(write_calls==before); /* Неверный адрес и все чужие команды не выполняют ни одной аппаратной записи. */ +} /* Последующие регрессии проверяют успешное обновление задатчика по адресу 1/8. */ int main(void) { pcan_boot_byte_t image[40]={0xAA,8},meta[8],compat[8]={0x33,0x28,1,1,2,0,1,1}; unsigned i,slot; pcan_boot_manifest_t m; memset(memory,0xA5,sizeof(memory)); image[21]=0x80; image[22]=5; image[27]=0x80; - F28335CanBoot_Init(); assert(boot.config.max_image_size==130560 && boot.config.slot_count==2); + address_isolation(); F28335CanBoot_Init(8U); assert(boot.config.max_image_size==130560 && boot.config.slot_count==2); /* Проверяет изоляцию всей шины перед штатной передачей задатчику. */ if(!F28335_BOOT_LOADER) { /* SPI-ROM application without Flash-loader handoff cannot erase anything. */ command(2,0,0); assert(boot.last_status==PCAN_BOOT_STATUS_INVALID_STATE && !reset_requested); + running=F28335_BOOT_FLASH_SLOT; F28335CanBoot_Init(8U); /* Достоверный handoff постоянного boot разрешает CAN-сервис защищённому Flash-приложению. */ + assert(confirmed && F28335CanBoot_WatchdogAllowed()); /* Flash не выдаётся за неподтверждённый EEPROM-кандидат и сохраняет штатное обслуживание watchdog. */ + command(12,0,0); assert(!F28335CanBoot_Active()); /* Диагностический PING не должен открывать сеанс прошивки или удерживать обычный запуск. */ + command(2,0,0); assert(reset_requested && reset_session==1U && F28335CanBoot_Active()); /* ENTER_BOOT из Flash планирует переход с той же session без прямой записи EEPROM. */ + running=255U; F28335CanBoot_Init(8U); /* Возвращает исходный SPI-ROM сценарий перед прежними тестами trial/CONFIRM и отката. */ memset(&m,0,sizeof(m));m.image_size=40;m.image_crc32=f28335_boot_crc(0,image,40); m.product_type=0x2833;m.hardware_revision_min=m.hardware_revision_max=1; assert(f28335_boot_prepare(&store,0)); for(i=0;i<40;i+=8)assert(f28335_boot_write(&store,0,i,image+i,8)); assert(f28335_boot_commit(&store,0,&m)); assert(f28335_boot_select(&store,&slot)); - running=0; F28335CanBoot_Init(); + running=0; F28335CanBoot_Init(8U); /* Пробное приложение сохраняет адрес задатчика после handoff постоянного загрузчика. */ assert(!F28335CanBoot_WatchdogAllowed()); command(8,0,0);assert(boot.last_status==PCAN_BOOT_STATUS_INVALID_STATE); F28335CanBoot_Ready(); @@ -55,7 +85,7 @@ int main(void) command(3,meta,8);command(4,compat,8);assert(boot.target_slot==0); command(5,0,0); for(i=0;i<5;++i) { tx_busy=0; assert(pcan_boot_process(&boot, - pcan_boot_make_id(1,0,3,7,10,i),image+i*8,8)); } + pcan_boot_make_id(1,0,1,8,10,i),image+i*8,8)); } /* Данные первого слота передаются только адресу задатчика. */ command(6,0,0);assert(boot.state==PCAN_BOOT_STATE_VERIFIED); command(7,0,0);assert(store.pending==0 && boot.state==PCAN_BOOT_STATE_COMMITTED); command(7,0,0);assert(boot.last_status==0); @@ -67,16 +97,16 @@ int main(void) } command(12,0,0); assert((ECanaMboxes.MBOX4.MSGID.all&65535)==12); command(13,0,0); assert(ECanaMboxes.MBOX4.MDH.all==130560); - meta[0]=0;command(14,meta,1); assert(ECanaMboxes.MBOX4.MDL.all==0x33383246UL); /* F283 */ + meta[0]=0;command(14,meta,1); assert(ECanaMboxes.MBOX4.MDL.all==0x6164615AUL); /* Первые четыре октета ASCII имени Zadatchik равны «Zada». */ meta[0]=3;command(15,meta,1);assert(ECanaMboxes.MBOX4.MDL.all==0x3FEFCUL); - assert(!pcan_boot_process(&boot,pcan_boot_make_id(1,0,3,6,9,0x102),0,0)); + assert(!pcan_boot_process(&boot,pcan_boot_make_id(1,0,1,6,9,0x102),0,0)); /* Адрес УМП2 1/6 не должен открывать сессию задатчика 1/8. */ tx_busy=0; assert(pcan_boot_process(&boot,pcan_boot_make_id(1,0,7,15,13,0),0,0)); assert(boot.discovery_pending); pcan_boot_poll(&boot,boot.discovery_at); assert(!boot.discovery_pending && (ECanaMboxes.MBOX4.MSGID.all&65535)==1); assert(!pcan_boot_process(&boot,pcan_boot_make_id(1,0,7,15,9,0x102),0,0)); head=tail=0; ECanaRegs.CANRMP.all=8; - ECanaMboxes.MBOX3.MSGID.all=0x80000000UL|pcan_boot_make_id(1,0,3,7,9,12); + ECanaMboxes.MBOX3.MSGID.all=0x80000000UL|pcan_boot_make_id(1,0,1,8,9,12); /* Собственный PING задатчика проходит очередь после проверки чужих адресов. */ ECanaMboxes.MBOX3.MSGCTRL.bit.DLC=0; F28335CanBoot_RxISR(); assert(head==1 && tail==0); tx_busy=0; F28335CanBoot_Service(); assert(tail==1); diff --git a/c/protocan-boot/tests/test_pcan_busy.c b/c/protocan-boot/tests/test_pcan_busy.c new file mode 100644 index 0000000..a7f0b72 --- /dev/null +++ b/c/protocan-boot/tests/test_pcan_busy.c @@ -0,0 +1,22 @@ +#include "../include/pcan_boot.h" /* Проверяет публичный BUSY codec и продление сессии на настоящем ядре. */ +#include /* Несовпадение состояния или wire-полей завершает тест ненулевым результатом. */ +#include /* Инициализирует опциональные поля конфигурации без аппаратных зависимостей. */ +static unsigned int status, body; /* Сохраняет наблюдаемые поля последнего настоящего STATUS кадра. */ +static bool send_frame(void *user, uint32_t id, const pcan_boot_byte_t *data, pcan_boot_byte_t length) /* Модель заменяет только физическую отправку CAN. */ +{ /* Содержимое статуса формирует production send_status, а не этот тест. */ + (void)user; assert(length == 8U && pcan_boot_id_msg_type(id) == 12U); status = data[0]; body = pcan_boot_id_msg_body(id); return true; /* Проверяет тип, длину и сохранённую session/command. */ +} /* Передача считается физически принятой аппаратным портом. */ +static bool erase(void *user, pcan_boot_byte_t slot) { (void)user; return slot == 0U; } /* Минимальный single-slot callback удовлетворяет обязательному контракту init. */ +static bool write_data(void *user, pcan_boot_byte_t slot, uint32_t offset, const pcan_boot_byte_t *data, pcan_boot_byte_t length) { (void)user; (void)offset; (void)data; return slot == 0U && length <= 8U; } /* Тест не программирует никакое реальное хранилище. */ +int main(void) /* Проверяет, что операция длиннее исходного session timeout остаётся живой при BUSY. */ +{ /* Без этой проверки длительный NOR erase мог бы закончиться уже отменённой сессией. */ + pcan_boot_t boot; pcan_boot_config_t config; pcan_boot_port_t port; /* Использует тот же экземпляр автомата, что аппаратные проекты. */ + memset(&config, 0, sizeof(config)); memset(&port, 0, sizeof(port)); config.slot_count = 1U; config.active_slot = 0U; config.session_timeout_ms = 30000UL; /* Сессия истекает через 30 секунд реального бездействия. */ + port.send = send_frame; port.erase_slot = erase; port.write_slot = write_data; assert(pcan_boot_init(&boot, &config, &port, 0)); /* Не обходит production валидацию обязательных callbacks. */ + assert(pcan_boot_process(&boot, pcan_boot_make_id(1U, 0U, 0U, 0U, 9U, 0x0102U), 0, 0U)); /* Открывает session=1 штатной командой ENTER_BOOT. */ + assert(pcan_boot_report_busy(&boot, 5U, 40000UL) && status == 1U && body == 0x0105U); /* BUSY долгого ERASE содержит исходную session и обновляет часы активности после сорока секунд. */ + pcan_boot_poll(&boot, 69999UL); assert(boot.state == PCAN_BOOT_STATE_METADATA); /* Почти 30 секунд после последнего BUSY ещё не означают тайм-аут. */ + pcan_boot_poll(&boot, 70000UL); assert(boot.state == PCAN_BOOT_STATE_IDLE); /* После полного интервала без прогресса сессия снова отменяется обычным способом. */ + assert(!pcan_boot_report_busy(0, 5U, 0UL)); /* Неинициализированный порт не должен вызывать аппаратный send. */ + return 0; /* Все проверки используют одно производственное ядро и его codec. */ +} /* Криптография и аппаратные сроки конкретной NOR не моделируются этим unit-тестом. */ diff --git a/c/protocan-boot/vendor/ti/README.md b/c/protocan-boot/vendor/ti/README.md new file mode 100644 index 0000000..d16ec89 --- /dev/null +++ b/c/protocan-boot/vendor/ti/README.md @@ -0,0 +1,20 @@ +# Поддержка TI C2000 для самостоятельных проектов + +Здесь сохранён минимальный необходимый набор device headers, peripheral linker, +GlobalVariableDefs, SysCtrl, CpuTimers, PieCtrl и usDelay. Для F28335 также +подключён ADC_cal. Полные исходные copyright/version comments TI сохранены. + +- `f28335`: DSP2833x Header Files/Common Sources **v1.20**, вариант рабочей + платы 167 из `Source/External/v120`. В нём сохранены русские пояснения и + действующие XCLKIN=30 МГц, CLKMULT=2, SYSCLKOUT=60 МГц. +- `f2812`: DSP281x Header Files/Common Sources **v1.20**, вариант рабочей + платы ПМ67 из `22220/ural/TMS_new_bus/Src/v120`. Используется штатный + PLLCR=10 при XCLKIN=30 МГц, SYSCLKOUT=150 МГц. Сохранено исходное имя + регистра `PIECRTL` SDK и секция `.fast_run` у usDelay; linker проекта + размещает её во внутренней Flash для вызовов из раннего InitSysCtrl. + +Это существующая поддержка производителя; код аппаратных портов ProtoCAN +находится отдельно в `ports`, а настройки платы — в проектах CCS. Перенос +исходников TI устраняет зависимость от соседнего checkout конкретной прошивки. +Установленный TI compiler/runtime по-прежнему требуется; `libc`/RTS не +копируются в репозиторий. diff --git a/c/protocan-boot/vendor/ti/f2812/cmd/DSP281x_Headers_nonBIOS.cmd b/c/protocan-boot/vendor/ti/f2812/cmd/DSP281x_Headers_nonBIOS.cmd new file mode 100644 index 0000000..0b9ae9c --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/cmd/DSP281x_Headers_nonBIOS.cmd @@ -0,0 +1,102 @@ +/* +// TI File $Revision: /main/4 $ +// Checkin $Date: July 9, 2009 17:39:29 $ +//########################################################################### +// +// FILE: DSP281x_Headers_nonBIOS.cmd +// +// TITLE: DSP281x Peripheral registers linker command file +// +// DESCRIPTION: +// +// This file is for use in Non-BIOS applications. +// +// Linker command file to place the peripheral structures +// used within the DSP28 headerfiles into the correct memory +// mapped locations. +// +// This version of the file includes the PieVectorTable structure. +// For BIOS applications, please use the DSP281x_Headers_BIOS.cmd file +// which does not include the PieVectorTable structure. +// +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### +*/ + +MEMORY +{ + PAGE 0: /* Program Memory */ + + PAGE 1: /* Data Memory */ + + DEV_EMU : origin = 0x000880, length = 0x000180 /* device emulation registers */ + PIE_VECT : origin = 0x000D00, length = 0x000100 /* PIE Vector Table */ + FLASH_REGS : origin = 0x000A80, length = 0x000060 /* FLASH registers */ + CSM : origin = 0x000AE0, length = 0x000010 /* code security module registers */ + XINTF : origin = 0x000B20, length = 0x000020 /* external interface registers */ + CPU_TIMER0 : origin = 0x000C00, length = 0x000008 /* CPU Timer0 registers */ + CPU_TIMER1 : origin = 0x000C08, length = 0x000008 /* CPU Timer1 registers */ + CPU_TIMER2 : origin = 0x000C10, length = 0x000008 /* CPU Timer2 registers */ + PIE_CTRL : origin = 0x000CE0, length = 0x000020 /* PIE control registers */ + ECANA : origin = 0x006000, length = 0x000040 /* eCAN control and status registers */ + ECANA_LAM : origin = 0x006040, length = 0x000040 /* eCAN local acceptance masks */ + ECANA_MOTS : origin = 0x006080, length = 0x000040 /* eCAN message object time stamps */ + ECANA_MOTO : origin = 0x0060C0, length = 0x000040 /* eCAN object time-out registers */ + ECANA_MBOX : origin = 0x006100, length = 0x000100 /* eCAN mailboxes */ + SYSTEM : origin = 0x007010, length = 0x000020 /* System control registers */ + SPIA : origin = 0x007040, length = 0x000010 /* SPI registers */ + SCIA : origin = 0x007050, length = 0x000010 /* SCI-A registers */ + XINTRUPT : origin = 0x007070, length = 0x000010 /* external interrupt registers */ + GPIOMUX : origin = 0x0070C0, length = 0x000020 /* GPIO mux registers */ + GPIODAT : origin = 0x0070E0, length = 0x000020 /* GPIO data registers */ + ADC : origin = 0x007100, length = 0x000020 /* ADC registers */ + EVA : origin = 0x007400, length = 0x000040 /* Event Manager A registers */ + EVB : origin = 0x007500, length = 0x000040 /* Event Manager B registers */ + SCIB : origin = 0x007750, length = 0x000010 /* SCI-B registers */ + MCBSPA : origin = 0x007800, length = 0x000040 /* McBSP registers */ + CSM_PWL : origin = 0x3F7FF8, length = 0x000008 /* Part of FLASHA. CSM password locations. */ +} + + +SECTIONS +{ + PieVectTableFile : > PIE_VECT, PAGE = 1 + +/*** Peripheral Frame 0 Register Structures ***/ + DevEmuRegsFile : > DEV_EMU, PAGE = 1 + FlashRegsFile : > FLASH_REGS, PAGE = 1 + CsmRegsFile : > CSM, PAGE = 1 + XintfRegsFile : > XINTF, PAGE = 1 + CpuTimer0RegsFile : > CPU_TIMER0, PAGE = 1 + CpuTimer1RegsFile : > CPU_TIMER1, PAGE = 1 + CpuTimer2RegsFile : > CPU_TIMER2, PAGE = 1 + PieCtrlRegsFile : > PIE_CTRL, PAGE = 1 + +/*** Peripheral Frame 1 Register Structures ***/ + ECanaRegsFile : > ECANA, PAGE = 1 + ECanaLAMRegsFile : > ECANA_LAM PAGE = 1 + ECanaMboxesFile : > ECANA_MBOX PAGE = 1 + ECanaMOTSRegsFile : > ECANA_MOTS PAGE = 1 + ECanaMOTORegsFile : > ECANA_MOTO PAGE = 1 + +/*** Peripheral Frame 2 Register Structures ***/ + SysCtrlRegsFile : > SYSTEM, PAGE = 1 + SpiaRegsFile : > SPIA, PAGE = 1 + SciaRegsFile : > SCIA, PAGE = 1 + XIntruptRegsFile : > XINTRUPT, PAGE = 1 + GpioMuxRegsFile : > GPIOMUX, PAGE = 1 + GpioDataRegsFile : > GPIODAT PAGE = 1 + AdcRegsFile : > ADC, PAGE = 1 + EvaRegsFile : > EVA, PAGE = 1 + EvbRegsFile : > EVB, PAGE = 1 + ScibRegsFile : > SCIB, PAGE = 1 + McbspaRegsFile : > MCBSPA, PAGE = 1 + +/*** Code Security Module Register Structures ***/ + CsmPwlFile : > CSM_PWL, PAGE = 1 +} + + +/******************* end of file ************************/ diff --git a/c/protocan-boot/vendor/ti/f2812/common/include/DSP281x_DefaultIsr.h b/c/protocan-boot/vendor/ti/f2812/common/include/DSP281x_DefaultIsr.h new file mode 100644 index 0000000..e617abd --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/common/include/DSP281x_DefaultIsr.h @@ -0,0 +1,123 @@ +// TI File $Revision: /main/2 $ +// Checkin $Date: April 28, 2005 15:22:28 $ +//########################################################################### +// +// FILE: DSP281x_DefaultIsr.h +// +// TITLE: DSP281x Devices Default Interrupt Service Routines Definitions. +// +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + +#ifndef DSP281x_DEFAULT_ISR_H +#define DSP281x_DEFAULT_ISR_H + +#ifdef __cplusplus +extern "C" { +#endif + + +//--------------------------------------------------------------------------- +// Default Interrupt Service Routine Declarations: +// +// The following function prototypes are for the +// default ISR routines used with the default PIE vector table. +// This default vector table is found in the DSP28_PieVect.h +// file. +// + +// Non-Peripheral Interrupts: +interrupt void INT13_ISR(void); // XINT13 or CPU-Timer 1 +interrupt void INT14_ISR(void); // CPU-Timer2 +interrupt void DATALOG_ISR(void); // Datalogging interrupt +interrupt void RTOSINT_ISR(void); // RTOS interrupt +interrupt void EMUINT_ISR(void); // Emulation interrupt +interrupt void NMI_ISR(void); // Non-maskable interrupt +interrupt void ILLEGAL_ISR(void); // Illegal operation TRAP +interrupt void USER1_ISR(void); // User Defined trap 1 +interrupt void USER2_ISR(void); // User Defined trap 2 +interrupt void USER3_ISR(void); // User Defined trap 3 +interrupt void USER4_ISR(void); // User Defined trap 4 +interrupt void USER5_ISR(void); // User Defined trap 5 +interrupt void USER6_ISR(void); // User Defined trap 6 +interrupt void USER7_ISR(void); // User Defined trap 7 +interrupt void USER8_ISR(void); // User Defined trap 8 +interrupt void USER9_ISR(void); // User Defined trap 9 +interrupt void USER10_ISR(void); // User Defined trap 10 +interrupt void USER11_ISR(void); // User Defined trap 11 +interrupt void USER12_ISR(void); // User Defined trap 12 + +// Group 1 PIE Interrupt Service Routines: +interrupt void PDPINTA_ISR(void); // EV-A +interrupt void PDPINTB_ISR(void); // EV-B +interrupt void XINT1_ISR(void); +interrupt void XINT2_ISR(void); +interrupt void ADCINT_ISR(void); // ADC +interrupt void TINT0_ISR(void); // Timer 0 +interrupt void WAKEINT_ISR(void); // WD + +// Group 2 PIE Interrupt Service Routines: +interrupt void CMP1INT_ISR(void); // EV-A +interrupt void CMP2INT_ISR(void); // EV-A +interrupt void CMP3INT_ISR(void); // EV-A +interrupt void T1PINT_ISR(void); // EV-A +interrupt void T1CINT_ISR(void); // EV-A +interrupt void T1UFINT_ISR(void); // EV-A +interrupt void T1OFINT_ISR(void); // EV-A + +// Group 3 PIE Interrupt Service Routines: +interrupt void T2PINT_ISR(void); // EV-A +interrupt void T2CINT_ISR(void); // EV-A +interrupt void T2UFINT_ISR(void); // EV-A +interrupt void T2OFINT_ISR(void); // EV-A +interrupt void CAPINT1_ISR(void); // EV-A +interrupt void CAPINT2_ISR(void); // EV-A +interrupt void CAPINT3_ISR(void); // EV-A + +// Group 4 PIE Interrupt Service Routines: +interrupt void CMP4INT_ISR(void); // EV-B +interrupt void CMP5INT_ISR(void); // EV-B +interrupt void CMP6INT_ISR(void); // EV-B +interrupt void T3PINT_ISR(void); // EV-B +interrupt void T3CINT_ISR(void); // EV-B +interrupt void T3UFINT_ISR(void); // EV-B +interrupt void T3OFINT_ISR(void); // EV-B + +// Group 5 PIE Interrupt Service Routines: +interrupt void T4PINT_ISR(void); // EV-B +interrupt void T4CINT_ISR(void); // EV-B +interrupt void T4UFINT_ISR(void); // EV-B +interrupt void T4OFINT_ISR(void); // EV-B +interrupt void CAPINT4_ISR(void); // EV-B +interrupt void CAPINT5_ISR(void); // EV-B +interrupt void CAPINT6_ISR(void); // EV-B + +// Group 6 PIE Interrupt Service Routines: +interrupt void SPIRXINTA_ISR(void); // SPI +interrupt void SPITXINTA_ISR(void); // SPI +interrupt void MRINTA_ISR(void); // McBSP +interrupt void MXINTA_ISR(void); // McBSP + + +// Group 9 PIE Interrupt Service Routines: +interrupt void SCIRXINTA_ISR(void); // SCI-A +interrupt void SCITXINTA_ISR(void); // SCI-A +interrupt void SCIRXINTB_ISR(void); // SCI-B +interrupt void SCITXINTB_ISR(void); // SCI-B +interrupt void ECAN0INTA_ISR(void); // eCAN +interrupt void ECAN1INTA_ISR(void); // eCAN + + +// Catch-all for Reserved Locations For testing purposes: +interrupt void PIE_RESERVED(void); // Reserved for test +interrupt void rsvd_ISR(void); // for test + + +#ifdef __cplusplus +} +#endif /* extern "C" */ + +#endif // end of DSP281x_DEFAULT_ISR_H definition + diff --git a/c/protocan-boot/vendor/ti/f2812/common/include/DSP281x_Examples.h b/c/protocan-boot/vendor/ti/f2812/common/include/DSP281x_Examples.h new file mode 100644 index 0000000..4a8cd6a --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/common/include/DSP281x_Examples.h @@ -0,0 +1,88 @@ +// TI File $Revision: /main/3 $ +// Checkin $Date: April 25, 2007 11:04:51 $ +//########################################################################### +// +// FILE: DSP281x_Examples.h +// +// TITLE: DSP281x Device Definitions. +// +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + +#ifndef DSP281x_EXAMPLES_H +#define DSP281x_EXAMPLES_H + + +#ifdef __cplusplus +extern "C" { +#endif + + +/*----------------------------------------------------------------------------- + Specify the clock rate of the CPU (SYSCLKOUT) in nS. + + Take into account the input clock frequency and the PLL multiplier + selected in SysCtrl.c (0xA by default). + + Use one of the values provided, or define your own. + The trailing L is required tells the compiler to treat + the number as a 64-bit value. + + Only one statement should be uncommented. + + Example: CLKIN is a 30MHz crystal. + + In SysCtrl.c the user specified PLLCR = 0xA for a + 150Mhz CPU clock (SYSCLKOUT = 150MHz). + + In this case, the CPU_RATE will be 6.667L + Uncomment the line: #define CPU_RATE 6.667L +-----------------------------------------------------------------------------*/ +//#define CPU_RATE 6.667L // for a 150MHz CPU clock speed (SYSCLKOUT) +#define CPU_RATE 7.143L // for a 140MHz CPU clock speed (SYSCLKOUT) +//#define CPU_RATE 8.333L // for a 120MHz CPU clock speed (SYSCLKOUT) +//#define CPU_RATE 10.000L // for a 100MHz CPU clock speed (SYSCLKOUT) +//#define CPU_RATE 13.330L // for a 75MHz CPU clock speed (SYSCLKOUT) +//#define CPU_RATE 20.000L // for a 50MHz CPU clock speed (SYSCLKOUT) +//#define CPU_RATE 33.333L // for a 30MHz CPU clock speed (SYSCLKOUT) +//#define CPU_RATE 41.667L // for a 24MHz CPU clock speed (SYSCLKOUT) +//#define CPU_RATE 50.000L // for a 20MHz CPU clock speed (SYSCLKOUT) +//#define CPU_RATE 66.667L // for a 15MHz CPU clock speed (SYSCLKOUT) +//#define CPU_RATE 100.000L // for a 10MHz CPU clock speed (SYSCLKOUT) + +//---------------------------------------------------------------------------- + + + +//--------------------------------------------------------------------------- +// Include Example Header Files: +// + +#include "DSP281x_GlobalPrototypes.h" // Prototypes for global functions within the + // .c files. + +#include "DSP281x_SWPrioritizedIsrLevels.h" // Used for Software Prioritization of ISR's + + +// Include files not used with DSP/BIOS +#ifndef DSP28_BIOS +#include "DSP281x_DefaultISR.h" +#endif + + +// DO NOT MODIFY THIS LINE. +#define DELAY_US(A) DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_RATE) - 9.0L) / 5.0L) + + +#ifdef __cplusplus +} +#endif /* extern "C" */ + +#endif // end of DSP281x_EXAMPELS_H definition + + +//=========================================================================== +// No more. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f2812/common/include/DSP281x_GlobalPrototypes.h b/c/protocan-boot/vendor/ti/f2812/common/include/DSP281x_GlobalPrototypes.h new file mode 100644 index 0000000..65bfb6c --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/common/include/DSP281x_GlobalPrototypes.h @@ -0,0 +1,87 @@ +// TI File $Revision: /main/7 $ +// Checkin $Date: July 9, 2009 13:14:00 $ +//########################################################################### +// +// FILE: DSP281x_GlobalPrototypes.h +// +// TITLE: Global prototypes for DSP28 Examples +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + +#ifndef DSP281x_GLOBALPROTOTYPES_H +#define DSP281x_GLOBALPROTOTYPES_H + + +#ifdef __cplusplus +extern "C" { +#endif + +/*---- shared global function prototypes -----------------------------------*/ +extern void InitAdc(void); +extern void InitPeripherals(void); +extern void InitECan(void); +extern void InitEv(void); +extern void InitGpio(void); +extern void InitMcbsp(void); +extern void InitPieCtrl(void); +extern void InitPieVectTable(void); +extern void EnableInterrupts(void); +extern void DisableInterrupts(void); +extern void InitSci(void); +extern void InitSpi(void); +extern void InitSysCtrl(void); +extern void InitXintf(void); +extern void InitXIntrupt(void); +extern void InitPll(Uint16 val); +extern void InitPeripheralClocks(void); + +// McBSP functions +// DSP281x_Mcbsp.c +extern void InitMcbspGpio(void); +extern void delay_loop(void); +extern void InitMcbspa8bit(void); +extern void InitMcbspa12bit(void); +extern void InitMcbspa16bit(void); +extern void InitMcbspa20bit(void); +extern void InitMcbspa24bit(void); +extern void InitMcbspa32bit(void); + +// Watchdog functions +// DSP28_SysCtrl.c +extern void KickDog(void); +extern void DisableDog(void); +extern Uint16 CsmUnlock(void); + +// DSP28_DBGIER.asm +extern void SetDBGIER(Uint16 dbgier); + +// DSP281x_usDelay.asm +extern void DSP28x_usDelay(Uint32 Count); + + +// CAUTION +// This function MUST be executed out of RAM. Executing it +// out of OTP/Flash will yield unpredictable results +extern void InitFlash(void); + + +void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr); + + +//--------------------------------------------------------------------------- +// External symbols created by the linker cmd file +// DSP28 examples will use these to relocate code from one LOAD location +// in either Flash or XINTF to a different RUN location in internal +// RAM +extern Uint16 RamfuncsLoadStart; +extern Uint16 RamfuncsLoadEnd; +extern Uint16 RamfuncsRunStart; + +#ifdef __cplusplus +} +#endif /* extern "C" */ + +#endif // - end of DSP281x_GLOBALPROTOTYPES_H + diff --git a/c/protocan-boot/vendor/ti/f2812/common/include/DSP281x_SWPrioritizedIsrLevels.h b/c/protocan-boot/vendor/ti/f2812/common/include/DSP281x_SWPrioritizedIsrLevels.h new file mode 100644 index 0000000..7495566 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/common/include/DSP281x_SWPrioritizedIsrLevels.h @@ -0,0 +1,5881 @@ +// TI File $Revision: /main/2 $ +// Checkin $Date: April 28, 2005 15:22:36 $ +//########################################################################### +// +// FILE: DSP281x_SWPrioritizedIsrLevels.h +// +// TITLE: DSP28 Devices Software Prioritized Interrupt Service Routine +// Level definitions. +// +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + +#ifndef DSP281x_SW_PRIORITZIED_ISR_H +#define DSP281x_SW_PRIORITZIED_ISR_H + + +#ifdef __cplusplus +extern "C" { +#endif + + +//------------------------------------------------------------------------------- +// Interrupt Enable Register Allocation For F2810/12 Devices: +//------------------------------------------------------------------------------- +// Interrupts can be enabled/disabled using the CPU interrupt enable register +// (IER) and the PIE interrupt enable registers (PIIER1 to PIEIER12). The table +// below lists the allocation of the various interrupts to these registers: +// +//----------------------------------------------------------------------------------- +// CPU | PIEIER1 to PIEIER12 | +// IER | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | +// =====|=========|=========|=========|=========|=========|=========|=======|=======| +// INT1 |PDPINTA |PDPINTB | resvd | XINT1 | XINT2 |ADCINT | TINT0 |WAKEINT| +// | (EV-A) | (EV-B) | | | | | | | +// INT2 |CMP1INT |CMP2INT |CMP3INT |T1PINT |T1CINT |T1UFINT |T1OFINT| resvd | +// | (EV-A) | (EV-A) |(EV-A) |(EV-A) |(EV-A) |(EV-A) |(EV-A) | | +// INT3 |T2PINT |T2CINT |T2UFINT |T2OFINT |CAPINT1 |CAPINT2 |CAPINT3| resvd | +// | (EV-A) | (EV-A) |(EV-A) |(EV-A) |(EV-A) |(EV-A) |(EV-A) | | +// INT4 |CMP4INT |CMP5INT |CMP6INT |T3PINT |T3CINT |T3UFINT |T3OFINT| resvd | +// | (EV-B) | (EV-B) |(EV-B) |(EV-B) |(EV-B) |(EV-B) |(EV-B) | | +// INT5 |T4PINT |T4CINT |T4UFINT |T4OFINT |CAPINT4 |CAPINT5 |CAPINT6| resvd | +// | (EV-B) | (EV-B) |(EV-B) |(EV-B) |(EV-B) |(EV-B) |(EV-B) | | +// INT6 |SPIRXINTA|SPITXINTA| resvd | resvd | MRINTA | MXINTA | resvd | resvd | +// | (SPI-A) | (SPI-A) | | |(McBSP-A)|(McBSP-A)| | | +// INT7 | resvd | resvd | resvd | resvd | resvd | resvd | resvd | resvd | +// INT8 | resvd | resvd | resvd | resvd | resvd | resvd | resvd | resvd | +// INT9 |SCIRXINTA|SCITXINTA|SCIRXINTB|SCITXINTB|ECAN0INTA|ECAN1INTA| resvd | resvd | +// | (SCI-A) | (SCI-A) |(SCI-B) |(SCI-B) |(ECAN-A) |(ECAN-A) | | | +// INT10| resvd | resvd | resvd | resvd | resvd | resvd | resvd | resvd | +// INT11| resvd | resvd | resvd | resvd | resvd | resvd | resvd | resvd | +// INT12| resvd | resvd | resvd | resvd | resvd | resvd | resvd | resvd | +//------------------------------------------------------------------------------- +// INT13| INT13 +// INT14| INT14 +// INT15| DATALOG +// INT16| RTOSINT +//------------------------------------------------------------------------------- +// +//------------------------------------------------------------------------------- +// Set "Global" Interrupt Priority Level (IER register): +//------------------------------------------------------------------------------- +// The user must set the appropriate priority level for each of the CPU +// interrupts. This is termed as the "global" priority. The priority level +// must be a number between 1 (highest) to 16 (lowest). A value of 0 must +// be entered for reserved interrupts or interrupts that are not used. This +// will also reduce code size by not including ISR's that are not used. +// +// Note: The priority levels below are used to calculate the IER register +// interrupt masks MINT1 to MINT16. +// +// +// Note: The priority levels shown here may not make sense in a +// real application. This is for demonstration purposes only!!! +// +// The user should change these to values that make sense for +// their application. +// +// 0 = not used +// 1 = highest priority +// ... +// 16 = lowest priority +#define INT1PL 1 // Group1 Interrupts (PIEIER1) +#define INT2PL 4 // Group2 Interrupts (PIEIER2) +#define INT3PL 2 // Group3 Interrupts (PIEIER3) +#define INT4PL 4 // Group4 Interrupts (PIEIER4) +#define INT5PL 5 // Group5 Interrupts (PIEIER5) +#define INT6PL 3 // Group6 Interrupts (PIEIER6) +#define INT7PL 0 // reserved +#define INT8PL 0 // reserved +#define INT9PL 3 // Group9 Interrupts (PIEIER9) +#define INT10PL 0 // reserved +#define INT11PL 0 // reserved +#define INT12PL 0 // reserved +#define INT13PL 4 // XINT3 +#define INT14PL 4 // INT14 (TINT2) +#define INT15PL 4 // DATALOG +#define INT16PL 4 // RTOSINT + +//------------------------------------------------------------------------------- +// Set "Group" Interrupt Priority Level (PIEIER1 to PIEIER12 registers): +//------------------------------------------------------------------------------- +// The user must set the appropriate priority level for each of the PIE +// interrupts. This is termed as the "group" priority. The priority level +// must be a number between 1 (highest) to 8 (lowest). A value of 0 must +// be entered for reserved interrupts or interrupts that are not used. This +// will also reduce code size by not including ISR's that are not used: +// +// Note: The priority levels below are used to calculate the following +// PIEIER register interrupt masks: +// MG11 to MG18 +// MG21 to MG28 +// MG31 to MG38 +// MG41 to MG48 +// MG51 to MG58 +// MG61 to MG68 +// MG71 to MG78 +// MG81 to MG88 +// MG91 to MG98 +// MG101 to MG108 +// MG111 to MG118 +// MG121 to MG128 +// +// Note: The priority levels shown here may not make sense in a +// real application. This is for demonstration purposes only!!! +// +// The user should change these to values that make sense for +// their application. +// +// 0 = not used +// 1 = highest priority +// ... +// 8 = lowest priority +// +#define G11PL 7 // PDPINTA (EV-A) +#define G12PL 6 // PDPINTB (EV-B) +#define G13PL 0 // reserved +#define G14PL 1 // XINT1 (External) +#define G15PL 3 // XINT2 (External) +#define G16PL 2 // ADCINT (ADC) +#define G17PL 1 // TINT0 (CPU Timer 0) +#define G18PL 5 // WAKEINT (WD/LPM) + +#define G21PL 4 // CMP1INT (EV-A) +#define G22PL 3 // CMP2INT (EV-A) +#define G23PL 2 // CMP3INT (EV-A) +#define G24PL 1 // T1PINT (EV-A) +#define G25PL 5 // T1CINT (EV-A) +#define G26PL 6 // T1UFINT (EV-A) +#define G27PL 7 // T1OFINT (EV-A) +#define G28PL 0 // reserved + +#define G31PL 1 // T2PINT (EV-A) +#define G32PL 1 // T2CINT (EV-A) +#define G33PL 1 // T2UFINT (EV-A) +#define G34PL 2 // T2OFINT (EV-A) +#define G35PL 2 // CAPINT1 (EV-A) +#define G36PL 1 // CAPINT2 (EV-A) +#define G37PL 3 // CAPINT3 (EV-A) +#define G38PL 0 // reserved + +#define G41PL 2 // CMP4INT (EV-B) +#define G42PL 1 // CMP5INT (EV-B) +#define G43PL 3 // CMP6INT (EV-B) +#define G44PL 3 // T3PINT (EV-B) +#define G45PL 2 // T3CINT (EV-B) +#define G46PL 2 // T3UFINT (EV-B) +#define G47PL 1 // T3OFINT (EV-B) +#define G48PL 0 // reserved + +#define G51PL 1 // T4PINT (EV-B) +#define G52PL 7 // T4CINT (EV-B) +#define G53PL 2 // T4UFINT (EV-B) +#define G54PL 6 // T4OFINT (EV-B) +#define G55PL 5 // CAPINT4 (EV-B) +#define G56PL 6 // CAPINT5 (EV-B) +#define G57PL 7 // CAPINT6 (EV-B) +#define G58PL 0 // reserved + +#define G61PL 3 // SPIRXINTA (SPI-A) +#define G62PL 1 // SPITXINTA (SPI-A) +#define G63PL 0 // reserved +#define G64PL 0 // reserved +#define G65PL 2 // MRINTA (McBSP-A) +#define G66PL 1 // MXINTA (McBSP-A) +#define G67PL 0 // reserved +#define G68PL 0 // reserved + +#define G71PL 0 // reserved +#define G72PL 0 // reserved +#define G73PL 0 // reserved +#define G74PL 0 // reserved +#define G75PL 0 // reserved +#define G76PL 0 // reserved +#define G77PL 0 // reserved +#define G78PL 0 // reserved + +#define G81PL 0 // reserved +#define G82PL 0 // reserved +#define G83PL 0 // reserved +#define G84PL 0 // reserved +#define G85PL 0 // reserved +#define G86PL 0 // reserved +#define G87PL 0 // reserved +#define G88PL 0 // reserved + +#define G91PL 1 // SCIRXINTA (SCI-A) +#define G92PL 5 // SCITXINTA (SCI-A) +#define G93PL 3 // SCIRXINTB (SCI-B) +#define G94PL 4 // SCITXINTB (SCI-B) +#define G95PL 1 // ECAN0INTA (ECAN-A) +#define G96PL 1 // ECAN1INTA (ECAN-A) +#define G97PL 0 // reserved +#define G98PL 0 // reserved + +#define G101PL 0 // reserved +#define G102PL 0 // reserved +#define G103PL 0 // reserved +#define G104PL 0 // reserved +#define G105PL 0 // reserved +#define G106PL 0 // reserved +#define G107PL 0 // reserved +#define G108PL 0 // reserved + +#define G111PL 0 // reserved +#define G112PL 0 // reserved +#define G113PL 0 // reserved +#define G114PL 0 // reserved +#define G115PL 0 // reserved +#define G116PL 0 // reserved +#define G117PL 0 // reserved +#define G118PL 0 // reserved + +#define G121PL 0 // reserved +#define G122PL 0 // reserved +#define G123PL 0 // reserved +#define G124PL 0 // reserved +#define G125PL 0 // reserved +#define G126PL 0 // reserved +#define G127PL 0 // reserved +#define G128PL 0 // reserved + + +// There should be no need to modify code below this line +//------------------------------------------------------------------------------- +// Automatically generate IER interrupt masks MINT1 to MINT16: +// + +// Beginning of MINT1: +#if (INT1PL == 0) +#define MINT1_1PL ~(1 << 0) +#else +#define MINT1_1PL 0xFFFF +#endif + +#if (INT2PL >= INT1PL) || (INT2PL == 0) +#define MINT1_2PL ~(1 << 1) +#else +#define MINT1_2PL 0xFFFF +#endif + +#if (INT3PL >= INT1PL) || (INT3PL == 0) +#define MINT1_3PL ~(1 << 2) +#else +#define MINT1_3PL 0xFFFF +#endif + +#if (INT4PL >= INT1PL) || (INT4PL == 0) +#define MINT1_4PL ~(1 << 3) +#else +#define MINT1_4PL 0xFFFF +#endif + +#if (INT5PL >= INT1PL) || (INT5PL == 0) +#define MINT1_5PL ~(1 << 4) +#else +#define MINT1_5PL 0xFFFF +#endif + +#if (INT6PL >= INT1PL) || (INT6PL == 0) +#define MINT1_6PL ~(1 << 5) +#else +#define MINT1_6PL 0xFFFF +#endif + +#if (INT7PL >= INT1PL) || (INT7PL == 0) +#define MINT1_7PL ~(1 << 6) +#else +#define MINT1_7PL 0xFFFF +#endif + +#if (INT8PL >= INT1PL) || (INT8PL == 0) +#define MINT1_8PL ~(1 << 7) +#else +#define MINT1_8PL 0xFFFF +#endif + +#if (INT9PL >= INT1PL) || (INT9PL == 0) +#define MINT1_9PL ~(1 << 8) +#else +#define MINT1_9PL 0xFFFF +#endif + +#if (INT10PL >= INT1PL) || (INT10PL == 0) +#define MINT1_10PL ~(1 << 9) +#else +#define MINT1_10PL 0xFFFF +#endif + +#if (INT11PL >= INT1PL) || (INT11PL == 0) +#define MINT1_11PL ~(1 << 10) +#else +#define MINT1_11PL 0xFFFF +#endif + +#if (INT12PL >= INT1PL) || (INT12PL == 0) +#define MINT1_12PL ~(1 << 11) +#else +#define MINT1_12PL 0xFFFF +#endif + +#if (INT13PL >= INT1PL) || (INT13PL == 0) +#define MINT1_13PL ~(1 << 12) +#else +#define MINT1_13PL 0xFFFF +#endif + +#if (INT14PL >= INT1PL) || (INT14PL == 0) +#define MINT1_14PL ~(1 << 13) +#else +#define MINT1_14PL 0xFFFF +#endif + +#if (INT15PL >= INT1PL) || (INT15PL == 0) +#define MINT1_15PL ~(1 << 14) +#else +#define MINT1_15PL 0xFFFF +#endif + +#if (INT16PL >= INT1PL) || (INT16PL == 0) +#define MINT1_16PL ~(1 << 15) +#else +#define MINT1_16PL 0xFFFF +#endif + +#define MINT1 (MINT1_1PL & MINT1_2PL & MINT1_3PL & MINT1_4PL & \ + MINT1_5PL & MINT1_6PL & MINT1_7PL & MINT1_8PL & \ + MINT1_9PL & MINT1_10PL & MINT1_11PL & MINT1_12PL & \ + MINT1_13PL & MINT1_14PL & MINT1_15PL & MINT1_16PL) +// End Of MINT1. + +// Beginning of MINT2: +#if (INT1PL >= INT2PL) || (INT1PL == 0) +#define MINT2_1PL ~(1 << 0) +#else +#define MINT2_1PL 0xFFFF +#endif + +#if (INT2PL == 0) +#define MINT2_2PL ~(1 << 1) +#else +#define MINT2_2PL 0xFFFF +#endif + +#if (INT3PL >= INT2PL) || (INT3PL == 0) +#define MINT2_3PL ~(1 << 2) +#else +#define MINT2_3PL 0xFFFF +#endif + +#if (INT4PL >= INT2PL) || (INT4PL == 0) +#define MINT2_4PL ~(1 << 3) +#else +#define MINT2_4PL 0xFFFF +#endif + +#if (INT5PL >= INT2PL) || (INT5PL == 0) +#define MINT2_5PL ~(1 << 4) +#else +#define MINT2_5PL 0xFFFF +#endif + +#if (INT6PL >= INT2PL) || (INT6PL == 0) +#define MINT2_6PL ~(1 << 5) +#else +#define MINT2_6PL 0xFFFF +#endif + +#if (INT7PL >= INT2PL) || (INT7PL == 0) +#define MINT2_7PL ~(1 << 6) +#else +#define MINT2_7PL 0xFFFF +#endif + +#if (INT8PL >= INT2PL) || (INT8PL == 0) +#define MINT2_8PL ~(1 << 7) +#else +#define MINT2_8PL 0xFFFF +#endif + +#if (INT9PL >= INT2PL) || (INT9PL == 0) +#define MINT2_9PL ~(1 << 8) +#else +#define MINT2_9PL 0xFFFF +#endif + +#if (INT10PL >= INT2PL) || (INT10PL == 0) +#define MINT2_10PL ~(1 << 9) +#else +#define MINT2_10PL 0xFFFF +#endif + +#if (INT11PL >= INT2PL) || (INT11PL == 0) +#define MINT2_11PL ~(1 << 10) +#else +#define MINT2_11PL 0xFFFF +#endif + +#if (INT12PL >= INT2PL) || (INT12PL == 0) +#define MINT2_12PL ~(1 << 11) +#else +#define MINT2_12PL 0xFFFF +#endif + +#if (INT13PL >= INT2PL) || (INT13PL == 0) +#define MINT2_13PL ~(1 << 12) +#else +#define MINT2_13PL 0xFFFF +#endif + +#if (INT14PL >= INT2PL) || (INT14PL == 0) +#define MINT2_14PL ~(1 << 13) +#else +#define MINT2_14PL 0xFFFF +#endif + +#if (INT15PL >= INT2PL) || (INT15PL == 0) +#define MINT2_15PL ~(1 << 14) +#else +#define MINT2_15PL 0xFFFF +#endif + +#if (INT16PL >= INT2PL) || (INT16PL == 0) +#define MINT2_16PL ~(1 << 15) +#else +#define MINT2_16PL 0xFFFF +#endif + +#define MINT2 (MINT2_1PL & MINT2_2PL & MINT2_3PL & MINT2_4PL & \ + MINT2_5PL & MINT2_6PL & MINT2_7PL & MINT2_8PL & \ + MINT2_9PL & MINT2_10PL & MINT2_11PL & MINT2_12PL & \ + MINT2_13PL & MINT2_14PL & MINT2_15PL & MINT2_16PL) +// End Of MINT2. + +// Beginning of MINT3: +#if (INT1PL >= INT3PL) || (INT1PL == 0) +#define MINT3_1PL ~(1 << 0) +#else +#define MINT3_1PL 0xFFFF +#endif + +#if (INT2PL >= INT3PL) || (INT2PL == 0) +#define MINT3_2PL ~(1 << 1) +#else +#define MINT3_2PL 0xFFFF +#endif + +#if (INT3PL == 0) +#define MINT3_3PL ~(1 << 2) +#else +#define MINT3_3PL 0xFFFF +#endif + +#if (INT4PL >= INT3PL) || (INT4PL == 0) +#define MINT3_4PL ~(1 << 3) +#else +#define MINT3_4PL 0xFFFF +#endif + +#if (INT5PL >= INT3PL) || (INT5PL == 0) +#define MINT3_5PL ~(1 << 4) +#else +#define MINT3_5PL 0xFFFF +#endif + +#if (INT6PL >= INT3PL) || (INT6PL == 0) +#define MINT3_6PL ~(1 << 5) +#else +#define MINT3_6PL 0xFFFF +#endif + +#if (INT7PL >= INT3PL) || (INT7PL == 0) +#define MINT3_7PL ~(1 << 6) +#else +#define MINT3_7PL 0xFFFF +#endif + +#if (INT8PL >= INT3PL) || (INT8PL == 0) +#define MINT3_8PL ~(1 << 7) +#else +#define MINT3_8PL 0xFFFF +#endif + +#if (INT9PL >= INT3PL) || (INT9PL == 0) +#define MINT3_9PL ~(1 << 8) +#else +#define MINT3_9PL 0xFFFF +#endif + +#if (INT10PL >= INT3PL) || (INT10PL == 0) +#define MINT3_10PL ~(1 << 9) +#else +#define MINT3_10PL 0xFFFF +#endif + +#if (INT11PL >= INT3PL) || (INT11PL == 0) +#define MINT3_11PL ~(1 << 10) +#else +#define MINT3_11PL 0xFFFF +#endif + +#if (INT12PL >= INT3PL) || (INT12PL == 0) +#define MINT3_12PL ~(1 << 11) +#else +#define MINT3_12PL 0xFFFF +#endif + +#if (INT13PL >= INT3PL) || (INT13PL == 0) +#define MINT3_13PL ~(1 << 12) +#else +#define MINT3_13PL 0xFFFF +#endif + +#if (INT14PL >= INT3PL) || (INT14PL == 0) +#define MINT3_14PL ~(1 << 13) +#else +#define MINT3_14PL 0xFFFF +#endif + +#if (INT15PL >= INT3PL) || (INT15PL == 0) +#define MINT3_15PL ~(1 << 14) +#else +#define MINT3_15PL 0xFFFF +#endif + +#if (INT16PL >= INT3PL) || (INT16PL == 0) +#define MINT3_16PL ~(1 << 15) +#else +#define MINT3_16PL 0xFFFF +#endif + +#define MINT3 (MINT3_1PL & MINT3_2PL & MINT3_3PL & MINT3_4PL & \ + MINT3_5PL & MINT3_6PL & MINT3_7PL & MINT3_8PL & \ + MINT3_9PL & MINT3_10PL & MINT3_11PL & MINT3_12PL & \ + MINT3_13PL & MINT3_14PL & MINT3_15PL & MINT3_16PL) +// End Of MINT3. + +// Beginning of MINT4: +#if (INT1PL >= INT4PL) || (INT1PL == 0) +#define MINT4_1PL ~(1 << 0) +#else +#define MINT4_1PL 0xFFFF +#endif + +#if (INT2PL >= INT4PL) || (INT2PL == 0) +#define MINT4_2PL ~(1 << 1) +#else +#define MINT4_2PL 0xFFFF +#endif + +#if (INT3PL >= INT4PL) || (INT3PL == 0) +#define MINT4_3PL ~(1 << 2) +#else +#define MINT4_3PL 0xFFFF +#endif + +#if (INT4PL == 0) +#define MINT4_4PL ~(1 << 3) +#else +#define MINT4_4PL 0xFFFF +#endif + +#if (INT5PL >= INT4PL) || (INT5PL == 0) +#define MINT4_5PL ~(1 << 4) +#else +#define MINT4_5PL 0xFFFF +#endif + +#if (INT6PL >= INT4PL) || (INT6PL == 0) +#define MINT4_6PL ~(1 << 5) +#else +#define MINT4_6PL 0xFFFF +#endif + +#if (INT7PL >= INT4PL) || (INT7PL == 0) +#define MINT4_7PL ~(1 << 6) +#else +#define MINT4_7PL 0xFFFF +#endif + +#if (INT8PL >= INT4PL) || (INT8PL == 0) +#define MINT4_8PL ~(1 << 7) +#else +#define MINT4_8PL 0xFFFF +#endif + +#if (INT9PL >= INT4PL) || (INT9PL == 0) +#define MINT4_9PL ~(1 << 8) +#else +#define MINT4_9PL 0xFFFF +#endif + +#if (INT10PL >= INT4PL) || (INT10PL == 0) +#define MINT4_10PL ~(1 << 9) +#else +#define MINT4_10PL 0xFFFF +#endif + +#if (INT11PL >= INT4PL) || (INT11PL == 0) +#define MINT4_11PL ~(1 << 10) +#else +#define MINT4_11PL 0xFFFF +#endif + +#if (INT12PL >= INT4PL) || (INT12PL == 0) +#define MINT4_12PL ~(1 << 11) +#else +#define MINT4_12PL 0xFFFF +#endif + +#if (INT13PL >= INT4PL) || (INT13PL == 0) +#define MINT4_13PL ~(1 << 12) +#else +#define MINT4_13PL 0xFFFF +#endif + +#if (INT14PL >= INT4PL) || (INT14PL == 0) +#define MINT4_14PL ~(1 << 13) +#else +#define MINT4_14PL 0xFFFF +#endif + +#if (INT15PL >= INT4PL) || (INT15PL == 0) +#define MINT4_15PL ~(1 << 14) +#else +#define MINT4_15PL 0xFFFF +#endif + +#if (INT16PL >= INT4PL) || (INT16PL == 0) +#define MINT4_16PL ~(1 << 15) +#else +#define MINT4_16PL 0xFFFF +#endif + +#define MINT4 (MINT4_1PL & MINT4_2PL & MINT4_3PL & MINT4_4PL & \ + MINT4_5PL & MINT4_6PL & MINT4_7PL & MINT4_8PL & \ + MINT4_9PL & MINT4_10PL & MINT4_11PL & MINT4_12PL & \ + MINT4_13PL & MINT4_14PL & MINT4_15PL & MINT4_16PL) +// End Of MINT4. + +// Beginning of MINT5: +#if (INT1PL >= INT5PL) || (INT1PL == 0) +#define MINT5_1PL ~(1 << 0) +#else +#define MINT5_1PL 0xFFFF +#endif + +#if (INT2PL >= INT5PL) || (INT2PL == 0) +#define MINT5_2PL ~(1 << 1) +#else +#define MINT5_2PL 0xFFFF +#endif + +#if (INT3PL >= INT5PL) || (INT3PL == 0) +#define MINT5_3PL ~(1 << 2) +#else +#define MINT5_3PL 0xFFFF +#endif + +#if (INT4PL >= INT5PL) || (INT4PL == 0) +#define MINT5_4PL ~(1 << 3) +#else +#define MINT5_4PL 0xFFFF +#endif + +#if (INT5PL == 0) +#define MINT5_5PL ~(1 << 4) +#else +#define MINT5_5PL 0xFFFF +#endif + +#if (INT6PL >= INT5PL) || (INT6PL == 0) +#define MINT5_6PL ~(1 << 5) +#else +#define MINT5_6PL 0xFFFF +#endif + +#if (INT7PL >= INT5PL) || (INT7PL == 0) +#define MINT5_7PL ~(1 << 6) +#else +#define MINT5_7PL 0xFFFF +#endif + +#if (INT8PL >= INT5PL) || (INT8PL == 0) +#define MINT5_8PL ~(1 << 7) +#else +#define MINT5_8PL 0xFFFF +#endif + +#if (INT9PL >= INT5PL) || (INT9PL == 0) +#define MINT5_9PL ~(1 << 8) +#else +#define MINT5_9PL 0xFFFF +#endif + +#if (INT10PL >= INT5PL) || (INT10PL == 0) +#define MINT5_10PL ~(1 << 9) +#else +#define MINT5_10PL 0xFFFF +#endif + +#if (INT11PL >= INT5PL) || (INT11PL == 0) +#define MINT5_11PL ~(1 << 10) +#else +#define MINT5_11PL 0xFFFF +#endif + +#if (INT12PL >= INT5PL) || (INT12PL == 0) +#define MINT5_12PL ~(1 << 11) +#else +#define MINT5_12PL 0xFFFF +#endif + +#if (INT13PL >= INT5PL) || (INT13PL == 0) +#define MINT5_13PL ~(1 << 12) +#else +#define MINT5_13PL 0xFFFF +#endif + +#if (INT14PL >= INT5PL) || (INT14PL == 0) +#define MINT5_14PL ~(1 << 13) +#else +#define MINT5_14PL 0xFFFF +#endif + +#if (INT15PL >= INT5PL) || (INT15PL == 0) +#define MINT5_15PL ~(1 << 14) +#else +#define MINT5_15PL 0xFFFF +#endif + +#if (INT16PL >= INT5PL) || (INT16PL == 0) +#define MINT5_16PL ~(1 << 15) +#else +#define MINT5_16PL 0xFFFF +#endif + +#define MINT5 (MINT5_1PL & MINT5_2PL & MINT5_3PL & MINT5_4PL & \ + MINT5_5PL & MINT5_6PL & MINT5_7PL & MINT5_8PL & \ + MINT5_9PL & MINT5_10PL & MINT5_11PL & MINT5_12PL & \ + MINT5_13PL & MINT5_14PL & MINT5_15PL & MINT5_16PL) +// End Of MINT5. + +// Beginning of MINT6: +#if (INT1PL >= INT6PL) || (INT1PL == 0) +#define MINT6_1PL ~(1 << 0) +#else +#define MINT6_1PL 0xFFFF +#endif + +#if (INT2PL >= INT6PL) || (INT2PL == 0) +#define MINT6_2PL ~(1 << 1) +#else +#define MINT6_2PL 0xFFFF +#endif + +#if (INT3PL >= INT6PL) || (INT3PL == 0) +#define MINT6_3PL ~(1 << 2) +#else +#define MINT6_3PL 0xFFFF +#endif + +#if (INT4PL >= INT6PL) || (INT4PL == 0) +#define MINT6_4PL ~(1 << 3) +#else +#define MINT6_4PL 0xFFFF +#endif + +#if (INT5PL >= INT6PL) || (INT5PL == 0) +#define MINT6_5PL ~(1 << 4) +#else +#define MINT6_5PL 0xFFFF +#endif + +#if (INT6PL == 0) +#define MINT6_6PL ~(1 << 5) +#else +#define MINT6_6PL 0xFFFF +#endif + +#if (INT7PL >= INT6PL) || (INT7PL == 0) +#define MINT6_7PL ~(1 << 6) +#else +#define MINT6_7PL 0xFFFF +#endif + +#if (INT8PL >= INT6PL) || (INT8PL == 0) +#define MINT6_8PL ~(1 << 7) +#else +#define MINT6_8PL 0xFFFF +#endif + +#if (INT9PL >= INT6PL) || (INT9PL == 0) +#define MINT6_9PL ~(1 << 8) +#else +#define MINT6_9PL 0xFFFF +#endif + +#if (INT10PL >= INT6PL) || (INT10PL == 0) +#define MINT6_10PL ~(1 << 9) +#else +#define MINT6_10PL 0xFFFF +#endif + +#if (INT11PL >= INT6PL) || (INT11PL == 0) +#define MINT6_11PL ~(1 << 10) +#else +#define MINT6_11PL 0xFFFF +#endif + +#if (INT12PL >= INT6PL) || (INT12PL == 0) +#define MINT6_12PL ~(1 << 11) +#else +#define MINT6_12PL 0xFFFF +#endif + +#if (INT13PL >= INT6PL) || (INT13PL == 0) +#define MINT6_13PL ~(1 << 12) +#else +#define MINT6_13PL 0xFFFF +#endif + +#if (INT14PL >= INT6PL) || (INT14PL == 0) +#define MINT6_14PL ~(1 << 13) +#else +#define MINT6_14PL 0xFFFF +#endif + +#if (INT15PL >= INT6PL) || (INT15PL == 0) +#define MINT6_15PL ~(1 << 14) +#else +#define MINT6_15PL 0xFFFF +#endif + +#if (INT16PL >= INT6PL) || (INT16PL == 0) +#define MINT6_16PL ~(1 << 15) +#else +#define MINT6_16PL 0xFFFF +#endif + +#define MINT6 (MINT6_1PL & MINT6_2PL & MINT6_3PL & MINT6_4PL & \ + MINT6_5PL & MINT6_6PL & MINT6_7PL & MINT6_8PL & \ + MINT6_9PL & MINT6_10PL & MINT6_11PL & MINT6_12PL & \ + MINT6_13PL & MINT6_14PL & MINT6_15PL & MINT6_16PL) +// End Of MINT6. + +// Beginning of MINT7: +#if (INT1PL >= INT7PL) || (INT1PL == 0) +#define MINT7_1PL ~(1 << 0) +#else +#define MINT7_1PL 0xFFFF +#endif + +#if (INT2PL >= INT7PL) || (INT2PL == 0) +#define MINT7_2PL ~(1 << 1) +#else +#define MINT7_2PL 0xFFFF +#endif + +#if (INT3PL >= INT7PL) || (INT3PL == 0) +#define MINT7_3PL ~(1 << 2) +#else +#define MINT7_3PL 0xFFFF +#endif + +#if (INT4PL >= INT7PL) || (INT4PL == 0) +#define MINT7_4PL ~(1 << 3) +#else +#define MINT7_4PL 0xFFFF +#endif + +#if (INT5PL >= INT7PL) || (INT5PL == 0) +#define MINT7_5PL ~(1 << 4) +#else +#define MINT7_5PL 0xFFFF +#endif + +#if (INT6PL >= INT7PL) || (INT6PL == 0) +#define MINT7_6PL ~(1 << 5) +#else +#define MINT7_6PL 0xFFFF +#endif + +#if (INT7PL == 0) +#define MINT7_7PL ~(1 << 6) +#else +#define MINT7_7PL 0xFFFF +#endif + +#if (INT8PL >= INT7PL) || (INT8PL == 0) +#define MINT7_8PL ~(1 << 7) +#else +#define MINT7_8PL 0xFFFF +#endif + +#if (INT9PL >= INT7PL) || (INT9PL == 0) +#define MINT7_9PL ~(1 << 8) +#else +#define MINT7_9PL 0xFFFF +#endif + +#if (INT10PL >= INT7PL) || (INT10PL == 0) +#define MINT7_10PL ~(1 << 9) +#else +#define MINT7_10PL 0xFFFF +#endif + +#if (INT11PL >= INT7PL) || (INT11PL == 0) +#define MINT7_11PL ~(1 << 10) +#else +#define MINT7_11PL 0xFFFF +#endif + +#if (INT12PL >= INT7PL) || (INT12PL == 0) +#define MINT7_12PL ~(1 << 11) +#else +#define MINT7_12PL 0xFFFF +#endif + +#if (INT13PL >= INT7PL) || (INT13PL == 0) +#define MINT7_13PL ~(1 << 12) +#else +#define MINT7_13PL 0xFFFF +#endif + +#if (INT14PL >= INT7PL) || (INT14PL == 0) +#define MINT7_14PL ~(1 << 13) +#else +#define MINT7_14PL 0xFFFF +#endif + +#if (INT15PL >= INT7PL) || (INT15PL == 0) +#define MINT7_15PL ~(1 << 14) +#else +#define MINT7_15PL 0xFFFF +#endif + +#if (INT16PL >= INT7PL) || (INT16PL == 0) +#define MINT7_16PL ~(1 << 15) +#else +#define MINT7_16PL 0xFFFF +#endif + +#define MINT7 (MINT7_1PL & MINT7_2PL & MINT7_3PL & MINT7_4PL & \ + MINT7_5PL & MINT7_6PL & MINT7_7PL & MINT7_8PL & \ + MINT7_9PL & MINT7_10PL & MINT7_11PL & MINT7_12PL & \ + MINT7_13PL & MINT7_14PL & MINT7_15PL & MINT7_16PL) +// End Of MINT7. + +// Beginning of MINT8: +#if (INT1PL >= INT8PL) || (INT1PL == 0) +#define MINT8_1PL ~(1 << 0) +#else +#define MINT8_1PL 0xFFFF +#endif + +#if (INT2PL >= INT8PL) || (INT2PL == 0) +#define MINT8_2PL ~(1 << 1) +#else +#define MINT8_2PL 0xFFFF +#endif + +#if (INT3PL >= INT8PL) || (INT3PL == 0) +#define MINT8_3PL ~(1 << 2) +#else +#define MINT8_3PL 0xFFFF +#endif + +#if (INT4PL >= INT8PL) || (INT4PL == 0) +#define MINT8_4PL ~(1 << 3) +#else +#define MINT8_4PL 0xFFFF +#endif + +#if (INT5PL >= INT8PL) || (INT5PL == 0) +#define MINT8_5PL ~(1 << 4) +#else +#define MINT8_5PL 0xFFFF +#endif + +#if (INT6PL >= INT8PL) || (INT6PL == 0) +#define MINT8_6PL ~(1 << 5) +#else +#define MINT8_6PL 0xFFFF +#endif + +#if (INT7PL >= INT8PL) || (INT7PL == 0) +#define MINT8_7PL ~(1 << 6) +#else +#define MINT8_7PL 0xFFFF +#endif + +#if (INT8PL == 0) +#define MINT8_8PL ~(1 << 7) +#else +#define MINT8_8PL 0xFFFF +#endif + +#if (INT9PL >= INT8PL) || (INT9PL == 0) +#define MINT8_9PL ~(1 << 8) +#else +#define MINT8_9PL 0xFFFF +#endif + +#if (INT10PL >= INT8PL) || (INT10PL == 0) +#define MINT8_10PL ~(1 << 9) +#else +#define MINT8_10PL 0xFFFF +#endif + +#if (INT11PL >= INT8PL) || (INT11PL == 0) +#define MINT8_11PL ~(1 << 10) +#else +#define MINT8_11PL 0xFFFF +#endif + +#if (INT12PL >= INT8PL) || (INT12PL == 0) +#define MINT8_12PL ~(1 << 11) +#else +#define MINT8_12PL 0xFFFF +#endif + +#if (INT13PL >= INT8PL) || (INT13PL == 0) +#define MINT8_13PL ~(1 << 12) +#else +#define MINT8_13PL 0xFFFF +#endif + +#if (INT14PL >= INT8PL) || (INT14PL == 0) +#define MINT8_14PL ~(1 << 13) +#else +#define MINT8_14PL 0xFFFF +#endif + +#if (INT15PL >= INT8PL) || (INT15PL == 0) +#define MINT8_15PL ~(1 << 14) +#else +#define MINT8_15PL 0xFFFF +#endif + +#if (INT16PL >= INT8PL) || (INT16PL == 0) +#define MINT8_16PL ~(1 << 15) +#else +#define MINT8_16PL 0xFFFF +#endif + +#define MINT8 (MINT8_1PL & MINT8_2PL & MINT8_3PL & MINT8_4PL & \ + MINT8_5PL & MINT8_6PL & MINT8_7PL & MINT8_8PL & \ + MINT8_9PL & MINT8_10PL & MINT8_11PL & MINT8_12PL & \ + MINT8_13PL & MINT8_14PL & MINT8_15PL & MINT8_16PL) +// End Of MINT8. + +// Beginning of MINT9: +#if (INT1PL >= INT9PL) || (INT1PL == 0) +#define MINT9_1PL ~(1 << 0) +#else +#define MINT9_1PL 0xFFFF +#endif + +#if (INT2PL >= INT9PL) || (INT2PL == 0) +#define MINT9_2PL ~(1 << 1) +#else +#define MINT9_2PL 0xFFFF +#endif + +#if (INT3PL >= INT9PL) || (INT3PL == 0) +#define MINT9_3PL ~(1 << 2) +#else +#define MINT9_3PL 0xFFFF +#endif + +#if (INT4PL >= INT9PL) || (INT4PL == 0) +#define MINT9_4PL ~(1 << 3) +#else +#define MINT9_4PL 0xFFFF +#endif + +#if (INT5PL >= INT9PL) || (INT5PL == 0) +#define MINT9_5PL ~(1 << 4) +#else +#define MINT9_5PL 0xFFFF +#endif + +#if (INT6PL >= INT9PL) || (INT6PL == 0) +#define MINT9_6PL ~(1 << 5) +#else +#define MINT9_6PL 0xFFFF +#endif + +#if (INT7PL >= INT9PL) || (INT7PL == 0) +#define MINT9_7PL ~(1 << 6) +#else +#define MINT9_7PL 0xFFFF +#endif + +#if (INT8PL >= INT9PL) || (INT8PL == 0) +#define MINT9_8PL ~(1 << 7) +#else +#define MINT9_8PL 0xFFFF +#endif + +#if (INT9PL == 0) +#define MINT9_9PL ~(1 << 8) +#else +#define MINT9_9PL 0xFFFF +#endif + +#if (INT10PL >= INT9PL) || (INT10PL == 0) +#define MINT9_10PL ~(1 << 9) +#else +#define MINT9_10PL 0xFFFF +#endif + +#if (INT11PL >= INT9PL) || (INT11PL == 0) +#define MINT9_11PL ~(1 << 10) +#else +#define MINT9_11PL 0xFFFF +#endif + +#if (INT12PL >= INT9PL) || (INT12PL == 0) +#define MINT9_12PL ~(1 << 11) +#else +#define MINT9_12PL 0xFFFF +#endif + +#if (INT13PL >= INT9PL) || (INT13PL == 0) +#define MINT9_13PL ~(1 << 12) +#else +#define MINT9_13PL 0xFFFF +#endif + +#if (INT14PL >= INT9PL) || (INT14PL == 0) +#define MINT9_14PL ~(1 << 13) +#else +#define MINT9_14PL 0xFFFF +#endif + +#if (INT15PL >= INT9PL) || (INT15PL == 0) +#define MINT9_15PL ~(1 << 14) +#else +#define MINT9_15PL 0xFFFF +#endif + +#if (INT16PL >= INT9PL) || (INT16PL == 0) +#define MINT9_16PL ~(1 << 15) +#else +#define MINT9_16PL 0xFFFF +#endif + +#define MINT9 (MINT9_1PL & MINT9_2PL & MINT9_3PL & MINT9_4PL & \ + MINT9_5PL & MINT9_6PL & MINT9_7PL & MINT9_8PL & \ + MINT9_9PL & MINT9_10PL & MINT9_11PL & MINT9_12PL & \ + MINT9_13PL & MINT9_14PL & MINT9_15PL & MINT9_16PL) +// End Of MINT9. + +// Beginning of MINT10: +#if (INT1PL >= INT10PL) || (INT1PL == 0) +#define MINT10_1PL ~(1 << 0) +#else +#define MINT10_1PL 0xFFFF +#endif + +#if (INT2PL >= INT10PL) || (INT2PL == 0) +#define MINT10_2PL ~(1 << 1) +#else +#define MINT10_2PL 0xFFFF +#endif + +#if (INT3PL >= INT10PL) || (INT3PL == 0) +#define MINT10_3PL ~(1 << 2) +#else +#define MINT10_3PL 0xFFFF +#endif + +#if (INT4PL >= INT10PL) || (INT4PL == 0) +#define MINT10_4PL ~(1 << 3) +#else +#define MINT10_4PL 0xFFFF +#endif + +#if (INT5PL >= INT10PL) || (INT5PL == 0) +#define MINT10_5PL ~(1 << 4) +#else +#define MINT10_5PL 0xFFFF +#endif + +#if (INT6PL >= INT10PL) || (INT6PL == 0) +#define MINT10_6PL ~(1 << 5) +#else +#define MINT10_6PL 0xFFFF +#endif + +#if (INT7PL >= INT10PL) || (INT7PL == 0) +#define MINT10_7PL ~(1 << 6) +#else +#define MINT10_7PL 0xFFFF +#endif + +#if (INT8PL >= INT10PL) || (INT8PL == 0) +#define MINT10_8PL ~(1 << 7) +#else +#define MINT10_8PL 0xFFFF +#endif + +#if (INT9PL >= INT10PL) || (INT9PL == 0) +#define MINT10_9PL ~(1 << 8) +#else +#define MINT10_9PL 0xFFFF +#endif + +#if (INT10PL == 0) +#define MINT10_10PL ~(1 << 9) +#else +#define MINT10_10PL 0xFFFF +#endif + +#if (INT11PL >= INT10PL) || (INT11PL == 0) +#define MINT10_11PL ~(1 << 10) +#else +#define MINT10_11PL 0xFFFF +#endif + +#if (INT12PL >= INT10PL) || (INT12PL == 0) +#define MINT10_12PL ~(1 << 11) +#else +#define MINT10_12PL 0xFFFF +#endif + +#if (INT13PL >= INT10PL) || (INT13PL == 0) +#define MINT10_13PL ~(1 << 12) +#else +#define MINT10_13PL 0xFFFF +#endif + +#if (INT14PL >= INT10PL) || (INT14PL == 0) +#define MINT10_14PL ~(1 << 13) +#else +#define MINT10_14PL 0xFFFF +#endif + +#if (INT15PL >= INT10PL) || (INT15PL == 0) +#define MINT10_15PL ~(1 << 14) +#else +#define MINT10_15PL 0xFFFF +#endif + +#if (INT16PL >= INT10PL) || (INT16PL == 0) +#define MINT10_16PL ~(1 << 15) +#else +#define MINT10_16PL 0xFFFF +#endif + +#define MINT10 (MINT10_1PL & MINT10_2PL & MINT10_3PL & MINT10_4PL & \ + MINT10_5PL & MINT10_6PL & MINT10_7PL & MINT10_8PL & \ + MINT10_9PL & MINT10_10PL & MINT10_11PL & MINT10_12PL & \ + MINT10_13PL & MINT10_14PL & MINT10_15PL & MINT10_16PL) +// End Of MINT10. + +// Beginning of MINT11: +#if (INT1PL >= INT11PL) || (INT1PL == 0) +#define MINT11_1PL ~(1 << 0) +#else +#define MINT11_1PL 0xFFFF +#endif + +#if (INT2PL >= INT11PL) || (INT2PL == 0) +#define MINT11_2PL ~(1 << 1) +#else +#define MINT11_2PL 0xFFFF +#endif + +#if (INT3PL >= INT11PL) || (INT3PL == 0) +#define MINT11_3PL ~(1 << 2) +#else +#define MINT11_3PL 0xFFFF +#endif + +#if (INT4PL >= INT11PL) || (INT4PL == 0) +#define MINT11_4PL ~(1 << 3) +#else +#define MINT11_4PL 0xFFFF +#endif + +#if (INT5PL >= INT11PL) || (INT5PL == 0) +#define MINT11_5PL ~(1 << 4) +#else +#define MINT11_5PL 0xFFFF +#endif + +#if (INT6PL >= INT11PL) || (INT6PL == 0) +#define MINT11_6PL ~(1 << 5) +#else +#define MINT11_6PL 0xFFFF +#endif + +#if (INT7PL >= INT11PL) || (INT7PL == 0) +#define MINT11_7PL ~(1 << 6) +#else +#define MINT11_7PL 0xFFFF +#endif + +#if (INT8PL >= INT11PL) || (INT8PL == 0) +#define MINT11_8PL ~(1 << 7) +#else +#define MINT11_8PL 0xFFFF +#endif + +#if (INT9PL >= INT11PL) || (INT9PL == 0) +#define MINT11_9PL ~(1 << 8) +#else +#define MINT11_9PL 0xFFFF +#endif + +#if (INT10PL >= INT11PL) || (INT10PL == 0) +#define MINT11_10PL ~(1 << 9) +#else +#define MINT11_10PL 0xFFFF +#endif + +#if (INT11PL == 0) +#define MINT11_11PL ~(1 << 10) +#else +#define MINT11_11PL 0xFFFF +#endif + +#if (INT12PL >= INT11PL) || (INT12PL == 0) +#define MINT11_12PL ~(1 << 11) +#else +#define MINT11_12PL 0xFFFF +#endif + +#if (INT13PL >= INT11PL) || (INT13PL == 0) +#define MINT11_13PL ~(1 << 12) +#else +#define MINT11_13PL 0xFFFF +#endif + +#if (INT14PL >= INT11PL) || (INT14PL == 0) +#define MINT11_14PL ~(1 << 13) +#else +#define MINT11_14PL 0xFFFF +#endif + +#if (INT15PL >= INT11PL) || (INT15PL == 0) +#define MINT11_15PL ~(1 << 14) +#else +#define MINT11_15PL 0xFFFF +#endif + +#if (INT16PL >= INT11PL) || (INT16PL == 0) +#define MINT11_16PL ~(1 << 15) +#else +#define MINT11_16PL 0xFFFF +#endif + +#define MINT11 (MINT11_1PL & MINT11_2PL & MINT11_3PL & MINT11_4PL & \ + MINT11_5PL & MINT11_6PL & MINT11_7PL & MINT11_8PL & \ + MINT11_9PL & MINT11_10PL & MINT11_11PL & MINT11_12PL & \ + MINT11_13PL & MINT11_14PL & MINT11_15PL & MINT11_16PL) +// End Of MINT11. + +// Beginning of MINT12: +#if (INT1PL >= INT12PL) || (INT1PL == 0) +#define MINT12_1PL ~(1 << 0) +#else +#define MINT12_1PL 0xFFFF +#endif + +#if (INT2PL >= INT12PL) || (INT2PL == 0) +#define MINT12_2PL ~(1 << 1) +#else +#define MINT12_2PL 0xFFFF +#endif + +#if (INT3PL >= INT12PL) || (INT3PL == 0) +#define MINT12_3PL ~(1 << 2) +#else +#define MINT12_3PL 0xFFFF +#endif + +#if (INT4PL >= INT12PL) || (INT4PL == 0) +#define MINT12_4PL ~(1 << 3) +#else +#define MINT12_4PL 0xFFFF +#endif + +#if (INT5PL >= INT12PL) || (INT5PL == 0) +#define MINT12_5PL ~(1 << 4) +#else +#define MINT12_5PL 0xFFFF +#endif + +#if (INT6PL >= INT12PL) || (INT6PL == 0) +#define MINT12_6PL ~(1 << 5) +#else +#define MINT12_6PL 0xFFFF +#endif + +#if (INT7PL >= INT12PL) || (INT7PL == 0) +#define MINT12_7PL ~(1 << 6) +#else +#define MINT12_7PL 0xFFFF +#endif + +#if (INT8PL >= INT12PL) || (INT8PL == 0) +#define MINT12_8PL ~(1 << 7) +#else +#define MINT12_8PL 0xFFFF +#endif + +#if (INT9PL >= INT12PL) || (INT9PL == 0) +#define MINT12_9PL ~(1 << 8) +#else +#define MINT12_9PL 0xFFFF +#endif + +#if (INT10PL >= INT12PL) || (INT10PL == 0) +#define MINT12_10PL ~(1 << 9) +#else +#define MINT12_10PL 0xFFFF +#endif + +#if (INT11PL >= INT12PL) || (INT11PL == 0) +#define MINT12_11PL ~(1 << 10) +#else +#define MINT12_11PL 0xFFFF +#endif + +#if (INT12PL == 0) +#define MINT12_12PL ~(1 << 11) +#else +#define MINT12_12PL 0xFFFF +#endif + +#if (INT13PL >= INT12PL) || (INT13PL == 0) +#define MINT12_13PL ~(1 << 12) +#else +#define MINT12_13PL 0xFFFF +#endif + +#if (INT14PL >= INT12PL) || (INT14PL == 0) +#define MINT12_14PL ~(1 << 13) +#else +#define MINT12_14PL 0xFFFF +#endif + +#if (INT15PL >= INT12PL) || (INT15PL == 0) +#define MINT12_15PL ~(1 << 14) +#else +#define MINT12_15PL 0xFFFF +#endif + +#if (INT16PL >= INT12PL) || (INT16PL == 0) +#define MINT12_16PL ~(1 << 15) +#else +#define MINT12_16PL 0xFFFF +#endif + +#define MINT12 (MINT12_1PL & MINT12_2PL & MINT12_3PL & MINT12_4PL & \ + MINT12_5PL & MINT12_6PL & MINT12_7PL & MINT12_8PL & \ + MINT12_9PL & MINT12_10PL & MINT12_11PL & MINT12_12PL & \ + MINT12_13PL & MINT12_14PL & MINT12_15PL & MINT12_16PL) +// End Of MINT12. + +// Beginning of MINT13: +#if (INT1PL >= INT13PL) || (INT1PL == 0) +#define MINT13_1PL ~(1 << 0) +#else +#define MINT13_1PL 0xFFFF +#endif + +#if (INT2PL >= INT13PL) || (INT2PL == 0) +#define MINT13_2PL ~(1 << 1) +#else +#define MINT13_2PL 0xFFFF +#endif + +#if (INT3PL >= INT13PL) || (INT3PL == 0) +#define MINT13_3PL ~(1 << 2) +#else +#define MINT13_3PL 0xFFFF +#endif + +#if (INT4PL >= INT13PL) || (INT4PL == 0) +#define MINT13_4PL ~(1 << 3) +#else +#define MINT13_4PL 0xFFFF +#endif + +#if (INT5PL >= INT13PL) || (INT5PL == 0) +#define MINT13_5PL ~(1 << 4) +#else +#define MINT13_5PL 0xFFFF +#endif + +#if (INT6PL >= INT13PL) || (INT6PL == 0) +#define MINT13_6PL ~(1 << 5) +#else +#define MINT13_6PL 0xFFFF +#endif + +#if (INT7PL >= INT13PL) || (INT7PL == 0) +#define MINT13_7PL ~(1 << 6) +#else +#define MINT13_7PL 0xFFFF +#endif + +#if (INT8PL >= INT13PL) || (INT8PL == 0) +#define MINT13_8PL ~(1 << 7) +#else +#define MINT13_8PL 0xFFFF +#endif + +#if (INT9PL >= INT13PL) || (INT9PL == 0) +#define MINT13_9PL ~(1 << 8) +#else +#define MINT13_9PL 0xFFFF +#endif + +#if (INT10PL >= INT13PL) || (INT10PL == 0) +#define MINT13_10PL ~(1 << 9) +#else +#define MINT13_10PL 0xFFFF +#endif + +#if (INT11PL >= INT13PL) || (INT11PL == 0) +#define MINT13_11PL ~(1 << 10) +#else +#define MINT13_11PL 0xFFFF +#endif + +#define MINT13_12PL ~(1 << 11) + +#if (INT13PL == 0) +#define MINT13_13PL ~(1 << 12) +#else +#define MINT13_13PL 0xFFFF +#endif + +#if (INT14PL >= INT13PL) || (INT14PL == 0) +#define MINT13_14PL ~(1 << 13) +#else +#define MINT13_14PL 0xFFFF +#endif + +#if (INT15PL >= INT13PL) || (INT15PL == 0) +#define MINT13_15PL ~(1 << 14) +#else +#define MINT13_15PL 0xFFFF +#endif + +#if (INT16PL >= INT13PL) || (INT16PL == 0) +#define MINT13_16PL ~(1 << 15) +#else +#define MINT13_16PL 0xFFFF +#endif + +#define MINT13 (MINT13_1PL & MINT13_2PL & MINT13_3PL & MINT13_4PL & \ + MINT13_5PL & MINT13_6PL & MINT13_7PL & MINT13_8PL & \ + MINT13_9PL & MINT13_10PL & MINT13_11PL & MINT13_12PL & \ + MINT13_13PL & MINT13_14PL & MINT13_15PL & MINT13_16PL) +// End Of MINT13. + +// Beginning of MINT14: +#if (INT1PL >= INT14PL) || (INT1PL == 0) +#define MINT14_1PL ~(1 << 0) +#else +#define MINT14_1PL 0xFFFF +#endif + +#if (INT2PL >= INT14PL) || (INT2PL == 0) +#define MINT14_2PL ~(1 << 1) +#else +#define MINT14_2PL 0xFFFF +#endif + +#if (INT3PL >= INT14PL) || (INT3PL == 0) +#define MINT14_3PL ~(1 << 2) +#else +#define MINT14_3PL 0xFFFF +#endif + +#if (INT4PL >= INT14PL) || (INT4PL == 0) +#define MINT14_4PL ~(1 << 3) +#else +#define MINT14_4PL 0xFFFF +#endif + +#if (INT5PL >= INT14PL) || (INT5PL == 0) +#define MINT14_5PL ~(1 << 4) +#else +#define MINT14_5PL 0xFFFF +#endif + +#if (INT6PL >= INT14PL) || (INT6PL == 0) +#define MINT14_6PL ~(1 << 5) +#else +#define MINT14_6PL 0xFFFF +#endif + +#if (INT7PL >= INT14PL) || (INT7PL == 0) +#define MINT14_7PL ~(1 << 6) +#else +#define MINT14_7PL 0xFFFF +#endif + +#if (INT8PL >= INT14PL) || (INT8PL == 0) +#define MINT14_8PL ~(1 << 7) +#else +#define MINT14_8PL 0xFFFF +#endif + +#if (INT9PL >= INT14PL) || (INT9PL == 0) +#define MINT14_9PL ~(1 << 8) +#else +#define MINT14_9PL 0xFFFF +#endif + +#if (INT10PL >= INT14PL) || (INT10PL == 0) +#define MINT14_10PL ~(1 << 9) +#else +#define MINT14_10PL 0xFFFF +#endif + +#if (INT11PL >= INT14PL) || (INT11PL == 0) +#define MINT14_11PL ~(1 << 10) +#else +#define MINT14_11PL 0xFFFF +#endif + +#if (INT12PL >= INT14PL) || (INT12PL == 0) +#define MINT14_12PL ~(1 << 11) +#else +#define MINT14_12PL 0xFFFF +#endif + +#if (INT13PL >= INT14PL) || (INT13PL == 0) +#define MINT14_13PL ~(1 << 12) +#else +#define MINT14_13PL 0xFFFF +#endif + +#define MINT14_14PL ~(1 << 13) + +#if (INT15PL >= INT14PL) || (INT15PL == 0) +#define MINT14_15PL ~(1 << 14) +#else +#define MINT14_15PL 0xFFFF +#endif + +#if (INT16PL >= INT14PL) || (INT16PL == 0) +#define MINT14_16PL ~(1 << 15) +#else +#define MINT14_16PL 0xFFFF +#endif + +#define MINT14 (MINT14_1PL & MINT14_2PL & MINT14_3PL & MINT14_4PL & \ + MINT14_5PL & MINT14_6PL & MINT14_7PL & MINT14_8PL & \ + MINT14_9PL & MINT14_10PL & MINT14_11PL & MINT14_12PL & \ + MINT14_13PL & MINT14_14PL & MINT14_15PL & MINT14_16PL) +// End Of MINT14. + +// Beginning of MINT15: +#if (INT1PL >= INT15PL) || (INT1PL == 0) +#define MINT15_1PL ~(1 << 0) +#else +#define MINT15_1PL 0xFFFF +#endif + +#if (INT2PL >= INT15PL) || (INT2PL == 0) +#define MINT15_2PL ~(1 << 1) +#else +#define MINT15_2PL 0xFFFF +#endif + +#if (INT3PL >= INT15PL) || (INT3PL == 0) +#define MINT15_3PL ~(1 << 2) +#else +#define MINT15_3PL 0xFFFF +#endif + +#if (INT4PL >= INT15PL) || (INT4PL == 0) +#define MINT15_4PL ~(1 << 3) +#else +#define MINT15_4PL 0xFFFF +#endif + +#if (INT5PL >= INT15PL) || (INT5PL == 0) +#define MINT15_5PL ~(1 << 4) +#else +#define MINT15_5PL 0xFFFF +#endif + +#if (INT6PL >= INT15PL) || (INT6PL == 0) +#define MINT15_6PL ~(1 << 5) +#else +#define MINT15_6PL 0xFFFF +#endif + +#if (INT7PL >= INT15PL) || (INT7PL == 0) +#define MINT15_7PL ~(1 << 6) +#else +#define MINT15_7PL 0xFFFF +#endif + +#if (INT8PL >= INT15PL) || (INT8PL == 0) +#define MINT15_8PL ~(1 << 7) +#else +#define MINT15_8PL 0xFFFF +#endif + +#if (INT9PL >= INT15PL) || (INT9PL == 0) +#define MINT15_9PL ~(1 << 8) +#else +#define MINT15_9PL 0xFFFF +#endif + +#if (INT10PL >= INT15PL) || (INT10PL == 0) +#define MINT15_10PL ~(1 << 9) +#else +#define MINT15_10PL 0xFFFF +#endif + +#if (INT11PL >= INT15PL) || (INT11PL == 0) +#define MINT15_11PL ~(1 << 10) +#else +#define MINT15_11PL 0xFFFF +#endif + +#if (INT12PL >= INT15PL) || (INT12PL == 0) +#define MINT15_12PL ~(1 << 11) +#else +#define MINT15_12PL 0xFFFF +#endif + +#if (INT13PL >= INT15PL) || (INT13PL == 0) +#define MINT15_13PL ~(1 << 12) +#else +#define MINT15_13PL 0xFFFF +#endif + +#if (INT14PL >= INT15PL) || (INT14PL == 0) +#define MINT15_14PL ~(1 << 13) +#else +#define MINT15_14PL 0xFFFF +#endif + +#define MINT15_15PL ~(1 << 14) + +#if (INT16PL >= INT15PL) || (INT16PL == 0) +#define MINT15_16PL ~(1 << 15) +#else +#define MINT15_16PL 0xFFFF +#endif + +#define MINT15 (MINT15_1PL & MINT15_2PL & MINT15_3PL & MINT15_4PL & \ + MINT15_5PL & MINT15_6PL & MINT15_7PL & MINT15_8PL & \ + MINT15_9PL & MINT15_10PL & MINT15_11PL & MINT15_12PL & \ + MINT15_13PL & MINT15_14PL & MINT15_15PL & MINT15_16PL) +// End Of MINT15. + +// Beginning of MINT16: +#if (INT1PL >= INT16PL) || (INT1PL == 0) +#define MINT16_1PL ~(1 << 0) +#else +#define MINT16_1PL 0xFFFF +#endif + +#if (INT2PL >= INT16PL) || (INT2PL == 0) +#define MINT16_2PL ~(1 << 1) +#else +#define MINT16_2PL 0xFFFF +#endif + +#if (INT3PL >= INT16PL) || (INT3PL == 0) +#define MINT16_3PL ~(1 << 2) +#else +#define MINT16_3PL 0xFFFF +#endif + +#if (INT4PL >= INT16PL) || (INT4PL == 0) +#define MINT16_4PL ~(1 << 3) +#else +#define MINT16_4PL 0xFFFF +#endif + +#if (INT5PL >= INT16PL) || (INT5PL == 0) +#define MINT16_5PL ~(1 << 4) +#else +#define MINT16_5PL 0xFFFF +#endif + +#if (INT6PL >= INT16PL) || (INT6PL == 0) +#define MINT16_6PL ~(1 << 5) +#else +#define MINT16_6PL 0xFFFF +#endif + +#if (INT7PL >= INT16PL) || (INT7PL == 0) +#define MINT16_7PL ~(1 << 6) +#else +#define MINT16_7PL 0xFFFF +#endif + +#if (INT8PL >= INT16PL) || (INT8PL == 0) +#define MINT16_8PL ~(1 << 7) +#else +#define MINT16_8PL 0xFFFF +#endif + +#if (INT9PL >= INT16PL) || (INT9PL == 0) +#define MINT16_9PL ~(1 << 8) +#else +#define MINT16_9PL 0xFFFF +#endif + +#if (INT10PL >= INT16PL) || (INT10PL == 0) +#define MINT16_10PL ~(1 << 9) +#else +#define MINT16_10PL 0xFFFF +#endif + +#if (INT11PL >= INT16PL) || (INT11PL == 0) +#define MINT16_11PL ~(1 << 10) +#else +#define MINT16_11PL 0xFFFF +#endif + +#if (INT12PL >= INT16PL) || (INT12PL == 0) +#define MINT16_12PL ~(1 << 11) +#else +#define MINT16_12PL 0xFFFF +#endif + +#if (INT13PL >= INT16PL) || (INT13PL == 0) +#define MINT16_13PL ~(1 << 12) +#else +#define MINT16_13PL 0xFFFF +#endif + +#if (INT14PL >= INT16PL) || (INT14PL == 0) +#define MINT16_14PL ~(1 << 13) +#else +#define MINT16_14PL 0xFFFF +#endif + +#if (INT15PL >= INT16PL) || (INT15PL == 0) +#define MINT16_15PL ~(1 << 14) +#else +#define MINT16_15PL 0xFFFF +#endif + +#define MINT16_16PL ~(1 << 15) + +#define MINT16 (MINT16_1PL & MINT16_2PL & MINT16_3PL & MINT16_4PL & \ + MINT16_5PL & MINT16_6PL & MINT16_7PL & MINT16_8PL & \ + MINT16_9PL & MINT16_10PL & MINT16_11PL & MINT16_12PL & \ + MINT16_13PL & MINT16_14PL & MINT16_15PL & MINT16_16PL) +// End Of MINT16. + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG11 to MG18: + +// Beginning of MG11: +#if (G12PL >= G11PL) || (G12PL == 0) +#define MG11_12PL ~(1 << 1) +#else +#define MG11_12PL 0xFFFF +#endif + +#if (G13PL >= G11PL) || (G13PL == 0) +#define MG11_13PL ~(1 << 2) +#else +#define MG11_13PL 0xFFFF +#endif + +#if (G14PL >= G11PL) || (G14PL == 0) +#define MG11_14PL ~(1 << 3) +#else +#define MG11_14PL 0xFFFF +#endif + +#if (G15PL >= G11PL) || (G15PL == 0) +#define MG11_15PL ~(1 << 4) +#else +#define MG11_15PL 0xFFFF +#endif + +#if (G16PL >= G11PL) || (G16PL == 0) +#define MG11_16PL ~(1 << 5) +#else +#define MG11_16PL 0xFFFF +#endif + +#if (G17PL >= G11PL) || (G17PL == 0) +#define MG11_17PL ~(1 << 6) +#else +#define MG11_17PL 0xFFFF +#endif + +#if (G18PL >= G11PL) || (G18PL == 0) +#define MG11_18PL ~(1 << 7) +#else +#define MG11_18PL 0xFFFF +#endif + +#define MG11_11PL 0x00FE +#define MG11 (MG11_11PL & MG11_12PL & MG11_13PL & MG11_14PL & \ + MG11_15PL & MG11_16PL & MG11_17PL & MG11_18PL) +// End of MG11: + +// Beginning of MG12: +#if (G11PL >= G12PL) || (G11PL == 0) +#define MG12_11PL ~(1) +#else +#define MG12_11PL 0xFFFF +#endif +#if (G13PL >= G12PL) || (G13PL == 0) +#define MG12_13PL ~(1 << 2) +#else +#define MG12_13PL 0xFFFF +#endif +#if (G14PL >= G12PL) || (G14PL == 0) +#define MG12_14PL ~(1 << 3) +#else +#define MG12_14PL 0xFFFF +#endif +#if (G15PL >= G12PL) || (G15PL == 0) +#define MG12_15PL ~(1 << 4) +#else +#define MG12_15PL 0xFFFF +#endif +#if (G16PL >= G12PL) || (G16PL == 0) +#define MG12_16PL ~(1 << 5) +#else +#define MG12_16PL 0xFFFF +#endif +#if (G17PL >= G12PL) || (G17PL == 0) +#define MG12_17PL ~(1 << 6) +#else +#define MG12_17PL 0xFFFF +#endif +#if (G18PL >= G12PL) || (G18PL == 0) +#define MG12_18PL ~(1 << 7) +#else +#define MG12_18PL 0xFFFF +#endif +#define MG12_12PL 0x00FD +#define MG12 (MG12_11PL & MG12_12PL & MG12_13PL & MG12_14PL & \ + MG12_15PL & MG12_16PL & MG12_17PL & MG12_18PL) +// End of MG12: + +// Beginning of MG13: +#if (G11PL >= G13PL) || (G11PL == 0) +#define MG13_11PL ~(1) +#else +#define MG13_11PL 0xFFFF +#endif +#if (G12PL >= G13PL) || (G12PL == 0) +#define MG13_12PL ~(1 << 1) +#else +#define MG13_12PL 0xFFFF +#endif +#if (G14PL >= G13PL) || (G14PL == 0) +#define MG13_14PL ~(1 << 3) +#else +#define MG13_14PL 0xFFFF +#endif +#if (G15PL >= G13PL) || (G15PL == 0) +#define MG13_15PL ~(1 << 4) +#else +#define MG13_15PL 0xFFFF +#endif +#if (G16PL >= G13PL) || (G16PL == 0) +#define MG13_16PL ~(1 << 5) +#else +#define MG13_16PL 0xFFFF +#endif +#if (G17PL >= G13PL) || (G17PL == 0) +#define MG13_17PL ~(1 << 6) +#else +#define MG13_17PL 0xFFFF +#endif +#if (G18PL >= G13PL) || (G18PL == 0) +#define MG13_18PL ~(1 << 7) +#else +#define MG13_18PL 0xFFFF +#endif +#define MG13_13PL 0x00FB +#define MG13 (MG13_11PL & MG13_12PL & MG13_13PL & MG13_14PL & \ + MG13_15PL & MG13_16PL & MG13_17PL & MG13_18PL) +// End of MG13: + +// Beginning of MG14: +#if (G11PL >= G14PL) || (G11PL == 0) +#define MG14_11PL ~(1) +#else +#define MG14_11PL 0xFFFF +#endif +#if (G12PL >= G14PL) || (G12PL == 0) +#define MG14_12PL ~(1 << 1) +#else +#define MG14_12PL 0xFFFF +#endif +#if (G13PL >= G14PL) || (G13PL == 0) +#define MG14_13PL ~(1 << 2) +#else +#define MG14_13PL 0xFFFF +#endif +#if (G15PL >= G14PL) || (G15PL == 0) +#define MG14_15PL ~(1 << 4) +#else +#define MG14_15PL 0xFFFF +#endif +#if (G16PL >= G14PL) || (G16PL == 0) +#define MG14_16PL ~(1 << 5) +#else +#define MG14_16PL 0xFFFF +#endif +#if (G17PL >= G14PL) || (G17PL == 0) +#define MG14_17PL ~(1 << 6) +#else +#define MG14_17PL 0xFFFF +#endif +#if (G18PL >= G14PL) || (G18PL == 0) +#define MG14_18PL ~(1 << 7) +#else +#define MG14_18PL 0xFFFF +#endif +#define MG14_14PL 0x00F7 +#define MG14 (MG14_11PL & MG14_12PL & MG14_13PL & MG14_14PL & \ + MG14_15PL & MG14_16PL & MG14_17PL & MG14_18PL) +// End of MG14: + +// Beginning of MG15: +#if (G11PL >= G15PL) || (G11PL == 0) +#define MG15_11PL ~(1) +#else +#define MG15_11PL 0xFFFF +#endif +#if (G12PL >= G15PL) || (G12PL == 0) +#define MG15_12PL ~(1 << 1) +#else +#define MG15_12PL 0xFFFF +#endif +#if (G13PL >= G15PL) || (G13PL == 0) +#define MG15_13PL ~(1 << 2) +#else +#define MG15_13PL 0xFFFF +#endif +#if (G14PL >= G15PL) || (G14PL == 0) +#define MG15_14PL ~(1 << 3) +#else +#define MG15_14PL 0xFFFF +#endif +#if (G16PL >= G15PL) || (G16PL == 0) +#define MG15_16PL ~(1 << 5) +#else +#define MG15_16PL 0xFFFF +#endif +#if (G17PL >= G15PL) || (G17PL == 0) +#define MG15_17PL ~(1 << 6) +#else +#define MG15_17PL 0xFFFF +#endif +#if (G18PL >= G15PL) || (G18PL == 0) +#define MG15_18PL ~(1 << 7) +#else +#define MG15_18PL 0xFFFF +#endif +#define MG15_15PL 0x00EF +#define MG15 (MG15_11PL & MG15_12PL & MG15_13PL & MG15_14PL & \ + MG15_15PL & MG15_16PL & MG15_17PL & MG15_18PL) +// End of MG15: + +// Beginning of MG16: +#if (G11PL >= G16PL) || (G11PL == 0) +#define MG16_11PL ~(1) +#else +#define MG16_11PL 0xFFFF +#endif +#if (G12PL >= G16PL) || (G12PL == 0) +#define MG16_12PL ~(1 << 1) +#else +#define MG16_12PL 0xFFFF +#endif +#if (G13PL >= G16PL) || (G13PL == 0) +#define MG16_13PL ~(1 << 2) +#else +#define MG16_13PL 0xFFFF +#endif +#if (G14PL >= G16PL) || (G14PL == 0) +#define MG16_14PL ~(1 << 3) +#else +#define MG16_14PL 0xFFFF +#endif +#if (G15PL >= G16PL) || (G15PL == 0) +#define MG16_15PL ~(1 << 4) +#else +#define MG16_15PL 0xFFFF +#endif +#if (G17PL >= G16PL) || (G17PL == 0) +#define MG16_17PL ~(1 << 6) +#else +#define MG16_17PL 0xFFFF +#endif +#if (G18PL >= G16PL) || (G18PL == 0) +#define MG16_18PL ~(1 << 7) +#else +#define MG16_18PL 0xFFFF +#endif +#define MG16_16PL 0x00DF +#define MG16 (MG16_11PL & MG16_12PL & MG16_13PL & MG16_14PL & \ + MG16_15PL & MG16_16PL & MG16_17PL & MG16_18PL) +// End of MG16: + +// Beginning of MG17: +#if (G11PL >= G17PL) || (G11PL == 0) +#define MG17_11PL ~(1) +#else +#define MG17_11PL 0xFFFF +#endif +#if (G12PL >= G17PL) || (G12PL == 0) +#define MG17_12PL ~(1 << 1) +#else +#define MG17_12PL 0xFFFF +#endif +#if (G13PL >= G17PL) || (G13PL == 0) +#define MG17_13PL ~(1 << 2) +#else +#define MG17_13PL 0xFFFF +#endif +#if (G14PL >= G17PL) || (G14PL == 0) +#define MG17_14PL ~(1 << 3) +#else +#define MG17_14PL 0xFFFF +#endif +#if (G15PL >= G17PL) || (G15PL == 0) +#define MG17_15PL ~(1 << 4) +#else +#define MG17_15PL 0xFFFF +#endif +#if (G16PL >= G17PL) || (G16PL == 0) +#define MG17_16PL ~(1 << 5) +#else +#define MG17_16PL 0xFFFF +#endif +#if (G18PL >= G17PL) || (G18PL == 0) +#define MG17_18PL ~(1 << 7) +#else +#define MG17_18PL 0xFFFF +#endif +#define MG17_17PL 0x00BF +#define MG17 (MG17_11PL & MG17_12PL & MG17_13PL & MG17_14PL & \ + MG17_15PL & MG17_16PL & MG17_17PL & MG17_18PL) +// End of MG17: + +// Beginning of MG18: +#if (G11PL >= G18PL) || (G11PL == 0) +#define MG18_11PL ~(1) +#else +#define MG18_11PL 0xFFFF +#endif +#if (G12PL >= G18PL) || (G12PL == 0) +#define MG18_12PL ~(1 << 1) +#else +#define MG18_12PL 0xFFFF +#endif +#if (G13PL >= G18PL) || (G13PL == 0) +#define MG18_13PL ~(1 << 2) +#else +#define MG18_13PL 0xFFFF +#endif +#if (G14PL >= G18PL) || (G14PL == 0) +#define MG18_14PL ~(1 << 3) +#else +#define MG18_14PL 0xFFFF +#endif +#if (G15PL >= G18PL) || (G15PL == 0) +#define MG18_15PL ~(1 << 4) +#else +#define MG18_15PL 0xFFFF +#endif +#if (G16PL >= G18PL) || (G16PL == 0) +#define MG18_16PL ~(1 << 5) +#else +#define MG18_16PL 0xFFFF +#endif +#if (G17PL >= G18PL) || (G17PL == 0) +#define MG18_17PL ~(1 << 6) +#else +#define MG18_17PL 0xFFFF +#endif +#define MG18_18PL 0x007F +#define MG18 (MG18_11PL & MG18_12PL & MG18_13PL & MG18_14PL & \ + MG18_15PL & MG18_16PL & MG18_17PL & MG18_18PL) +// End of MG18: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG21 to MG28: +// + +// Beginning of MG21: +#if (G22PL >= G21PL) || (G22PL == 0) +#define MG21_12PL ~(1 << 1) +#else +#define MG21_12PL 0xFFFF +#endif +#if (G23PL >= G21PL) || (G23PL == 0) +#define MG21_13PL ~(1 << 2) +#else +#define MG21_13PL 0xFFFF +#endif +#if (G24PL >= G21PL) || (G24PL == 0) +#define MG21_14PL ~(1 << 3) +#else +#define MG21_14PL 0xFFFF +#endif +#if (G25PL >= G21PL) || (G25PL == 0) +#define MG21_15PL ~(1 << 4) +#else +#define MG21_15PL 0xFFFF +#endif +#if (G26PL >= G21PL) || (G26PL == 0) +#define MG21_16PL ~(1 << 5) +#else +#define MG21_16PL 0xFFFF +#endif +#if (G27PL >= G21PL) || (G27PL == 0) +#define MG21_17PL ~(1 << 6) +#else +#define MG21_17PL 0xFFFF +#endif +#if (G28PL >= G21PL) || (G28PL == 0) +#define MG21_18PL ~(1 << 7) +#else +#define MG21_18PL 0xFFFF +#endif +#define MG21_11PL 0x00FE +#define MG21 (MG21_11PL & MG21_12PL & MG21_13PL & MG21_14PL & \ + MG21_15PL & MG21_16PL & MG21_17PL & MG21_18PL) +// End of MG21: + +// Beginning of MG22: +#if (G21PL >= G22PL) || (G21PL == 0) +#define MG22_11PL ~(1) +#else +#define MG22_11PL 0xFFFF +#endif +#if (G23PL >= G22PL) || (G23PL == 0) +#define MG22_13PL ~(1 << 2) +#else +#define MG22_13PL 0xFFFF +#endif +#if (G24PL >= G22PL) || (G24PL == 0) +#define MG22_14PL ~(1 << 3) +#else +#define MG22_14PL 0xFFFF +#endif +#if (G25PL >= G22PL) || (G25PL == 0) +#define MG22_15PL ~(1 << 4) +#else +#define MG22_15PL 0xFFFF +#endif +#if (G26PL >= G22PL) || (G26PL == 0) +#define MG22_16PL ~(1 << 5) +#else +#define MG22_16PL 0xFFFF +#endif +#if (G27PL >= G22PL) || (G27PL == 0) +#define MG22_17PL ~(1 << 6) +#else +#define MG22_17PL 0xFFFF +#endif +#if (G28PL >= G22PL) || (G28PL == 0) +#define MG22_18PL ~(1 << 7) +#else +#define MG22_18PL 0xFFFF +#endif +#define MG22_12PL 0x00FD +#define MG22 (MG22_11PL & MG22_12PL & MG22_13PL & MG22_14PL & \ + MG22_15PL & MG22_16PL & MG22_17PL & MG22_18PL) +// End of MG22: + +// Beginning of MG23: +#if (G21PL >= G23PL) || (G21PL == 0) +#define MG23_11PL ~(1) +#else +#define MG23_11PL 0xFFFF +#endif +#if (G22PL >= G23PL) || (G22PL == 0) +#define MG23_12PL ~(1 << 1) +#else +#define MG23_12PL 0xFFFF +#endif +#if (G24PL >= G23PL) || (G24PL == 0) +#define MG23_14PL ~(1 << 3) +#else +#define MG23_14PL 0xFFFF +#endif +#if (G25PL >= G23PL) || (G25PL == 0) +#define MG23_15PL ~(1 << 4) +#else +#define MG23_15PL 0xFFFF +#endif +#if (G26PL >= G23PL) || (G26PL == 0) +#define MG23_16PL ~(1 << 5) +#else +#define MG23_16PL 0xFFFF +#endif +#if (G27PL >= G23PL) || (G27PL == 0) +#define MG23_17PL ~(1 << 6) +#else +#define MG23_17PL 0xFFFF +#endif +#if (G28PL >= G23PL) || (G28PL == 0) +#define MG23_18PL ~(1 << 7) +#else +#define MG23_18PL 0xFFFF +#endif +#define MG23_13PL 0x00FB +#define MG23 (MG23_11PL & MG23_12PL & MG23_13PL & MG23_14PL & \ + MG23_15PL & MG23_16PL & MG23_17PL & MG23_18PL) +// End of MG23: + +// Beginning of MG24: +#if (G21PL >= G24PL) || (G21PL == 0) +#define MG24_11PL ~(1) +#else +#define MG24_11PL 0xFFFF +#endif +#if (G22PL >= G24PL) || (G22PL == 0) +#define MG24_12PL ~(1 << 1) +#else +#define MG24_12PL 0xFFFF +#endif +#if (G23PL >= G24PL) || (G23PL == 0) +#define MG24_13PL ~(1 << 2) +#else +#define MG24_13PL 0xFFFF +#endif +#if (G25PL >= G24PL) || (G25PL == 0) +#define MG24_15PL ~(1 << 4) +#else +#define MG24_15PL 0xFFFF +#endif +#if (G26PL >= G24PL) || (G26PL == 0) +#define MG24_16PL ~(1 << 5) +#else +#define MG24_16PL 0xFFFF +#endif +#if (G27PL >= G24PL) || (G27PL == 0) +#define MG24_17PL ~(1 << 6) +#else +#define MG24_17PL 0xFFFF +#endif +#if (G28PL >= G24PL) || (G28PL == 0) +#define MG24_18PL ~(1 << 7) +#else +#define MG24_18PL 0xFFFF +#endif +#define MG24_14PL 0x00F7 +#define MG24 (MG24_11PL & MG24_12PL & MG24_13PL & MG24_14PL & \ + MG24_15PL & MG24_16PL & MG24_17PL & MG24_18PL) +// End of MG24: + +// Beginning of MG25: +#if (G21PL >= G25PL) || (G21PL == 0) +#define MG25_11PL ~(1) +#else +#define MG25_11PL 0xFFFF +#endif +#if (G22PL >= G25PL) || (G22PL == 0) +#define MG25_12PL ~(1 << 1) +#else +#define MG25_12PL 0xFFFF +#endif +#if (G23PL >= G25PL) || (G23PL == 0) +#define MG25_13PL ~(1 << 2) +#else +#define MG25_13PL 0xFFFF +#endif +#if (G24PL >= G25PL) || (G24PL == 0) +#define MG25_14PL ~(1 << 3) +#else +#define MG25_14PL 0xFFFF +#endif +#if (G26PL >= G25PL) || (G26PL == 0) +#define MG25_16PL ~(1 << 5) +#else +#define MG25_16PL 0xFFFF +#endif +#if (G27PL >= G25PL) || (G27PL == 0) +#define MG25_17PL ~(1 << 6) +#else +#define MG25_17PL 0xFFFF +#endif +#if (G28PL >= G25PL) || (G28PL == 0) +#define MG25_18PL ~(1 << 7) +#else +#define MG25_18PL 0xFFFF +#endif +#define MG25_15PL 0x00EF +#define MG25 (MG25_11PL & MG25_12PL & MG25_13PL & MG25_14PL & \ + MG25_15PL & MG25_16PL & MG25_17PL & MG25_18PL) +// End of MG25: + +// Beginning of MG26: +#if (G21PL >= G26PL) || (G21PL == 0) +#define MG26_11PL ~(1) +#else +#define MG26_11PL 0xFFFF +#endif +#if (G22PL >= G26PL) || (G22PL == 0) +#define MG26_12PL ~(1 << 1) +#else +#define MG26_12PL 0xFFFF +#endif +#if (G23PL >= G26PL) || (G23PL == 0) +#define MG26_13PL ~(1 << 2) +#else +#define MG26_13PL 0xFFFF +#endif +#if (G24PL >= G26PL) || (G24PL == 0) +#define MG26_14PL ~(1 << 3) +#else +#define MG26_14PL 0xFFFF +#endif +#if (G25PL >= G26PL) || (G25PL == 0) +#define MG26_15PL ~(1 << 4) +#else +#define MG26_15PL 0xFFFF +#endif +#if (G27PL >= G26PL) || (G27PL == 0) +#define MG26_17PL ~(1 << 6) +#else +#define MG26_17PL 0xFFFF +#endif +#if (G28PL >= G26PL) || (G28PL == 0) +#define MG26_18PL ~(1 << 7) +#else +#define MG26_18PL 0xFFFF +#endif +#define MG26_16PL 0x00DF +#define MG26 (MG26_11PL & MG26_12PL & MG26_13PL & MG26_14PL & \ + MG26_15PL & MG26_16PL & MG26_17PL & MG26_18PL) +// End of MG26: + +// Beginning of MG27: +#if (G21PL >= G27PL) || (G21PL == 0) +#define MG27_11PL ~(1) +#else +#define MG27_11PL 0xFFFF +#endif +#if (G22PL >= G27PL) || (G22PL == 0) +#define MG27_12PL ~(1 << 1) +#else +#define MG27_12PL 0xFFFF +#endif +#if (G23PL >= G27PL) || (G23PL == 0) +#define MG27_13PL ~(1 << 2) +#else +#define MG27_13PL 0xFFFF +#endif +#if (G24PL >= G27PL) || (G24PL == 0) +#define MG27_14PL ~(1 << 3) +#else +#define MG27_14PL 0xFFFF +#endif +#if (G25PL >= G27PL) || (G25PL == 0) +#define MG27_15PL ~(1 << 4) +#else +#define MG27_15PL 0xFFFF +#endif +#if (G26PL >= G27PL) || (G26PL == 0) +#define MG27_16PL ~(1 << 5) +#else +#define MG27_16PL 0xFFFF +#endif +#if (G28PL >= G27PL) || (G28PL == 0) +#define MG27_18PL ~(1 << 7) +#else +#define MG27_18PL 0xFFFF +#endif +#define MG27_17PL 0x00BF +#define MG27 (MG27_11PL & MG27_12PL & MG27_13PL & MG27_14PL & \ + MG27_15PL & MG27_16PL & MG27_17PL & MG27_18PL) +// End of MG27: + +// Beginning of MG28: +#if (G21PL >= G28PL) || (G21PL == 0) +#define MG28_11PL ~(1) +#else +#define MG28_11PL 0xFFFF +#endif +#if (G22PL >= G28PL) || (G22PL == 0) +#define MG28_12PL ~(1 << 1) +#else +#define MG28_12PL 0xFFFF +#endif +#if (G23PL >= G28PL) || (G23PL == 0) +#define MG28_13PL ~(1 << 2) +#else +#define MG28_13PL 0xFFFF +#endif +#if (G24PL >= G28PL) || (G24PL == 0) +#define MG28_14PL ~(1 << 3) +#else +#define MG28_14PL 0xFFFF +#endif +#if (G25PL >= G28PL) || (G25PL == 0) +#define MG28_15PL ~(1 << 4) +#else +#define MG28_15PL 0xFFFF +#endif +#if (G26PL >= G28PL) || (G26PL == 0) +#define MG28_16PL ~(1 << 5) +#else +#define MG28_16PL 0xFFFF +#endif +#if (G27PL >= G28PL) || (G27PL == 0) +#define MG28_17PL ~(1 << 6) +#else +#define MG28_17PL 0xFFFF +#endif +#define MG28_18PL 0x007F +#define MG28 (MG28_11PL & MG28_12PL & MG28_13PL & MG28_14PL & \ + MG28_15PL & MG28_16PL & MG28_17PL & MG28_18PL) +// End of MG28: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG31 to MG38: +// + +// Beginning of MG31: +#if (G32PL >= G31PL) || (G32PL == 0) +#define MG31_12PL ~(1 << 1) +#else +#define MG31_12PL 0xFFFF +#endif +#if (G33PL >= G31PL) || (G33PL == 0) +#define MG31_13PL ~(1 << 2) +#else +#define MG31_13PL 0xFFFF +#endif +#if (G34PL >= G31PL) || (G34PL == 0) +#define MG31_14PL ~(1 << 3) +#else +#define MG31_14PL 0xFFFF +#endif +#if (G35PL >= G31PL) || (G35PL == 0) +#define MG31_15PL ~(1 << 4) +#else +#define MG31_15PL 0xFFFF +#endif +#if (G36PL >= G31PL) || (G36PL == 0) +#define MG31_16PL ~(1 << 5) +#else +#define MG31_16PL 0xFFFF +#endif +#if (G37PL >= G31PL) || (G37PL == 0) +#define MG31_17PL ~(1 << 6) +#else +#define MG31_17PL 0xFFFF +#endif +#if (G38PL >= G31PL) || (G38PL == 0) +#define MG31_18PL ~(1 << 7) +#else +#define MG31_18PL 0xFFFF +#endif +#define MG31_11PL 0x00FE +#define MG31 (MG31_11PL & MG31_12PL & MG31_13PL & MG31_14PL & \ + MG31_15PL & MG31_16PL & MG31_17PL & MG31_18PL) +// End of MG31: + +// Beginning of MG32: +#if (G31PL >= G32PL) || (G31PL == 0) +#define MG32_11PL ~(1) +#else +#define MG32_11PL 0xFFFF +#endif +#if (G33PL >= G32PL) || (G33PL == 0) +#define MG32_13PL ~(1 << 2) +#else +#define MG32_13PL 0xFFFF +#endif +#if (G34PL >= G32PL) || (G34PL == 0) +#define MG32_14PL ~(1 << 3) +#else +#define MG32_14PL 0xFFFF +#endif +#if (G35PL >= G32PL) || (G35PL == 0) +#define MG32_15PL ~(1 << 4) +#else +#define MG32_15PL 0xFFFF +#endif +#if (G36PL >= G32PL) || (G36PL == 0) +#define MG32_16PL ~(1 << 5) +#else +#define MG32_16PL 0xFFFF +#endif +#if (G37PL >= G32PL) || (G37PL == 0) +#define MG32_17PL ~(1 << 6) +#else +#define MG32_17PL 0xFFFF +#endif +#if (G38PL >= G32PL) || (G38PL == 0) +#define MG32_18PL ~(1 << 7) +#else +#define MG32_18PL 0xFFFF +#endif +#define MG32_12PL 0x00FD +#define MG32 (MG32_11PL & MG32_12PL & MG32_13PL & MG32_14PL & \ + MG32_15PL & MG32_16PL & MG32_17PL & MG32_18PL) +// End of MG32: + +// Beginning of MG33: +#if (G31PL >= G33PL) || (G31PL == 0) +#define MG33_11PL ~(1) +#else +#define MG33_11PL 0xFFFF +#endif +#if (G32PL >= G33PL) || (G32PL == 0) +#define MG33_12PL ~(1 << 1) +#else +#define MG33_12PL 0xFFFF +#endif +#if (G34PL >= G33PL) || (G34PL == 0) +#define MG33_14PL ~(1 << 3) +#else +#define MG33_14PL 0xFFFF +#endif +#if (G35PL >= G33PL) || (G35PL == 0) +#define MG33_15PL ~(1 << 4) +#else +#define MG33_15PL 0xFFFF +#endif +#if (G36PL >= G33PL) || (G36PL == 0) +#define MG33_16PL ~(1 << 5) +#else +#define MG33_16PL 0xFFFF +#endif +#if (G37PL >= G33PL) || (G37PL == 0) +#define MG33_17PL ~(1 << 6) +#else +#define MG33_17PL 0xFFFF +#endif +#if (G38PL >= G33PL) || (G38PL == 0) +#define MG33_18PL ~(1 << 7) +#else +#define MG33_18PL 0xFFFF +#endif +#define MG33_13PL 0x00FB +#define MG33 (MG33_11PL & MG33_12PL & MG33_13PL & MG33_14PL & \ + MG33_15PL & MG33_16PL & MG33_17PL & MG33_18PL) +// End of MG33: + +// Beginning of MG34: +#if (G31PL >= G34PL) || (G31PL == 0) +#define MG34_11PL ~(1) +#else +#define MG34_11PL 0xFFFF +#endif +#if (G32PL >= G34PL) || (G32PL == 0) +#define MG34_12PL ~(1 << 1) +#else +#define MG34_12PL 0xFFFF +#endif +#if (G33PL >= G34PL) || (G33PL == 0) +#define MG34_13PL ~(1 << 2) +#else +#define MG34_13PL 0xFFFF +#endif +#if (G35PL >= G34PL) || (G35PL == 0) +#define MG34_15PL ~(1 << 4) +#else +#define MG34_15PL 0xFFFF +#endif +#if (G36PL >= G34PL) || (G36PL == 0) +#define MG34_16PL ~(1 << 5) +#else +#define MG34_16PL 0xFFFF +#endif +#if (G37PL >= G34PL) || (G37PL == 0) +#define MG34_17PL ~(1 << 6) +#else +#define MG34_17PL 0xFFFF +#endif +#if (G38PL >= G34PL) || (G38PL == 0) +#define MG34_18PL ~(1 << 7) +#else +#define MG34_18PL 0xFFFF +#endif +#define MG34_14PL 0x00F7 +#define MG34 (MG34_11PL & MG34_12PL & MG34_13PL & MG34_14PL & \ + MG34_15PL & MG34_16PL & MG34_17PL & MG34_18PL) +// End of MG34: + +// Beginning of MG35: +#if (G31PL >= G35PL) || (G31PL == 0) +#define MG35_11PL ~(1) +#else +#define MG35_11PL 0xFFFF +#endif +#if (G32PL >= G35PL) || (G32PL == 0) +#define MG35_12PL ~(1 << 1) +#else +#define MG35_12PL 0xFFFF +#endif +#if (G33PL >= G35PL) || (G33PL == 0) +#define MG35_13PL ~(1 << 2) +#else +#define MG35_13PL 0xFFFF +#endif +#if (G34PL >= G35PL) || (G34PL == 0) +#define MG35_14PL ~(1 << 3) +#else +#define MG35_14PL 0xFFFF +#endif +#if (G36PL >= G35PL) || (G36PL == 0) +#define MG35_16PL ~(1 << 5) +#else +#define MG35_16PL 0xFFFF +#endif +#if (G37PL >= G35PL) || (G37PL == 0) +#define MG35_17PL ~(1 << 6) +#else +#define MG35_17PL 0xFFFF +#endif +#if (G38PL >= G35PL) || (G38PL == 0) +#define MG35_18PL ~(1 << 7) +#else +#define MG35_18PL 0xFFFF +#endif +#define MG35_15PL 0x00EF +#define MG35 (MG35_11PL & MG35_12PL & MG35_13PL & MG35_14PL & \ + MG35_15PL & MG35_16PL & MG35_17PL & MG35_18PL) +// End of MG35: + +// Beginning of MG36: +#if (G31PL >= G36PL) || (G31PL == 0) +#define MG36_11PL ~(1) +#else +#define MG36_11PL 0xFFFF +#endif +#if (G32PL >= G36PL) || (G32PL == 0) +#define MG36_12PL ~(1 << 1) +#else +#define MG36_12PL 0xFFFF +#endif +#if (G33PL >= G36PL) || (G33PL == 0) +#define MG36_13PL ~(1 << 2) +#else +#define MG36_13PL 0xFFFF +#endif +#if (G34PL >= G36PL) || (G34PL == 0) +#define MG36_14PL ~(1 << 3) +#else +#define MG36_14PL 0xFFFF +#endif +#if (G35PL >= G36PL) || (G35PL == 0) +#define MG36_15PL ~(1 << 4) +#else +#define MG36_15PL 0xFFFF +#endif +#if (G37PL >= G36PL) || (G37PL == 0) +#define MG36_17PL ~(1 << 6) +#else +#define MG36_17PL 0xFFFF +#endif +#if (G38PL >= G36PL) || (G38PL == 0) +#define MG36_18PL ~(1 << 7) +#else +#define MG36_18PL 0xFFFF +#endif +#define MG36_16PL 0x00DF +#define MG36 (MG36_11PL & MG36_12PL & MG36_13PL & MG36_14PL & \ + MG36_15PL & MG36_16PL & MG36_17PL & MG36_18PL) +// End of MG36: + +// Beginning of MG37: +#if (G31PL >= G37PL) || (G31PL == 0) +#define MG37_11PL ~(1) +#else +#define MG37_11PL 0xFFFF +#endif +#if (G32PL >= G37PL) || (G32PL == 0) +#define MG37_12PL ~(1 << 1) +#else +#define MG37_12PL 0xFFFF +#endif +#if (G33PL >= G37PL) || (G33PL == 0) +#define MG37_13PL ~(1 << 2) +#else +#define MG37_13PL 0xFFFF +#endif +#if (G34PL >= G37PL) || (G34PL == 0) +#define MG37_14PL ~(1 << 3) +#else +#define MG37_14PL 0xFFFF +#endif +#if (G35PL >= G37PL) || (G35PL == 0) +#define MG37_15PL ~(1 << 4) +#else +#define MG37_15PL 0xFFFF +#endif +#if (G36PL >= G37PL) || (G36PL == 0) +#define MG37_16PL ~(1 << 5) +#else +#define MG37_16PL 0xFFFF +#endif +#if (G38PL >= G37PL) || (G38PL == 0) +#define MG37_18PL ~(1 << 7) +#else +#define MG37_18PL 0xFFFF +#endif +#define MG37_17PL 0x00BF +#define MG37 (MG37_11PL & MG37_12PL & MG37_13PL & MG37_14PL & \ + MG37_15PL & MG37_16PL & MG37_17PL & MG37_18PL) +// End of MG37: + +// Beginning of MG38: +#if (G31PL >= G38PL) || (G31PL == 0) +#define MG38_11PL ~(1) +#else +#define MG38_11PL 0xFFFF +#endif +#if (G32PL >= G38PL) || (G32PL == 0) +#define MG38_12PL ~(1 << 1) +#else +#define MG38_12PL 0xFFFF +#endif +#if (G33PL >= G38PL) || (G33PL == 0) +#define MG38_13PL ~(1 << 2) +#else +#define MG38_13PL 0xFFFF +#endif +#if (G34PL >= G38PL) || (G34PL == 0) +#define MG38_14PL ~(1 << 3) +#else +#define MG38_14PL 0xFFFF +#endif +#if (G35PL >= G38PL) || (G35PL == 0) +#define MG38_15PL ~(1 << 4) +#else +#define MG38_15PL 0xFFFF +#endif +#if (G36PL >= G38PL) || (G36PL == 0) +#define MG38_16PL ~(1 << 5) +#else +#define MG38_16PL 0xFFFF +#endif +#if (G37PL >= G38PL) || (G37PL == 0) +#define MG38_17PL ~(1 << 6) +#else +#define MG38_17PL 0xFFFF +#endif +#define MG38_18PL 0x007F +#define MG38 (MG38_11PL & MG38_12PL & MG38_13PL & MG38_14PL & \ + MG38_15PL & MG38_16PL & MG38_17PL & MG38_18PL) +// End of MG38: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG41 to MG48: +// + +// Beginning of MG41: +#if (G42PL >= G41PL) || (G42PL == 0) +#define MG41_12PL ~(1 << 1) +#else +#define MG41_12PL 0xFFFF +#endif +#if (G43PL >= G41PL) || (G43PL == 0) +#define MG41_13PL ~(1 << 2) +#else +#define MG41_13PL 0xFFFF +#endif +#if (G44PL >= G41PL) || (G44PL == 0) +#define MG41_14PL ~(1 << 3) +#else +#define MG41_14PL 0xFFFF +#endif +#if (G45PL >= G41PL) || (G45PL == 0) +#define MG41_15PL ~(1 << 4) +#else +#define MG41_15PL 0xFFFF +#endif +#if (G46PL >= G41PL) || (G46PL == 0) +#define MG41_16PL ~(1 << 5) +#else +#define MG41_16PL 0xFFFF +#endif +#if (G47PL >= G41PL) || (G47PL == 0) +#define MG41_17PL ~(1 << 6) +#else +#define MG41_17PL 0xFFFF +#endif +#if (G48PL >= G41PL) || (G48PL == 0) +#define MG41_18PL ~(1 << 7) +#else +#define MG41_18PL 0xFFFF +#endif +#define MG41_11PL 0x00FE +#define MG41 (MG41_11PL & MG41_12PL & MG41_13PL & MG41_14PL & \ + MG41_15PL & MG41_16PL & MG41_17PL & MG41_18PL) +// End of MG41: + +// Beginning of MG42: +#if (G41PL >= G42PL) || (G41PL == 0) +#define MG42_11PL ~(1) +#else +#define MG42_11PL 0xFFFF +#endif +#if (G43PL >= G42PL) || (G43PL == 0) +#define MG42_13PL ~(1 << 2) +#else +#define MG42_13PL 0xFFFF +#endif +#if (G44PL >= G42PL) || (G44PL == 0) +#define MG42_14PL ~(1 << 3) +#else +#define MG42_14PL 0xFFFF +#endif +#if (G45PL >= G42PL) || (G45PL == 0) +#define MG42_15PL ~(1 << 4) +#else +#define MG42_15PL 0xFFFF +#endif +#if (G46PL >= G42PL) || (G46PL == 0) +#define MG42_16PL ~(1 << 5) +#else +#define MG42_16PL 0xFFFF +#endif +#if (G47PL >= G42PL) || (G47PL == 0) +#define MG42_17PL ~(1 << 6) +#else +#define MG42_17PL 0xFFFF +#endif +#if (G48PL >= G42PL) || (G48PL == 0) +#define MG42_18PL ~(1 << 7) +#else +#define MG42_18PL 0xFFFF +#endif +#define MG42_12PL 0x00FD +#define MG42 (MG42_11PL & MG42_12PL & MG42_13PL & MG42_14PL & \ + MG42_15PL & MG42_16PL & MG42_17PL & MG42_18PL) +// End of MG42: + +// Beginning of MG43: +#if (G41PL >= G43PL) || (G41PL == 0) +#define MG43_11PL ~(1) +#else +#define MG43_11PL 0xFFFF +#endif +#if (G42PL >= G43PL) || (G42PL == 0) +#define MG43_12PL ~(1 << 1) +#else +#define MG43_12PL 0xFFFF +#endif +#if (G44PL >= G43PL) || (G44PL == 0) +#define MG43_14PL ~(1 << 3) +#else +#define MG43_14PL 0xFFFF +#endif +#if (G45PL >= G43PL) || (G45PL == 0) +#define MG43_15PL ~(1 << 4) +#else +#define MG43_15PL 0xFFFF +#endif +#if (G46PL >= G43PL) || (G46PL == 0) +#define MG43_16PL ~(1 << 5) +#else +#define MG43_16PL 0xFFFF +#endif +#if (G47PL >= G43PL) || (G47PL == 0) +#define MG43_17PL ~(1 << 6) +#else +#define MG43_17PL 0xFFFF +#endif +#if (G48PL >= G43PL) || (G48PL == 0) +#define MG43_18PL ~(1 << 7) +#else +#define MG43_18PL 0xFFFF +#endif +#define MG43_13PL 0x00FB +#define MG43 (MG43_11PL & MG43_12PL & MG43_13PL & MG43_14PL & \ + MG43_15PL & MG43_16PL & MG43_17PL & MG43_18PL) +// End of MG43: + +// Beginning of MG44: +#if (G41PL >= G44PL) || (G41PL == 0) +#define MG44_11PL ~(1) +#else +#define MG44_11PL 0xFFFF +#endif +#if (G42PL >= G44PL) || (G42PL == 0) +#define MG44_12PL ~(1 << 1) +#else +#define MG44_12PL 0xFFFF +#endif +#if (G43PL >= G44PL) || (G43PL == 0) +#define MG44_13PL ~(1 << 2) +#else +#define MG44_13PL 0xFFFF +#endif +#if (G45PL >= G44PL) || (G45PL == 0) +#define MG44_15PL ~(1 << 4) +#else +#define MG44_15PL 0xFFFF +#endif +#if (G46PL >= G44PL) || (G46PL == 0) +#define MG44_16PL ~(1 << 5) +#else +#define MG44_16PL 0xFFFF +#endif +#if (G47PL >= G44PL) || (G47PL == 0) +#define MG44_17PL ~(1 << 6) +#else +#define MG44_17PL 0xFFFF +#endif +#if (G48PL >= G44PL) || (G48PL == 0) +#define MG44_18PL ~(1 << 7) +#else +#define MG44_18PL 0xFFFF +#endif +#define MG44_14PL 0x00F7 +#define MG44 (MG44_11PL & MG44_12PL & MG44_13PL & MG44_14PL & \ + MG44_15PL & MG44_16PL & MG44_17PL & MG44_18PL) +// End of MG44: + +// Beginning of MG45: +#if (G41PL >= G45PL) || (G41PL == 0) +#define MG45_11PL ~(1) +#else +#define MG45_11PL 0xFFFF +#endif +#if (G42PL >= G45PL) || (G42PL == 0) +#define MG45_12PL ~(1 << 1) +#else +#define MG45_12PL 0xFFFF +#endif +#if (G43PL >= G45PL) || (G43PL == 0) +#define MG45_13PL ~(1 << 2) +#else +#define MG45_13PL 0xFFFF +#endif +#if (G44PL >= G45PL) || (G44PL == 0) +#define MG45_14PL ~(1 << 3) +#else +#define MG45_14PL 0xFFFF +#endif +#if (G46PL >= G45PL) || (G46PL == 0) +#define MG45_16PL ~(1 << 5) +#else +#define MG45_16PL 0xFFFF +#endif +#if (G47PL >= G45PL) || (G47PL == 0) +#define MG45_17PL ~(1 << 6) +#else +#define MG45_17PL 0xFFFF +#endif +#if (G48PL >= G45PL) || (G48PL == 0) +#define MG45_18PL ~(1 << 7) +#else +#define MG45_18PL 0xFFFF +#endif +#define MG45_15PL 0x00EF +#define MG45 (MG45_11PL & MG45_12PL & MG45_13PL & MG45_14PL & \ + MG45_15PL & MG45_16PL & MG45_17PL & MG45_18PL) +// End of MG45: + +// Beginning of MG46: +#if (G41PL >= G46PL) || (G41PL == 0) +#define MG46_11PL ~(1) +#else +#define MG46_11PL 0xFFFF +#endif +#if (G42PL >= G46PL) || (G42PL == 0) +#define MG46_12PL ~(1 << 1) +#else +#define MG46_12PL 0xFFFF +#endif +#if (G43PL >= G46PL) || (G43PL == 0) +#define MG46_13PL ~(1 << 2) +#else +#define MG46_13PL 0xFFFF +#endif +#if (G44PL >= G46PL) || (G44PL == 0) +#define MG46_14PL ~(1 << 3) +#else +#define MG46_14PL 0xFFFF +#endif +#if (G45PL >= G46PL) || (G45PL == 0) +#define MG46_15PL ~(1 << 4) +#else +#define MG46_15PL 0xFFFF +#endif +#if (G47PL >= G46PL) || (G47PL == 0) +#define MG46_17PL ~(1 << 6) +#else +#define MG46_17PL 0xFFFF +#endif +#if (G48PL >= G46PL) || (G48PL == 0) +#define MG46_18PL ~(1 << 7) +#else +#define MG46_18PL 0xFFFF +#endif +#define MG46_16PL 0x00DF +#define MG46 (MG46_11PL & MG46_12PL & MG46_13PL & MG46_14PL & \ + MG46_15PL & MG46_16PL & MG46_17PL & MG46_18PL) +// End of MG46: + +// Beginning of MG47: +#if (G41PL >= G47PL) || (G41PL == 0) +#define MG47_11PL ~(1) +#else +#define MG47_11PL 0xFFFF +#endif +#if (G42PL >= G47PL) || (G42PL == 0) +#define MG47_12PL ~(1 << 1) +#else +#define MG47_12PL 0xFFFF +#endif +#if (G43PL >= G47PL) || (G43PL == 0) +#define MG47_13PL ~(1 << 2) +#else +#define MG47_13PL 0xFFFF +#endif +#if (G44PL >= G47PL) || (G44PL == 0) +#define MG47_14PL ~(1 << 3) +#else +#define MG47_14PL 0xFFFF +#endif +#if (G45PL >= G47PL) || (G45PL == 0) +#define MG47_15PL ~(1 << 4) +#else +#define MG47_15PL 0xFFFF +#endif +#if (G46PL >= G47PL) || (G46PL == 0) +#define MG47_16PL ~(1 << 5) +#else +#define MG47_16PL 0xFFFF +#endif +#if (G48PL >= G47PL) || (G48PL == 0) +#define MG47_18PL ~(1 << 7) +#else +#define MG47_18PL 0xFFFF +#endif +#define MG47_17PL 0x00BF +#define MG47 (MG47_11PL & MG47_12PL & MG47_13PL & MG47_14PL & \ + MG47_15PL & MG47_16PL & MG47_17PL & MG47_18PL) +// End of MG47: + +// Beginning of MG48: +#if (G41PL >= G48PL) || (G41PL == 0) +#define MG48_11PL ~(1) +#else +#define MG48_11PL 0xFFFF +#endif +#if (G42PL >= G48PL) || (G42PL == 0) +#define MG48_12PL ~(1 << 1) +#else +#define MG48_12PL 0xFFFF +#endif +#if (G43PL >= G48PL) || (G43PL == 0) +#define MG48_13PL ~(1 << 2) +#else +#define MG48_13PL 0xFFFF +#endif +#if (G44PL >= G48PL) || (G44PL == 0) +#define MG48_14PL ~(1 << 3) +#else +#define MG48_14PL 0xFFFF +#endif +#if (G45PL >= G48PL) || (G45PL == 0) +#define MG48_15PL ~(1 << 4) +#else +#define MG48_15PL 0xFFFF +#endif +#if (G46PL >= G48PL) || (G46PL == 0) +#define MG48_16PL ~(1 << 5) +#else +#define MG48_16PL 0xFFFF +#endif +#if (G47PL >= G48PL) || (G47PL == 0) +#define MG48_17PL ~(1 << 6) +#else +#define MG48_17PL 0xFFFF +#endif +#define MG48_18PL 0x007F +#define MG48 (MG48_11PL & MG48_12PL & MG48_13PL & MG48_14PL & \ + MG48_15PL & MG48_16PL & MG48_17PL & MG48_18PL) +// End of MG48: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG51 to MG58: +// + +// Beginning of MG51: +#if (G52PL >= G51PL) || (G52PL == 0) +#define MG51_12PL ~(1 << 1) +#else +#define MG51_12PL 0xFFFF +#endif +#if (G53PL >= G51PL) || (G53PL == 0) +#define MG51_13PL ~(1 << 2) +#else +#define MG51_13PL 0xFFFF +#endif +#if (G54PL >= G51PL) || (G54PL == 0) +#define MG51_14PL ~(1 << 3) +#else +#define MG51_14PL 0xFFFF +#endif +#if (G55PL >= G51PL) || (G55PL == 0) +#define MG51_15PL ~(1 << 4) +#else +#define MG51_15PL 0xFFFF +#endif +#if (G56PL >= G51PL) || (G56PL == 0) +#define MG51_16PL ~(1 << 5) +#else +#define MG51_16PL 0xFFFF +#endif +#if (G57PL >= G51PL) || (G57PL == 0) +#define MG51_17PL ~(1 << 6) +#else +#define MG51_17PL 0xFFFF +#endif +#if (G58PL >= G51PL) || (G58PL == 0) +#define MG51_18PL ~(1 << 7) +#else +#define MG51_18PL 0xFFFF +#endif +#define MG51_11PL 0x00FE +#define MG51 (MG51_11PL & MG51_12PL & MG51_13PL & MG51_14PL & \ + MG51_15PL & MG51_16PL & MG51_17PL & MG51_18PL) +// End of MG51: + +// Beginning of MG52: +#if (G51PL >= G52PL) || (G51PL == 0) +#define MG52_11PL ~(1) +#else +#define MG52_11PL 0xFFFF +#endif +#if (G53PL >= G52PL) || (G53PL == 0) +#define MG52_13PL ~(1 << 2) +#else +#define MG52_13PL 0xFFFF +#endif +#if (G54PL >= G52PL) || (G54PL == 0) +#define MG52_14PL ~(1 << 3) +#else +#define MG52_14PL 0xFFFF +#endif +#if (G55PL >= G52PL) || (G55PL == 0) +#define MG52_15PL ~(1 << 4) +#else +#define MG52_15PL 0xFFFF +#endif +#if (G56PL >= G52PL) || (G56PL == 0) +#define MG52_16PL ~(1 << 5) +#else +#define MG52_16PL 0xFFFF +#endif +#if (G57PL >= G52PL) || (G57PL == 0) +#define MG52_17PL ~(1 << 6) +#else +#define MG52_17PL 0xFFFF +#endif +#if (G58PL >= G52PL) || (G58PL == 0) +#define MG52_18PL ~(1 << 7) +#else +#define MG52_18PL 0xFFFF +#endif +#define MG52_12PL 0x00FD +#define MG52 (MG52_11PL & MG52_12PL & MG52_13PL & MG52_14PL & \ + MG52_15PL & MG52_16PL & MG52_17PL & MG52_18PL) +// End of MG52: + +// Beginning of MG53: +#if (G51PL >= G53PL) || (G51PL == 0) +#define MG53_11PL ~(1) +#else +#define MG53_11PL 0xFFFF +#endif +#if (G52PL >= G53PL) || (G52PL == 0) +#define MG53_12PL ~(1 << 1) +#else +#define MG53_12PL 0xFFFF +#endif +#if (G54PL >= G53PL) || (G54PL == 0) +#define MG53_14PL ~(1 << 3) +#else +#define MG53_14PL 0xFFFF +#endif +#if (G55PL >= G53PL) || (G55PL == 0) +#define MG53_15PL ~(1 << 4) +#else +#define MG53_15PL 0xFFFF +#endif +#if (G56PL >= G53PL) || (G56PL == 0) +#define MG53_16PL ~(1 << 5) +#else +#define MG53_16PL 0xFFFF +#endif +#if (G57PL >= G53PL) || (G57PL == 0) +#define MG53_17PL ~(1 << 6) +#else +#define MG53_17PL 0xFFFF +#endif +#if (G58PL >= G53PL) || (G58PL == 0) +#define MG53_18PL ~(1 << 7) +#else +#define MG53_18PL 0xFFFF +#endif +#define MG53_13PL 0x00FB +#define MG53 (MG53_11PL & MG53_12PL & MG53_13PL & MG53_14PL & \ + MG53_15PL & MG53_16PL & MG53_17PL & MG53_18PL) +// End of MG53: + +// Beginning of MG54: +#if (G51PL >= G54PL) || (G51PL == 0) +#define MG54_11PL ~(1) +#else +#define MG54_11PL 0xFFFF +#endif +#if (G52PL >= G54PL) || (G52PL == 0) +#define MG54_12PL ~(1 << 1) +#else +#define MG54_12PL 0xFFFF +#endif +#if (G53PL >= G54PL) || (G53PL == 0) +#define MG54_13PL ~(1 << 2) +#else +#define MG54_13PL 0xFFFF +#endif +#if (G55PL >= G54PL) || (G55PL == 0) +#define MG54_15PL ~(1 << 4) +#else +#define MG54_15PL 0xFFFF +#endif +#if (G56PL >= G54PL) || (G56PL == 0) +#define MG54_16PL ~(1 << 5) +#else +#define MG54_16PL 0xFFFF +#endif +#if (G57PL >= G54PL) || (G57PL == 0) +#define MG54_17PL ~(1 << 6) +#else +#define MG54_17PL 0xFFFF +#endif +#if (G58PL >= G54PL) || (G58PL == 0) +#define MG54_18PL ~(1 << 7) +#else +#define MG54_18PL 0xFFFF +#endif +#define MG54_14PL 0x00F7 +#define MG54 (MG54_11PL & MG54_12PL & MG54_13PL & MG54_14PL & \ + MG54_15PL & MG54_16PL & MG54_17PL & MG54_18PL) +// End of MG54: + +// Beginning of MG55: +#if (G51PL >= G55PL) || (G51PL == 0) +#define MG55_11PL ~(1) +#else +#define MG55_11PL 0xFFFF +#endif +#if (G52PL >= G55PL) || (G52PL == 0) +#define MG55_12PL ~(1 << 1) +#else +#define MG55_12PL 0xFFFF +#endif +#if (G53PL >= G55PL) || (G53PL == 0) +#define MG55_13PL ~(1 << 2) +#else +#define MG55_13PL 0xFFFF +#endif +#if (G54PL >= G55PL) || (G54PL == 0) +#define MG55_14PL ~(1 << 3) +#else +#define MG55_14PL 0xFFFF +#endif +#if (G56PL >= G55PL) || (G56PL == 0) +#define MG55_16PL ~(1 << 5) +#else +#define MG55_16PL 0xFFFF +#endif +#if (G57PL >= G55PL) || (G57PL == 0) +#define MG55_17PL ~(1 << 6) +#else +#define MG55_17PL 0xFFFF +#endif +#if (G58PL >= G55PL) || (G58PL == 0) +#define MG55_18PL ~(1 << 7) +#else +#define MG55_18PL 0xFFFF +#endif +#define MG55_15PL 0x00EF +#define MG55 (MG55_11PL & MG55_12PL & MG55_13PL & MG55_14PL & \ + MG55_15PL & MG55_16PL & MG55_17PL & MG55_18PL) +// End of MG55: + +// Beginning of MG56: +#if (G51PL >= G56PL) || (G51PL == 0) +#define MG56_11PL ~(1) +#else +#define MG56_11PL 0xFFFF +#endif +#if (G52PL >= G56PL) || (G52PL == 0) +#define MG56_12PL ~(1 << 1) +#else +#define MG56_12PL 0xFFFF +#endif +#if (G53PL >= G56PL) || (G53PL == 0) +#define MG56_13PL ~(1 << 2) +#else +#define MG56_13PL 0xFFFF +#endif +#if (G54PL >= G56PL) || (G54PL == 0) +#define MG56_14PL ~(1 << 3) +#else +#define MG56_14PL 0xFFFF +#endif +#if (G55PL >= G56PL) || (G55PL == 0) +#define MG56_15PL ~(1 << 4) +#else +#define MG56_15PL 0xFFFF +#endif +#if (G57PL >= G56PL) || (G57PL == 0) +#define MG56_17PL ~(1 << 6) +#else +#define MG56_17PL 0xFFFF +#endif +#if (G58PL >= G56PL) || (G58PL == 0) +#define MG56_18PL ~(1 << 7) +#else +#define MG56_18PL 0xFFFF +#endif +#define MG56_16PL 0x00DF +#define MG56 (MG56_11PL & MG56_12PL & MG56_13PL & MG56_14PL & \ + MG56_15PL & MG56_16PL & MG56_17PL & MG56_18PL) +// End of MG56: + +// Beginning of MG57: +#if (G51PL >= G57PL) || (G51PL == 0) +#define MG57_11PL ~(1) +#else +#define MG57_11PL 0xFFFF +#endif +#if (G52PL >= G57PL) || (G52PL == 0) +#define MG57_12PL ~(1 << 1) +#else +#define MG57_12PL 0xFFFF +#endif +#if (G53PL >= G57PL) || (G53PL == 0) +#define MG57_13PL ~(1 << 2) +#else +#define MG57_13PL 0xFFFF +#endif +#if (G54PL >= G57PL) || (G54PL == 0) +#define MG57_14PL ~(1 << 3) +#else +#define MG57_14PL 0xFFFF +#endif +#if (G55PL >= G57PL) || (G55PL == 0) +#define MG57_15PL ~(1 << 4) +#else +#define MG57_15PL 0xFFFF +#endif +#if (G56PL >= G57PL) || (G56PL == 0) +#define MG57_16PL ~(1 << 5) +#else +#define MG57_16PL 0xFFFF +#endif +#if (G58PL >= G57PL) || (G58PL == 0) +#define MG57_18PL ~(1 << 7) +#else +#define MG57_18PL 0xFFFF +#endif +#define MG57_17PL 0x00BF +#define MG57 (MG57_11PL & MG57_12PL & MG57_13PL & MG57_14PL & \ + MG57_15PL & MG57_16PL & MG57_17PL & MG57_18PL) +// End of MG57: + +// Beginning of MG58: +#if (G51PL >= G58PL) || (G51PL == 0) +#define MG58_11PL ~(1) +#else +#define MG58_11PL 0xFFFF +#endif +#if (G52PL >= G58PL) || (G52PL == 0) +#define MG58_12PL ~(1 << 1) +#else +#define MG58_12PL 0xFFFF +#endif +#if (G53PL >= G58PL) || (G53PL == 0) +#define MG58_13PL ~(1 << 2) +#else +#define MG58_13PL 0xFFFF +#endif +#if (G54PL >= G58PL) || (G54PL == 0) +#define MG58_14PL ~(1 << 3) +#else +#define MG58_14PL 0xFFFF +#endif +#if (G55PL >= G58PL) || (G55PL == 0) +#define MG58_15PL ~(1 << 4) +#else +#define MG58_15PL 0xFFFF +#endif +#if (G56PL >= G58PL) || (G56PL == 0) +#define MG58_16PL ~(1 << 5) +#else +#define MG58_16PL 0xFFFF +#endif +#if (G57PL >= G58PL) || (G57PL == 0) +#define MG58_17PL ~(1 << 6) +#else +#define MG58_17PL 0xFFFF +#endif +#define MG58_18PL 0x007F +#define MG58 (MG58_11PL & MG58_12PL & MG58_13PL & MG58_14PL & \ + MG58_15PL & MG58_16PL & MG58_17PL & MG58_18PL) +// End of MG58: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG61 to MG68: +// + +// Beginning of MG61: +#if (G62PL >= G61PL) || (G62PL == 0) +#define MG61_12PL ~(1 << 1) +#else +#define MG61_12PL 0xFFFF +#endif +#if (G63PL >= G61PL) || (G63PL == 0) +#define MG61_13PL ~(1 << 2) +#else +#define MG61_13PL 0xFFFF +#endif +#if (G64PL >= G61PL) || (G64PL == 0) +#define MG61_14PL ~(1 << 3) +#else +#define MG61_14PL 0xFFFF +#endif +#if (G65PL >= G61PL) || (G65PL == 0) +#define MG61_15PL ~(1 << 4) +#else +#define MG61_15PL 0xFFFF +#endif +#if (G66PL >= G61PL) || (G66PL == 0) +#define MG61_16PL ~(1 << 5) +#else +#define MG61_16PL 0xFFFF +#endif +#if (G67PL >= G61PL) || (G67PL == 0) +#define MG61_17PL ~(1 << 6) +#else +#define MG61_17PL 0xFFFF +#endif +#if (G68PL >= G61PL) || (G68PL == 0) +#define MG61_18PL ~(1 << 7) +#else +#define MG61_18PL 0xFFFF +#endif +#define MG61_11PL 0x00FE +#define MG61 (MG61_11PL & MG61_12PL & MG61_13PL & MG61_14PL & \ + MG61_15PL & MG61_16PL & MG61_17PL & MG61_18PL) +// End of MG61: + +// Beginning of MG62: +#if (G61PL >= G62PL) || (G61PL == 0) +#define MG62_11PL ~(1) +#else +#define MG62_11PL 0xFFFF +#endif +#if (G63PL >= G62PL) || (G63PL == 0) +#define MG62_13PL ~(1 << 2) +#else +#define MG62_13PL 0xFFFF +#endif +#if (G64PL >= G62PL) || (G64PL == 0) +#define MG62_14PL ~(1 << 3) +#else +#define MG62_14PL 0xFFFF +#endif +#if (G65PL >= G62PL) || (G65PL == 0) +#define MG62_15PL ~(1 << 4) +#else +#define MG62_15PL 0xFFFF +#endif +#if (G66PL >= G62PL) || (G66PL == 0) +#define MG62_16PL ~(1 << 5) +#else +#define MG62_16PL 0xFFFF +#endif +#if (G67PL >= G62PL) || (G67PL == 0) +#define MG62_17PL ~(1 << 6) +#else +#define MG62_17PL 0xFFFF +#endif +#if (G68PL >= G62PL) || (G68PL == 0) +#define MG62_18PL ~(1 << 7) +#else +#define MG62_18PL 0xFFFF +#endif +#define MG62_12PL 0x00FD +#define MG62 (MG62_11PL & MG62_12PL & MG62_13PL & MG62_14PL & \ + MG62_15PL & MG62_16PL & MG62_17PL & MG62_18PL) +// End of MG62: + +// Beginning of MG63: +#if (G61PL >= G63PL) || (G61PL == 0) +#define MG63_11PL ~(1) +#else +#define MG63_11PL 0xFFFF +#endif +#if (G62PL >= G63PL) || (G62PL == 0) +#define MG63_12PL ~(1 << 1) +#else +#define MG63_12PL 0xFFFF +#endif +#if (G64PL >= G63PL) || (G64PL == 0) +#define MG63_14PL ~(1 << 3) +#else +#define MG63_14PL 0xFFFF +#endif +#if (G65PL >= G63PL) || (G65PL == 0) +#define MG63_15PL ~(1 << 4) +#else +#define MG63_15PL 0xFFFF +#endif +#if (G66PL >= G63PL) || (G66PL == 0) +#define MG63_16PL ~(1 << 5) +#else +#define MG63_16PL 0xFFFF +#endif +#if (G67PL >= G63PL) || (G67PL == 0) +#define MG63_17PL ~(1 << 6) +#else +#define MG63_17PL 0xFFFF +#endif +#if (G68PL >= G63PL) || (G68PL == 0) +#define MG63_18PL ~(1 << 7) +#else +#define MG63_18PL 0xFFFF +#endif +#define MG63_13PL 0x00FB +#define MG63 (MG63_11PL & MG63_12PL & MG63_13PL & MG63_14PL & \ + MG63_15PL & MG63_16PL & MG63_17PL & MG63_18PL) +// End of MG63: + +// Beginning of MG64: +#if (G61PL >= G64PL) || (G61PL == 0) +#define MG64_11PL ~(1) +#else +#define MG64_11PL 0xFFFF +#endif +#if (G62PL >= G64PL) || (G62PL == 0) +#define MG64_12PL ~(1 << 1) +#else +#define MG64_12PL 0xFFFF +#endif +#if (G63PL >= G64PL) || (G63PL == 0) +#define MG64_13PL ~(1 << 2) +#else +#define MG64_13PL 0xFFFF +#endif +#if (G65PL >= G64PL) || (G65PL == 0) +#define MG64_15PL ~(1 << 4) +#else +#define MG64_15PL 0xFFFF +#endif +#if (G66PL >= G64PL) || (G66PL == 0) +#define MG64_16PL ~(1 << 5) +#else +#define MG64_16PL 0xFFFF +#endif +#if (G67PL >= G64PL) || (G67PL == 0) +#define MG64_17PL ~(1 << 6) +#else +#define MG64_17PL 0xFFFF +#endif +#if (G68PL >= G64PL) || (G68PL == 0) +#define MG64_18PL ~(1 << 7) +#else +#define MG64_18PL 0xFFFF +#endif +#define MG64_14PL 0x00F7 +#define MG64 (MG64_11PL & MG64_12PL & MG64_13PL & MG64_14PL & \ + MG64_15PL & MG64_16PL & MG64_17PL & MG64_18PL) +// End of MG64: + +// Beginning of MG65: +#if (G61PL >= G65PL) || (G61PL == 0) +#define MG65_11PL ~(1) +#else +#define MG65_11PL 0xFFFF +#endif +#if (G62PL >= G65PL) || (G62PL == 0) +#define MG65_12PL ~(1 << 1) +#else +#define MG65_12PL 0xFFFF +#endif +#if (G63PL >= G65PL) || (G63PL == 0) +#define MG65_13PL ~(1 << 2) +#else +#define MG65_13PL 0xFFFF +#endif +#if (G64PL >= G65PL) || (G64PL == 0) +#define MG65_14PL ~(1 << 3) +#else +#define MG65_14PL 0xFFFF +#endif +#if (G66PL >= G65PL) || (G66PL == 0) +#define MG65_16PL ~(1 << 5) +#else +#define MG65_16PL 0xFFFF +#endif +#if (G67PL >= G65PL) || (G67PL == 0) +#define MG65_17PL ~(1 << 6) +#else +#define MG65_17PL 0xFFFF +#endif +#if (G68PL >= G65PL) || (G68PL == 0) +#define MG65_18PL ~(1 << 7) +#else +#define MG65_18PL 0xFFFF +#endif +#define MG65_15PL 0x00EF +#define MG65 (MG65_11PL & MG65_12PL & MG65_13PL & MG65_14PL & \ + MG65_15PL & MG65_16PL & MG65_17PL & MG65_18PL) +// End of MG65: + +// Beginning of MG66: +#if (G61PL >= G66PL) || (G61PL == 0) +#define MG66_11PL ~(1) +#else +#define MG66_11PL 0xFFFF +#endif +#if (G62PL >= G66PL) || (G62PL == 0) +#define MG66_12PL ~(1 << 1) +#else +#define MG66_12PL 0xFFFF +#endif +#if (G63PL >= G66PL) || (G63PL == 0) +#define MG66_13PL ~(1 << 2) +#else +#define MG66_13PL 0xFFFF +#endif +#if (G64PL >= G66PL) || (G64PL == 0) +#define MG66_14PL ~(1 << 3) +#else +#define MG66_14PL 0xFFFF +#endif +#if (G65PL >= G66PL) || (G65PL == 0) +#define MG66_15PL ~(1 << 4) +#else +#define MG66_15PL 0xFFFF +#endif +#if (G67PL >= G66PL) || (G67PL == 0) +#define MG66_17PL ~(1 << 6) +#else +#define MG66_17PL 0xFFFF +#endif +#if (G68PL >= G66PL) || (G68PL == 0) +#define MG66_18PL ~(1 << 7) +#else +#define MG66_18PL 0xFFFF +#endif +#define MG66_16PL 0x00DF +#define MG66 (MG66_11PL & MG66_12PL & MG66_13PL & MG66_14PL & \ + MG66_15PL & MG66_16PL & MG66_17PL & MG66_18PL) +// End of MG66: + +// Beginning of MG67: +#if (G61PL >= G67PL) || (G61PL == 0) +#define MG67_11PL ~(1) +#else +#define MG67_11PL 0xFFFF +#endif +#if (G62PL >= G67PL) || (G62PL == 0) +#define MG67_12PL ~(1 << 1) +#else +#define MG67_12PL 0xFFFF +#endif +#if (G63PL >= G67PL) || (G63PL == 0) +#define MG67_13PL ~(1 << 2) +#else +#define MG67_13PL 0xFFFF +#endif +#if (G64PL >= G67PL) || (G64PL == 0) +#define MG67_14PL ~(1 << 3) +#else +#define MG67_14PL 0xFFFF +#endif +#if (G65PL >= G67PL) || (G65PL == 0) +#define MG67_15PL ~(1 << 4) +#else +#define MG67_15PL 0xFFFF +#endif +#if (G66PL >= G67PL) || (G66PL == 0) +#define MG67_16PL ~(1 << 5) +#else +#define MG67_16PL 0xFFFF +#endif +#if (G68PL >= G67PL) || (G68PL == 0) +#define MG67_18PL ~(1 << 7) +#else +#define MG67_18PL 0xFFFF +#endif +#define MG67_17PL 0x00BF +#define MG67 (MG67_11PL & MG67_12PL & MG67_13PL & MG67_14PL & \ + MG67_15PL & MG67_16PL & MG67_17PL & MG67_18PL) +// End of MG67: + +// Beginning of MG68: +#if (G61PL >= G68PL) || (G61PL == 0) +#define MG68_11PL ~(1) +#else +#define MG68_11PL 0xFFFF +#endif +#if (G62PL >= G68PL) || (G62PL == 0) +#define MG68_12PL ~(1 << 1) +#else +#define MG68_12PL 0xFFFF +#endif +#if (G63PL >= G68PL) || (G63PL == 0) +#define MG68_13PL ~(1 << 2) +#else +#define MG68_13PL 0xFFFF +#endif +#if (G64PL >= G68PL) || (G64PL == 0) +#define MG68_14PL ~(1 << 3) +#else +#define MG68_14PL 0xFFFF +#endif +#if (G65PL >= G68PL) || (G65PL == 0) +#define MG68_15PL ~(1 << 4) +#else +#define MG68_15PL 0xFFFF +#endif +#if (G66PL >= G68PL) || (G66PL == 0) +#define MG68_16PL ~(1 << 5) +#else +#define MG68_16PL 0xFFFF +#endif +#if (G67PL >= G68PL) || (G67PL == 0) +#define MG68_17PL ~(1 << 6) +#else +#define MG68_17PL 0xFFFF +#endif +#define MG68_18PL 0x007F +#define MG68 (MG68_11PL & MG68_12PL & MG68_13PL & MG68_14PL & \ + MG68_15PL & MG68_16PL & MG68_17PL & MG68_18PL) +// End of MG68: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG71 to MG78: +// + +// Beginning of MG71: +#if (G72PL >= G71PL) || (G72PL == 0) +#define MG71_12PL ~(1 << 1) +#else +#define MG71_12PL 0xFFFF +#endif +#if (G73PL >= G71PL) || (G73PL == 0) +#define MG71_13PL ~(1 << 2) +#else +#define MG71_13PL 0xFFFF +#endif +#if (G74PL >= G71PL) || (G74PL == 0) +#define MG71_14PL ~(1 << 3) +#else +#define MG71_14PL 0xFFFF +#endif +#if (G75PL >= G71PL) || (G75PL == 0) +#define MG71_15PL ~(1 << 4) +#else +#define MG71_15PL 0xFFFF +#endif +#if (G76PL >= G71PL) || (G76PL == 0) +#define MG71_16PL ~(1 << 5) +#else +#define MG71_16PL 0xFFFF +#endif +#if (G77PL >= G71PL) || (G77PL == 0) +#define MG71_17PL ~(1 << 6) +#else +#define MG71_17PL 0xFFFF +#endif +#if (G78PL >= G71PL) || (G78PL == 0) +#define MG71_18PL ~(1 << 7) +#else +#define MG71_18PL 0xFFFF +#endif +#define MG71_11PL 0x00FE +#define MG71 (MG71_11PL & MG71_12PL & MG71_13PL & MG71_14PL & \ + MG71_15PL & MG71_16PL & MG71_17PL & MG71_18PL) +// End of MG71: + +// Beginning of MG72: +#if (G71PL >= G72PL) || (G71PL == 0) +#define MG72_11PL ~(1) +#else +#define MG72_11PL 0xFFFF +#endif +#if (G73PL >= G72PL) || (G73PL == 0) +#define MG72_13PL ~(1 << 2) +#else +#define MG72_13PL 0xFFFF +#endif +#if (G74PL >= G72PL) || (G74PL == 0) +#define MG72_14PL ~(1 << 3) +#else +#define MG72_14PL 0xFFFF +#endif +#if (G75PL >= G72PL) || (G75PL == 0) +#define MG72_15PL ~(1 << 4) +#else +#define MG72_15PL 0xFFFF +#endif +#if (G76PL >= G72PL) || (G76PL == 0) +#define MG72_16PL ~(1 << 5) +#else +#define MG72_16PL 0xFFFF +#endif +#if (G77PL >= G72PL) || (G77PL == 0) +#define MG72_17PL ~(1 << 6) +#else +#define MG72_17PL 0xFFFF +#endif +#if (G78PL >= G72PL) || (G78PL == 0) +#define MG72_18PL ~(1 << 7) +#else +#define MG72_18PL 0xFFFF +#endif +#define MG72_12PL 0x00FD +#define MG72 (MG72_11PL & MG72_12PL & MG72_13PL & MG72_14PL & \ + MG72_15PL & MG72_16PL & MG72_17PL & MG72_18PL) +// End of MG72: + +// Beginning of MG73: +#if (G71PL >= G73PL) || (G71PL == 0) +#define MG73_11PL ~(1) +#else +#define MG73_11PL 0xFFFF +#endif +#if (G72PL >= G73PL) || (G72PL == 0) +#define MG73_12PL ~(1 << 1) +#else +#define MG73_12PL 0xFFFF +#endif +#if (G74PL >= G73PL) || (G74PL == 0) +#define MG73_14PL ~(1 << 3) +#else +#define MG73_14PL 0xFFFF +#endif +#if (G75PL >= G73PL) || (G75PL == 0) +#define MG73_15PL ~(1 << 4) +#else +#define MG73_15PL 0xFFFF +#endif +#if (G76PL >= G73PL) || (G76PL == 0) +#define MG73_16PL ~(1 << 5) +#else +#define MG73_16PL 0xFFFF +#endif +#if (G77PL >= G73PL) || (G77PL == 0) +#define MG73_17PL ~(1 << 6) +#else +#define MG73_17PL 0xFFFF +#endif +#if (G78PL >= G73PL) || (G78PL == 0) +#define MG73_18PL ~(1 << 7) +#else +#define MG73_18PL 0xFFFF +#endif +#define MG73_13PL 0x00FB +#define MG73 (MG73_11PL & MG73_12PL & MG73_13PL & MG73_14PL & \ + MG73_15PL & MG73_16PL & MG73_17PL & MG73_18PL) +// End of MG73: + +// Beginning of MG74: +#if (G71PL >= G74PL) || (G71PL == 0) +#define MG74_11PL ~(1) +#else +#define MG74_11PL 0xFFFF +#endif +#if (G72PL >= G74PL) || (G72PL == 0) +#define MG74_12PL ~(1 << 1) +#else +#define MG74_12PL 0xFFFF +#endif +#if (G73PL >= G74PL) || (G73PL == 0) +#define MG74_13PL ~(1 << 2) +#else +#define MG74_13PL 0xFFFF +#endif +#if (G75PL >= G74PL) || (G75PL == 0) +#define MG74_15PL ~(1 << 4) +#else +#define MG74_15PL 0xFFFF +#endif +#if (G76PL >= G74PL) || (G76PL == 0) +#define MG74_16PL ~(1 << 5) +#else +#define MG74_16PL 0xFFFF +#endif +#if (G77PL >= G74PL) || (G77PL == 0) +#define MG74_17PL ~(1 << 6) +#else +#define MG74_17PL 0xFFFF +#endif +#if (G78PL >= G74PL) || (G78PL == 0) +#define MG74_18PL ~(1 << 7) +#else +#define MG74_18PL 0xFFFF +#endif +#define MG74_14PL 0x00F7 +#define MG74 (MG74_11PL & MG74_12PL & MG74_13PL & MG74_14PL & \ + MG74_15PL & MG74_16PL & MG74_17PL & MG74_18PL) +// End of MG74: + +// Beginning of MG75: +#if (G71PL >= G75PL) || (G71PL == 0) +#define MG75_11PL ~(1) +#else +#define MG75_11PL 0xFFFF +#endif +#if (G72PL >= G75PL) || (G72PL == 0) +#define MG75_12PL ~(1 << 1) +#else +#define MG75_12PL 0xFFFF +#endif +#if (G73PL >= G75PL) || (G73PL == 0) +#define MG75_13PL ~(1 << 2) +#else +#define MG75_13PL 0xFFFF +#endif +#if (G74PL >= G75PL) || (G74PL == 0) +#define MG75_14PL ~(1 << 3) +#else +#define MG75_14PL 0xFFFF +#endif +#if (G76PL >= G75PL) || (G76PL == 0) +#define MG75_16PL ~(1 << 5) +#else +#define MG75_16PL 0xFFFF +#endif +#if (G77PL >= G75PL) || (G77PL == 0) +#define MG75_17PL ~(1 << 6) +#else +#define MG75_17PL 0xFFFF +#endif +#if (G78PL >= G75PL) || (G78PL == 0) +#define MG75_18PL ~(1 << 7) +#else +#define MG75_18PL 0xFFFF +#endif +#define MG75_15PL 0x00EF +#define MG75 (MG75_11PL & MG75_12PL & MG75_13PL & MG75_14PL & \ + MG75_15PL & MG75_16PL & MG75_17PL & MG75_18PL) +// End of MG75: + +// Beginning of MG76: +#if (G71PL >= G76PL) || (G71PL == 0) +#define MG76_11PL ~(1) +#else +#define MG76_11PL 0xFFFF +#endif +#if (G72PL >= G76PL) || (G72PL == 0) +#define MG76_12PL ~(1 << 1) +#else +#define MG76_12PL 0xFFFF +#endif +#if (G73PL >= G76PL) || (G73PL == 0) +#define MG76_13PL ~(1 << 2) +#else +#define MG76_13PL 0xFFFF +#endif +#if (G74PL >= G76PL) || (G74PL == 0) +#define MG76_14PL ~(1 << 3) +#else +#define MG76_14PL 0xFFFF +#endif +#if (G75PL >= G76PL) || (G75PL == 0) +#define MG76_15PL ~(1 << 4) +#else +#define MG76_15PL 0xFFFF +#endif +#if (G77PL >= G76PL) || (G77PL == 0) +#define MG76_17PL ~(1 << 6) +#else +#define MG76_17PL 0xFFFF +#endif +#if (G78PL >= G76PL) || (G78PL == 0) +#define MG76_18PL ~(1 << 7) +#else +#define MG76_18PL 0xFFFF +#endif +#define MG76_16PL 0x00DF +#define MG76 (MG76_11PL & MG76_12PL & MG76_13PL & MG76_14PL & \ + MG76_15PL & MG76_16PL & MG76_17PL & MG76_18PL) +// End of MG76: + +// Beginning of MG77: +#if (G71PL >= G77PL) || (G71PL == 0) +#define MG77_11PL ~(1) +#else +#define MG77_11PL 0xFFFF +#endif +#if (G72PL >= G77PL) || (G72PL == 0) +#define MG77_12PL ~(1 << 1) +#else +#define MG77_12PL 0xFFFF +#endif +#if (G73PL >= G77PL) || (G73PL == 0) +#define MG77_13PL ~(1 << 2) +#else +#define MG77_13PL 0xFFFF +#endif +#if (G74PL >= G77PL) || (G74PL == 0) +#define MG77_14PL ~(1 << 3) +#else +#define MG77_14PL 0xFFFF +#endif +#if (G75PL >= G77PL) || (G75PL == 0) +#define MG77_15PL ~(1 << 4) +#else +#define MG77_15PL 0xFFFF +#endif +#if (G76PL >= G77PL) || (G76PL == 0) +#define MG77_16PL ~(1 << 5) +#else +#define MG77_16PL 0xFFFF +#endif +#if (G78PL >= G77PL) || (G78PL == 0) +#define MG77_18PL ~(1 << 7) +#else +#define MG77_18PL 0xFFFF +#endif +#define MG77_17PL 0x00BF +#define MG77 (MG77_11PL & MG77_12PL & MG77_13PL & MG77_14PL & \ + MG77_15PL & MG77_16PL & MG77_17PL & MG77_18PL) +// End of MG77: + +// Beginning of MG78: +#if (G71PL >= G78PL) || (G71PL == 0) +#define MG78_11PL ~(1) +#else +#define MG78_11PL 0xFFFF +#endif +#if (G72PL >= G78PL) || (G72PL == 0) +#define MG78_12PL ~(1 << 1) +#else +#define MG78_12PL 0xFFFF +#endif +#if (G73PL >= G78PL) || (G73PL == 0) +#define MG78_13PL ~(1 << 2) +#else +#define MG78_13PL 0xFFFF +#endif +#if (G74PL >= G78PL) || (G74PL == 0) +#define MG78_14PL ~(1 << 3) +#else +#define MG78_14PL 0xFFFF +#endif +#if (G75PL >= G78PL) || (G75PL == 0) +#define MG78_15PL ~(1 << 4) +#else +#define MG78_15PL 0xFFFF +#endif +#if (G76PL >= G78PL) || (G76PL == 0) +#define MG78_16PL ~(1 << 5) +#else +#define MG78_16PL 0xFFFF +#endif +#if (G77PL >= G78PL) || (G77PL == 0) +#define MG78_17PL ~(1 << 6) +#else +#define MG78_17PL 0xFFFF +#endif +#define MG78_18PL 0x007F +#define MG78 (MG78_11PL & MG78_12PL & MG78_13PL & MG78_14PL & \ + MG78_15PL & MG78_16PL & MG78_17PL & MG78_18PL) +// End of MG78: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG81 to MG88: +// + +// Beginning of MG81: +#if (G82PL >= G81PL) || (G82PL == 0) +#define MG81_12PL ~(1 << 1) +#else +#define MG81_12PL 0xFFFF +#endif +#if (G83PL >= G81PL) || (G83PL == 0) +#define MG81_13PL ~(1 << 2) +#else +#define MG81_13PL 0xFFFF +#endif +#if (G84PL >= G81PL) || (G84PL == 0) +#define MG81_14PL ~(1 << 3) +#else +#define MG81_14PL 0xFFFF +#endif +#if (G85PL >= G81PL) || (G85PL == 0) +#define MG81_15PL ~(1 << 4) +#else +#define MG81_15PL 0xFFFF +#endif +#if (G86PL >= G81PL) || (G86PL == 0) +#define MG81_16PL ~(1 << 5) +#else +#define MG81_16PL 0xFFFF +#endif +#if (G87PL >= G81PL) || (G87PL == 0) +#define MG81_17PL ~(1 << 6) +#else +#define MG81_17PL 0xFFFF +#endif +#if (G88PL >= G81PL) || (G88PL == 0) +#define MG81_18PL ~(1 << 7) +#else +#define MG81_18PL 0xFFFF +#endif +#define MG81_11PL 0x00FE +#define MG81 (MG81_11PL & MG81_12PL & MG81_13PL & MG81_14PL & \ + MG81_15PL & MG81_16PL & MG81_17PL & MG81_18PL) +// End of MG81: + +// Beginning of MG82: +#if (G81PL >= G82PL) || (G81PL == 0) +#define MG82_11PL ~(1) +#else +#define MG82_11PL 0xFFFF +#endif +#if (G83PL >= G82PL) || (G83PL == 0) +#define MG82_13PL ~(1 << 2) +#else +#define MG82_13PL 0xFFFF +#endif +#if (G84PL >= G82PL) || (G84PL == 0) +#define MG82_14PL ~(1 << 3) +#else +#define MG82_14PL 0xFFFF +#endif +#if (G85PL >= G82PL) || (G85PL == 0) +#define MG82_15PL ~(1 << 4) +#else +#define MG82_15PL 0xFFFF +#endif +#if (G86PL >= G82PL) || (G86PL == 0) +#define MG82_16PL ~(1 << 5) +#else +#define MG82_16PL 0xFFFF +#endif +#if (G87PL >= G82PL) || (G87PL == 0) +#define MG82_17PL ~(1 << 6) +#else +#define MG82_17PL 0xFFFF +#endif +#if (G88PL >= G82PL) || (G88PL == 0) +#define MG82_18PL ~(1 << 7) +#else +#define MG82_18PL 0xFFFF +#endif +#define MG82_12PL 0x00FD +#define MG82 (MG82_11PL & MG82_12PL & MG82_13PL & MG82_14PL & \ + MG82_15PL & MG82_16PL & MG82_17PL & MG82_18PL) +// End of MG82: + +// Beginning of MG83: +#if (G81PL >= G83PL) || (G81PL == 0) +#define MG83_11PL ~(1) +#else +#define MG83_11PL 0xFFFF +#endif +#if (G82PL >= G83PL) || (G82PL == 0) +#define MG83_12PL ~(1 << 1) +#else +#define MG83_12PL 0xFFFF +#endif +#if (G84PL >= G83PL) || (G84PL == 0) +#define MG83_14PL ~(1 << 3) +#else +#define MG83_14PL 0xFFFF +#endif +#if (G85PL >= G83PL) || (G85PL == 0) +#define MG83_15PL ~(1 << 4) +#else +#define MG83_15PL 0xFFFF +#endif +#if (G86PL >= G83PL) || (G86PL == 0) +#define MG83_16PL ~(1 << 5) +#else +#define MG83_16PL 0xFFFF +#endif +#if (G87PL >= G83PL) || (G87PL == 0) +#define MG83_17PL ~(1 << 6) +#else +#define MG83_17PL 0xFFFF +#endif +#if (G88PL >= G83PL) || (G88PL == 0) +#define MG83_18PL ~(1 << 7) +#else +#define MG83_18PL 0xFFFF +#endif +#define MG83_13PL 0x00FB +#define MG83 (MG83_11PL & MG83_12PL & MG83_13PL & MG83_14PL & \ + MG83_15PL & MG83_16PL & MG83_17PL & MG83_18PL) +// End of MG83: + +// Beginning of MG84: +#if (G81PL >= G84PL) || (G81PL == 0) +#define MG84_11PL ~(1) +#else +#define MG84_11PL 0xFFFF +#endif +#if (G82PL >= G84PL) || (G82PL == 0) +#define MG84_12PL ~(1 << 1) +#else +#define MG84_12PL 0xFFFF +#endif +#if (G83PL >= G84PL) || (G83PL == 0) +#define MG84_13PL ~(1 << 2) +#else +#define MG84_13PL 0xFFFF +#endif +#if (G85PL >= G84PL) || (G85PL == 0) +#define MG84_15PL ~(1 << 4) +#else +#define MG84_15PL 0xFFFF +#endif +#if (G86PL >= G84PL) || (G86PL == 0) +#define MG84_16PL ~(1 << 5) +#else +#define MG84_16PL 0xFFFF +#endif +#if (G87PL >= G84PL) || (G87PL == 0) +#define MG84_17PL ~(1 << 6) +#else +#define MG84_17PL 0xFFFF +#endif +#if (G88PL >= G84PL) || (G88PL == 0) +#define MG84_18PL ~(1 << 7) +#else +#define MG84_18PL 0xFFFF +#endif +#define MG84_14PL 0x00F7 +#define MG84 (MG84_11PL & MG84_12PL & MG84_13PL & MG84_14PL & \ + MG84_15PL & MG84_16PL & MG84_17PL & MG84_18PL) +// End of MG84: + +// Beginning of MG85: +#if (G81PL >= G85PL) || (G81PL == 0) +#define MG85_11PL ~(1) +#else +#define MG85_11PL 0xFFFF +#endif +#if (G82PL >= G85PL) || (G82PL == 0) +#define MG85_12PL ~(1 << 1) +#else +#define MG85_12PL 0xFFFF +#endif +#if (G83PL >= G85PL) || (G83PL == 0) +#define MG85_13PL ~(1 << 2) +#else +#define MG85_13PL 0xFFFF +#endif +#if (G84PL >= G85PL) || (G84PL == 0) +#define MG85_14PL ~(1 << 3) +#else +#define MG85_14PL 0xFFFF +#endif +#if (G86PL >= G85PL) || (G86PL == 0) +#define MG85_16PL ~(1 << 5) +#else +#define MG85_16PL 0xFFFF +#endif +#if (G87PL >= G85PL) || (G87PL == 0) +#define MG85_17PL ~(1 << 6) +#else +#define MG85_17PL 0xFFFF +#endif +#if (G88PL >= G85PL) || (G88PL == 0) +#define MG85_18PL ~(1 << 7) +#else +#define MG85_18PL 0xFFFF +#endif +#define MG85_15PL 0x00EF +#define MG85 (MG85_11PL & MG85_12PL & MG85_13PL & MG85_14PL & \ + MG85_15PL & MG85_16PL & MG85_17PL & MG85_18PL) +// End of MG85: + +// Beginning of MG86: +#if (G81PL >= G86PL) || (G81PL == 0) +#define MG86_11PL ~(1) +#else +#define MG86_11PL 0xFFFF +#endif +#if (G82PL >= G86PL) || (G82PL == 0) +#define MG86_12PL ~(1 << 1) +#else +#define MG86_12PL 0xFFFF +#endif +#if (G83PL >= G86PL) || (G83PL == 0) +#define MG86_13PL ~(1 << 2) +#else +#define MG86_13PL 0xFFFF +#endif +#if (G84PL >= G86PL) || (G84PL == 0) +#define MG86_14PL ~(1 << 3) +#else +#define MG86_14PL 0xFFFF +#endif +#if (G85PL >= G86PL) || (G85PL == 0) +#define MG86_15PL ~(1 << 4) +#else +#define MG86_15PL 0xFFFF +#endif +#if (G87PL >= G86PL) || (G87PL == 0) +#define MG86_17PL ~(1 << 6) +#else +#define MG86_17PL 0xFFFF +#endif +#if (G88PL >= G86PL) || (G88PL == 0) +#define MG86_18PL ~(1 << 7) +#else +#define MG86_18PL 0xFFFF +#endif +#define MG86_16PL 0x00DF +#define MG86 (MG86_11PL & MG86_12PL & MG86_13PL & MG86_14PL & \ + MG86_15PL & MG86_16PL & MG86_17PL & MG86_18PL) +// End of MG86: + +// Beginning of MG87: +#if (G81PL >= G87PL) || (G81PL == 0) +#define MG87_11PL ~(1) +#else +#define MG87_11PL 0xFFFF +#endif +#if (G82PL >= G87PL) || (G82PL == 0) +#define MG87_12PL ~(1 << 1) +#else +#define MG87_12PL 0xFFFF +#endif +#if (G83PL >= G87PL) || (G83PL == 0) +#define MG87_13PL ~(1 << 2) +#else +#define MG87_13PL 0xFFFF +#endif +#if (G84PL >= G87PL) || (G84PL == 0) +#define MG87_14PL ~(1 << 3) +#else +#define MG87_14PL 0xFFFF +#endif +#if (G85PL >= G87PL) || (G85PL == 0) +#define MG87_15PL ~(1 << 4) +#else +#define MG87_15PL 0xFFFF +#endif +#if (G86PL >= G87PL) || (G86PL == 0) +#define MG87_16PL ~(1 << 5) +#else +#define MG87_16PL 0xFFFF +#endif +#if (G88PL >= G87PL) || (G88PL == 0) +#define MG87_18PL ~(1 << 7) +#else +#define MG87_18PL 0xFFFF +#endif +#define MG87_17PL 0x00BF +#define MG87 (MG87_11PL & MG87_12PL & MG87_13PL & MG87_14PL & \ + MG87_15PL & MG87_16PL & MG87_17PL & MG87_18PL) +// End of MG87: + +// Beginning of MG88: +#if (G81PL >= G88PL) || (G81PL == 0) +#define MG88_11PL ~(1) +#else +#define MG88_11PL 0xFFFF +#endif +#if (G82PL >= G88PL) || (G82PL == 0) +#define MG88_12PL ~(1 << 1) +#else +#define MG88_12PL 0xFFFF +#endif +#if (G83PL >= G88PL) || (G83PL == 0) +#define MG88_13PL ~(1 << 2) +#else +#define MG88_13PL 0xFFFF +#endif +#if (G84PL >= G88PL) || (G84PL == 0) +#define MG88_14PL ~(1 << 3) +#else +#define MG88_14PL 0xFFFF +#endif +#if (G85PL >= G88PL) || (G85PL == 0) +#define MG88_15PL ~(1 << 4) +#else +#define MG88_15PL 0xFFFF +#endif +#if (G86PL >= G88PL) || (G86PL == 0) +#define MG88_16PL ~(1 << 5) +#else +#define MG88_16PL 0xFFFF +#endif +#if (G87PL >= G88PL) || (G87PL == 0) +#define MG88_17PL ~(1 << 6) +#else +#define MG88_17PL 0xFFFF +#endif +#define MG88_18PL 0x007F +#define MG88 (MG88_11PL & MG88_12PL & MG88_13PL & MG88_14PL & \ + MG88_15PL & MG88_16PL & MG88_17PL & MG88_18PL) +// End of MG88: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG91 to MG98: +// + +// Beginning of MG91: +#if (G92PL >= G91PL) || (G92PL == 0) +#define MG91_12PL ~(1 << 1) +#else +#define MG91_12PL 0xFFFF +#endif +#if (G93PL >= G91PL) || (G93PL == 0) +#define MG91_13PL ~(1 << 2) +#else +#define MG91_13PL 0xFFFF +#endif +#if (G94PL >= G91PL) || (G94PL == 0) +#define MG91_14PL ~(1 << 3) +#else +#define MG91_14PL 0xFFFF +#endif +#if (G95PL >= G91PL) || (G95PL == 0) +#define MG91_15PL ~(1 << 4) +#else +#define MG91_15PL 0xFFFF +#endif +#if (G96PL >= G91PL) || (G96PL == 0) +#define MG91_16PL ~(1 << 5) +#else +#define MG91_16PL 0xFFFF +#endif +#if (G97PL >= G91PL) || (G97PL == 0) +#define MG91_17PL ~(1 << 6) +#else +#define MG91_17PL 0xFFFF +#endif +#if (G98PL >= G91PL) || (G98PL == 0) +#define MG91_18PL ~(1 << 7) +#else +#define MG91_18PL 0xFFFF +#endif +#define MG91_11PL 0x00FE +#define MG91 (MG91_11PL & MG91_12PL & MG91_13PL & MG91_14PL & \ + MG91_15PL & MG91_16PL & MG91_17PL & MG91_18PL) +// End of MG91: + +// Beginning of MG92: +#if (G91PL >= G92PL) || (G91PL == 0) +#define MG92_11PL ~(1) +#else +#define MG92_11PL 0xFFFF +#endif +#if (G93PL >= G92PL) || (G93PL == 0) +#define MG92_13PL ~(1 << 2) +#else +#define MG92_13PL 0xFFFF +#endif +#if (G94PL >= G92PL) || (G94PL == 0) +#define MG92_14PL ~(1 << 3) +#else +#define MG92_14PL 0xFFFF +#endif +#if (G95PL >= G92PL) || (G95PL == 0) +#define MG92_15PL ~(1 << 4) +#else +#define MG92_15PL 0xFFFF +#endif +#if (G96PL >= G92PL) || (G96PL == 0) +#define MG92_16PL ~(1 << 5) +#else +#define MG92_16PL 0xFFFF +#endif +#if (G97PL >= G92PL) || (G97PL == 0) +#define MG92_17PL ~(1 << 6) +#else +#define MG92_17PL 0xFFFF +#endif +#if (G98PL >= G92PL) || (G98PL == 0) +#define MG92_18PL ~(1 << 7) +#else +#define MG92_18PL 0xFFFF +#endif +#define MG92_12PL 0x00FD +#define MG92 (MG92_11PL & MG92_12PL & MG92_13PL & MG92_14PL & \ + MG92_15PL & MG92_16PL & MG92_17PL & MG92_18PL) +// End of MG92: + +// Beginning of MG93: +#if (G91PL >= G93PL) || (G91PL == 0) +#define MG93_11PL ~(1) +#else +#define MG93_11PL 0xFFFF +#endif +#if (G92PL >= G93PL) || (G92PL == 0) +#define MG93_12PL ~(1 << 1) +#else +#define MG93_12PL 0xFFFF +#endif +#if (G94PL >= G93PL) || (G94PL == 0) +#define MG93_14PL ~(1 << 3) +#else +#define MG93_14PL 0xFFFF +#endif +#if (G95PL >= G93PL) || (G95PL == 0) +#define MG93_15PL ~(1 << 4) +#else +#define MG93_15PL 0xFFFF +#endif +#if (G96PL >= G93PL) || (G96PL == 0) +#define MG93_16PL ~(1 << 5) +#else +#define MG93_16PL 0xFFFF +#endif +#if (G97PL >= G93PL) || (G97PL == 0) +#define MG93_17PL ~(1 << 6) +#else +#define MG93_17PL 0xFFFF +#endif +#if (G98PL >= G93PL) || (G98PL == 0) +#define MG93_18PL ~(1 << 7) +#else +#define MG93_18PL 0xFFFF +#endif +#define MG93_13PL 0x00FB +#define MG93 (MG93_11PL & MG93_12PL & MG93_13PL & MG93_14PL & \ + MG93_15PL & MG93_16PL & MG93_17PL & MG93_18PL) +// End of MG93: + +// Beginning of MG94: +#if (G91PL >= G94PL) || (G91PL == 0) +#define MG94_11PL ~(1) +#else +#define MG94_11PL 0xFFFF +#endif +#if (G92PL >= G94PL) || (G92PL == 0) +#define MG94_12PL ~(1 << 1) +#else +#define MG94_12PL 0xFFFF +#endif +#if (G93PL >= G94PL) || (G93PL == 0) +#define MG94_13PL ~(1 << 2) +#else +#define MG94_13PL 0xFFFF +#endif +#if (G95PL >= G94PL) || (G95PL == 0) +#define MG94_15PL ~(1 << 4) +#else +#define MG94_15PL 0xFFFF +#endif +#if (G96PL >= G94PL) || (G96PL == 0) +#define MG94_16PL ~(1 << 5) +#else +#define MG94_16PL 0xFFFF +#endif +#if (G97PL >= G94PL) || (G97PL == 0) +#define MG94_17PL ~(1 << 6) +#else +#define MG94_17PL 0xFFFF +#endif +#if (G98PL >= G94PL) || (G98PL == 0) +#define MG94_18PL ~(1 << 7) +#else +#define MG94_18PL 0xFFFF +#endif +#define MG94_14PL 0x00F7 +#define MG94 (MG94_11PL & MG94_12PL & MG94_13PL & MG94_14PL & \ + MG94_15PL & MG94_16PL & MG94_17PL & MG94_18PL) +// End of MG94: + +// Beginning of MG95: +#if (G91PL >= G95PL) || (G91PL == 0) +#define MG95_11PL ~(1) +#else +#define MG95_11PL 0xFFFF +#endif +#if (G92PL >= G95PL) || (G92PL == 0) +#define MG95_12PL ~(1 << 1) +#else +#define MG95_12PL 0xFFFF +#endif +#if (G93PL >= G95PL) || (G93PL == 0) +#define MG95_13PL ~(1 << 2) +#else +#define MG95_13PL 0xFFFF +#endif +#if (G94PL >= G95PL) || (G94PL == 0) +#define MG95_14PL ~(1 << 3) +#else +#define MG95_14PL 0xFFFF +#endif +#if (G96PL >= G95PL) || (G96PL == 0) +#define MG95_16PL ~(1 << 5) +#else +#define MG95_16PL 0xFFFF +#endif +#if (G97PL >= G95PL) || (G97PL == 0) +#define MG95_17PL ~(1 << 6) +#else +#define MG95_17PL 0xFFFF +#endif +#if (G98PL >= G95PL) || (G98PL == 0) +#define MG95_18PL ~(1 << 7) +#else +#define MG95_18PL 0xFFFF +#endif +#define MG95_15PL 0x00EF +#define MG95 (MG95_11PL & MG95_12PL & MG95_13PL & MG95_14PL & \ + MG95_15PL & MG95_16PL & MG95_17PL & MG95_18PL) +// End of MG95: + +// Beginning of MG96: +#if (G91PL >= G96PL) || (G91PL == 0) +#define MG96_11PL ~(1) +#else +#define MG96_11PL 0xFFFF +#endif +#if (G92PL >= G96PL) || (G92PL == 0) +#define MG96_12PL ~(1 << 1) +#else +#define MG96_12PL 0xFFFF +#endif +#if (G93PL >= G96PL) || (G93PL == 0) +#define MG96_13PL ~(1 << 2) +#else +#define MG96_13PL 0xFFFF +#endif +#if (G94PL >= G96PL) || (G94PL == 0) +#define MG96_14PL ~(1 << 3) +#else +#define MG96_14PL 0xFFFF +#endif +#if (G95PL >= G96PL) || (G95PL == 0) +#define MG96_15PL ~(1 << 4) +#else +#define MG96_15PL 0xFFFF +#endif +#if (G97PL >= G96PL) || (G97PL == 0) +#define MG96_17PL ~(1 << 6) +#else +#define MG96_17PL 0xFFFF +#endif +#if (G98PL >= G96PL) || (G98PL == 0) +#define MG96_18PL ~(1 << 7) +#else +#define MG96_18PL 0xFFFF +#endif +#define MG96_16PL 0x00DF +#define MG96 (MG96_11PL & MG96_12PL & MG96_13PL & MG96_14PL & \ + MG96_15PL & MG96_16PL & MG96_17PL & MG96_18PL) +// End of MG96: + +// Beginning of MG97: +#if (G91PL >= G97PL) || (G91PL == 0) +#define MG97_11PL ~(1) +#else +#define MG97_11PL 0xFFFF +#endif +#if (G92PL >= G97PL) || (G92PL == 0) +#define MG97_12PL ~(1 << 1) +#else +#define MG97_12PL 0xFFFF +#endif +#if (G93PL >= G97PL) || (G93PL == 0) +#define MG97_13PL ~(1 << 2) +#else +#define MG97_13PL 0xFFFF +#endif +#if (G94PL >= G97PL) || (G94PL == 0) +#define MG97_14PL ~(1 << 3) +#else +#define MG97_14PL 0xFFFF +#endif +#if (G95PL >= G97PL) || (G95PL == 0) +#define MG97_15PL ~(1 << 4) +#else +#define MG97_15PL 0xFFFF +#endif +#if (G96PL >= G97PL) || (G96PL == 0) +#define MG97_16PL ~(1 << 5) +#else +#define MG97_16PL 0xFFFF +#endif +#if (G98PL >= G97PL) || (G98PL == 0) +#define MG97_18PL ~(1 << 7) +#else +#define MG97_18PL 0xFFFF +#endif +#define MG97_17PL 0x00BF +#define MG97 (MG97_11PL & MG97_12PL & MG97_13PL & MG97_14PL & \ + MG97_15PL & MG97_16PL & MG97_17PL & MG97_18PL) +// End of MG97: + +// Beginning of MG98: +#if (G91PL >= G98PL) || (G91PL == 0) +#define MG98_11PL ~(1) +#else +#define MG98_11PL 0xFFFF +#endif +#if (G92PL >= G98PL) || (G92PL == 0) +#define MG98_12PL ~(1 << 1) +#else +#define MG98_12PL 0xFFFF +#endif +#if (G93PL >= G98PL) || (G93PL == 0) +#define MG98_13PL ~(1 << 2) +#else +#define MG98_13PL 0xFFFF +#endif +#if (G94PL >= G98PL) || (G94PL == 0) +#define MG98_14PL ~(1 << 3) +#else +#define MG98_14PL 0xFFFF +#endif +#if (G95PL >= G98PL) || (G95PL == 0) +#define MG98_15PL ~(1 << 4) +#else +#define MG98_15PL 0xFFFF +#endif +#if (G96PL >= G98PL) || (G96PL == 0) +#define MG98_16PL ~(1 << 5) +#else +#define MG98_16PL 0xFFFF +#endif +#if (G97PL >= G98PL) || (G97PL == 0) +#define MG98_17PL ~(1 << 6) +#else +#define MG98_17PL 0xFFFF +#endif +#define MG98_18PL 0x007F +#define MG98 (MG98_11PL & MG98_12PL & MG98_13PL & MG98_14PL & \ + MG98_15PL & MG98_16PL & MG98_17PL & MG98_18PL) +// End of MG98: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG101 to MG108: +// + +// Beginning of MG101: +#if (G102PL >= G101PL) || (G102PL == 0) +#define MG101_12PL ~(1 << 1) +#else +#define MG101_12PL 0xFFFF +#endif +#if (G103PL >= G101PL) || (G103PL == 0) +#define MG101_13PL ~(1 << 2) +#else +#define MG101_13PL 0xFFFF +#endif +#if (G104PL >= G101PL) || (G104PL == 0) +#define MG101_14PL ~(1 << 3) +#else +#define MG101_14PL 0xFFFF +#endif +#if (G105PL >= G101PL) || (G105PL == 0) +#define MG101_15PL ~(1 << 4) +#else +#define MG101_15PL 0xFFFF +#endif +#if (G106PL >= G101PL) || (G106PL == 0) +#define MG101_16PL ~(1 << 5) +#else +#define MG101_16PL 0xFFFF +#endif +#if (G107PL >= G101PL) || (G107PL == 0) +#define MG101_17PL ~(1 << 6) +#else +#define MG101_17PL 0xFFFF +#endif +#if (G108PL >= G101PL) || (G108PL == 0) +#define MG101_18PL ~(1 << 7) +#else +#define MG101_18PL 0xFFFF +#endif +#define MG101_11PL 0x00FE +#define MG101 (MG101_11PL & MG101_12PL & MG101_13PL & MG101_14PL & \ + MG101_15PL & MG101_16PL & MG101_17PL & MG101_18PL) +// End of MG101: + +// Beginning of MG102: +#if (G101PL >= G102PL) || (G101PL == 0) +#define MG102_11PL ~(1) +#else +#define MG102_11PL 0xFFFF +#endif +#if (G103PL >= G102PL) || (G103PL == 0) +#define MG102_13PL ~(1 << 2) +#else +#define MG102_13PL 0xFFFF +#endif +#if (G104PL >= G102PL) || (G104PL == 0) +#define MG102_14PL ~(1 << 3) +#else +#define MG102_14PL 0xFFFF +#endif +#if (G105PL >= G102PL) || (G105PL == 0) +#define MG102_15PL ~(1 << 4) +#else +#define MG102_15PL 0xFFFF +#endif +#if (G106PL >= G102PL) || (G106PL == 0) +#define MG102_16PL ~(1 << 5) +#else +#define MG102_16PL 0xFFFF +#endif +#if (G107PL >= G102PL) || (G107PL == 0) +#define MG102_17PL ~(1 << 6) +#else +#define MG102_17PL 0xFFFF +#endif +#if (G108PL >= G102PL) || (G108PL == 0) +#define MG102_18PL ~(1 << 7) +#else +#define MG102_18PL 0xFFFF +#endif +#define MG102_12PL 0x00FD +#define MG102 (MG102_11PL & MG102_12PL & MG102_13PL & MG102_14PL & \ + MG102_15PL & MG102_16PL & MG102_17PL & MG102_18PL) +// End of MG102: + +// Beginning of MG103: +#if (G101PL >= G103PL) || (G101PL == 0) +#define MG103_11PL ~(1) +#else +#define MG103_11PL 0xFFFF +#endif +#if (G102PL >= G103PL) || (G102PL == 0) +#define MG103_12PL ~(1 << 1) +#else +#define MG103_12PL 0xFFFF +#endif +#if (G104PL >= G103PL) || (G104PL == 0) +#define MG103_14PL ~(1 << 3) +#else +#define MG103_14PL 0xFFFF +#endif +#if (G105PL >= G103PL) || (G105PL == 0) +#define MG103_15PL ~(1 << 4) +#else +#define MG103_15PL 0xFFFF +#endif +#if (G106PL >= G103PL) || (G106PL == 0) +#define MG103_16PL ~(1 << 5) +#else +#define MG103_16PL 0xFFFF +#endif +#if (G107PL >= G103PL) || (G107PL == 0) +#define MG103_17PL ~(1 << 6) +#else +#define MG103_17PL 0xFFFF +#endif +#if (G108PL >= G103PL) || (G108PL == 0) +#define MG103_18PL ~(1 << 7) +#else +#define MG103_18PL 0xFFFF +#endif +#define MG103_13PL 0x00FB +#define MG103 (MG103_11PL & MG103_12PL & MG103_13PL & MG103_14PL & \ + MG103_15PL & MG103_16PL & MG103_17PL & MG103_18PL) +// End of MG103: + +// Beginning of MG104: +#if (G101PL >= G104PL) || (G101PL == 0) +#define MG104_11PL ~(1) +#else +#define MG104_11PL 0xFFFF +#endif +#if (G102PL >= G104PL) || (G102PL == 0) +#define MG104_12PL ~(1 << 1) +#else +#define MG104_12PL 0xFFFF +#endif +#if (G103PL >= G104PL) || (G103PL == 0) +#define MG104_13PL ~(1 << 2) +#else +#define MG104_13PL 0xFFFF +#endif +#if (G105PL >= G104PL) || (G105PL == 0) +#define MG104_15PL ~(1 << 4) +#else +#define MG104_15PL 0xFFFF +#endif +#if (G106PL >= G104PL) || (G106PL == 0) +#define MG104_16PL ~(1 << 5) +#else +#define MG104_16PL 0xFFFF +#endif +#if (G107PL >= G104PL) || (G107PL == 0) +#define MG104_17PL ~(1 << 6) +#else +#define MG104_17PL 0xFFFF +#endif +#if (G108PL >= G104PL) || (G108PL == 0) +#define MG104_18PL ~(1 << 7) +#else +#define MG104_18PL 0xFFFF +#endif +#define MG104_14PL 0x00F7 +#define MG104 (MG104_11PL & MG104_12PL & MG104_13PL & MG104_14PL & \ + MG104_15PL & MG104_16PL & MG104_17PL & MG104_18PL) +// End of MG104: + +// Beginning of MG105: +#if (G101PL >= G105PL) || (G101PL == 0) +#define MG105_11PL ~(1) +#else +#define MG105_11PL 0xFFFF +#endif +#if (G102PL >= G105PL) || (G102PL == 0) +#define MG105_12PL ~(1 << 1) +#else +#define MG105_12PL 0xFFFF +#endif +#if (G103PL >= G105PL) || (G103PL == 0) +#define MG105_13PL ~(1 << 2) +#else +#define MG105_13PL 0xFFFF +#endif +#if (G104PL >= G105PL) || (G104PL == 0) +#define MG105_14PL ~(1 << 3) +#else +#define MG105_14PL 0xFFFF +#endif +#if (G106PL >= G105PL) || (G106PL == 0) +#define MG105_16PL ~(1 << 5) +#else +#define MG105_16PL 0xFFFF +#endif +#if (G107PL >= G105PL) || (G107PL == 0) +#define MG105_17PL ~(1 << 6) +#else +#define MG105_17PL 0xFFFF +#endif +#if (G108PL >= G105PL) || (G108PL == 0) +#define MG105_18PL ~(1 << 7) +#else +#define MG105_18PL 0xFFFF +#endif +#define MG105_15PL 0x00EF +#define MG105 (MG105_11PL & MG105_12PL & MG105_13PL & MG105_14PL & \ + MG105_15PL & MG105_16PL & MG105_17PL & MG105_18PL) +// End of MG105: + +// Beginning of MG106: +#if (G101PL >= G106PL) || (G101PL == 0) +#define MG106_11PL ~(1) +#else +#define MG106_11PL 0xFFFF +#endif +#if (G102PL >= G106PL) || (G102PL == 0) +#define MG106_12PL ~(1 << 1) +#else +#define MG106_12PL 0xFFFF +#endif +#if (G103PL >= G106PL) || (G103PL == 0) +#define MG106_13PL ~(1 << 2) +#else +#define MG106_13PL 0xFFFF +#endif +#if (G104PL >= G106PL) || (G104PL == 0) +#define MG106_14PL ~(1 << 3) +#else +#define MG106_14PL 0xFFFF +#endif +#if (G105PL >= G106PL) || (G105PL == 0) +#define MG106_15PL ~(1 << 4) +#else +#define MG106_15PL 0xFFFF +#endif +#if (G107PL >= G106PL) || (G107PL == 0) +#define MG106_17PL ~(1 << 6) +#else +#define MG106_17PL 0xFFFF +#endif +#if (G108PL >= G106PL) || (G108PL == 0) +#define MG106_18PL ~(1 << 7) +#else +#define MG106_18PL 0xFFFF +#endif +#define MG106_16PL 0x00DF +#define MG106 (MG106_11PL & MG106_12PL & MG106_13PL & MG106_14PL & \ + MG106_15PL & MG106_16PL & MG106_17PL & MG106_18PL) +// End of MG106: + +// Beginning of MG107: +#if (G101PL >= G107PL) || (G101PL == 0) +#define MG107_11PL ~(1) +#else +#define MG107_11PL 0xFFFF +#endif +#if (G102PL >= G107PL) || (G102PL == 0) +#define MG107_12PL ~(1 << 1) +#else +#define MG107_12PL 0xFFFF +#endif +#if (G103PL >= G107PL) || (G103PL == 0) +#define MG107_13PL ~(1 << 2) +#else +#define MG107_13PL 0xFFFF +#endif +#if (G104PL >= G107PL) || (G104PL == 0) +#define MG107_14PL ~(1 << 3) +#else +#define MG107_14PL 0xFFFF +#endif +#if (G105PL >= G107PL) || (G105PL == 0) +#define MG107_15PL ~(1 << 4) +#else +#define MG107_15PL 0xFFFF +#endif +#if (G106PL >= G107PL) || (G106PL == 0) +#define MG107_16PL ~(1 << 5) +#else +#define MG107_16PL 0xFFFF +#endif +#if (G108PL >= G107PL) || (G108PL == 0) +#define MG107_18PL ~(1 << 7) +#else +#define MG107_18PL 0xFFFF +#endif +#define MG107_17PL 0x00BF +#define MG107 (MG107_11PL & MG107_12PL & MG107_13PL & MG107_14PL & \ + MG107_15PL & MG107_16PL & MG107_17PL & MG107_18PL) +// End of MG107: + +// Beginning of MG108: +#if (G101PL >= G108PL) || (G101PL == 0) +#define MG108_11PL ~(1) +#else +#define MG108_11PL 0xFFFF +#endif +#if (G102PL >= G108PL) || (G102PL == 0) +#define MG108_12PL ~(1 << 1) +#else +#define MG108_12PL 0xFFFF +#endif +#if (G103PL >= G108PL) || (G103PL == 0) +#define MG108_13PL ~(1 << 2) +#else +#define MG108_13PL 0xFFFF +#endif +#if (G104PL >= G108PL) || (G104PL == 0) +#define MG108_14PL ~(1 << 3) +#else +#define MG108_14PL 0xFFFF +#endif +#if (G105PL >= G108PL) || (G105PL == 0) +#define MG108_15PL ~(1 << 4) +#else +#define MG108_15PL 0xFFFF +#endif +#if (G106PL >= G108PL) || (G106PL == 0) +#define MG108_16PL ~(1 << 5) +#else +#define MG108_16PL 0xFFFF +#endif +#if (G107PL >= G108PL) || (G107PL == 0) +#define MG108_17PL ~(1 << 6) +#else +#define MG108_17PL 0xFFFF +#endif +#define MG108_18PL 0x007F +#define MG108 (MG108_11PL & MG108_12PL & MG108_13PL & MG108_14PL & \ + MG108_15PL & MG108_16PL & MG108_17PL & MG108_18PL) +// End of MG108: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG111 to MG118: +// + +// Beginning of MG111: +#if (G112PL >= G111PL) || (G112PL == 0) +#define MG111_12PL ~(1 << 1) +#else +#define MG111_12PL 0xFFFF +#endif +#if (G113PL >= G111PL) || (G113PL == 0) +#define MG111_13PL ~(1 << 2) +#else +#define MG111_13PL 0xFFFF +#endif +#if (G114PL >= G111PL) || (G114PL == 0) +#define MG111_14PL ~(1 << 3) +#else +#define MG111_14PL 0xFFFF +#endif +#if (G115PL >= G111PL) || (G115PL == 0) +#define MG111_15PL ~(1 << 4) +#else +#define MG111_15PL 0xFFFF +#endif +#if (G116PL >= G111PL) || (G116PL == 0) +#define MG111_16PL ~(1 << 5) +#else +#define MG111_16PL 0xFFFF +#endif +#if (G117PL >= G111PL) || (G117PL == 0) +#define MG111_17PL ~(1 << 6) +#else +#define MG111_17PL 0xFFFF +#endif +#if (G118PL >= G111PL) || (G118PL == 0) +#define MG111_18PL ~(1 << 7) +#else +#define MG111_18PL 0xFFFF +#endif +#define MG111_11PL 0x00FE +#define MG111 (MG111_11PL & MG111_12PL & MG111_13PL & MG111_14PL & \ + MG111_15PL & MG111_16PL & MG111_17PL & MG111_18PL) +// End of MG111: + +// Beginning of MG112: +#if (G111PL >= G112PL) || (G111PL == 0) +#define MG112_11PL ~(1) +#else +#define MG112_11PL 0xFFFF +#endif +#if (G113PL >= G112PL) || (G113PL == 0) +#define MG112_13PL ~(1 << 2) +#else +#define MG112_13PL 0xFFFF +#endif +#if (G114PL >= G112PL) || (G114PL == 0) +#define MG112_14PL ~(1 << 3) +#else +#define MG112_14PL 0xFFFF +#endif +#if (G115PL >= G112PL) || (G115PL == 0) +#define MG112_15PL ~(1 << 4) +#else +#define MG112_15PL 0xFFFF +#endif +#if (G116PL >= G112PL) || (G116PL == 0) +#define MG112_16PL ~(1 << 5) +#else +#define MG112_16PL 0xFFFF +#endif +#if (G117PL >= G112PL) || (G117PL == 0) +#define MG112_17PL ~(1 << 6) +#else +#define MG112_17PL 0xFFFF +#endif +#if (G118PL >= G112PL) || (G118PL == 0) +#define MG112_18PL ~(1 << 7) +#else +#define MG112_18PL 0xFFFF +#endif +#define MG112_12PL 0x00FD +#define MG112 (MG112_11PL & MG112_12PL & MG112_13PL & MG112_14PL & \ + MG112_15PL & MG112_16PL & MG112_17PL & MG112_18PL) +// End of MG112: + +// Beginning of MG113: +#if (G111PL >= G113PL) || (G111PL == 0) +#define MG113_11PL ~(1) +#else +#define MG113_11PL 0xFFFF +#endif +#if (G112PL >= G113PL) || (G112PL == 0) +#define MG113_12PL ~(1 << 1) +#else +#define MG113_12PL 0xFFFF +#endif +#if (G114PL >= G113PL) || (G114PL == 0) +#define MG113_14PL ~(1 << 3) +#else +#define MG113_14PL 0xFFFF +#endif +#if (G115PL >= G113PL) || (G115PL == 0) +#define MG113_15PL ~(1 << 4) +#else +#define MG113_15PL 0xFFFF +#endif +#if (G116PL >= G113PL) || (G116PL == 0) +#define MG113_16PL ~(1 << 5) +#else +#define MG113_16PL 0xFFFF +#endif +#if (G117PL >= G113PL) || (G117PL == 0) +#define MG113_17PL ~(1 << 6) +#else +#define MG113_17PL 0xFFFF +#endif +#if (G118PL >= G113PL) || (G118PL == 0) +#define MG113_18PL ~(1 << 7) +#else +#define MG113_18PL 0xFFFF +#endif +#define MG113_13PL 0x00FB +#define MG113 (MG113_11PL & MG113_12PL & MG113_13PL & MG113_14PL & \ + MG113_15PL & MG113_16PL & MG113_17PL & MG113_18PL) +// End of MG113: + +// Beginning of MG114: +#if (G111PL >= G114PL) || (G111PL == 0) +#define MG114_11PL ~(1) +#else +#define MG114_11PL 0xFFFF +#endif +#if (G112PL >= G114PL) || (G112PL == 0) +#define MG114_12PL ~(1 << 1) +#else +#define MG114_12PL 0xFFFF +#endif +#if (G113PL >= G114PL) || (G113PL == 0) +#define MG114_13PL ~(1 << 2) +#else +#define MG114_13PL 0xFFFF +#endif +#if (G115PL >= G114PL) || (G115PL == 0) +#define MG114_15PL ~(1 << 4) +#else +#define MG114_15PL 0xFFFF +#endif +#if (G116PL >= G114PL) || (G116PL == 0) +#define MG114_16PL ~(1 << 5) +#else +#define MG114_16PL 0xFFFF +#endif +#if (G117PL >= G114PL) || (G117PL == 0) +#define MG114_17PL ~(1 << 6) +#else +#define MG114_17PL 0xFFFF +#endif +#if (G118PL >= G114PL) || (G118PL == 0) +#define MG114_18PL ~(1 << 7) +#else +#define MG114_18PL 0xFFFF +#endif +#define MG114_14PL 0x00F7 +#define MG114 (MG114_11PL & MG114_12PL & MG114_13PL & MG114_14PL & \ + MG114_15PL & MG114_16PL & MG114_17PL & MG114_18PL) +// End of MG114: + +// Beginning of MG115: +#if (G111PL >= G115PL) || (G111PL == 0) +#define MG115_11PL ~(1) +#else +#define MG115_11PL 0xFFFF +#endif +#if (G112PL >= G115PL) || (G112PL == 0) +#define MG115_12PL ~(1 << 1) +#else +#define MG115_12PL 0xFFFF +#endif +#if (G113PL >= G115PL) || (G113PL == 0) +#define MG115_13PL ~(1 << 2) +#else +#define MG115_13PL 0xFFFF +#endif +#if (G114PL >= G115PL) || (G114PL == 0) +#define MG115_14PL ~(1 << 3) +#else +#define MG115_14PL 0xFFFF +#endif +#if (G116PL >= G115PL) || (G116PL == 0) +#define MG115_16PL ~(1 << 5) +#else +#define MG115_16PL 0xFFFF +#endif +#if (G117PL >= G115PL) || (G117PL == 0) +#define MG115_17PL ~(1 << 6) +#else +#define MG115_17PL 0xFFFF +#endif +#if (G118PL >= G115PL) || (G118PL == 0) +#define MG115_18PL ~(1 << 7) +#else +#define MG115_18PL 0xFFFF +#endif +#define MG115_15PL 0x00EF +#define MG115 (MG115_11PL & MG115_12PL & MG115_13PL & MG115_14PL & \ + MG115_15PL & MG115_16PL & MG115_17PL & MG115_18PL) +// End of MG115: + +// Beginning of MG116: +#if (G111PL >= G116PL) || (G111PL == 0) +#define MG116_11PL ~(1) +#else +#define MG116_11PL 0xFFFF +#endif +#if (G112PL >= G116PL) || (G112PL == 0) +#define MG116_12PL ~(1 << 1) +#else +#define MG116_12PL 0xFFFF +#endif +#if (G113PL >= G116PL) || (G113PL == 0) +#define MG116_13PL ~(1 << 2) +#else +#define MG116_13PL 0xFFFF +#endif +#if (G114PL >= G116PL) || (G114PL == 0) +#define MG116_14PL ~(1 << 3) +#else +#define MG116_14PL 0xFFFF +#endif +#if (G115PL >= G116PL) || (G115PL == 0) +#define MG116_15PL ~(1 << 4) +#else +#define MG116_15PL 0xFFFF +#endif +#if (G117PL >= G116PL) || (G117PL == 0) +#define MG116_17PL ~(1 << 6) +#else +#define MG116_17PL 0xFFFF +#endif +#if (G118PL >= G116PL) || (G118PL == 0) +#define MG116_18PL ~(1 << 7) +#else +#define MG116_18PL 0xFFFF +#endif +#define MG116_16PL 0x00DF +#define MG116 (MG116_11PL & MG116_12PL & MG116_13PL & MG116_14PL & \ + MG116_15PL & MG116_16PL & MG116_17PL & MG116_18PL) +// End of MG116: + +// Beginning of MG117: +#if (G111PL >= G117PL) || (G111PL == 0) +#define MG117_11PL ~(1) +#else +#define MG117_11PL 0xFFFF +#endif +#if (G112PL >= G117PL) || (G112PL == 0) +#define MG117_12PL ~(1 << 1) +#else +#define MG117_12PL 0xFFFF +#endif +#if (G113PL >= G117PL) || (G113PL == 0) +#define MG117_13PL ~(1 << 2) +#else +#define MG117_13PL 0xFFFF +#endif +#if (G114PL >= G117PL) || (G114PL == 0) +#define MG117_14PL ~(1 << 3) +#else +#define MG117_14PL 0xFFFF +#endif +#if (G115PL >= G117PL) || (G115PL == 0) +#define MG117_15PL ~(1 << 4) +#else +#define MG117_15PL 0xFFFF +#endif +#if (G116PL >= G117PL) || (G116PL == 0) +#define MG117_16PL ~(1 << 5) +#else +#define MG117_16PL 0xFFFF +#endif +#if (G118PL >= G117PL) || (G118PL == 0) +#define MG117_18PL ~(1 << 7) +#else +#define MG117_18PL 0xFFFF +#endif +#define MG117_17PL 0x00BF +#define MG117 (MG117_11PL & MG117_12PL & MG117_13PL & MG117_14PL & \ + MG117_15PL & MG117_16PL & MG117_17PL & MG117_18PL) +// End of MG117: + +// Beginning of MG118: +#if (G111PL >= G118PL) || (G111PL == 0) +#define MG118_11PL ~(1) +#else +#define MG118_11PL 0xFFFF +#endif +#if (G112PL >= G118PL) || (G112PL == 0) +#define MG118_12PL ~(1 << 1) +#else +#define MG118_12PL 0xFFFF +#endif +#if (G113PL >= G118PL) || (G113PL == 0) +#define MG118_13PL ~(1 << 2) +#else +#define MG118_13PL 0xFFFF +#endif +#if (G114PL >= G118PL) || (G114PL == 0) +#define MG118_14PL ~(1 << 3) +#else +#define MG118_14PL 0xFFFF +#endif +#if (G115PL >= G118PL) || (G115PL == 0) +#define MG118_15PL ~(1 << 4) +#else +#define MG118_15PL 0xFFFF +#endif +#if (G116PL >= G118PL) || (G116PL == 0) +#define MG118_16PL ~(1 << 5) +#else +#define MG118_16PL 0xFFFF +#endif +#if (G117PL >= G118PL) || (G117PL == 0) +#define MG118_17PL ~(1 << 6) +#else +#define MG118_17PL 0xFFFF +#endif +#define MG118_18PL 0x007F +#define MG118 (MG118_11PL & MG118_12PL & MG118_13PL & MG118_14PL & \ + MG118_15PL & MG118_16PL & MG118_17PL & MG118_18PL) +// End of MG118: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG121 to MG128: +// + +// Beginning of MG121: +#if (G122PL >= G121PL) || (G122PL == 0) +#define MG121_12PL ~(1 << 1) +#else +#define MG121_12PL 0xFFFF +#endif +#if (G123PL >= G121PL) || (G123PL == 0) +#define MG121_13PL ~(1 << 2) +#else +#define MG121_13PL 0xFFFF +#endif +#if (G124PL >= G121PL) || (G124PL == 0) +#define MG121_14PL ~(1 << 3) +#else +#define MG121_14PL 0xFFFF +#endif +#if (G125PL >= G121PL) || (G125PL == 0) +#define MG121_15PL ~(1 << 4) +#else +#define MG121_15PL 0xFFFF +#endif +#if (G126PL >= G121PL) || (G126PL == 0) +#define MG121_16PL ~(1 << 5) +#else +#define MG121_16PL 0xFFFF +#endif +#if (G127PL >= G121PL) || (G127PL == 0) +#define MG121_17PL ~(1 << 6) +#else +#define MG121_17PL 0xFFFF +#endif +#if (G128PL >= G121PL) || (G128PL == 0) +#define MG121_18PL ~(1 << 7) +#else +#define MG121_18PL 0xFFFF +#endif +#define MG121_11PL 0x00FE +#define MG121 (MG121_11PL & MG121_12PL & MG121_13PL & MG121_14PL & \ + MG121_15PL & MG121_16PL & MG121_17PL & MG121_18PL) +// End of MG121: + +// Beginning of MG121: +#if (G121PL >= G122PL) || (G121PL == 0) +#define MG122_11PL ~(1) +#else +#define MG122_11PL 0xFFFF +#endif +#if (G123PL >= G122PL) || (G123PL == 0) +#define MG122_13PL ~(1 << 2) +#else +#define MG122_13PL 0xFFFF +#endif +#if (G124PL >= G122PL) || (G124PL == 0) +#define MG122_14PL ~(1 << 3) +#else +#define MG122_14PL 0xFFFF +#endif +#if (G125PL >= G122PL) || (G125PL == 0) +#define MG122_15PL ~(1 << 4) +#else +#define MG122_15PL 0xFFFF +#endif +#if (G126PL >= G122PL) || (G126PL == 0) +#define MG122_16PL ~(1 << 5) +#else +#define MG122_16PL 0xFFFF +#endif +#if (G127PL >= G122PL) || (G127PL == 0) +#define MG122_17PL ~(1 << 6) +#else +#define MG122_17PL 0xFFFF +#endif +#if (G128PL >= G122PL) || (G128PL == 0) +#define MG122_18PL ~(1 << 7) +#else +#define MG122_18PL 0xFFFF +#endif +#define MG122_12PL 0x00FD +#define MG122 (MG122_11PL & MG122_12PL & MG122_13PL & MG122_14PL & \ + MG122_15PL & MG122_16PL & MG122_17PL & MG122_18PL) +// End of MG122: + +// Beginning of MG123: +#if (G121PL >= G123PL) || (G121PL == 0) +#define MG123_11PL ~(1) +#else +#define MG123_11PL 0xFFFF +#endif +#if (G122PL >= G123PL) || (G122PL == 0) +#define MG123_12PL ~(1 << 1) +#else +#define MG123_12PL 0xFFFF +#endif +#if (G124PL >= G123PL) || (G124PL == 0) +#define MG123_14PL ~(1 << 3) +#else +#define MG123_14PL 0xFFFF +#endif +#if (G125PL >= G123PL) || (G125PL == 0) +#define MG123_15PL ~(1 << 4) +#else +#define MG123_15PL 0xFFFF +#endif +#if (G126PL >= G123PL) || (G126PL == 0) +#define MG123_16PL ~(1 << 5) +#else +#define MG123_16PL 0xFFFF +#endif +#if (G127PL >= G123PL) || (G127PL == 0) +#define MG123_17PL ~(1 << 6) +#else +#define MG123_17PL 0xFFFF +#endif +#if (G128PL >= G123PL) || (G128PL == 0) +#define MG123_18PL ~(1 << 7) +#else +#define MG123_18PL 0xFFFF +#endif +#define MG123_13PL 0x00FB +#define MG123 (MG123_11PL & MG123_12PL & MG123_13PL & MG123_14PL & \ + MG123_15PL & MG123_16PL & MG123_17PL & MG123_18PL) +// End of MG123: + +// Beginning of MG124: +#if (G121PL >= G124PL) || (G121PL == 0) +#define MG124_11PL ~(1) +#else +#define MG124_11PL 0xFFFF +#endif +#if (G122PL >= G124PL) || (G122PL == 0) +#define MG124_12PL ~(1 << 1) +#else +#define MG124_12PL 0xFFFF +#endif +#if (G123PL >= G124PL) || (G123PL == 0) +#define MG124_13PL ~(1 << 2) +#else +#define MG124_13PL 0xFFFF +#endif +#if (G125PL >= G124PL) || (G125PL == 0) +#define MG124_15PL ~(1 << 4) +#else +#define MG124_15PL 0xFFFF +#endif +#if (G126PL >= G124PL) || (G126PL == 0) +#define MG124_16PL ~(1 << 5) +#else +#define MG124_16PL 0xFFFF +#endif +#if (G127PL >= G124PL) || (G127PL == 0) +#define MG124_17PL ~(1 << 6) +#else +#define MG124_17PL 0xFFFF +#endif +#if (G128PL >= G124PL) || (G128PL == 0) +#define MG124_18PL ~(1 << 7) +#else +#define MG124_18PL 0xFFFF +#endif +#define MG124_14PL 0x00F7 +#define MG124 (MG124_11PL & MG124_12PL & MG124_13PL & MG124_14PL & \ + MG124_15PL & MG124_16PL & MG124_17PL & MG124_18PL) +// End of MG124: + +// Beginning of MG125: +#if (G121PL >= G125PL) || (G121PL == 0) +#define MG125_11PL ~(1) +#else +#define MG125_11PL 0xFFFF +#endif +#if (G122PL >= G125PL) || (G122PL == 0) +#define MG125_12PL ~(1 << 1) +#else +#define MG125_12PL 0xFFFF +#endif +#if (G123PL >= G125PL) || (G123PL == 0) +#define MG125_13PL ~(1 << 2) +#else +#define MG125_13PL 0xFFFF +#endif +#if (G124PL >= G125PL) || (G124PL == 0) +#define MG125_14PL ~(1 << 3) +#else +#define MG125_14PL 0xFFFF +#endif +#if (G126PL >= G125PL) || (G126PL == 0) +#define MG125_16PL ~(1 << 5) +#else +#define MG125_16PL 0xFFFF +#endif +#if (G127PL >= G125PL) || (G127PL == 0) +#define MG125_17PL ~(1 << 6) +#else +#define MG125_17PL 0xFFFF +#endif +#if (G128PL >= G125PL) || (G128PL == 0) +#define MG125_18PL ~(1 << 7) +#else +#define MG125_18PL 0xFFFF +#endif +#define MG125_15PL 0x00EF +#define MG125 (MG125_11PL & MG125_12PL & MG125_13PL & MG125_14PL & \ + MG125_15PL & MG125_16PL & MG125_17PL & MG125_18PL) +// End of MG125: + +// Beginning of MG126: +#if (G121PL >= G126PL) || (G121PL == 0) +#define MG126_11PL ~(1) +#else +#define MG126_11PL 0xFFFF +#endif +#if (G122PL >= G126PL) || (G122PL == 0) +#define MG126_12PL ~(1 << 1) +#else +#define MG126_12PL 0xFFFF +#endif +#if (G123PL >= G126PL) || (G123PL == 0) +#define MG126_13PL ~(1 << 2) +#else +#define MG126_13PL 0xFFFF +#endif +#if (G124PL >= G126PL) || (G124PL == 0) +#define MG126_14PL ~(1 << 3) +#else +#define MG126_14PL 0xFFFF +#endif +#if (G125PL >= G126PL) || (G125PL == 0) +#define MG126_15PL ~(1 << 4) +#else +#define MG126_15PL 0xFFFF +#endif +#if (G127PL >= G126PL) || (G127PL == 0) +#define MG126_17PL ~(1 << 6) +#else +#define MG126_17PL 0xFFFF +#endif +#if (G128PL >= G126PL) || (G128PL == 0) +#define MG126_18PL ~(1 << 7) +#else +#define MG126_18PL 0xFFFF +#endif +#define MG126_16PL 0x00DF +#define MG126 (MG126_11PL & MG126_12PL & MG126_13PL & MG126_14PL & \ + MG126_15PL & MG126_16PL & MG126_17PL & MG126_18PL) +// End of MG126: + +// Beginning of MG127: +#if (G121PL >= G127PL) || (G121PL == 0) +#define MG127_11PL ~(1) +#else +#define MG127_11PL 0xFFFF +#endif +#if (G122PL >= G127PL) || (G122PL == 0) +#define MG127_12PL ~(1 << 1) +#else +#define MG127_12PL 0xFFFF +#endif +#if (G123PL >= G127PL) || (G123PL == 0) +#define MG127_13PL ~(1 << 2) +#else +#define MG127_13PL 0xFFFF +#endif +#if (G124PL >= G127PL) || (G124PL == 0) +#define MG127_14PL ~(1 << 3) +#else +#define MG127_14PL 0xFFFF +#endif +#if (G125PL >= G127PL) || (G125PL == 0) +#define MG127_15PL ~(1 << 4) +#else +#define MG127_15PL 0xFFFF +#endif +#if (G126PL >= G127PL) || (G126PL == 0) +#define MG127_16PL ~(1 << 5) +#else +#define MG127_16PL 0xFFFF +#endif +#if (G128PL >= G127PL) || (G128PL == 0) +#define MG127_18PL ~(1 << 7) +#else +#define MG127_18PL 0xFFFF +#endif +#define MG127_17PL 0x00BF +#define MG127 (MG127_11PL & MG127_12PL & MG127_13PL & MG127_14PL & \ + MG127_15PL & MG127_16PL & MG127_17PL & MG127_18PL) +// End of MG127: + +// Beginning of MG128: +#if (G121PL >= G128PL) || (G121PL == 0) +#define MG128_11PL ~(1) +#else +#define MG128_11PL 0xFFFF +#endif +#if (G122PL >= G128PL) || (G122PL == 0) +#define MG128_12PL ~(1 << 1) +#else +#define MG128_12PL 0xFFFF +#endif +#if (G123PL >= G128PL) || (G123PL == 0) +#define MG128_13PL ~(1 << 2) +#else +#define MG128_13PL 0xFFFF +#endif +#if (G124PL >= G128PL) || (G124PL == 0) +#define MG128_14PL ~(1 << 3) +#else +#define MG128_14PL 0xFFFF +#endif +#if (G125PL >= G128PL) || (G125PL == 0) +#define MG128_15PL ~(1 << 4) +#else +#define MG128_15PL 0xFFFF +#endif +#if (G126PL >= G128PL) || (G126PL == 0) +#define MG128_16PL ~(1 << 5) +#else +#define MG128_16PL 0xFFFF +#endif +#if (G127PL >= G128PL) || (G127PL == 0) +#define MG128_17PL ~(1 << 6) +#else +#define MG128_17PL 0xFFFF +#endif +#define MG128_18PL 0x007F +#define MG128 (MG128_11PL & MG128_12PL & MG128_13PL & MG128_14PL & \ + MG128_15PL & MG128_16PL & MG128_17PL & MG128_18PL) +// End of MG128: + + +#ifdef __cplusplus +} +#endif /* extern "C" */ + +#endif // eof + +//=========================================================================== +// No more. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Adc.h b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Adc.h new file mode 100644 index 0000000..e6b5e40 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Adc.h @@ -0,0 +1,224 @@ +// TI File $Revision: /main/3 $ +// Checkin $Date: March 19, 2007 15:09:18 $ +//########################################################################### +// +// FILE: DSP281x_Adc.h +// +// TITLE: DSP281x Device ADC Register Definitions. +// +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + + +#ifndef DSP281x_ADC_H +#define DSP281x_ADC_H + +#ifdef __cplusplus +extern "C" { +#endif + + +//--------------------------------------------------------------------------- +// ADC Individual Register Bit Definitions: + +struct ADCTRL1_BITS { // bits description + Uint16 rsvd1:4; // 3:0 reserved + Uint16 SEQ_CASC:1; // 4 Cascaded sequencer mode + Uint16 SEQ_OVRD:1; // 5 Sequencer override + Uint16 CONT_RUN:1; // 6 Continuous run + Uint16 CPS:1; // 7 ADC core clock pre-scalar + Uint16 ACQ_PS:4; // 11:8 Acquisition window size + Uint16 SUSMOD:2; // 13:12 Emulation suspend mode + Uint16 RESET:1; // 14 ADC reset + Uint16 rsvd2:1; // 15 reserved +}; + + +union ADCTRL1_REG { + Uint16 all; + struct ADCTRL1_BITS bit; +}; + + +struct ADCTRL2_BITS { // bits description + Uint16 EVB_SOC_SEQ2:1; // 0 Event manager B SOC mask for SEQ2 + Uint16 rsvd1:1; // 1 reserved + Uint16 INT_MOD_SEQ2:1; // 2 SEQ2 Interrupt mode + Uint16 INT_ENA_SEQ2:1; // 3 SEQ2 Interrupt enable + Uint16 rsvd2:1; // 4 reserved + Uint16 SOC_SEQ2:1; // 5 Start of conversion for SEQ2 + Uint16 RST_SEQ2:1; // 6 Reset SEQ2 + Uint16 EXT_SOC_SEQ1:1; // 7 External start of conversion for SEQ1 + Uint16 EVA_SOC_SEQ1:1; // 8 Event manager A SOC mask for SEQ1 + Uint16 rsvd3:1; // 9 reserved + Uint16 INT_MOD_SEQ1:1; // 10 SEQ1 Interrupt mode + Uint16 INT_ENA_SEQ1:1; // 11 SEQ1 Interrupt enable + Uint16 rsvd4:1; // 12 reserved + Uint16 SOC_SEQ1:1; // 13 Start of conversion trigger for SEQ1 + Uint16 RST_SEQ1:1; // 14 Restart sequencer 1 + Uint16 EVB_SOC_SEQ:1; // 15 EVB SOC enable +}; + + +union ADCTRL2_REG { + Uint16 all; + struct ADCTRL2_BITS bit; +}; + + +struct ADCASEQSR_BITS { // bits description + Uint16 SEQ1_STATE:4; // 3:0 SEQ1 state + Uint16 SEQ2_STATE:3; // 6:4 SEQ2 state + Uint16 rsvd1:1; // 7 reserved + Uint16 SEQ_CNTR:4; // 11:8 Sequencing counter status + Uint16 rsvd2:4; // 15:12 reserved +}; + +union ADCASEQSR_REG { + Uint16 all; + struct ADCASEQSR_BITS bit; +}; + + +struct ADCMAXCONV_BITS { // bits description + Uint16 MAX_CONV1:4; // 3:0 Max number of conversions + Uint16 MAX_CONV2:3; // 6:4 Max number of conversions + Uint16 rsvd1:9; // 15:7 reserved +}; + +union ADCMAXCONV_REG { + Uint16 all; + struct ADCMAXCONV_BITS bit; +}; + + +struct ADCCHSELSEQ1_BITS { // bits description + Uint16 CONV00:4; // 3:0 Conversion selection 00 + Uint16 CONV01:4; // 7:4 Conversion selection 01 + Uint16 CONV02:4; // 11:8 Conversion selection 02 + Uint16 CONV03:4; // 15:12 Conversion selection 03 +}; + +union ADCCHSELSEQ1_REG{ + Uint16 all; + struct ADCCHSELSEQ1_BITS bit; +}; + +struct ADCCHSELSEQ2_BITS { // bits description + Uint16 CONV04:4; // 3:0 Conversion selection 04 + Uint16 CONV05:4; // 7:4 Conversion selection 05 + Uint16 CONV06:4; // 11:8 Conversion selection 06 + Uint16 CONV07:4; // 15:12 Conversion selection 07 +}; + +union ADCCHSELSEQ2_REG{ + Uint16 all; + struct ADCCHSELSEQ2_BITS bit; +}; + +struct ADCCHSELSEQ3_BITS { // bits description + Uint16 CONV08:4; // 3:0 Conversion selection 08 + Uint16 CONV09:4; // 7:4 Conversion selection 09 + Uint16 CONV10:4; // 11:8 Conversion selection 10 + Uint16 CONV11:4; // 15:12 Conversion selection 11 +}; + +union ADCCHSELSEQ3_REG{ + Uint16 all; + struct ADCCHSELSEQ3_BITS bit; +}; + +struct ADCCHSELSEQ4_BITS { // bits description + Uint16 CONV12:4; // 3:0 Conversion selection 12 + Uint16 CONV13:4; // 7:4 Conversion selection 13 + Uint16 CONV14:4; // 11:8 Conversion selection 14 + Uint16 CONV15:4; // 15:12 Conversion selection 15 +}; + +union ADCCHSELSEQ4_REG { + Uint16 all; + struct ADCCHSELSEQ4_BITS bit; +}; + +struct ADCTRL3_BITS { // bits description + Uint16 SMODE_SEL:1; // 0 Sampling mode select + Uint16 ADCCLKPS:4; // 4:1 ADC core clock divider + Uint16 ADCPWDN:1; // 5 ADC powerdown + Uint16 ADCBGRFDN:2; // 7:6 ADC bandgap/ref power down + Uint16 ADCEXTREF:1; // 8 ADC external reference + Uint16 rsvd1:7; // 15:9 reserved +}; + +union ADCTRL3_REG { + Uint16 all; + struct ADCTRL3_BITS bit; +}; + + +struct ADCST_BITS { // bits description + Uint16 INT_SEQ1:1; // 0 SEQ1 Interrupt flag + Uint16 INT_SEQ2:1; // 1 SEQ2 Interrupt flag + Uint16 SEQ1_BSY:1; // 2 SEQ1 busy status + Uint16 SEQ2_BSY:1; // 3 SEQ2 busy status + Uint16 INT_SEQ1_CLR:1; // 4 SEQ1 Interrupt clear + Uint16 INT_SEQ2_CLR:1; // 5 SEQ2 Interrupt clear + Uint16 EOS_BUF1:1; // 6 End of sequence buffer1 + Uint16 EOS_BUF2:1; // 7 End of sequence buffer2 + Uint16 rsvd1:8; // 15:8 reserved +}; + + +union ADCST_REG { + Uint16 all; + struct ADCST_BITS bit; +}; + + +struct ADC_REGS { + union ADCTRL1_REG ADCTRL1; // ADC Control 1 + union ADCTRL2_REG ADCTRL2; // ADC Control 2 + union ADCMAXCONV_REG ADCMAXCONV; // Max conversions + union ADCCHSELSEQ1_REG ADCCHSELSEQ1; // Channel select sequencing control 1 + union ADCCHSELSEQ2_REG ADCCHSELSEQ2; // Channel select sequencing control 2 + union ADCCHSELSEQ3_REG ADCCHSELSEQ3; // Channel select sequencing control 3 + union ADCCHSELSEQ4_REG ADCCHSELSEQ4; // Channel select sequencing control 4 + union ADCASEQSR_REG ADCASEQSR; // Autosequence status register + Uint16 ADCRESULT0; // Conversion Result Buffer 0 + Uint16 ADCRESULT1; // Conversion Result Buffer 1 + Uint16 ADCRESULT2; // Conversion Result Buffer 2 + Uint16 ADCRESULT3; // Conversion Result Buffer 3 + Uint16 ADCRESULT4; // Conversion Result Buffer 4 + Uint16 ADCRESULT5; // Conversion Result Buffer 5 + Uint16 ADCRESULT6; // Conversion Result Buffer 6 + Uint16 ADCRESULT7; // Conversion Result Buffer 7 + Uint16 ADCRESULT8; // Conversion Result Buffer 8 + Uint16 ADCRESULT9; // Conversion Result Buffer 9 + Uint16 ADCRESULT10; // Conversion Result Buffer 10 + Uint16 ADCRESULT11; // Conversion Result Buffer 11 + Uint16 ADCRESULT12; // Conversion Result Buffer 12 + Uint16 ADCRESULT13; // Conversion Result Buffer 13 + Uint16 ADCRESULT14; // Conversion Result Buffer 14 + Uint16 ADCRESULT15; // Conversion Result Buffer 15 + union ADCTRL3_REG ADCTRL3; // ADC Control 3 + union ADCST_REG ADCST; // ADC Status Register +}; + + +//--------------------------------------------------------------------------- +// ADC External References & Function Declarations: +// +extern volatile struct ADC_REGS AdcRegs; + + +#ifdef __cplusplus +} +#endif /* extern "C" */ + + +#endif // end of DSP281x_ADC_H definition + +//=========================================================================== +// No more. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f2812/include/DSP281x_CpuTimers.h b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_CpuTimers.h new file mode 100644 index 0000000..ffe1784 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_CpuTimers.h @@ -0,0 +1,184 @@ +// TI File $Revision: /main/3 $ +// Checkin $Date: July 9, 2009 17:08:54 $ +//########################################################################### +// +// FILE: DSP281x_CpuTimers.h +// +// TITLE: DSP281x CPU 32-bit Timers Register Definitions. +// +// NOTES: CpuTimer2 is reserved for use with DSP BIOS and +// other realtime operating systems. +// +// Do not use this timer in your application if you ever plan +// on integrating DSP-BIOS or another realtime OS. +// +// +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + +#ifndef DSP281x_CPU_TIMERS_H +#define DSP281x_CPU_TIMERS_H + +#ifdef __cplusplus +extern "C" { +#endif + +//--------------------------------------------------------------------------- +// CPU Timer Register Bit Definitions: +// +// +// TCR: Control register bit definitions: +struct TCR_BITS { // bits description + Uint16 rsvd1:4; // 3:0 reserved + Uint16 TSS:1; // 4 Timer Start/Stop + Uint16 TRB:1; // 5 Timer reload + Uint16 rsvd2:4; // 9:6 reserved + Uint16 SOFT:1; // 10 Emulation modes + Uint16 FREE:1; // 11 + Uint16 rsvd3:2; // 12:13 reserved + Uint16 TIE:1; // 14 Output enable + Uint16 TIF:1; // 15 Interrupt flag +}; + +union TCR_REG { + Uint16 all; + struct TCR_BITS bit; +}; + +// TPR: Pre-scale low bit definitions: +struct TPR_BITS { // bits description + Uint16 TDDR:8; // 7:0 Divide-down low + Uint16 PSC:8; // 15:8 Prescale counter low +}; + +union TPR_REG { + Uint16 all; + struct TPR_BITS bit; +}; + +// TPRH: Pre-scale high bit definitions: +struct TPRH_BITS { // bits description + Uint16 TDDRH:8; // 7:0 Divide-down high + Uint16 PSCH:8; // 15:8 Prescale counter high +}; + +union TPRH_REG { + Uint16 all; + struct TPRH_BITS bit; +}; + +// TIM, TIMH: Timer register definitions: +struct TIM_REG { + Uint16 LSW; + Uint16 MSW; +}; + +union TIM_GROUP { + Uint32 all; + struct TIM_REG half; +}; + +// PRD, PRDH: Period register definitions: +struct PRD_REG { + Uint16 LSW; + Uint16 MSW; +}; + +union PRD_GROUP { + Uint32 all; + struct PRD_REG half; +}; + +//--------------------------------------------------------------------------- +// CPU Timer Register File: +// +struct CPUTIMER_REGS { + union TIM_GROUP TIM; // Timer counter register + union PRD_GROUP PRD; // Period register + union TCR_REG TCR; // Timer control register + Uint16 rsvd1; // reserved + union TPR_REG TPR; // Timer pre-scale low + union TPRH_REG TPRH; // Timer pre-scale high +}; + +//--------------------------------------------------------------------------- +// CPU Timer Support Variables: +// +struct CPUTIMER_VARS { + volatile struct CPUTIMER_REGS *RegsAddr; + Uint32 InterruptCount; + float CPUFreqInMHz; + float PeriodInUSec; +}; + +//--------------------------------------------------------------------------- +// Function prototypes and external definitions: +// +void InitCpuTimers(void); +void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period); + +extern volatile struct CPUTIMER_REGS CpuTimer0Regs; +extern struct CPUTIMER_VARS CpuTimer0; + +// CpuTimer2 is reserved when using DSP BIOS & other RTOS +extern volatile struct CPUTIMER_REGS CpuTimer1Regs; +extern volatile struct CPUTIMER_REGS CpuTimer2Regs; + +extern struct CPUTIMER_VARS CpuTimer1; +extern struct CPUTIMER_VARS CpuTimer2; + +//--------------------------------------------------------------------------- +// Usefull Timer Operations: +// +// Start Timer: +#define StartCpuTimer0() CpuTimer0Regs.TCR.bit.TSS = 0 + +// Stop Timer: +#define StopCpuTimer0() CpuTimer0Regs.TCR.bit.TSS = 1 + +// Reload Timer With period Value: +#define ReloadCpuTimer0() CpuTimer0Regs.TCR.bit.TRB = 1 + +// Read 32-Bit Timer Value: +#define ReadCpuTimer0Counter() CpuTimer0Regs.TIM.all + +// Read 32-Bit Period Value: +#define ReadCpuTimer0Period() CpuTimer0Regs.PRD.all + +// CpuTimer2 is reserved by DSP BIOS & other RTOS +// Do not use this timer if you ever plan on integrating +// DSP-BIOS or another realtime OS. + +// Start Timer: +#define StartCpuTimer1() CpuTimer1Regs.TCR.bit.TSS = 0 +#define StartCpuTimer2() CpuTimer2Regs.TCR.bit.TSS = 0 + +// Stop Timer: +#define StopCpuTimer1() CpuTimer1Regs.TCR.bit.TSS = 1 +#define StopCpuTimer2() CpuTimer2Regs.TCR.bit.TSS = 1 + +// Reload Timer With period Value: +#define ReloadCpuTimer1() CpuTimer1Regs.TCR.bit.TRB = 1 +#define ReloadCpuTimer2() CpuTimer2Regs.TCR.bit.TRB = 1 + +// Read 32-Bit Timer Value: +#define ReadCpuTimer1Counter() CpuTimer1Regs.TIM.all +#define ReadCpuTimer2Counter() CpuTimer2Regs.TIM.all + +// Read 32-Bit Period Value: +#define ReadCpuTimer1Period() CpuTimer1Regs.PRD.all +#define ReadCpuTimer2Period() CpuTimer2Regs.PRD.all + + +#ifdef __cplusplus +} +#endif /* extern "C" */ + +#endif // end of DSP281x_CPU_TIMERS_H definition + + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f2812/include/DSP281x_DefaultIsr.h b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_DefaultIsr.h new file mode 100644 index 0000000..e55f671 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_DefaultIsr.h @@ -0,0 +1,123 @@ +// TI File $Revision: /main/2 $ +// Checkin $Date: April 28, 2005 14:57:38 $ +//########################################################################### +// +// FILE: DSP281x_DefaultIsr.h +// +// TITLE: DSP281x Devices Default Interrupt Service Routines Definitions. +// +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + +#ifndef DSP281x_DEFAULT_ISR_H +#define DSP281x_DEFAULT_ISR_H + +#ifdef __cplusplus +extern "C" { +#endif + + +//--------------------------------------------------------------------------- +// Default Interrupt Service Routine Declarations: +// +// The following function prototypes are for the +// default ISR routines used with the default PIE vector table. +// This default vector table is found in the DSP281x_PieVect.h +// file. +// + +// Non-Peripheral Interrupts: +interrupt void INT13_ISR(void); // XINT13 or CPU-Timer 1 +interrupt void INT14_ISR(void); // CPU-Timer2 +interrupt void DATALOG_ISR(void); // Datalogging interrupt +interrupt void RTOSINT_ISR(void); // RTOS interrupt +interrupt void EMUINT_ISR(void); // Emulation interrupt +interrupt void NMI_ISR(void); // Non-maskable interrupt +interrupt void ILLEGAL_ISR(void); // Illegal operation TRAP +interrupt void USER1_ISR(void); // User Defined trap 1 +interrupt void USER2_ISR(void); // User Defined trap 2 +interrupt void USER3_ISR(void); // User Defined trap 3 +interrupt void USER4_ISR(void); // User Defined trap 4 +interrupt void USER5_ISR(void); // User Defined trap 5 +interrupt void USER6_ISR(void); // User Defined trap 6 +interrupt void USER7_ISR(void); // User Defined trap 7 +interrupt void USER8_ISR(void); // User Defined trap 8 +interrupt void USER9_ISR(void); // User Defined trap 9 +interrupt void USER10_ISR(void); // User Defined trap 10 +interrupt void USER11_ISR(void); // User Defined trap 11 +interrupt void USER12_ISR(void); // User Defined trap 12 + +// Group 1 PIE Interrupt Service Routines: +interrupt void PDPINTA_ISR(void); // EV-A +interrupt void PDPINTB_ISR(void); // EV-B +interrupt void XINT1_ISR(void); +interrupt void XINT2_ISR(void); +interrupt void ADCINT_ISR(void); // ADC +interrupt void TINT0_ISR(void); // Timer 0 +interrupt void WAKEINT_ISR(void); // WD + +// Group 2 PIE Interrupt Service Routines: +interrupt void CMP1INT_ISR(void); // EV-A +interrupt void CMP2INT_ISR(void); // EV-A +interrupt void CMP3INT_ISR(void); // EV-A +interrupt void T1PINT_ISR(void); // EV-A +interrupt void T1CINT_ISR(void); // EV-A +interrupt void T1UFINT_ISR(void); // EV-A +interrupt void T1OFINT_ISR(void); // EV-A + +// Group 3 PIE Interrupt Service Routines: +interrupt void T2PINT_ISR(void); // EV-A +interrupt void T2CINT_ISR(void); // EV-A +interrupt void T2UFINT_ISR(void); // EV-A +interrupt void T2OFINT_ISR(void); // EV-A +interrupt void CAPINT1_ISR(void); // EV-A +interrupt void CAPINT2_ISR(void); // EV-A +interrupt void CAPINT3_ISR(void); // EV-A + +// Group 4 PIE Interrupt Service Routines: +interrupt void CMP4INT_ISR(void); // EV-B +interrupt void CMP5INT_ISR(void); // EV-B +interrupt void CMP6INT_ISR(void); // EV-B +interrupt void T3PINT_ISR(void); // EV-B +interrupt void T3CINT_ISR(void); // EV-B +interrupt void T3UFINT_ISR(void); // EV-B +interrupt void T3OFINT_ISR(void); // EV-B + +// Group 5 PIE Interrupt Service Routines: +interrupt void T4PINT_ISR(void); // EV-B +interrupt void T4CINT_ISR(void); // EV-B +interrupt void T4UFINT_ISR(void); // EV-B +interrupt void T4OFINT_ISR(void); // EV-B +interrupt void CAPINT4_ISR(void); // EV-B +interrupt void CAPINT5_ISR(void); // EV-B +interrupt void CAPINT6_ISR(void); // EV-B + +// Group 6 PIE Interrupt Service Routines: +interrupt void SPIRXINTA_ISR(void); // SPI +interrupt void SPITXINTA_ISR(void); // SPI +interrupt void MRINTA_ISR(void); // McBSP +interrupt void MXINTA_ISR(void); // McBSP + + +// Group 9 PIE Interrupt Service Routines: +interrupt void SCIRXINTA_ISR(void); // SCI-A +interrupt void SCITXINTA_ISR(void); // SCI-A +interrupt void SCIRXINTB_ISR(void); // SCI-B +interrupt void SCITXINTB_ISR(void); // SCI-B +interrupt void ECAN0INTA_ISR(void); // eCAN +interrupt void ECAN1INTA_ISR(void); // eCAN + + +// Catch-all for Reserved Locations For testing purposes: +interrupt void PIE_RESERVED(void); // Reserved for test +interrupt void rsvd_ISR(void); // for test + + +#ifdef __cplusplus +} +#endif /* extern "C" */ + +#endif // end of DSP281x_DEFAULT_ISR_H definition + diff --git a/c/protocan-boot/vendor/ti/f2812/include/DSP281x_DevEmu.h b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_DevEmu.h new file mode 100644 index 0000000..af37f2e --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_DevEmu.h @@ -0,0 +1,103 @@ +//########################################################################### +// +// FILE: DSP281x_DevEmu.h +// +// TITLE: DSP281x Device Emulation Register Definitions. +// +//########################################################################### +// +// Ver | dd mmm yyyy | Who | Description of changes +// =====|=============|======|=============================================== +// 1.00| 11 Sep 2003 | L.H. | Changes since previous version (v.58 Alpha) +// | | | As of Rev C silicon, DEVICEID is a 16-bit +// | | | register +// | | | Commented out the DFT test registers. These +// | | | are not needed as of Rev C silicon. +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + +#ifndef DSP281x_DEV_EMU_H +#define DSP281x_DEV_EMU_H + +#ifdef __cplusplus +extern "C" { +#endif + +//--------------------------------------------------------------------------- +// Device Emulation Register Bit Definitions: +// +// Device Configuration Register Bit Definitions +struct DEVICECNF_BITS { // bits description + Uint16 rsvd1:3; // 2:0 reserved + Uint16 VMAPS:1; // 3 VMAP Status + Uint16 rsvd2:1; // 4 reserved + Uint16 XRSn:1; // 5 XRSn Signal Status + Uint16 rsvd3:10; // 15:6 + Uint16 rsvd4:3; // 18:6 + Uint16 ENPROT:1; // 19 Enable/Disable pipeline protection + Uint16 rsvd5:12; // 31:20 reserved +}; + +union DEVICECNF_REG { + Uint32 all; + struct DEVICECNF_BITS bit; +}; + + +// Device ID Register Bit Definitions +struct DEVICEID_BITS { // bits description + Uint16 REVID:16; // 15:0 Silicon revision +}; + +union DEVICEID_REG { + Uint16 all; + struct DEVICEID_BITS bit; +}; + +// PARTID Register Bit Definitions +struct PARTID_BITS { // bits description + Uint16 PARTNO:8; // 7:0 Part Number + Uint16 PARTTYPE:8; // 15:8 Part Type +}; + +union PARTID_REG { + Uint16 all; + struct PARTID_BITS bit; +}; + +struct DEV_EMU_REGS { + union DEVICECNF_REG DEVICECNF; // device configuration + union PARTID_REG PARTID; // Part ID + union DEVICEID_REG DEVICEID; // Device ID + Uint16 PROTSTART; // Write-Read protection start + Uint16 PROTRANGE; // Write-Read protection range + Uint16 rsvd2[202]; +// These registers are no longer needed for Rev C and beyond +// Uint16 M0RAMDFT; +// Uint16 M1RAMDFT; +// Uint16 L0RAMDFT; +// Uint16 L1RAMDFT; +// Uint16 H0RAMDFT; +}; + +#define REVID DEVICEID // REVID replaces DEVICEID starting 281x header files v1.10 + // use #define to maintain code compatibility with v1.00 and older + + + +//--------------------------------------------------------------------------- +// Device Emulation Register References & Function Declarations: +// +extern volatile struct DEV_EMU_REGS DevEmuRegs; + +#ifdef __cplusplus +} +#endif /* extern "C" */ + +#endif // end of DSP281x_DEV_EMU_H definition + +//=========================================================================== +// No more. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Device.h b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Device.h new file mode 100644 index 0000000..e664028 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Device.h @@ -0,0 +1,144 @@ +// TI File $Revision: /main/5 $ +// Checkin $Date: December 17, 2007 13:36:09 $ +//########################################################################### +// +// FILE: DSP281x_Device.h +// +// TITLE: DSP281x Device Definitions. +// +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + +#ifndef DSP281x_DEVICE_H +#define DSP281x_DEVICE_H + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define TARGET 1 +//--------------------------------------------------------------------------- +// User To Select Target Device: + +#define DSP28_F2812 TARGET +#define DSP28_F2811 0 +#define DSP28_F2810 0 + +//--------------------------------------------------------------------------- +// Common CPU Definitions: +// + +extern cregister volatile unsigned int IFR; +extern cregister volatile unsigned int IER; + +#define EINT asm(" clrc INTM") +#define DINT asm(" setc INTM") +#define ERTM asm(" clrc DBGM") +#define DRTM asm(" setc DBGM") +#define EALLOW asm(" EALLOW") +#define EDIS asm(" EDIS") +#define ESTOP0 asm(" ESTOP0") + +#define M_INT1 0x0001 +#define M_INT2 0x0002 +#define M_INT3 0x0004 +#define M_INT4 0x0008 +#define M_INT5 0x0010 +#define M_INT6 0x0020 +#define M_INT7 0x0040 +#define M_INT8 0x0080 +#define M_INT9 0x0100 +#define M_INT10 0x0200 +#define M_INT11 0x0400 +#define M_INT12 0x0800 +#define M_INT13 0x1000 +#define M_INT14 0x2000 +#define M_DLOG 0x4000 +#define M_RTOS 0x8000 + +#define BIT0 0x0001 +#define BIT1 0x0002 +#define BIT2 0x0004 +#define BIT3 0x0008 +#define BIT4 0x0010 +#define BIT5 0x0020 +#define BIT6 0x0040 +#define BIT7 0x0080 +#define BIT8 0x0100 +#define BIT9 0x0200 +#define BIT10 0x0400 +#define BIT11 0x0800 +#define BIT12 0x1000 +#define BIT13 0x2000 +#define BIT14 0x4000 +#define BIT15 0x8000 + +#ifndef NULL + #define NULL 0 +#endif + + +//--------------------------------------------------------------------------- +// For Portability, User Is Recommended To Use Following Data Type Size +// Definitions For 16-bit and 32-Bit Signed/Unsigned Integers: +// + +#ifndef DSP28_DATA_TYPES +#define DSP28_DATA_TYPES +typedef int int16; +typedef long int32; +typedef long long int64; +typedef unsigned int Uint16; +typedef unsigned long Uint32; +typedef unsigned long long Uint64; +typedef float float32; +typedef long double float64; +#endif + +#define LOWORD(l)((short int)( (long int)(l) &0xFFFF)) +#define HIWORD(l)((short int)(((long int)(l)>>16)&0xFFFF)) + +#define LOBYTE(w)((char)( (short int)(w) &0xFF)) +#define HIBYTE(w)((char)(((short int)(w)>>8)&0xFF)) + +#define BYTE3(l)((char)(((long int)(l)>>24)&0xFF)) +#define BYTE2(l)((char)(((long int)(l)>>16)&0xFF)) +#define BYTE1(l)((char)(((long int)(l)>> 8)&0xFF)) +#define BYTE0(l)((char)( (long int)(l) &0xFF)) + +//--------------------------------------------------------------------------- +// Include All Peripheral Header Files: +// + +#include "DSP281x_SysCtrl.h" // System Control/Power Modes +#include "DSP281x_DevEmu.h" // Device Emulation Registers +#include "DSP281x_Xintf.h" // External Interface Registers +#include "DSP281x_CpuTimers.h" // 32-bit CPU Timers +#include "DSP281x_PieCtrl.h" // PIE Control Registers +#include "DSP281x_PieVect.h" // PIE Vector Table +#include "DSP281x_Spi.h" // SPI Registers +#include "DSP281x_Sci.h" // SCI Registers +#include "DSP281x_Mcbsp.h" // McBSP Registers +#include "DSP281x_ECan.h" // Enhanced eCAN Registers +#include "DSP281x_Gpio.h" // General Purpose I/O Registers +#include "DSP281x_Ev.h" // Event Manager Registers +#include "DSP281x_Adc.h" // ADC Registers +#include "DSP281x_XIntrupt.h" // External Interrupts + +#define XCLKIN 24000000 // external oscillator frequency +extern float SYSCLKOUT, LSPCLK, HSPCLK; + +#ifdef __cplusplus +} +#endif /* extern "C" */ + +#endif // end of DSP281x_DEVICE_H definition + + +//=========================================================================== +// No more. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f2812/include/DSP281x_ECan.h b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_ECan.h new file mode 100644 index 0000000..7f26fc5 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_ECan.h @@ -0,0 +1,1163 @@ +//########################################################################### +// +// FILE: DSP281x_ECan.h +// +// TITLE: DSP281x Device eCAN Register Definitions. +// +//########################################################################### +// +// Ver | dd mmm yyyy | Who | Description of changes +// =====|=============|======|=============================================== +// 1.00a| 07/21/2004 | H.J. |(i) Support for errata (as explained in SPRZ193E and above) incorporated +// |(ii) Changed the byte ordering to make it easy to use with the +// | default value of DBO bit (0). + +//########################################################################### + +#ifndef DSP281x_ECAN_H +#define DSP281x_ECAN_H + +/* These 2 lines have been added to support the C callable assembly workaround */ +/* This is to support the workaround for errata (as explained in SPRZ193E and above) */ + +extern void CanDoubleRead(Uint32 *StorePtr, volatile Uint32 *RegPtr); +extern void CanDoubleWrite(volatile Uint32 *RegPtr, Uint32 *LoadPtr); + +#ifdef __cplusplus +extern "C" { +#endif + + +/* --------------------------------------------------- */ +/* eCAN Control & Status Registers */ +/* ----------------------------------------------------*/ + +/* eCAN Mailbox enable register (CANME) bit definitions */ +struct CANME_BITS { // bit description + Uint16 ME0:1; // 0 Enable Mailbox 0 + Uint16 ME1:1; // 1 Enable Mailbox 1 + Uint16 ME2:1; // 2 Enable Mailbox 2 + Uint16 ME3:1; // 3 Enable Mailbox 3 + Uint16 ME4:1; // 4 Enable Mailbox 4 + Uint16 ME5:1; // 5 Enable Mailbox 5 + Uint16 ME6:1; // 6 Enable Mailbox 6 + Uint16 ME7:1; // 7 Enable Mailbox 7 + Uint16 ME8:1; // 8 Enable Mailbox 8 + Uint16 ME9:1; // 9 Enable Mailbox 9 + Uint16 ME10:1; // 10 Enable Mailbox 10 + Uint16 ME11:1; // 11 Enable Mailbox 11 + Uint16 ME12:1; // 12 Enable Mailbox 12 + Uint16 ME13:1; // 13 Enable Mailbox 13 + Uint16 ME14:1; // 14 Enable Mailbox 14 + Uint16 ME15:1; // 15 Enable Mailbox 15 + Uint16 ME16:1; // 16 Enable Mailbox 16 + Uint16 ME17:1; // 17 Enable Mailbox 17 + Uint16 ME18:1; // 18 Enable Mailbox 18 + Uint16 ME19:1; // 19 Enable Mailbox 19 + Uint16 ME20:1; // 20 Enable Mailbox 20 + Uint16 ME21:1; // 21 Enable Mailbox 21 + Uint16 ME22:1; // 22 Enable Mailbox 22 + Uint16 ME23:1; // 23 Enable Mailbox 23 + Uint16 ME24:1; // 24 Enable Mailbox 24 + Uint16 ME25:1; // 25 Enable Mailbox 25 + Uint16 ME26:1; // 26 Enable Mailbox 26 + Uint16 ME27:1; // 27 Enable Mailbox 27 + Uint16 ME28:1; // 28 Enable Mailbox 28 + Uint16 ME29:1; // 29 Enable Mailbox 29 + Uint16 ME30:1; // 30 Enable Mailbox 30 + Uint16 ME31:1; // 31 Enable Mailbox 31 + +}; + +/* Allow access to the bit fields or entire register */ +union CANME_REG { + Uint32 all; + struct CANME_BITS bit; +}; + +/* eCAN Mailbox direction register (CANMD) bit definitions */ +struct CANMD_BITS { // bit description + Uint16 MD0:1; // 0 0 -> Tx 1 -> Rx + Uint16 MD1:1; // 1 0 -> Tx 1 -> Rx + Uint16 MD2:1; // 2 0 -> Tx 1 -> Rx + Uint16 MD3:1; // 3 0 -> Tx 1 -> Rx + Uint16 MD4:1; // 4 0 -> Tx 1 -> Rx + Uint16 MD5:1; // 5 0 -> Tx 1 -> Rx + Uint16 MD6:1; // 6 0 -> Tx 1 -> Rx + Uint16 MD7:1; // 7 0 -> Tx 1 -> Rx + Uint16 MD8:1; // 8 0 -> Tx 1 -> Rx + Uint16 MD9:1; // 9 0 -> Tx 1 -> Rx + Uint16 MD10:1; // 10 0 -> Tx 1 -> Rx + Uint16 MD11:1; // 11 0 -> Tx 1 -> Rx + Uint16 MD12:1; // 12 0 -> Tx 1 -> Rx + Uint16 MD13:1; // 13 0 -> Tx 1 -> Rx + Uint16 MD14:1; // 14 0 -> Tx 1 -> Rx + Uint16 MD15:1; // 15 0 -> Tx 1 -> Rx + Uint16 MD16:1; // 16 0 -> Tx 1 -> Rx + Uint16 MD17:1; // 17 0 -> Tx 1 -> Rx + Uint16 MD18:1; // 18 0 -> Tx 1 -> Rx + Uint16 MD19:1; // 19 0 -> Tx 1 -> Rx + Uint16 MD20:1; // 20 0 -> Tx 1 -> Rx + Uint16 MD21:1; // 21 0 -> Tx 1 -> Rx + Uint16 MD22:1; // 22 0 -> Tx 1 -> Rx + Uint16 MD23:1; // 23 0 -> Tx 1 -> Rx + Uint16 MD24:1; // 24 0 -> Tx 1 -> Rx + Uint16 MD25:1; // 25 0 -> Tx 1 -> Rx + Uint16 MD26:1; // 26 0 -> Tx 1 -> Rx + Uint16 MD27:1; // 27 0 -> Tx 1 -> Rx + Uint16 MD28:1; // 28 0 -> Tx 1 -> Rx + Uint16 MD29:1; // 29 0 -> Tx 1 -> Rx + Uint16 MD30:1; // 30 0 -> Tx 1 -> Rx + Uint16 MD31:1; // 31 0 -> Tx 1 -> Rx + +}; + +/* Allow access to the bit fields or entire register */ +union CANMD_REG { + Uint32 all; + struct CANMD_BITS bit; +}; + +/* eCAN Transmit Request Set register (CANTRS) bit definitions */ +struct CANTRS_BITS { // bit description + Uint16 TRS0:1; // 0 TRS for Mailbox 0 + Uint16 TRS1:1; // 1 TRS for Mailbox 1 + Uint16 TRS2:1; // 2 TRS for Mailbox 2 + Uint16 TRS3:1; // 3 TRS for Mailbox 3 + Uint16 TRS4:1; // 4 TRS for Mailbox 4 + Uint16 TRS5:1; // 5 TRS for Mailbox 5 + Uint16 TRS6:1; // 6 TRS for Mailbox 6 + Uint16 TRS7:1; // 7 TRS for Mailbox 7 + Uint16 TRS8:1; // 8 TRS for Mailbox 8 + Uint16 TRS9:1; // 9 TRS for Mailbox 9 + Uint16 TRS10:1; // 10 TRS for Mailbox 10 + Uint16 TRS11:1; // 11 TRS for Mailbox 11 + Uint16 TRS12:1; // 12 TRS for Mailbox 12 + Uint16 TRS13:1; // 13 TRS for Mailbox 13 + Uint16 TRS14:1; // 14 TRS for Mailbox 14 + Uint16 TRS15:1; // 15 TRS for Mailbox 15 + Uint16 TRS16:1; // 16 TRS for Mailbox 16 + Uint16 TRS17:1; // 17 TRS for Mailbox 17 + Uint16 TRS18:1; // 18 TRS for Mailbox 18 + Uint16 TRS19:1; // 19 TRS for Mailbox 19 + Uint16 TRS20:1; // 20 TRS for Mailbox 20 + Uint16 TRS21:1; // 21 TRS for Mailbox 21 + Uint16 TRS22:1; // 22 TRS for Mailbox 22 + Uint16 TRS23:1; // 23 TRS for Mailbox 23 + Uint16 TRS24:1; // 24 TRS for Mailbox 24 + Uint16 TRS25:1; // 25 TRS for Mailbox 25 + Uint16 TRS26:1; // 26 TRS for Mailbox 26 + Uint16 TRS27:1; // 27 TRS for Mailbox 27 + Uint16 TRS28:1; // 28 TRS for Mailbox 28 + Uint16 TRS29:1; // 29 TRS for Mailbox 29 + Uint16 TRS30:1; // 30 TRS for Mailbox 30 + Uint16 TRS31:1; // 31 TRS for Mailbox 31 + +}; + +/* Allow access to the bit fields or entire register */ +union CANTRS_REG { + Uint32 all; + struct CANTRS_BITS bit; +}; + +/* eCAN Transmit Request Reset register (CANTRR) bit definitions */ +struct CANTRR_BITS { // bit description + Uint16 TRR0:1; // 0 TRR for Mailbox 0 + Uint16 TRR1:1; // 1 TRR for Mailbox 1 + Uint16 TRR2:1; // 2 TRR for Mailbox 2 + Uint16 TRR3:1; // 3 TRR for Mailbox 3 + Uint16 TRR4:1; // 4 TRR for Mailbox 4 + Uint16 TRR5:1; // 5 TRR for Mailbox 5 + Uint16 TRR6:1; // 6 TRR for Mailbox 6 + Uint16 TRR7:1; // 7 TRR for Mailbox 7 + Uint16 TRR8:1; // 8 TRR for Mailbox 8 + Uint16 TRR9:1; // 9 TRR for Mailbox 9 + Uint16 TRR10:1; // 10 TRR for Mailbox 10 + Uint16 TRR11:1; // 11 TRR for Mailbox 11 + Uint16 TRR12:1; // 12 TRR for Mailbox 12 + Uint16 TRR13:1; // 13 TRR for Mailbox 13 + Uint16 TRR14:1; // 14 TRR for Mailbox 14 + Uint16 TRR15:1; // 15 TRR for Mailbox 15 + Uint16 TRR16:1; // 16 TRR for Mailbox 16 + Uint16 TRR17:1; // 17 TRR for Mailbox 17 + Uint16 TRR18:1; // 18 TRR for Mailbox 18 + Uint16 TRR19:1; // 19 TRR for Mailbox 19 + Uint16 TRR20:1; // 20 TRR for Mailbox 20 + Uint16 TRR21:1; // 21 TRR for Mailbox 21 + Uint16 TRR22:1; // 22 TRR for Mailbox 22 + Uint16 TRR23:1; // 23 TRR for Mailbox 23 + Uint16 TRR24:1; // 24 TRR for Mailbox 24 + Uint16 TRR25:1; // 25 TRR for Mailbox 25 + Uint16 TRR26:1; // 26 TRR for Mailbox 26 + Uint16 TRR27:1; // 27 TRR for Mailbox 27 + Uint16 TRR28:1; // 28 TRR for Mailbox 28 + Uint16 TRR29:1; // 29 TRR for Mailbox 29 + Uint16 TRR30:1; // 30 TRR for Mailbox 30 + Uint16 TRR31:1; // 31 TRR for Mailbox 31 + +}; + +/* Allow access to the bit fields or entire register */ +union CANTRR_REG { + Uint32 all; + struct CANTRR_BITS bit; +}; + +/* eCAN Transmit Acknowledge register (CANTA) bit definitions */ +struct CANTA_BITS { // bit description + Uint16 TA0:1; // 0 TA for Mailbox 0 + Uint16 TA1:1; // 1 TA for Mailbox 1 + Uint16 TA2:1; // 2 TA for Mailbox 2 + Uint16 TA3:1; // 3 TA for Mailbox 3 + Uint16 TA4:1; // 4 TA for Mailbox 4 + Uint16 TA5:1; // 5 TA for Mailbox 5 + Uint16 TA6:1; // 6 TA for Mailbox 6 + Uint16 TA7:1; // 7 TA for Mailbox 7 + Uint16 TA8:1; // 8 TA for Mailbox 8 + Uint16 TA9:1; // 9 TA for Mailbox 9 + Uint16 TA10:1; // 10 TA for Mailbox 10 + Uint16 TA11:1; // 11 TA for Mailbox 11 + Uint16 TA12:1; // 12 TA for Mailbox 12 + Uint16 TA13:1; // 13 TA for Mailbox 13 + Uint16 TA14:1; // 14 TA for Mailbox 14 + Uint16 TA15:1; // 15 TA for Mailbox 15 + Uint16 TA16:1; // 16 TA for Mailbox 16 + Uint16 TA17:1; // 17 TA for Mailbox 17 + Uint16 TA18:1; // 18 TA for Mailbox 18 + Uint16 TA19:1; // 19 TA for Mailbox 19 + Uint16 TA20:1; // 20 TA for Mailbox 20 + Uint16 TA21:1; // 21 TA for Mailbox 21 + Uint16 TA22:1; // 22 TA for Mailbox 22 + Uint16 TA23:1; // 23 TA for Mailbox 23 + Uint16 TA24:1; // 24 TA for Mailbox 24 + Uint16 TA25:1; // 25 TA for Mailbox 25 + Uint16 TA26:1; // 26 TA for Mailbox 26 + Uint16 TA27:1; // 27 TA for Mailbox 27 + Uint16 TA28:1; // 28 TA for Mailbox 28 + Uint16 TA29:1; // 29 TA for Mailbox 29 + Uint16 TA30:1; // 30 TA for Mailbox 30 + Uint16 TA31:1; // 31 TA for Mailbox 31 + +}; + +/* Allow access to the bit fields or entire register */ +union CANTA_REG { + Uint32 all; + struct CANTA_BITS bit; +}; + +/* eCAN Transmit Abort Acknowledge register (CANAA) bit definitions */ +struct CANAA_BITS { // bit description + Uint16 AA0:1; // 0 AA for Mailbox 0 + Uint16 AA1:1; // 1 AA for Mailbox 1 + Uint16 AA2:1; // 2 AA for Mailbox 2 + Uint16 AA3:1; // 3 AA for Mailbox 3 + Uint16 AA4:1; // 4 AA for Mailbox 4 + Uint16 AA5:1; // 5 AA for Mailbox 5 + Uint16 AA6:1; // 6 AA for Mailbox 6 + Uint16 AA7:1; // 7 AA for Mailbox 7 + Uint16 AA8:1; // 8 AA for Mailbox 8 + Uint16 AA9:1; // 9 AA for Mailbox 9 + Uint16 AA10:1; // 10 AA for Mailbox 10 + Uint16 AA11:1; // 11 AA for Mailbox 11 + Uint16 AA12:1; // 12 AA for Mailbox 12 + Uint16 AA13:1; // 13 AA for Mailbox 13 + Uint16 AA14:1; // 14 AA for Mailbox 14 + Uint16 AA15:1; // 15 AA for Mailbox 15 + Uint16 AA16:1; // 16 AA for Mailbox 16 + Uint16 AA17:1; // 17 AA for Mailbox 17 + Uint16 AA18:1; // 18 AA for Mailbox 18 + Uint16 AA19:1; // 19 AA for Mailbox 19 + Uint16 AA20:1; // 20 AA for Mailbox 20 + Uint16 AA21:1; // 21 AA for Mailbox 21 + Uint16 AA22:1; // 22 AA for Mailbox 22 + Uint16 AA23:1; // 23 AA for Mailbox 23 + Uint16 AA24:1; // 24 AA for Mailbox 24 + Uint16 AA25:1; // 25 AA for Mailbox 25 + Uint16 AA26:1; // 26 AA for Mailbox 26 + Uint16 AA27:1; // 27 AA for Mailbox 27 + Uint16 AA28:1; // 28 AA for Mailbox 28 + Uint16 AA29:1; // 29 AA for Mailbox 29 + Uint16 AA30:1; // 30 AA for Mailbox 30 + Uint16 AA31:1; // 31 AA for Mailbox 31 + +}; + +/* Allow access to the bit fields or entire register */ +union CANAA_REG { + Uint32 all; + struct CANAA_BITS bit; +}; + +/* eCAN Received Message Pending register (CANRMP) bit definitions */ +struct CANRMP_BITS { // bit description + Uint16 RMP0:1; // 0 RMP for Mailbox 0 + Uint16 RMP1:1; // 1 RMP for Mailbox 1 + Uint16 RMP2:1; // 2 RMP for Mailbox 2 + Uint16 RMP3:1; // 3 RMP for Mailbox 3 + Uint16 RMP4:1; // 4 RMP for Mailbox 4 + Uint16 RMP5:1; // 5 RMP for Mailbox 5 + Uint16 RMP6:1; // 6 RMP for Mailbox 6 + Uint16 RMP7:1; // 7 RMP for Mailbox 7 + Uint16 RMP8:1; // 8 RMP for Mailbox 8 + Uint16 RMP9:1; // 9 RMP for Mailbox 9 + Uint16 RMP10:1; // 10 RMP for Mailbox 10 + Uint16 RMP11:1; // 11 RMP for Mailbox 11 + Uint16 RMP12:1; // 12 RMP for Mailbox 12 + Uint16 RMP13:1; // 13 RMP for Mailbox 13 + Uint16 RMP14:1; // 14 RMP for Mailbox 14 + Uint16 RMP15:1; // 15 RMP for Mailbox 15 + Uint16 RMP16:1; // 16 RMP for Mailbox 16 + Uint16 RMP17:1; // 17 RMP for Mailbox 17 + Uint16 RMP18:1; // 18 RMP for Mailbox 18 + Uint16 RMP19:1; // 19 RMP for Mailbox 19 + Uint16 RMP20:1; // 20 RMP for Mailbox 20 + Uint16 RMP21:1; // 21 RMP for Mailbox 21 + Uint16 RMP22:1; // 22 RMP for Mailbox 22 + Uint16 RMP23:1; // 23 RMP for Mailbox 23 + Uint16 RMP24:1; // 24 RMP for Mailbox 24 + Uint16 RMP25:1; // 25 RMP for Mailbox 25 + Uint16 RMP26:1; // 26 RMP for Mailbox 26 + Uint16 RMP27:1; // 27 RMP for Mailbox 27 + Uint16 RMP28:1; // 28 RMP for Mailbox 28 + Uint16 RMP29:1; // 29 RMP for Mailbox 29 + Uint16 RMP30:1; // 30 RMP for Mailbox 30 + Uint16 RMP31:1; // 31 RMP for Mailbox 31 + +}; + +/* Allow access to the bit fields or entire register */ +union CANRMP_REG { + Uint32 all; + struct CANRMP_BITS bit; +}; + +/* eCAN Received Message Lost register (CANRML) bit definitions */ +struct CANRML_BITS { // bit description + Uint16 RML0:1; // 0 RML for Mailbox 0 + Uint16 RML1:1; // 1 RML for Mailbox 1 + Uint16 RML2:1; // 2 RML for Mailbox 2 + Uint16 RML3:1; // 3 RML for Mailbox 3 + Uint16 RML4:1; // 4 RML for Mailbox 4 + Uint16 RML5:1; // 5 RML for Mailbox 5 + Uint16 RML6:1; // 6 RML for Mailbox 6 + Uint16 RML7:1; // 7 RML for Mailbox 7 + Uint16 RML8:1; // 8 RML for Mailbox 8 + Uint16 RML9:1; // 9 RML for Mailbox 9 + Uint16 RML10:1; // 10 RML for Mailbox 10 + Uint16 RML11:1; // 11 RML for Mailbox 11 + Uint16 RML12:1; // 12 RML for Mailbox 12 + Uint16 RML13:1; // 13 RML for Mailbox 13 + Uint16 RML14:1; // 14 RML for Mailbox 14 + Uint16 RML15:1; // 15 RML for Mailbox 15 + Uint16 RML16:1; // 16 RML for Mailbox 16 + Uint16 RML17:1; // 17 RML for Mailbox 17 + Uint16 RML18:1; // 18 RML for Mailbox 18 + Uint16 RML19:1; // 19 RML for Mailbox 19 + Uint16 RML20:1; // 20 RML for Mailbox 20 + Uint16 RML21:1; // 21 RML for Mailbox 21 + Uint16 RML22:1; // 22 RML for Mailbox 22 + Uint16 RML23:1; // 23 RML for Mailbox 23 + Uint16 RML24:1; // 24 RML for Mailbox 24 + Uint16 RML25:1; // 25 RML for Mailbox 25 + Uint16 RML26:1; // 26 RML for Mailbox 26 + Uint16 RML27:1; // 27 RML for Mailbox 27 + Uint16 RML28:1; // 28 RML for Mailbox 28 + Uint16 RML29:1; // 29 RML for Mailbox 29 + Uint16 RML30:1; // 30 RML for Mailbox 30 + Uint16 RML31:1; // 31 RML for Mailbox 31 + +}; + +/* Allow access to the bit fields or entire register */ +union CANRML_REG { + Uint32 all; + struct CANRML_BITS bit; +}; + +/* eCAN Remote Frame Pending register (CANRFP) bit definitions */ +struct CANRFP_BITS { // bit description + Uint16 RFP0:1; // 0 RFP for Mailbox 0 + Uint16 RFP1:1; // 1 RFP for Mailbox 1 + Uint16 RFP2:1; // 2 RFP for Mailbox 2 + Uint16 RFP3:1; // 3 RFP for Mailbox 3 + Uint16 RFP4:1; // 4 RFP for Mailbox 4 + Uint16 RFP5:1; // 5 RFP for Mailbox 5 + Uint16 RFP6:1; // 6 RFP for Mailbox 6 + Uint16 RFP7:1; // 7 RFP for Mailbox 7 + Uint16 RFP8:1; // 8 RFP for Mailbox 8 + Uint16 RFP9:1; // 9 RFP for Mailbox 9 + Uint16 RFP10:1; // 10 RFP for Mailbox 10 + Uint16 RFP11:1; // 11 RFP for Mailbox 11 + Uint16 RFP12:1; // 12 RFP for Mailbox 12 + Uint16 RFP13:1; // 13 RFP for Mailbox 13 + Uint16 RFP14:1; // 14 RFP for Mailbox 14 + Uint16 RFP15:1; // 15 RFP for Mailbox 15 + Uint16 RFP16:1; // 16 RFP for Mailbox 16 + Uint16 RFP17:1; // 17 RFP for Mailbox 17 + Uint16 RFP18:1; // 18 RFP for Mailbox 18 + Uint16 RFP19:1; // 19 RFP for Mailbox 19 + Uint16 RFP20:1; // 20 RFP for Mailbox 20 + Uint16 RFP21:1; // 21 RFP for Mailbox 21 + Uint16 RFP22:1; // 22 RFP for Mailbox 22 + Uint16 RFP23:1; // 23 RFP for Mailbox 23 + Uint16 RFP24:1; // 24 RFP for Mailbox 24 + Uint16 RFP25:1; // 25 RFP for Mailbox 25 + Uint16 RFP26:1; // 26 RFP for Mailbox 26 + Uint16 RFP27:1; // 27 RFP for Mailbox 27 + Uint16 RFP28:1; // 28 RFP for Mailbox 28 + Uint16 RFP29:1; // 29 RFP for Mailbox 29 + Uint16 RFP30:1; // 30 RFP for Mailbox 30 + Uint16 RFP31:1; // 31 RFP for Mailbox 31 + +}; + +/* Allow access to the bit fields or entire register */ +union CANRFP_REG { + Uint32 all; + struct CANRFP_BITS bit; +}; + +/* eCAN Global Acceptance Mask register (CANGAM) bit definitions */ +struct CANGAM_BITS { // bits description + Uint16 GAM150:16; // 15:0 Global acceptance mask bits 0-15 + Uint16 GAM2816:13; // 28:16 Global acceptance mask bits 16-28 + Uint16 rsvd:2; // 30:29 reserved + Uint16 AMI:1; // 31 AMI bit +}; + +/* Allow access to the bit fields or entire register */ +union CANGAM_REG { + Uint32 all; + struct CANGAM_BITS bit; +}; + + +/* eCAN Master Control register (CANMC) bit definitions */ +struct CANMC_BITS { // bits description + Uint16 MBNR:5; // 4:0 MBX # for CDR bit + Uint16 SRES:1; // 5 Soft reset + Uint16 STM:1; // 6 Self-test mode + Uint16 ABO:1; // 7 Auto bus-on + Uint16 CDR:1; // 8 Change data request + Uint16 WUBA:1; // 9 Wake-up on bus activity + Uint16 DBO:1; // 10 Data-byte order + Uint16 PDR:1; // 11 Power-down mode request + Uint16 CCR:1; // 12 Change configuration request + Uint16 SCB:1; // 13 SCC compatibility bit + Uint16 TCC:1; // 14 TSC MSB clear bit + Uint16 MBCC:1; // 15 TSC clear bit thru mailbox 16 + Uint16 SUSP:1; // 16 SUSPEND free/soft bit + Uint16 rsvd:15; // 31:17 reserved +}; + +/* Allow access to the bit fields or entire register */ +union CANMC_REG { + Uint32 all; + struct CANMC_BITS bit; +}; + +/* eCAN Bit -timing configuration register (CANBTC) bit definitions */ +struct CANBTC_BITS { // bits description + Uint16 TSEG2REG:3; // 2:0 TSEG2 register value + Uint16 TSEG1REG:4; // 6:3 TSEG1 register value + Uint16 SAM:1; // 7 Sample-point setting + Uint16 SJWREG:2; // 9:8 Synchroniztion Jump Width register value + Uint16 rsvd1:6; // 15:10 reserved + Uint16 BRPREG:8; // 23:16 Baudrate prescaler register value + Uint16 rsvd2:8; // 31:24 reserved +}; + +/* Allow access to the bit fields or entire register */ +union CANBTC_REG { + Uint32 all; + struct CANBTC_BITS bit; +}; + +/* eCAN Error & Status register (CANES) bit definitions */ +struct CANES_BITS { // bits description + Uint16 TM:1; // 0 Transmit Mode + Uint16 RM:1; // 1 Receive Mode + Uint16 rsvd1:1; // 2 reserved + Uint16 PDA:1; // 3 Power-down acknowledge + Uint16 CCE:1; // 4 Change Configuration Enable + Uint16 SMA:1; // 5 Suspend Mode Acknowledge + Uint16 rsvd2:10; // 15:6 reserved + Uint16 EW:1; // 16 Warning status + Uint16 EP:1; // 17 Error Passive status + Uint16 BO:1; // 18 Bus-off status + Uint16 ACKE:1; // 19 Acknowledge error + Uint16 SE:1; // 20 Stuff error + Uint16 CRCE:1; // 21 CRC error + Uint16 SA1:1; // 22 Stuck at Dominant error + Uint16 BE:1; // 23 Bit error + Uint16 FE:1; // 24 Framing error + Uint16 rsvd3:7; // 31:25 reserved +}; + +/* Allow access to the bit fields or entire register */ +union CANES_REG { + Uint32 all; + struct CANES_BITS bit; +}; + + +/* eCAN Transmit Error Counter register (CANTEC) bit definitions */ +struct CANTEC_BITS { // bits description + Uint16 TEC:8; // 7:0 TEC + Uint16 rsvd1:8; // 15:8 reserved + Uint16 rsvd2:16; // 31:16 reserved +}; + +/* Allow access to the bit fields or entire register */ +union CANTEC_REG { + Uint32 all; + struct CANTEC_BITS bit; +}; + +/* eCAN Receive Error Counter register (CANREC) bit definitions */ +struct CANREC_BITS { // bits description + Uint16 REC:8; // 7:0 REC + Uint16 rsvd1:8; // 15:8 reserved + Uint16 rsvd2:16; // 31:16 reserved +}; + +/* Allow access to the bit fields or entire register */ +union CANREC_REG { + Uint32 all; + struct CANREC_BITS bit; +}; + +/* eCAN Global Interrupt Flag 0 (CANGIF0) bit definitions */ +struct CANGIF0_BITS { // bits description + Uint16 MIV0:5; // 4:0 Mailbox Interrupt Vector + Uint16 rsvd1:3; // 7:5 reserved + Uint16 WLIF0:1; // 8 Warning level interrupt flag + Uint16 EPIF0:1; // 9 Error-passive interrupt flag + Uint16 BOIF0:1; // 10 Bus-off interrupt flag + Uint16 RMLIF0:1; // 11 Received message lost interrupt flag + Uint16 WUIF0:1; // 12 Wakeup interrupt flag + Uint16 WDIF0:1; // 13 Write denied interrupt flag + Uint16 AAIF0:1; // 14 Abort Ack interrupt flag + Uint16 GMIF0:1; // 15 Global MBX interrupt flag + Uint16 TCOF0:1; // 16 TSC Overflow flag + Uint16 MTOF0:1; // 17 Mailbox Timeout flag + Uint16 rsvd2:14; // 31:18 reserved +}; + +/* Allow access to the bit fields or entire register */ +union CANGIF0_REG { + Uint32 all; + struct CANGIF0_BITS bit; +}; + +/* eCAN Global Interrupt Mask register (CANGIM) bit definitions */ +struct CANGIM_BITS { // bits description + Uint16 I0EN:1; // 0 Interrupt 0 enable + Uint16 I1EN:1; // 1 Interrupt 1 enable + Uint16 GIL:1; // 2 Global Interrupt Level + Uint16 rsvd1:5; // 7:3 reserved + Uint16 WLIM:1; // 8 Warning level interrupt mask + Uint16 EPIM:1; // 9 Error-passive interrupt mask + Uint16 BOIM:1; // 10 Bus-off interrupt mask + Uint16 RMLIM:1; // 11 Received message lost interrupt mask + Uint16 WUIM:1; // 12 Wakeup interrupt mask + Uint16 WDIM:1; // 13 Write denied interrupt mask + Uint16 AAIM:1; // 14 Abort Ack interrupt mask + Uint16 rsvd2:1; // 15 reserved + Uint16 TCOM:1; // 16 TSC overflow interrupt mask + Uint16 MTOM:1; // 17 MBX Timeout interrupt mask + Uint16 rsvd3:14; // 31:18 reserved +}; + +/* Allow access to the bit fields or entire register */ +union CANGIM_REG { + Uint32 all; + struct CANGIM_BITS bit; +}; + + +/* eCAN Global Interrupt Flag 1 (eCANGIF1) bit definitions */ +struct CANGIF1_BITS { // bits description + Uint16 MIV1:5; // 4:0 Mailbox Interrupt Vector + Uint16 rsvd1:3; // 7:5 reserved + Uint16 WLIF1:1; // 8 Warning level interrupt flag + Uint16 EPIF1:1; // 9 Error-passive interrupt flag + Uint16 BOIF1:1; // 10 Bus-off interrupt flag + Uint16 RMLIF1:1; // 11 Received message lost interrupt flag + Uint16 WUIF1:1; // 12 Wakeup interrupt flag + Uint16 WDIF1:1; // 13 Write denied interrupt flag + Uint16 AAIF1:1; // 14 Abort Ack interrupt flag + Uint16 GMIF1:1; // 15 Global MBX interrupt flag + Uint16 TCOF1:1; // 16 TSC Overflow flag + Uint16 MTOF1:1; // 17 Mailbox Timeout flag + Uint16 rsvd2:14; // 31:18 reserved +}; + +/* Allow access to the bit fields or entire register */ +union CANGIF1_REG { + Uint32 all; + struct CANGIF1_BITS bit; +}; + + +/* eCAN Mailbox Interrupt Mask register (CANMIM) bit definitions */ +struct CANMIM_BITS { // bit description + Uint16 MIM0:1; // 0 MIM for Mailbox 0 + Uint16 MIM1:1; // 1 MIM for Mailbox 1 + Uint16 MIM2:1; // 2 MIM for Mailbox 2 + Uint16 MIM3:1; // 3 MIM for Mailbox 3 + Uint16 MIM4:1; // 4 MIM for Mailbox 4 + Uint16 MIM5:1; // 5 MIM for Mailbox 5 + Uint16 MIM6:1; // 6 MIM for Mailbox 6 + Uint16 MIM7:1; // 7 MIM for Mailbox 7 + Uint16 MIM8:1; // 8 MIM for Mailbox 8 + Uint16 MIM9:1; // 9 MIM for Mailbox 9 + Uint16 MIM10:1; // 10 MIM for Mailbox 10 + Uint16 MIM11:1; // 11 MIM for Mailbox 11 + Uint16 MIM12:1; // 12 MIM for Mailbox 12 + Uint16 MIM13:1; // 13 MIM for Mailbox 13 + Uint16 MIM14:1; // 14 MIM for Mailbox 14 + Uint16 MIM15:1; // 15 MIM for Mailbox 15 + Uint16 MIM16:1; // 16 MIM for Mailbox 16 + Uint16 MIM17:1; // 17 MIM for Mailbox 17 + Uint16 MIM18:1; // 18 MIM for Mailbox 18 + Uint16 MIM19:1; // 19 MIM for Mailbox 19 + Uint16 MIM20:1; // 20 MIM for Mailbox 20 + Uint16 MIM21:1; // 21 MIM for Mailbox 21 + Uint16 MIM22:1; // 22 MIM for Mailbox 22 + Uint16 MIM23:1; // 23 MIM for Mailbox 23 + Uint16 MIM24:1; // 24 MIM for Mailbox 24 + Uint16 MIM25:1; // 25 MIM for Mailbox 25 + Uint16 MIM26:1; // 26 MIM for Mailbox 26 + Uint16 MIM27:1; // 27 MIM for Mailbox 27 + Uint16 MIM28:1; // 28 MIM for Mailbox 28 + Uint16 MIM29:1; // 29 MIM for Mailbox 29 + Uint16 MIM30:1; // 30 MIM for Mailbox 30 + Uint16 MIM31:1; // 31 MIM for Mailbox 31 + +}; + +/* Allow access to the bit fields or entire register */ +union CANMIM_REG { + Uint32 all; + struct CANMIM_BITS bit; +}; + +/* eCAN Mailbox Interrupt Level register (CANMIL) bit definitions */ +struct CANMIL_BITS { // bit description + Uint16 MIL0:1; // 0 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL1:1; // 1 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL2:1; // 2 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL3:1; // 3 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL4:1; // 4 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL5:1; // 5 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL6:1; // 6 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL7:1; // 7 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL8:1; // 8 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL9:1; // 9 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL10:1; // 10 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL11:1; // 11 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL12:1; // 12 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL13:1; // 13 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL14:1; // 14 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL15:1; // 15 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL16:1; // 16 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL17:1; // 17 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL18:1; // 18 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL19:1; // 19 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL20:1; // 20 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL21:1; // 21 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL22:1; // 22 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL23:1; // 23 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL24:1; // 24 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL25:1; // 25 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL26:1; // 26 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL27:1; // 27 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL28:1; // 28 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL29:1; // 29 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL30:1; // 30 0 -> Int 9.5 1 -> Int 9.6 + Uint16 MIL31:1; // 31 0 -> Int 9.5 1 -> Int 9.6 + +}; + +/* Allow access to the bit fields or entire register */ +union CANMIL_REG { + Uint32 all; + struct CANMIL_BITS bit; +}; + + +/* eCAN Overwrite Protection Control register (CANOPC) bit definitions */ +struct CANOPC_BITS { // bit description + Uint16 OPC0:1; // 0 OPC for Mailbox 0 + Uint16 OPC1:1; // 1 OPC for Mailbox 1 + Uint16 OPC2:1; // 2 OPC for Mailbox 2 + Uint16 OPC3:1; // 3 OPC for Mailbox 3 + Uint16 OPC4:1; // 4 OPC for Mailbox 4 + Uint16 OPC5:1; // 5 OPC for Mailbox 5 + Uint16 OPC6:1; // 6 OPC for Mailbox 6 + Uint16 OPC7:1; // 7 OPC for Mailbox 7 + Uint16 OPC8:1; // 8 OPC for Mailbox 8 + Uint16 OPC9:1; // 9 OPC for Mailbox 9 + Uint16 OPC10:1; // 10 OPC for Mailbox 10 + Uint16 OPC11:1; // 11 OPC for Mailbox 11 + Uint16 OPC12:1; // 12 OPC for Mailbox 12 + Uint16 OPC13:1; // 13 OPC for Mailbox 13 + Uint16 OPC14:1; // 14 OPC for Mailbox 14 + Uint16 OPC15:1; // 15 OPC for Mailbox 15 + Uint16 OPC16:1; // 16 OPC for Mailbox 16 + Uint16 OPC17:1; // 17 OPC for Mailbox 17 + Uint16 OPC18:1; // 18 OPC for Mailbox 18 + Uint16 OPC19:1; // 19 OPC for Mailbox 19 + Uint16 OPC20:1; // 20 OPC for Mailbox 20 + Uint16 OPC21:1; // 21 OPC for Mailbox 21 + Uint16 OPC22:1; // 22 OPC for Mailbox 22 + Uint16 OPC23:1; // 23 OPC for Mailbox 23 + Uint16 OPC24:1; // 24 OPC for Mailbox 24 + Uint16 OPC25:1; // 25 OPC for Mailbox 25 + Uint16 OPC26:1; // 26 OPC for Mailbox 26 + Uint16 OPC27:1; // 27 OPC for Mailbox 27 + Uint16 OPC28:1; // 28 OPC for Mailbox 28 + Uint16 OPC29:1; // 29 OPC for Mailbox 29 + Uint16 OPC30:1; // 30 OPC for Mailbox 30 + Uint16 OPC31:1; // 31 OPC for Mailbox 31 + +}; + +/* Allow access to the bit fields or entire register */ +union CANOPC_REG { + Uint32 all; + struct CANOPC_BITS bit; +}; + + +/* eCAN TX I/O Control Register (CANTIOC) bit definitions */ +struct CANTIOC_BITS { // bits description + Uint16 rsvd1:3; // 2:0 reserved + Uint16 TXFUNC:1; // 3 TXFUNC + Uint16 rsvd2:12; // 15:4 reserved + Uint16 rsvd3:16; // 31:16 reserved +}; + +/* Allow access to the bit fields or entire register */ +union CANTIOC_REG { + Uint32 all; + struct CANTIOC_BITS bit; +}; + +/* eCAN RX I/O Control Register (CANRIOC) bit definitions */ +struct CANRIOC_BITS { // bits description + Uint16 rsvd1:3; // 2:0 reserved + Uint16 RXFUNC:1; // 3 RXFUNC + Uint16 rsvd2:12; // 15:4 reserved + Uint16 rsvd3:16; // 31:16 reserved +}; + +/* Allow access to the bit fields or entire register */ +union CANRIOC_REG { + Uint32 all; + struct CANRIOC_BITS bit; +}; + + +/* eCAN Time-out Control register (CANTOC) bit definitions */ +struct CANTOC_BITS { // bit description + Uint16 TOC0:1; // 0 TOC for Mailbox 0 + Uint16 TOC1:1; // 1 TOC for Mailbox 1 + Uint16 TOC2:1; // 2 TOC for Mailbox 2 + Uint16 TOC3:1; // 3 TOC for Mailbox 3 + Uint16 TOC4:1; // 4 TOC for Mailbox 4 + Uint16 TOC5:1; // 5 TOC for Mailbox 5 + Uint16 TOC6:1; // 6 TOC for Mailbox 6 + Uint16 TOC7:1; // 7 TOC for Mailbox 7 + Uint16 TOC8:1; // 8 TOC for Mailbox 8 + Uint16 TOC9:1; // 9 TOC for Mailbox 9 + Uint16 TOC10:1; // 10 TOC for Mailbox 10 + Uint16 TOC11:1; // 11 TOC for Mailbox 11 + Uint16 TOC12:1; // 12 TOC for Mailbox 12 + Uint16 TOC13:1; // 13 TOC for Mailbox 13 + Uint16 TOC14:1; // 14 TOC for Mailbox 14 + Uint16 TOC15:1; // 15 TOC for Mailbox 15 + Uint16 TOC16:1; // 16 TOC for Mailbox 16 + Uint16 TOC17:1; // 17 TOC for Mailbox 17 + Uint16 TOC18:1; // 18 TOC for Mailbox 18 + Uint16 TOC19:1; // 19 TOC for Mailbox 19 + Uint16 TOC20:1; // 20 TOC for Mailbox 20 + Uint16 TOC21:1; // 21 TOC for Mailbox 21 + Uint16 TOC22:1; // 22 TOC for Mailbox 22 + Uint16 TOC23:1; // 23 TOC for Mailbox 23 + Uint16 TOC24:1; // 24 TOC for Mailbox 24 + Uint16 TOC25:1; // 25 TOC for Mailbox 25 + Uint16 TOC26:1; // 26 TOC for Mailbox 26 + Uint16 TOC27:1; // 27 TOC for Mailbox 27 + Uint16 TOC28:1; // 28 TOC for Mailbox 28 + Uint16 TOC29:1; // 29 TOC for Mailbox 29 + Uint16 TOC30:1; // 30 TOC for Mailbox 30 + Uint16 TOC31:1; // 31 TOC for Mailbox 31 + +}; + +/* Allow access to the bit fields or entire register */ +union CANTOC_REG { + Uint32 all; + struct CANTOC_BITS bit; +}; + + +/* eCAN Time-out Status register (CANTOS) bit definitions */ +struct CANTOS_BITS { // bit description + Uint16 TOS0:1; // 0 TOS for Mailbox 0 + Uint16 TOS1:1; // 1 TOS for Mailbox 1 + Uint16 TOS2:1; // 2 TOS for Mailbox 2 + Uint16 TOS3:1; // 3 TOS for Mailbox 3 + Uint16 TOS4:1; // 4 TOS for Mailbox 4 + Uint16 TOS5:1; // 5 TOS for Mailbox 5 + Uint16 TOS6:1; // 6 TOS for Mailbox 6 + Uint16 TOS7:1; // 7 TOS for Mailbox 7 + Uint16 TOS8:1; // 8 TOS for Mailbox 8 + Uint16 TOS9:1; // 9 TOS for Mailbox 9 + Uint16 TOS10:1; // 10 TOS for Mailbox 10 + Uint16 TOS11:1; // 11 TOS for Mailbox 11 + Uint16 TOS12:1; // 12 TOS for Mailbox 12 + Uint16 TOS13:1; // 13 TOS for Mailbox 13 + Uint16 TOS14:1; // 14 TOS for Mailbox 14 + Uint16 TOS15:1; // 15 TOS for Mailbox 15 + Uint16 TOS16:1; // 16 TOS for Mailbox 16 + Uint16 TOS17:1; // 17 TOS for Mailbox 17 + Uint16 TOS18:1; // 18 TOS for Mailbox 18 + Uint16 TOS19:1; // 19 TOS for Mailbox 19 + Uint16 TOS20:1; // 20 TOS for Mailbox 20 + Uint16 TOS21:1; // 21 TOS for Mailbox 21 + Uint16 TOS22:1; // 22 TOS for Mailbox 22 + Uint16 TOS23:1; // 23 TOS for Mailbox 23 + Uint16 TOS24:1; // 24 TOS for Mailbox 24 + Uint16 TOS25:1; // 25 TOS for Mailbox 25 + Uint16 TOS26:1; // 26 TOS for Mailbox 26 + Uint16 TOS27:1; // 27 TOS for Mailbox 27 + Uint16 TOS28:1; // 28 TOS for Mailbox 28 + Uint16 TOS29:1; // 29 TOS for Mailbox 29 + Uint16 TOS30:1; // 30 TOS for Mailbox 30 + Uint16 TOS31:1; // 31 TOS for Mailbox 31 + +}; + +/* Allow access to the bit fields or entire register */ +union CANTOS_REG { + Uint32 all; + struct CANTOS_BITS bit; +}; + +/**************************************/ +/* eCAN Control & Status register file */ +/**************************************/ + +struct ECAN_REGS { + union CANME_REG CANME; // Mailbox Enable + union CANMD_REG CANMD; // Mailbox Direction + union CANTRS_REG CANTRS; // Transmit Request Set + union CANTRR_REG CANTRR; // Transmit Request Reset + union CANTA_REG CANTA; // Transmit Acknowledge + union CANAA_REG CANAA; // Abort Acknowledge + union CANRMP_REG CANRMP; // Received Message Pending + union CANRML_REG CANRML; // Received Message Lost + union CANRFP_REG CANRFP; // Remote Frame Pending + union CANGAM_REG CANGAM; // Global Acceptance Mask + union CANMC_REG CANMC; // Master Control + union CANBTC_REG CANBTC; // Bit Timing + union CANES_REG CANES; // Error Status + union CANTEC_REG CANTEC; // Transmit Error Counter + union CANREC_REG CANREC; // Receive Error Counter + union CANGIF0_REG CANGIF0; // Global Interrupt Flag 0 + union CANGIM_REG CANGIM; // Global Interrupt Mask 0 + union CANGIF1_REG CANGIF1; // Global Interrupt Flag 1 + union CANMIM_REG CANMIM; // Mailbox Interrupt Mask + union CANMIL_REG CANMIL; // Mailbox Interrupt Level + union CANOPC_REG CANOPC; // Overwrite Protection Control + union CANTIOC_REG CANTIOC; // TX I/O Control + union CANRIOC_REG CANRIOC; // RX I/O Control + Uint32 CANTSC; // Time-stamp counter + union CANTOC_REG CANTOC; // Time-out Control + union CANTOS_REG CANTOS; // Time-out Status + +}; + +/* --------------------------------------------------- */ +/* eCAN Mailbox Registers */ +/* ----------------------------------------------------*/ + +/* eCAN Message ID (MSGID) bit definitions */ +struct CANMSGID_BITS { // bits description + Uint16 EXTMSGID_L:16; // 0:15 + Uint16 EXTMSGID_H:2; // 16:17 + Uint16 STDMSGID:11; // 18:28 + Uint16 AAM:1; // 29 + Uint16 AME:1; // 30 + Uint16 IDE:1; // 31 + +}; + +/* Allow access to the bit fields or entire register */ +union CANMSGID_REG { + Uint32 all; + struct CANMSGID_BITS bit; +}; + +/* eCAN Message Control Field (MSGCTRL) bit definitions */ +struct CANMSGCTRL_BITS { // bits description + Uint16 DLC:4; // 0:3 + Uint16 RTR:1; // 4 + Uint16 rsvd1:3; // 7:5 reserved + Uint16 TPL:5; // 12:8 + Uint16 rsvd2:3; // 15:13 reserved + Uint16 rsvd3:16; // 31:16 reserved +}; + +/* Allow access to the bit fields or entire register */ +union CANMSGCTRL_REG { + Uint32 all; + struct CANMSGCTRL_BITS bit; +}; + +/* eCAN Message Data Register low (MDR_L) word definitions */ +struct CANMDL_WORDS { // bits description + Uint16 LOW_WORD:16; // 0:15 + Uint16 HI_WORD:16; // 31:16 +}; + +/* eCAN Message Data Register low (MDR_L) byte definitions */ +struct CANMDL_BYTES { // bits description + Uint16 BYTE3:8; // 31:24 + Uint16 BYTE2:8; // 23:16 + Uint16 BYTE1:8; // 15:8 + Uint16 BYTE0:8; // 7:0 +}; + + +/* Allow access to the bit fields or entire register */ + +union CANMDL_REG { + Uint32 all; + struct CANMDL_WORDS word; + struct CANMDL_BYTES byte; +}; + + + +/* eCAN Message Data Register high (MDR_H) word definitions */ +struct CANMDH_WORDS { // bits description + Uint16 LOW_WORD:16; // 0:15 + Uint16 HI_WORD:16; // 31:16 +}; + +/* eCAN Message Data Register low (MDR_H) byte definitions */ +struct CANMDH_BYTES { // bits description + Uint16 BYTE7:8; // 63:56 + Uint16 BYTE6:8; // 55:48 + Uint16 BYTE5:8; // 47:40 + Uint16 BYTE4:8; // 39:32 +}; + +/* Allow access to the bit fields or entire register */ +union CANMDH_REG { + Uint32 all; + struct CANMDH_WORDS word; + struct CANMDH_BYTES byte; +}; + + +struct MBOX { + union CANMSGID_REG MSGID; + union CANMSGCTRL_REG MSGCTRL; + union CANMDL_REG MDL; + union CANMDH_REG MDH; +}; + +/**************************************/ +/* eCAN Mailboxes */ +/**************************************/ + +struct ECAN_MBOXES { + struct MBOX MBOX0; + struct MBOX MBOX1; + struct MBOX MBOX2; + struct MBOX MBOX3; + struct MBOX MBOX4; + struct MBOX MBOX5; + struct MBOX MBOX6; + struct MBOX MBOX7; + struct MBOX MBOX8; + struct MBOX MBOX9; + struct MBOX MBOX10; + struct MBOX MBOX11; + struct MBOX MBOX12; + struct MBOX MBOX13; + struct MBOX MBOX14; + struct MBOX MBOX15; + struct MBOX MBOX16; + struct MBOX MBOX17; + struct MBOX MBOX18; + struct MBOX MBOX19; + struct MBOX MBOX20; + struct MBOX MBOX21; + struct MBOX MBOX22; + struct MBOX MBOX23; + struct MBOX MBOX24; + struct MBOX MBOX25; + struct MBOX MBOX26; + struct MBOX MBOX27; + struct MBOX MBOX28; + struct MBOX MBOX29; + struct MBOX MBOX30; + struct MBOX MBOX31; +}; + +/* eCAN Local Acceptance Mask (LAM) bit definitions */ +struct CANLAM_BITS { // bits description + Uint16 LAM_L:16; // 0:15 + Uint16 LAM_H:13; // 16:28 + Uint16 rsvd1:2; // 29:30 reserved + Uint16 LAMI:1; // 31 +}; + +/* Allow access to the bit fields or entire register */ +union CANLAM_REG { + Uint32 all; + struct CANLAM_BITS bit; +}; + + +/**************************************/ +/* eCAN Local Acceptance Masks */ +/**************************************/ + +/* eCAN LAM File */ +struct LAM_REGS { + union CANLAM_REG LAM0; + union CANLAM_REG LAM1; + union CANLAM_REG LAM2; + union CANLAM_REG LAM3; + union CANLAM_REG LAM4; + union CANLAM_REG LAM5; + union CANLAM_REG LAM6; + union CANLAM_REG LAM7; + union CANLAM_REG LAM8; + union CANLAM_REG LAM9; + union CANLAM_REG LAM10; + union CANLAM_REG LAM11; + union CANLAM_REG LAM12; + union CANLAM_REG LAM13; + union CANLAM_REG LAM14; + union CANLAM_REG LAM15; + union CANLAM_REG LAM16; + union CANLAM_REG LAM17; + union CANLAM_REG LAM18; + union CANLAM_REG LAM19; + union CANLAM_REG LAM20; + union CANLAM_REG LAM21; + union CANLAM_REG LAM22; + union CANLAM_REG LAM23; + union CANLAM_REG LAM24; + union CANLAM_REG LAM25; + union CANLAM_REG LAM26; + union CANLAM_REG LAM27; + union CANLAM_REG LAM28; + union CANLAM_REG LAM29; + union CANLAM_REG LAM30; + union CANLAM_REG LAM31; +}; + +/* Mailbox MOTS File */ + +struct MOTS_REGS { + Uint32 MOTS0; + Uint32 MOTS1; + Uint32 MOTS2; + Uint32 MOTS3; + Uint32 MOTS4; + Uint32 MOTS5; + Uint32 MOTS6; + Uint32 MOTS7; + Uint32 MOTS8; + Uint32 MOTS9; + Uint32 MOTS10; + Uint32 MOTS11; + Uint32 MOTS12; + Uint32 MOTS13; + Uint32 MOTS14; + Uint32 MOTS15; + Uint32 MOTS16; + Uint32 MOTS17; + Uint32 MOTS18; + Uint32 MOTS19; + Uint32 MOTS20; + Uint32 MOTS21; + Uint32 MOTS22; + Uint32 MOTS23; + Uint32 MOTS24; + Uint32 MOTS25; + Uint32 MOTS26; + Uint32 MOTS27; + Uint32 MOTS28; + Uint32 MOTS29; + Uint32 MOTS30; + Uint32 MOTS31; +}; + +/* Mailbox MOTO File */ + +struct MOTO_REGS { + Uint32 MOTO0; + Uint32 MOTO1; + Uint32 MOTO2; + Uint32 MOTO3; + Uint32 MOTO4; + Uint32 MOTO5; + Uint32 MOTO6; + Uint32 MOTO7; + Uint32 MOTO8; + Uint32 MOTO9; + Uint32 MOTO10; + Uint32 MOTO11; + Uint32 MOTO12; + Uint32 MOTO13; + Uint32 MOTO14; + Uint32 MOTO15; + Uint32 MOTO16; + Uint32 MOTO17; + Uint32 MOTO18; + Uint32 MOTO19; + Uint32 MOTO20; + Uint32 MOTO21; + Uint32 MOTO22; + Uint32 MOTO23; + Uint32 MOTO24; + Uint32 MOTO25; + Uint32 MOTO26; + Uint32 MOTO27; + Uint32 MOTO28; + Uint32 MOTO29; + Uint32 MOTO30; + Uint32 MOTO31; +}; + + +//--------------------------------------------------------------------------- +// eCAN External References & Function Declarations: +// +extern volatile struct ECAN_REGS ECanaRegs; +extern volatile struct ECAN_MBOXES ECanaMboxes; +extern volatile struct LAM_REGS ECanaLAMRegs; +extern volatile struct MOTO_REGS ECanaMOTORegs; +extern volatile struct MOTS_REGS ECanaMOTSRegs; + +#ifdef __cplusplus +} +#endif /* extern "C" */ + +#endif // end of DSP281x_ECAN.H definition + +//=========================================================================== +// No more. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Ev.h b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Ev.h new file mode 100644 index 0000000..092a5fd --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Ev.h @@ -0,0 +1,654 @@ +// TI File $Revision: /main/4 $ +// Checkin $Date: June 22, 2007 09:30:33 $ +//########################################################################### +// +// FILE: DSP281x_Ev.h +// +// TITLE: DSP281x Device Event Manager Register Definitions. +// +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + +#ifndef DSP281x_EV_H +#define DSP281x_EV_H + + +#ifdef __cplusplus +extern "C" { +#endif + +#include "DSP281x_Device.h" +/* --------------------------------------------------- */ +/* F2810/12 Event Manager (EV) GP Timer Registers */ +/* */ +/* ----------------------------------------------------*/ + +/* Overall Timer Control Register */ + +struct GPTCONA_BITS { + Uint16 T1PIN:2; // 1:0 Polarity of GP timer 1 compare + Uint16 T2PIN:2; // 3:2 Polarity of GP timer 2 compare + Uint16 T1CMPOE:1; // 4 Timer1 compare output + Uint16 T2CMPOE:1; // 5 Timer2 compare output + Uint16 TCMPOE:1; // 6 Compare output enable + Uint16 T1TOADC:2; // 8:7 Start ADC with timer 1 event + Uint16 T2TOADC:2; // 10:9 Start ADC with timer 2 event + Uint16 T1CTRIPE:1; // 11 Enable Timer 1 compare trip + Uint16 T2CTRIPE:1; // 12 Enable Timer 2 compare trip + Uint16 T1STAT:1; // 13 GP Timer 1 status (read only) + Uint16 T2STAT:1; // 14 GP Timer 2 status (read only) + Uint16 rsvd:1; // 15 reserved +}; + +/* Allow access to the bit fields or entire register */ +union GPTCONA_REG { + Uint16 all; + struct GPTCONA_BITS bit; +}; + +struct GPTCONB_BITS { + Uint16 T3PIN:2; // 1:0 Polarity of GP timer 3 compare + Uint16 T4PIN:2; // 3:2 Polarity of GP timer 4 compare + Uint16 T3CMPOE:1; // 4 Timer3 compare output + Uint16 T4CMPOE:1; // 5 Timer4 compare output + Uint16 TCMPOE:1; // 6 Compare output enable + Uint16 T3TOADC:2; // 8:7 Start ADC with timer 3 event + Uint16 T4TOADC:2; // 10:9 Start ADC with timer 4 event + Uint16 T3CTRIPE:1; // 11 Timer 3 trip enable + Uint16 T4CTRIPE:1; // 12 Timer 4 trip enable + Uint16 T3STAT:1; // 13 GP Timer 3 status (read only) + Uint16 T4STAT:1; // 14 GP Timer 4 status (read only) + Uint16 rsvd2:1; // 15 reserved +}; + +/* Allow access to the bit fields or entire register */ +union GPTCONB_REG { + Uint16 all; + struct GPTCONB_BITS bit; +}; + +/* Timer 1 Control Register bit defintions */ +struct T1CON_BITS { + Uint16 rsvd1:1; // 0 reserved + Uint16 TECMPR:1; // 1 Timer compare enable + Uint16 TCLD10:2; // 3:2 Timer copare register reload + Uint16 TCLKS10:2; // 5:4 Clock source select + Uint16 TENABLE:1; // 6 Timer enable + Uint16 rsvd2:1; // 7 reserved + Uint16 TPS:3; // 10:8 Input clock prescaler + Uint16 TMODE:2; // 12:11 Count mode selection + Uint16 rsvd:1; // 13 reserved + Uint16 SOFT:1; // 14 Soft emulation control + Uint16 FREE:1; // 15 Free emulation control +}; + +/* Allow access to the bit fields or entire register */ +union T1CON_REG { + Uint16 all; + struct T1CON_BITS bit; +}; + + +/* Timer 2 Control Register bit defintions */ +struct T2CON_BITS { + Uint16 SET1PR:1; // 0 Period register select + Uint16 TECMPR:1; // 1 Timer compare enable + Uint16 TCLD10:2; // 3:2 Timer copare register reload + Uint16 TCLKS10:2; // 5:4 Clock source select + Uint16 TENABLE:1; // 6 Timer enable + Uint16 T2SWT1:1; // 7 Start GP timer 2 with GP timer 1's enable + Uint16 TPS:3; // 10:8 Input clock prescaler + Uint16 TMODE:2; // 12:11 Count mode selection + Uint16 rsvd:1; // 13 reserved + Uint16 SOFT:1; // 14 Soft emulation control + Uint16 FREE:1; // 15 Free emulation control +}; + +/* Allow access to the bit fields or entire register */ +union T2CON_REG { + Uint16 all; + struct T2CON_BITS bit; +}; + +/* Timer 3 Control Register bit defintions */ +struct T3CON_BITS { + Uint16 rsvd1:1; // 0 reserved + Uint16 TECMPR:1; // 1 Timer compare enable + Uint16 TCLD10:2; // 3:2 Timer copare register reload + Uint16 TCLKS10:2; // 5:4 Clock source select + Uint16 TENABLE:1; // 6 Timer enable + Uint16 rsvd2:1; // 7 reserved + Uint16 TPS:3; // 10:8 Input clock prescaler + Uint16 TMODE:2; // 12:11 Count mode selection + Uint16 rsvd:1; // 13 reserved + Uint16 SOFT:1; // 14 Soft emulation control + Uint16 FREE:1; // 15 Free emulation control +}; + +/* Allow access to the bit fields or entire register */ +union T3CON_REG { + Uint16 all; + struct T3CON_BITS bit; +}; + +/* Timer 4 Control Register bit defintions */ +struct T4CON_BITS { + Uint16 SET3PR:1; // 0 Period register select + Uint16 TECMPR:1; // 1 Timer compare enable + Uint16 TCLD10:2; // 3:2 Timer copare register reload + Uint16 TCLKS10:2; // 5:4 Clock source select + Uint16 TENABLE:1; // 6 Timer enable + Uint16 T4SWT3:1; // 7 Start GP timer 2 with GP timer 1's enable + Uint16 TPS:3; // 10:8 Input clock prescaler + Uint16 TMODE:2; // 12:11 Count mode selection + Uint16 rsvd:1; // 13 reserved + Uint16 SOFT:1; // 14 Soft emulation control + Uint16 FREE:1; // 15 Free emulation control +}; + +/* Allow access to the bit fields or entire register */ +union T4CON_REG { + Uint16 all; + struct T4CON_BITS bit; +}; + + +struct EXTCONA_BITS { + Uint16 INDCOE:1; // 0 Independant compare output + Uint16 QEPIQUAL:1; // 1 QEP/CAP3 Index Qual Mode + Uint16 QEPIE:1; // 2 QEP index enable + Uint16 EVSOCE:1; // 3 EvA start of conversion output enable + Uint16 rsvd:12; // 15:4 reserved +}; + +/* Allow access to the bit fields or entire register */ +union EXTCONA_REG { + Uint16 all; + struct EXTCONA_BITS bit; +}; + + +struct EXTCONB_BITS { + Uint16 INDCOE:1; // 0 Independant compare output + Uint16 QEPIQUAL:1; // 1 QEP/CAP3 Index Qual Mode + Uint16 QEPIE:1; // 2 QEP index enable + Uint16 EVSOCE:1; // 3 EvB start of conversion output enable + Uint16 rsvd:12; // 15:4 reserved +}; + +/* Allow access to the bit fields or entire register */ +union EXTCONB_REG { + Uint16 all; + struct EXTCONA_BITS bit; +}; + + + +/* Compare Control Register */ +struct COMCONA_BITS { + Uint16 C1TRIPE:1; // 0 C1TRIP enable + Uint16 C2TRIPE:1; // 1 C2TRIP enable + Uint16 C3TRIPE:1; // 2 C3TRIP eanble + Uint16 rsvd:2; // 4:3 reserved + Uint16 FCMP1OE:1; // 5 Full compare 1 output enable + Uint16 FCMP2OE:1; // 6 Full compare 2 output enable + Uint16 FCMP3OE:1; // 7 Full compare 3 output enable + Uint16 PDPINTASTATUS:1;// 8 Current status of the PDPINTA pin + Uint16 FCOMPOE:1; // 9 Compare output enable + Uint16 ACTRLD:2; // 11:10 Action control register reload + Uint16 SVENABLE:1; // 12 Space vector PWM Mode enable + Uint16 CLD:2; // 14:13 Compare register reload condition + Uint16 CENABLE:1; // 15 Compare enable +}; + +/* Allow access to the bit fields or entire register */ +union COMCONA_REG { + Uint16 all; + struct COMCONA_BITS bit; +}; + +struct COMCONB_BITS { + Uint16 C4TRIPE:1; // 0 C4TRIP enable + Uint16 C5TRIPE:1; // 1 C5TRIP enable + Uint16 C6TRIPE:1; // 2 C6TRIP eanble + Uint16 rsvd:2; // 4:3 reserved + Uint16 FCMP4OE:1; // 5 Full compare 4 output enable + Uint16 FCMP5OE:1; // 6 Full compare 5 output enable + Uint16 FCMP6OE:1; // 7 Full compare 6 output enable + Uint16 PDPINTBSTATUS:1;// 8 Current status of the PDPINTB pin + Uint16 FCOMPOE:1; // 9 Compare output enable + Uint16 ACTRLD:2; // 11:10 Action control register reload + Uint16 SVENABLE:1; // 12 Space vector PWM Mode enable + Uint16 CLD:2; // 14:13 Compare register reload condition + Uint16 CENABLE:1; // 15 Compare enable +}; + +/* Allow access to the bit fields or entire register */ +union COMCONB_REG { + Uint16 all; + struct COMCONB_BITS bit; +}; + +/* Compare Action Control Register bit definitions */ + +struct ACTRA_BITS { + Uint16 CMP1ACT:2; // 1:0 Action on compare output pin 1 CMP1 + Uint16 CMP2ACT:2; // 3:2 Action on compare output pin 2 CMP2 + Uint16 CMP3ACT:2; // 5:4 Action on compare output pin 3 CMP3 + Uint16 CMP4ACT:2; // 7:6 Action on compare output pin 4 CMP4 + Uint16 CMP5ACT:2; // 9:8 Action on compare output pin 5 CMP5 + Uint16 CMP6ACT:2; // 11:10 Action on compare output pin 6 CMP6 + Uint16 D:3; // 14:12 Basic vector bits + Uint16 SVRDIR:1; // 15 Space vecor PWM rotation dir +}; + +/* Allow access to the bit fields or entire register */ +union ACTRA_REG { + Uint16 all; + struct ACTRA_BITS bit; +}; + +struct ACTRB_BITS { + Uint16 CMP7ACT:2; // 1:0 Action on compare output pin 7 CMP7 + Uint16 CMP8ACT:2; // 3:2 Action on compare output pin 8 CMP8 + Uint16 CMP9ACT:2; // 5:4 Action on compare output pin 9 CMP9 + Uint16 CMP10ACT:2; // 7:6 Action on compare output pin 10 CMP10 + Uint16 CMP11ACT:2; // 9:8 Action on compare output pin 11 CMP11 + Uint16 CMP12ACT:2; // 11:10 Action on compare output pin 12 CMP12 + Uint16 D:3; // 14:12 Basic vector bits + Uint16 SVRDIR:1; // 15 Space vecor PWM rotation dir +}; + +/* Allow access to the bit fields or entire register */ +union ACTRB_REG { + Uint16 all; + struct ACTRB_BITS bit; +}; + +/* Dead-Band Timer Control register bit definitions */ +struct DBTCON_BITS { + Uint16 rsvd1:2; // 1:0 reserved + Uint16 DBTPS:3; // 4:2 Dead-Band timer prescaler + Uint16 EDBT1:1; // 5 Dead-Band timer 1 enable + Uint16 EDBT2:1; // 6 Dead-Band timer 2 enable + Uint16 EDBT3:1; // 7 Dead-Band timer 3 enable + Uint16 DBT:4; // 11:8 Dead-Band timer period + Uint16 rsvd2:4; // 15:12 reserved +}; + +/* Allow access to the bit fields or entire register */ +union DBTCON_REG { + Uint16 all; + struct DBTCON_BITS bit; +}; + + +/* Capture Control register bit definitions */ +struct CAPCONA_BITS { + Uint16 rsvd1:2; // 1:0 reserved + Uint16 CAP3EDGE:2; // 3:2 Edge Detection for Unit 3 + Uint16 CAP2EDGE:2; // 5:4 Edge Detection for Unit 2 + Uint16 CAP1EDGE:2; // 7:6 Edge Detection for Unit 1 + Uint16 CAP3TOADC:1; // 8 Unit 3 starts the ADC + Uint16 CAP12TSEL:1; // 9 GP Timer selection for Units 1 and 2 + Uint16 CAP3TSEL:1; // 10 GP Timer selection for Unit 3 + Uint16 rsvd2:1; // 11 reserved + Uint16 CAP3EN:1; // 12 Capture Unit 3 enable + Uint16 CAP12EN:2; // 14:13 Capture Unit 1 and 2 enable + Uint16 CAPRES:1; // 15 Capture reset (always reads 0) +}; + +/* Allow access to the bit fields or entire register */ +union CAPCONA_REG { + Uint16 all; + struct CAPCONA_BITS bit; +}; + + +/* Control register bit definitions */ +struct CAPCONB_BITS { + Uint16 rsvd1:2; // 1:0 reserved + Uint16 CAP6EDGE:2; // 3:2 Edge Detection for Unit 6 + Uint16 CAP5EDGE:2; // 5:4 Edge Detection for Unit 5 + Uint16 CAP4EDGE:2; // 7:6 Edge Detection for Unit 4 + Uint16 CAP6TOADC:1; // 8 Unit 6 starts the ADC + Uint16 CAP45TSEL:1; // 9 GP Timer selection for Units 4 and 5 + Uint16 CAP6TSEL:1; // 10 GP Timer selection for Unit 6 + Uint16 rsvd2:1; // 11 reserved + Uint16 CAP6EN:1; // 12 Capture Unit 6 control + Uint16 CAP45EN:2; // 14:13 Capture Unit 4 and 5 control + Uint16 CAPRES:1; // 15 Capture reset (always reads 0) +}; + +/* Allow access to the bit fields or entire register */ +union CAPCONB_REG { + Uint16 all; + struct CAPCONB_BITS bit; +}; + +/* Capture FIFO Status Register bit definitions */ +struct CAPFIFOA_BITS { + Uint16 rsvd1:8; // 7:0 reserved + Uint16 CAP1FIFO:2; // 9:8 CAP1 FIFO status + Uint16 CAP2FIFO:2; // 11:10 CAP2 FIFO status + Uint16 CAP3FIFO:2; // 13:12 CAP2 FIFO status + Uint16 rsvd2:2; // 15:14 reserved +}; + +/* Allow access to the bit fields or entire register */ +union CAPFIFOA_REG { + Uint16 all; + struct CAPFIFOA_BITS bit; +}; + +/* Capture FIFO Status Register bit definitions */ +struct CAPFIFOB_BITS { + Uint16 rsvd1:8; // 7:0 reserved + Uint16 CAP4FIFO:2; // 9:8 CAP4 FIFO status + Uint16 CAP5FIFO:2; // 11:10 CAP5 FIFO status + Uint16 CAP6FIFO:2; // 13:12 CAP6 FIFO status + Uint16 rsvd2:2; // 15:14 reserved +}; + +/* Allow access to the bit fields or entire register */ +union CAPFIFOB_REG { + Uint16 all; + struct CAPFIFOB_BITS bit; +}; + +/* Interrupt Mask Register bit definitions */ +struct EVAIMRA_BITS { + Uint16 PDPINTA:1; // 0 Enable PDPINTA + Uint16 CMP1INT:1; // 1 Enable + Uint16 CMP2INT:1; // 2 Enable + Uint16 CMP3INT:1; // 3 Enable + Uint16 rsvd1:3; // 6:4 reserved + Uint16 T1PINT:1; // 7 Enable + Uint16 T1CINT:1; // 8 Enable + Uint16 T1UFINT:1; // 9 Enable + Uint16 T1OFINT:1; // 10 Enable + Uint16 rsvd2:5; // 15:11 reserved +}; + +/* Allow access to the bit fields or entire register */ +union EVAIMRA_REG { + Uint16 all; + struct EVAIMRA_BITS bit; +}; + +/* Interrupt Mask Register bit definitions */ +struct EVBIMRA_BITS { + Uint16 PDPINTB:1; // 0 Enable PDPINTB + Uint16 CMP4INT:1; // 1 Enable + Uint16 CMP5INT:1; // 2 Enable + Uint16 CMP6INT:1; // 3 Enable + Uint16 rsvd1:3; // 6:4 reserved + Uint16 T3PINT:1; // 7 Enable + Uint16 T3CINT:1; // 8 Enable + Uint16 T3UFINT:1; // 9 Enable + Uint16 T3OFINT:1; // 10 Enable + Uint16 rsvd2:5; // 15:11 reserved +}; + +/* Allow access to the bit fields or entire register */ +union EVBIMRA_REG { + Uint16 all; + struct EVBIMRA_BITS bit; +}; + +struct EVAIMRB_BITS { + Uint16 T2PINT:1; // 0 Enable + Uint16 T2CINT:1; // 1 Enable + Uint16 T2UFINT:1; // 2 Enable + Uint16 T2OFINT:1; // 3 Enable + Uint16 rsvd1:12; // 15:4 reserved +}; + +/* Allow access to the bit fields or entire register */ +union EVAIMRB_REG { + Uint16 all; + struct EVAIMRB_BITS bit; +}; + +struct EVBIMRB_BITS { + Uint16 T4PINT:1; // 0 Enable + Uint16 T4CINT:1; // 1 Enable + Uint16 T4UFINT:1; // 2 Enable + Uint16 T4OFINT:1; // 3 Enable + Uint16 rsvd1:12; // 15:4 reserved +}; + +/* Allow access to the bit fields or entire register */ +union EVBIMRB_REG { + Uint16 all; + struct EVBIMRB_BITS bit; +}; + +struct EVAIMRC_BITS { + Uint16 CAP1INT:1; // 0 Enable + Uint16 CAP2INT:1; // 1 Enable + Uint16 CAP3INT:1; // 2 Enable + Uint16 rsvd1:13; // 15:3 reserved +}; + +/* Allow access to the bit fields or entire register */ +union EVAIMRC_REG { + Uint16 all; + struct EVAIMRC_BITS bit; +}; + +struct EVBIMRC_BITS { + Uint16 CAP4INT:1; // 0 Enable + Uint16 CAP5INT:1; // 1 Enable + Uint16 CAP6INT:1; // 2 Enable + Uint16 rsvd1:13; // 15:3 reserved +}; + +/* Allow access to the bit fields or entire register */ +union EVBIMRC_REG { + Uint16 all; + struct EVBIMRC_BITS bit; +}; + +/* Interrupt Flag Register bit definitions */ +struct EVAIFRA_BITS { + Uint16 PDPINTA:1; // 0 Flag PDPINTA + Uint16 CMP1INT:1; // 1 Flag + Uint16 CMP2INT:1; // 2 Flag + Uint16 CMP3INT:1; // 3 Flag + Uint16 rsvd1:3; // 6:4 reserved + Uint16 T1PINT:1; // 7 Flag + Uint16 T1CINT:1; // 8 Flag + Uint16 T1UFINT:1; // 9 Flag + Uint16 T1OFINT:1; // 10 Flag + Uint16 rsvd2:5; // 15:11 reserved +}; + +/* Allow access to the bit fields or entire register */ +union EVAIFRA_REG { + Uint16 all; + struct EVAIMRA_BITS bit; +}; + +/* Interrupt Mask Register bit definitions */ +struct EVBIFRA_BITS { + Uint16 PDPINTB:1; // 0 Flag PDPINTB + Uint16 CMP4INT:1; // 1 Flag + Uint16 CMP5INT:1; // 2 Flag + Uint16 CMP6INT:1; // 3 Flag + Uint16 rsvd1:3; // 6:4 reserved + Uint16 T3PINT:1; // 7 Flag + Uint16 T3CINT:1; // 8 Flag + Uint16 T3UFINT:1; // 9 Flag + Uint16 T3OFINT:1; // 10 Flag + Uint16 rsvd2:5; // 15:11 reserved +}; + +/* Allow access to the bit fields or entire register */ +union EVBIFRA_REG { + Uint16 all; + struct EVBIFRA_BITS bit; +}; + +struct EVAIFRB_BITS { + Uint16 T2PINT:1; // 0 Flag + Uint16 T2CINT:1; // 1 Flag + Uint16 T2UFINT:1; // 2 Flag + Uint16 T2OFINT:1; // 3 Flag + Uint16 rsvd1:12; // 15:4 reserved +}; + +/* Allow access to the bit fields or entire register */ +union EVAIFRB_REG { + Uint16 all; + struct EVAIFRB_BITS bit; +}; + +struct EVBIFRB_BITS { + Uint16 T4PINT:1; // 0 Flag + Uint16 T4CINT:1; // 1 Flag + Uint16 T4UFINT:1; // 2 Flag + Uint16 T4OFINT:1; // 3 Flag + Uint16 rsvd1:12; // 15:4 reserved +}; + +/* Allow access to the bit fields or entire register */ +union EVBIFRB_REG { + Uint16 all; + struct EVBIFRB_BITS bit; +}; + +struct EVAIFRC_BITS { + Uint16 CAP1INT:1; // 0 Flag + Uint16 CAP2INT:1; // 1 Flag + Uint16 CAP3INT:1; // 2 Flag + Uint16 rsvd1:13; // 15:3 reserved +}; + +/* Allow access to the bit fields or entire register */ +union EVAIFRC_REG { + Uint16 all; + struct EVAIFRC_BITS bit; +}; + +struct EVBIFRC_BITS { + Uint16 CAP4INT:1; // 0 Flag + Uint16 CAP5INT:1; // 1 Flag + Uint16 CAP6INT:1; // 2 Flag + Uint16 rsvd1:13; // 15:3 reserved +}; + +/* Allow access to the bit fields or entire register */ +union EVBIFRC_REG { + Uint16 all; + struct EVBIFRC_BITS bit; +}; + +/* EVA Register File */ + +struct EVA_REGS { + union GPTCONA_REG GPTCONA; //0x7400 + Uint16 T1CNT; //0x7401 + Uint16 T1CMPR; //0x7402 + Uint16 T1PR; //0x7403 + union T1CON_REG T1CON; //0x7404 + Uint16 T2CNT; //0x7405 + Uint16 T2CMPR; //0x7406 + Uint16 T2PR; //0x7407 + union T2CON_REG T2CON; //0x7408 + union EXTCONA_REG EXTCONA; //0x7409 + Uint16 rsvd1[7]; //0x740A-10 + union COMCONA_REG COMCONA; //0x7411 + Uint16 rsvd2; //0x7412 + union ACTRA_REG ACTRA; //0x7413 + Uint16 rsvd3; //0x7414 + union DBTCON_REG DBTCONA; //0x7415 + Uint16 rsvd4; //0x7416 + Uint16 CMPR1; //0x7417 + Uint16 CMPR2; //0x7418 + Uint16 CMPR3; //0x7419 + Uint16 rsvd5[6]; //0x741A-F + union CAPCONA_REG CAPCONA; //0x7420 + Uint16 rsvd6; //0x7421 + union CAPFIFOA_REG CAPFIFOA; //0x7422 + Uint16 CAP1FIFO; //0x7423 + Uint16 CAP2FIFO; //0x7424 + Uint16 CAP3FIFO; //0x7425 + Uint16 rsvd7; //0x7426 + Uint16 CAP1FBOT; //0x7427 + Uint16 CAP2FBOT; //0x7428 + Uint16 CAP3FBOT; //0x7429 + Uint16 rsvd8[2]; //0x742A-B + union EVAIMRA_REG EVAIMRA; //0x742C + union EVAIMRB_REG EVAIMRB; //0x742D + union EVAIMRC_REG EVAIMRC; //0x742E + union EVAIFRA_REG EVAIFRA; //0x742F + union EVAIFRB_REG EVAIFRB; //0x7430 + union EVAIFRC_REG EVAIFRC; //0x7431 +}; + + +/* EVB Register File */ + +struct EVB_REGS { + union GPTCONB_REG GPTCONB; //0x7500 + Uint16 T3CNT; //0x7501 + Uint16 T3CMPR; //0x7502 + Uint16 T3PR; //0x7503 + union T3CON_REG T3CON; //0x7504 + Uint16 T4CNT; //0x7505 + Uint16 T4CMPR; //0x7506 + Uint16 T4PR; //0x7507 + union T4CON_REG T4CON; //0x7508 + union EXTCONB_REG EXTCONB; //0x7509 + Uint16 rsvd1[7]; //0x750A-10 + union COMCONB_REG COMCONB; //0x7511 + Uint16 rsvd2; //0x7512 + union ACTRB_REG ACTRB; //0x7513 + Uint16 rsvd3; //0x7514 + union DBTCON_REG DBTCONB; //0x7515 + Uint16 rsvd4; //0x7516 + Uint16 CMPR4; //0x7517 + Uint16 CMPR5; //0x7518 + Uint16 CMPR6; //0x7519 + Uint16 rsvd5[6]; //0x751A-F + union CAPCONB_REG CAPCONB; //0x7520 + Uint16 rsvd6; //0x7521 + union CAPFIFOB_REG CAPFIFOB; //0x7522 + Uint16 CAP4FIFO; //0x7523 + Uint16 CAP5FIFO; //0x7524 + Uint16 CAP6FIFO; //0x7525 + Uint16 rsvd7; //0x7526 + Uint16 CAP4FBOT; //0x7527 + Uint16 CAP5FBOT; //0x7528 + Uint16 CAP6FBOT; //0x7529 + Uint16 rsvd8[2]; //0x752A-B + union EVBIMRA_REG EVBIMRA; //0x752C + union EVBIMRB_REG EVBIMRB; //0x752D + union EVBIMRC_REG EVBIMRC; //0x752E + union EVBIFRA_REG EVBIFRA; //0x752F + union EVBIFRB_REG EVBIFRB; //0x7530 + union EVBIFRC_REG EVBIFRC; //0x7531 +}; + + + +//--------------------------------------------------------------------------- +// Function prototypes and external definitions: +// + +extern volatile struct EVA_REGS EvaRegs; +extern volatile struct EVB_REGS EvbRegs; + +#ifdef __cplusplus +} +#endif /* extern "C" */ + +#endif // end of DSP281x_EV.H definition + + +//=========================================================================== +// No more. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Gpio.h b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Gpio.h new file mode 100644 index 0000000..fb3d751 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Gpio.h @@ -0,0 +1,1034 @@ +// TI File $Revision: /main/2 $ +// Checkin $Date: April 28, 2005 14:57:26 $ +//########################################################################### +// +// FILE: DSP281x_Gpio.h +// +// TITLE: DSP281x General Purpose I/O Definitions. +// +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + +#ifndef DSP281x_GPIO_H +#define DSP281x_GPIO_H + + +#ifdef __cplusplus +extern "C" { +#endif + + +//---------------------------------------------------- +// General purpose I/O (GPIO) Register Bit Definitions + +//---------------------------------------------------- +// GPIO A mux control register bit definitions */ +// +// +struct GPAMUX_BITS { // bits description + Uint16 PWM1_GPIOA0:1; // 0 + Uint16 PWM2_GPIOA1:1; // 1 + Uint16 PWM3_GPIOA2:1; // 2 + Uint16 PWM4_GPIOA3:1; // 3 + Uint16 PWM5_GPIOA4:1; // 4 + Uint16 PWM6_GPIOA5:1; // 5 + Uint16 T1PWM_GPIOA6:1; // 6 + Uint16 T2PWM_GPIOA7:1; // 7 + Uint16 CAP1Q1_GPIOA8:1; // 8 + Uint16 CAP2Q2_GPIOA9:1; // 9 + Uint16 CAP3QI1_GPIOA10:1; // 10 + Uint16 TDIRA_GPIOA11:1; // 11 + Uint16 TCLKINA_GPIOA12:1; // 12 + Uint16 C1TRIP_GPIOA13:1; // 13 + Uint16 C2TRIP_GPIOA14:1; // 14 + Uint16 C3TRIP_GPIOA15:1; // 15 + +}; + +union GPAMUX_REG { + Uint16 all; + struct GPAMUX_BITS bit; +}; + + + +//--------------------------------------------------------------------------------------- +// GPIO A Direction control register bit definitions +// +// +struct GPADIR_BITS { // bits description + Uint16 GPIOA0:1; // 0 + Uint16 GPIOA1:1; // 1 + Uint16 GPIOA2:1; // 2 + Uint16 GPIOA3:1; // 3 + Uint16 GPIOA4:1; // 4 + Uint16 GPIOA5:1; // 5 + Uint16 GPIOA6:1; // 6 + Uint16 GPIOA7:1; // 7 + Uint16 GPIOA8:1; // 8 + Uint16 GPIOA9:1; // 9 + Uint16 GPIOA10:1; // 10 + Uint16 GPIOA11:1; // 11 + Uint16 GPIOA12:1; // 12 + Uint16 GPIOA13:1; // 13 + Uint16 GPIOA14:1; // 14 + Uint16 GPIOA15:1; // 15 + +}; + +union GPADIR_REG { + Uint16 all; + struct GPADIR_BITS bit; +}; + +//---------------------------------- +// GPA Qualregister bit definitions +// +// + +struct GPAQUAL_BITS { // bits description + Uint16 QUALPRD:8; // 0:7 Qualification Sampling Period + Uint16 rsvd1:8; // 15:8 reserved +}; + +union GPAQUAL_REG { + Uint16 all; + struct GPAQUAL_BITS bit; +}; + + +//--------------------------------------------------------------------------------------- +// GPIO A Data register bit definitions +// +// +struct GPADAT_BITS { // bits description + Uint16 GPIOA0:1; // 0 + Uint16 GPIOA1:1; // 1 + Uint16 GPIOA2:1; // 2 + Uint16 GPIOA3:1; // 3 + Uint16 GPIOA4:1; // 4 + Uint16 GPIOA5:1; // 5 + Uint16 GPIOA6:1; // 6 + Uint16 GPIOA7:1; // 7 + Uint16 GPIOA8:1; // 8 + Uint16 GPIOA9:1; // 9 + Uint16 GPIOA10:1; // 10 + Uint16 GPIOA11:1; // 11 + Uint16 GPIOA12:1; // 12 + Uint16 GPIOA13:1; // 13 + Uint16 GPIOA14:1; // 14 + Uint16 GPIOA15:1; // 15 + +}; + +union GPADAT_REG { + Uint16 all; + struct GPADAT_BITS bit; +}; + + +//--------------------------------------------------------------------------------------- +// GPIO A Data set bit definitions +// +// +struct GPASET_BITS { // bits description + Uint16 GPIOA0:1; // 0 + Uint16 GPIOA1:1; // 1 + Uint16 GPIOA2:1; // 2 + Uint16 GPIOA3:1; // 3 + Uint16 GPIOA4:1; // 4 + Uint16 GPIOA5:1; // 5 + Uint16 GPIOA6:1; // 6 + Uint16 GPIOA7:1; // 7 + Uint16 GPIOA8:1; // 8 + Uint16 GPIOA9:1; // 9 + Uint16 GPIOA10:1; // 10 + Uint16 GPIOA11:1; // 11 + Uint16 GPIOA12:1; // 12 + Uint16 GPIOA13:1; // 13 + Uint16 GPIOA14:1; // 14 + Uint16 GPIOA15:1; // 15 + +}; + +union GPASET_REG { + Uint16 all; + struct GPASET_BITS bit; +}; + + + +//--------------------------------------------------------------------------------------- +// GPIO A Data clear register bit definitions +// +// +struct GPACLEAR_BITS { // bits description + Uint16 GPIOA0:1; // 0 + Uint16 GPIOA1:1; // 1 + Uint16 GPIOA2:1; // 2 + Uint16 GPIOA3:1; // 3 + Uint16 GPIOA4:1; // 4 + Uint16 GPIOA5:1; // 5 + Uint16 GPIOA6:1; // 6 + Uint16 GPIOA7:1; // 7 + Uint16 GPIOA8:1; // 8 + Uint16 GPIOA9:1; // 9 + Uint16 GPIOA10:1; // 10 + Uint16 GPIOA11:1; // 11 + Uint16 GPIOA12:1; // 12 + Uint16 GPIOA13:1; // 13 + Uint16 GPIOA14:1; // 14 + Uint16 GPIOA15:1; // 15 + +}; + +union GPACLEAR_REG { + Uint16 all; + struct GPACLEAR_BITS bit; +}; + +//--------------------------------------------------------------------------------------- +// GPIO A Data toggle register bit definitions +// +// +struct GPATOGGLE_BITS { // bits description + Uint16 GPIOA0:1; // 0 + Uint16 GPIOA1:1; // 1 + Uint16 GPIOA2:1; // 2 + Uint16 GPIOA3:1; // 3 + Uint16 GPIOA4:1; // 4 + Uint16 GPIOA5:1; // 5 + Uint16 GPIOA6:1; // 6 + Uint16 GPIOA7:1; // 7 + Uint16 GPIOA8:1; // 8 + Uint16 GPIOA9:1; // 9 + Uint16 GPIOA10:1; // 10 + Uint16 GPIOA11:1; // 11 + Uint16 GPIOA12:1; // 12 + Uint16 GPIOA13:1; // 13 + Uint16 GPIOA14:1; // 14 + Uint16 GPIOA15:1; // 15 + +}; + +union GPATOGGLE_REG { + Uint16 all; + struct GPATOGGLE_BITS bit; +}; + + + +//--------------------------------------------------------------------------------- +// GPIO B mux control register bit definitions +// +// +struct GPBMUX_BITS { // bits description + Uint16 PWM7_GPIOB0:1; // 0 + Uint16 PWM8_GPIOB1:1; // 1 + Uint16 PWM9_GPIOB2:1; // 2 + Uint16 PWM10_GPIOB3:1; // 3 + Uint16 PWM11_GPIOB4:1; // 4 + Uint16 PWM12_GPIOB5:1; // 5 + Uint16 T3PWM_GPIOB6:1; // 6 + Uint16 T4PWM_GPIOB7:1; // 7 + Uint16 CAP4Q1_GPIOB8:1; // 8 + Uint16 CAP5Q2_GPIOB9:1; // 9 + Uint16 CAP6QI2_GPIOB10:1; // 10 + Uint16 TDIRB_GPIOB11:1; // 11 + Uint16 TCLKINB_GPIOB12:1; // 12 + Uint16 C4TRIP_GPIOB13:1; // 13 + Uint16 C5TRIP_GPIOB14:1; // 14 + Uint16 C6TRIP_GPIOB15:1; // 15 + +}; + +union GPBMUX_REG { + Uint16 all; + struct GPBMUX_BITS bit; +}; + +//--------------------------------------------------------------------------------------- +// GPIO B Direction control register bit definitions +// +// +struct GPBDIR_BITS { // bits description + Uint16 GPIOB0:1; // 0 + Uint16 GPIOB1:1; // 1 + Uint16 GPIOB2:1; // 2 + Uint16 GPIOB3:1; // 3 + Uint16 GPIOB4:1; // 4 + Uint16 GPIOB5:1; // 5 + Uint16 GPIOB6:1; // 6 + Uint16 GPIOB7:1; // 7 + Uint16 GPIOB8:1; // 8 + Uint16 GPIOB9:1; // 9 + Uint16 GPIOB10:1; // 10 + Uint16 GPIOB11:1; // 11 + Uint16 GPIOB12:1; // 12 + Uint16 GPIOB13:1; // 13 + Uint16 GPIOB14:1; // 14 + Uint16 GPIOB15:1; // 15 + +}; + +union GPBDIR_REG { + Uint16 all; + struct GPBDIR_BITS bit; +}; + +//----------------------------------- +// GPB Qualregister bit definitions +// +// + +struct GPBQUAL_BITS { // bits description + Uint16 QUALPRD:8; // 0:7 Qualification Sampling Period + Uint16 rsvd1:8; // 15:8 reserved +}; + +union GPBQUAL_REG { + Uint16 all; + struct GPBQUAL_BITS bit; +}; + + +//--------------------------------------------------------------------------------------- +// GPIO B data register bit definitions +// +// +struct GPBDAT_BITS { // bits description + Uint16 GPIOB0:1; // 0 + Uint16 GPIOB1:1; // 1 + Uint16 GPIOB2:1; // 2 + Uint16 GPIOB3:1; // 3 + Uint16 GPIOB4:1; // 4 + Uint16 GPIOB5:1; // 5 + Uint16 GPIOB6:1; // 6 + Uint16 GPIOB7:1; // 7 + Uint16 GPIOB8:1; // 8 + Uint16 GPIOB9:1; // 9 + Uint16 GPIOB10:1; // 10 + Uint16 GPIOB11:1; // 11 + Uint16 GPIOB12:1; // 12 + Uint16 GPIOB13:1; // 13 + Uint16 GPIOB14:1; // 14 + Uint16 GPIOB15:1; // 15 + +}; + +union GPBDAT_REG { + Uint16 all; + struct GPBDAT_BITS bit; +}; + + + +//--------------------------------------------------------------------------------------- +// GPIO B data set register bit definitions +// +// +struct GPBSET_BITS { // bits description + Uint16 GPIOB0:1; // 0 + Uint16 GPIOB1:1; // 1 + Uint16 GPIOB2:1; // 2 + Uint16 GPIOB3:1; // 3 + Uint16 GPIOB4:1; // 4 + Uint16 GPIOB5:1; // 5 + Uint16 GPIOB6:1; // 6 + Uint16 GPIOB7:1; // 7 + Uint16 GPIOB8:1; // 8 + Uint16 GPIOB9:1; // 9 + Uint16 GPIOB10:1; // 10 + Uint16 GPIOB11:1; // 11 + Uint16 GPIOB12:1; // 12 + Uint16 GPIOB13:1; // 13 + Uint16 GPIOB14:1; // 14 + Uint16 GPIOB15:1; // 15 + +}; + + +union GPBSET_REG { + Uint16 all; + struct GPBSET_BITS bit; +}; + + +//--------------------------------------------------------------------------------------- +// GPIO B data clear register bit definitions +// +// +struct GPBCLEAR_BITS { // bits description + Uint16 GPIOB0:1; // 0 + Uint16 GPIOB1:1; // 1 + Uint16 GPIOB2:1; // 2 + Uint16 GPIOB3:1; // 3 + Uint16 GPIOB4:1; // 4 + Uint16 GPIOB5:1; // 5 + Uint16 GPIOB6:1; // 6 + Uint16 GPIOB7:1; // 7 + Uint16 GPIOB8:1; // 8 + Uint16 GPIOB9:1; // 9 + Uint16 GPIOB10:1; // 10 + Uint16 GPIOB11:1; // 11 + Uint16 GPIOB12:1; // 12 + Uint16 GPIOB13:1; // 13 + Uint16 GPIOB14:1; // 14 + Uint16 GPIOB15:1; // 15 + +}; + +union GPBCLEAR_REG { + Uint16 all; + struct GPBCLEAR_BITS bit; +}; + + + +//--------------------------------------------------------------------------------------- +// GPIO B data toggle register bit definitions +// +// +struct GPBTOGGLE_BITS { // bits description + Uint16 GPIOB0:1; // 0 + Uint16 GPIOB1:1; // 1 + Uint16 GPIOB2:1; // 2 + Uint16 GPIOB3:1; // 3 + Uint16 GPIOB4:1; // 4 + Uint16 GPIOB5:1; // 5 + Uint16 GPIOB6:1; // 6 + Uint16 GPIOB7:1; // 7 + Uint16 GPIOB8:1; // 8 + Uint16 GPIOB9:1; // 9 + Uint16 GPIOB10:1; // 10 + Uint16 GPIOB11:1; // 11 + Uint16 GPIOB12:1; // 12 + Uint16 GPIOB13:1; // 13 + Uint16 GPIOB14:1; // 14 + Uint16 GPIOB15:1; // 15 + +}; + +union GPBTOGGLE_REG { + Uint16 all; + struct GPBTOGGLE_BITS bit; +}; + + +//--------------------------------------------------------------------------------- +// GPIO D mux control register bit definitions +// +// +struct GPDMUX_BITS { // bits description + Uint16 T1CTRIP_PDPA_GPIOD0:1; // 0 + Uint16 T2CTRIP_SOCA_GPIOD1:1; // 1 + Uint16 rsvd1:3; // 4:2 + Uint16 T3CTRIP_PDPB_GPIOD5:1; // 5 + Uint16 T4CTRIP_SOCB_GPIOD6:1; // 6 + Uint16 rsvd2:9; // 15:7 + +}; + +union GPDMUX_REG { + Uint16 all; + struct GPDMUX_BITS bit; +}; + +//---------------------------------------------------- +// GPIO D Direction control register bit definitions +// +// +struct GPDDIR_BITS { // bits description + Uint16 GPIOD0:1; // 0 + Uint16 GPIOD1:1; // 1 + Uint16 rsvd1:3; // 4:2 + Uint16 GPIOD5:1; // 5 + Uint16 GPIOD6:1; // 6 + Uint16 rsvd2:9; // 15:7 +}; + +union GPDDIR_REG { + Uint16 all; + struct GPDDIR_BITS bit; +}; + + +//---------------------------------------------------- +// GPIO D data register bit definitions +// +// +struct GPDDAT_BITS { // bits description + Uint16 GPIOD0:1; // 0 + Uint16 GPIOD1:1; // 1 + Uint16 rsvd1:3; // 4:2 + Uint16 GPIOD5:1; // 5 + Uint16 GPIOD6:1; // 6 + Uint16 rsvd2:9; // 15:7 +}; + +union GPDDAT_REG { + Uint16 all; + struct GPDDAT_BITS bit; +}; + + +//---------------------------------------------------- +// GPIO D data set register bit definitions +// +// +struct GPDSET_BITS { // bits description + Uint16 GPIOD0:1; // 0 + Uint16 GPIOD1:1; // 1 + Uint16 rsvd1:3; // 4:2 + Uint16 GPIOD5:1; // 5 + Uint16 GPIOD6:1; // 6 + Uint16 rsvd2:9; // 15:7 +}; + +union GPDSET_REG { + Uint16 all; + struct GPDSET_BITS bit; +}; + + +//---------------------------------------------------- +// GPIO D data clear register bit definitions +// +// +struct GPDCLEAR_BITS { // bits description + Uint16 GPIOD0:1; // 0 + Uint16 GPIOD1:1; // 1 + Uint16 rsvd1:3; // 4:2 + Uint16 GPIOD5:1; // 5 + Uint16 GPIOD6:1; // 6 + Uint16 rsvd2:9; // 15:7 +}; + +union GPDCLEAR_REG { + Uint16 all; + struct GPDCLEAR_BITS bit; +}; + + + +//---------------------------------------------------- +// GPIO D data toggle register bit definitions +// +// +struct GPDTOGGLE_BITS { // bits description + Uint16 GPIOD0:1; // 0 + Uint16 GPIOD1:1; // 1 + Uint16 rsvd1:3; // 4:2 + Uint16 GPIOD5:1; // 5 + Uint16 GPIOD6:1; // 6 + Uint16 rsvd2:9; // 15:7 +}; + +union GPDTOGGLE_REG { + Uint16 all; + struct GPDTOGGLE_BITS bit; +}; + + + +//---------------------------------- +// GPIOD Qualregister bit definitions +// +// +struct GPDQUAL_BITS { // bits description + Uint16 QUALPRD:8; // 0:7 Qualification Sampling Period + Uint16 rsvd1:8; // 15:8 reserved +}; + +union GPDQUAL_REG { + Uint16 all; + struct GPDQUAL_BITS bit; +}; + + +//--------------------------------------------- +// GPIO E mux control register bit definitions +// +// +struct GPEMUX_BITS { // bits description + Uint16 XINT1_XBIO_GPIOE0:1; // 0 + Uint16 XINT2_ADCSOC_GPIOE1:1; // 1 + Uint16 XNMI_XINT13_GPIOE2:1; // 2 + Uint16 rsvd1:12; // 15:3 + +}; + +union GPEMUX_REG { + Uint16 all; + struct GPEMUX_BITS bit; +}; + +//--------------------------------------------------- +// GPIO E Direction control register bit definitions +// +// +struct GPEDIR_BITS { // bits description + Uint16 GPIOE0:1; // 0 + Uint16 GPIOE1:1; // 1 + Uint16 GPIOE2:1; // 2 + Uint16 rsvd1:12; // 15:3 +}; + +union GPEDIR_REG { + Uint16 all; + struct GPEDIR_BITS bit; +}; + +//--------------------------------------------------- +// GPIO E data register bit definitions +// +// +struct GPEDAT_BITS { // bits description + Uint16 GPIOE0:1; // 0 + Uint16 GPIOE1:1; // 1 + Uint16 GPIOE2:1; // 2 + Uint16 rsvd1:12; // 15:3 +}; + +union GPEDAT_REG { + Uint16 all; + struct GPEDAT_BITS bit; +}; + + + +//--------------------------------------------------- +// GPIO E data set register bit definitions +// +// +struct GPESET_BITS { // bits description + Uint16 GPIOE0:1; // 0 + Uint16 GPIOE1:1; // 1 + Uint16 GPIOE2:1; // 2 + Uint16 rsvd1:12; // 15:3 +}; + +union GPESET_REG { + Uint16 all; + struct GPESET_BITS bit; +}; + + +//--------------------------------------------------- +// GPIO E data clear register bit definitions +// +// +struct GPECLEAR_BITS { // bits description + Uint16 GPIOE0:1; // 0 + Uint16 GPIOE1:1; // 1 + Uint16 GPIOE2:1; // 2 + Uint16 rsvd1:12; // 15:3 +}; + +union GPECLEAR_REG { + Uint16 all; + struct GPECLEAR_BITS bit; +}; + + +//--------------------------------------------------- +// GPIO E data toggle register bit definitions +// +// +struct GPETOGGLE_BITS { // bits description + Uint16 GPIOE0:1; // 0 + Uint16 GPIOE1:1; // 1 + Uint16 GPIOE2:1; // 2 + Uint16 rsvd1:12; // 15:3 +}; + +union GPETOGGLE_REG { + Uint16 all; + struct GPETOGGLE_BITS bit; +}; + + + +//----------------------------------- +// GPIOE Qualregister bit definitions +// +// +struct GPEQUAL_BITS { // bits description + Uint16 QUALPRD:8; // 0:7 Qualification Sampling Period + Uint16 rsvd1:8; // 15:8 reserved +}; + +union GPEQUAL_REG { + Uint16 all; + struct GPEQUAL_BITS bit; +}; + + +//---------------------------------------------- +// GPIO F mux control register bit definitions +// +// +struct GPFMUX_BITS { // bits description + Uint16 SPISIMOA_GPIOF0:1; // 0 + Uint16 SPISOMIA_GPIOF1:1; // 1 + Uint16 SPICLKA_GPIOF2:1; // 2 + Uint16 SPISTEA_GPIOF3:1; // 3 + Uint16 SCITXDA_GPIOF4:1; // 4 + Uint16 SCIRXDA_GPIOF5:1; // 5 + Uint16 CANTXA_GPIOF6:1; // 6 + Uint16 CANRXA_GPIOF7:1; // 7 + Uint16 MCLKXA_GPIOF8:1; // 8 + Uint16 MCLKRA_GPIOF9:1; // 9 + Uint16 MFSXA_GPIOF10:1; // 10 + Uint16 MFSRA_GPIOF11:1; // 11 + Uint16 MDXA_GPIOF12:1; // 12 + Uint16 MDRA_GPIOF13:1; // 13 + Uint16 XF_GPIOF14:1; // 14 + Uint16 spare_GPIOF15:1; // 15 + +}; + +/* Allow access to the bit fields or entire register */ +union GPFMUX_REG { + Uint16 all; + struct GPFMUX_BITS bit; +}; + +//--------------------------------------------------- +// GPIO F Direction control register bit definitions +// +// + +struct GPFDIR_BITS { // bits description + Uint16 GPIOF0:1; // 0 + Uint16 GPIOF1:1; // 1 + Uint16 GPIOF2:1; // 2 + Uint16 GPIOF3:1; // 3 + Uint16 GPIOF4:1; // 4 + Uint16 GPIOF5:1; // 5 + Uint16 GPIOF6:1; // 6 + Uint16 GPIOF7:1; // 7 + Uint16 GPIOF8:1; // 8 + Uint16 GPIOF9:1; // 9 + Uint16 GPIOF10:1; // 10 + Uint16 GPIOF11:1; // 11 + Uint16 GPIOF12:1; // 12 + Uint16 GPIOF13:1; // 13 + Uint16 GPIOF14:1; // 14 + Uint16 GPIOF15:1; // 15 + +}; + +union GPFDIR_REG { + Uint16 all; + struct GPFDIR_BITS bit; +}; + +//--------------------------------------------------- +// GPIO F data register bit definitions +// +// + +struct GPFDAT_BITS { // bits description + Uint16 GPIOF0:1; // 0 + Uint16 GPIOF1:1; // 1 + Uint16 GPIOF2:1; // 2 + Uint16 GPIOF3:1; // 3 + Uint16 GPIOF4:1; // 4 + Uint16 GPIOF5:1; // 5 + Uint16 GPIOF6:1; // 6 + Uint16 GPIOF7:1; // 7 + Uint16 GPIOF8:1; // 8 + Uint16 GPIOF9:1; // 9 + Uint16 GPIOF10:1; // 10 + Uint16 GPIOF11:1; // 11 + Uint16 GPIOF12:1; // 12 + Uint16 GPIOF13:1; // 13 + Uint16 GPIOF14:1; // 14 + Uint16 GPIOF15:1; // 15 + +}; + +union GPFDAT_REG { + Uint16 all; + struct GPFDAT_BITS bit; +}; + + +//--------------------------------------------------- +// GPIO F data set register bit definitions +// +// + +struct GPFSET_BITS { // bits description + Uint16 GPIOF0:1; // 0 + Uint16 GPIOF1:1; // 1 + Uint16 GPIOF2:1; // 2 + Uint16 GPIOF3:1; // 3 + Uint16 GPIOF4:1; // 4 + Uint16 GPIOF5:1; // 5 + Uint16 GPIOF6:1; // 6 + Uint16 GPIOF7:1; // 7 + Uint16 GPIOF8:1; // 8 + Uint16 GPIOF9:1; // 9 + Uint16 GPIOF10:1; // 10 + Uint16 GPIOF11:1; // 11 + Uint16 GPIOF12:1; // 12 + Uint16 GPIOF13:1; // 13 + Uint16 GPIOF14:1; // 14 + Uint16 GPIOF15:1; // 15 + +}; + +union GPFSET_REG { + Uint16 all; + struct GPFSET_BITS bit; +}; + + +//--------------------------------------------------- +// GPIO F data clear register bit definitions +// +// + +struct GPFCLEAR_BITS { // bits description + Uint16 GPIOF0:1; // 0 + Uint16 GPIOF1:1; // 1 + Uint16 GPIOF2:1; // 2 + Uint16 GPIOF3:1; // 3 + Uint16 GPIOF4:1; // 4 + Uint16 GPIOF5:1; // 5 + Uint16 GPIOF6:1; // 6 + Uint16 GPIOF7:1; // 7 + Uint16 GPIOF8:1; // 8 + Uint16 GPIOF9:1; // 9 + Uint16 GPIOF10:1; // 10 + Uint16 GPIOF11:1; // 11 + Uint16 GPIOF12:1; // 12 + Uint16 GPIOF13:1; // 13 + Uint16 GPIOF14:1; // 14 + Uint16 GPIOF15:1; // 15 + +}; + +union GPFCLEAR_REG { + Uint16 all; + struct GPFCLEAR_BITS bit; +}; + + +//--------------------------------------------------- +// GPIO F data toggle register bit definitions +// +// + +struct GPFTOGGLE_BITS { // bits description + Uint16 GPIOF0:1; // 0 + Uint16 GPIOF1:1; // 1 + Uint16 GPIOF2:1; // 2 + Uint16 GPIOF3:1; // 3 + Uint16 GPIOF4:1; // 4 + Uint16 GPIOF5:1; // 5 + Uint16 GPIOF6:1; // 6 + Uint16 GPIOF7:1; // 7 + Uint16 GPIOF8:1; // 8 + Uint16 GPIOF9:1; // 9 + Uint16 GPIOF10:1; // 10 + Uint16 GPIOF11:1; // 11 + Uint16 GPIOF12:1; // 12 + Uint16 GPIOF13:1; // 13 + Uint16 GPIOF14:1; // 14 + Uint16 GPIOF15:1; // 15 + +}; + +union GPFTOGGLE_REG { + Uint16 all; + struct GPFTOGGLE_BITS bit; +}; + +//---------------------------------------------- +// GPIO G mux control register bit definitions +// +// +struct GPGMUX_BITS { // bits description + Uint16 rsvd1:4; // 3:0 + Uint16 SCITXDB_GPIOG4:1; // 4 + Uint16 SCIRXDB_GPIOG5:1; // 5 + Uint16 rsvd2:10; // 15:6 + +}; + + +/* Allow access to the bit fields or entire register */ +union GPGMUX_REG { + Uint16 all; + struct GPGMUX_BITS bit; +}; + +//--------------------------------------------------- +// GPIO G Direction control register bit definitions +// +// + +struct GPGDIR_BITS { // bits description + Uint16 rsvd1:4; // 3:0 + Uint16 GPIOG4:1; // 4 + Uint16 GPIOG5:1; // 5 + Uint16 rsvd2:10; // 15:6 + +}; + +union GPGDIR_REG { + Uint16 all; + struct GPGDIR_BITS bit; +}; + +//--------------------------------------------------- +// GPIO G data register bit definitions +// +// + +struct GPGDAT_BITS { // bits description + Uint16 rsvd1:4; // 3:0 + Uint16 GPIOG4:1; // 4 + Uint16 GPIOG5:1; // 5 + Uint16 rsvd2:10; // 15:6 + +}; + +union GPGDAT_REG { + Uint16 all; + struct GPGDAT_BITS bit; +}; + + +//--------------------------------------------------- +// GPIO G data set register bit definitions +// +// + +struct GPGSET_BITS { // bits description + Uint16 rsvd1:4; // 3:0 + Uint16 GPIOG4:1; // 4 + Uint16 GPIOG5:1; // 5 + Uint16 rsvd2:10; // 15:6 + +}; + +union GPGSET_REG { + Uint16 all; + struct GPGSET_BITS bit; +}; + + +//--------------------------------------------------- +// GPIO G data clear register bit definitions +// +// + +struct GPGCLEAR_BITS { // bits description + Uint16 rsvd1:4; // 3:0 + Uint16 GPIOG4:1; // 4 + Uint16 GPIOG5:1; // 5 + Uint16 rsvd2:10; // 15:6 + +}; + +union GPGCLEAR_REG { + Uint16 all; + struct GPGCLEAR_BITS bit; +}; + + +//--------------------------------------------------- +// GPIO G data toggle register bit definitions +// +// + +struct GPGTOGGLE_BITS { // bits description + Uint16 rsvd1:4; // 3:0 + Uint16 GPIOG4:1; // 4 + Uint16 GPIOG5:1; // 5 + Uint16 rsvd2:10; // 15:6 + +}; + +union GPGTOGGLE_REG { + Uint16 all; + struct GPGTOGGLE_BITS bit; +}; + + +struct GPIO_MUX_REGS { + union GPAMUX_REG GPAMUX; + union GPADIR_REG GPADIR; + union GPAQUAL_REG GPAQUAL; + Uint16 rsvd1; + union GPBMUX_REG GPBMUX; + union GPBDIR_REG GPBDIR; + union GPBQUAL_REG GPBQUAL; + Uint16 rsvd2[5]; + union GPDMUX_REG GPDMUX; + union GPDDIR_REG GPDDIR; + union GPDQUAL_REG GPDQUAL; + Uint16 rsvd3; + union GPEMUX_REG GPEMUX; + union GPEDIR_REG GPEDIR; + union GPEQUAL_REG GPEQUAL; + Uint16 rsvd4; + union GPFMUX_REG GPFMUX; + union GPFDIR_REG GPFDIR; + Uint16 rsvd5[2]; + union GPGMUX_REG GPGMUX; + union GPGDIR_REG GPGDIR; + Uint16 rsvd6[6]; +}; + +struct GPIO_DATA_REGS { + union GPADAT_REG GPADAT; + union GPASET_REG GPASET; + union GPACLEAR_REG GPACLEAR; + union GPATOGGLE_REG GPATOGGLE; + union GPBDAT_REG GPBDAT; + union GPBSET_REG GPBSET; + union GPBCLEAR_REG GPBCLEAR; + union GPBTOGGLE_REG GPBTOGGLE; + Uint16 rsvd1[4]; + union GPDDAT_REG GPDDAT; + union GPDSET_REG GPDSET; + union GPDCLEAR_REG GPDCLEAR; + union GPDTOGGLE_REG GPDTOGGLE; + union GPEDAT_REG GPEDAT; + union GPESET_REG GPESET; + union GPECLEAR_REG GPECLEAR; + union GPETOGGLE_REG GPETOGGLE; + union GPFDAT_REG GPFDAT; + union GPFSET_REG GPFSET; + union GPFCLEAR_REG GPFCLEAR; + union GPFTOGGLE_REG GPFTOGGLE; + union GPGDAT_REG GPGDAT; + union GPGSET_REG GPGSET; + union GPGCLEAR_REG GPGCLEAR; + union GPGTOGGLE_REG GPGTOGGLE; + Uint16 rsvd2[4]; +}; + + +//--------------------------------------------------------------------------- +// GPI/O External References & Function Declarations: +// +extern volatile struct GPIO_MUX_REGS GpioMuxRegs; +extern volatile struct GPIO_DATA_REGS GpioDataRegs; + +#ifdef __cplusplus +} +#endif /* extern "C" */ + +#endif // end of DSP281x_GPIO_H definition + +//=========================================================================== +// No more. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Mcbsp.h b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Mcbsp.h new file mode 100644 index 0000000..559d96d --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Mcbsp.h @@ -0,0 +1,777 @@ +// TI File $Revision: /main/2 $ +// Checkin $Date: April 28, 2005 14:57:24 $ +//########################################################################### +// +// FILE: DSP281x_Mcbsp.h +// +// TITLE: DSP281x Device McBSP Register Definitions. +// +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + +#ifndef DSP281x_MCBSP_H +#define DSP281x_MCBSP_H + +#ifdef __cplusplus +extern "C" { +#endif + + +//--------------------------------------------------------------------------- +// McBSP Individual Register Bit Definitions: +// +// McBSP DRR2 register bit definitions: +struct DRR2_BITS { // bit description + Uint16 HWLB:8; // 16:23 High word low byte + Uint16 HWHB:8; // 24:31 High word high byte +}; + +union DRR2_REG { + Uint16 all; + struct DRR2_BITS bit; +}; + +// McBSP DRR1 register bit definitions: +struct DRR1_BITS { // bit description + Uint16 LWLB:8; // 16:23 Low word low byte + Uint16 LWHB:8; // 24:31 low word high byte +}; + +union DRR1_REG { + Uint16 all; + struct DRR1_BITS bit; +}; + +// McBSP DXR2 register bit definitions: +struct DXR2_BITS { // bit description + Uint16 HWLB:8; // 16:23 High word low byte + Uint16 HWHB:8; // 24:31 High word high byte +}; + +union DXR2_REG { + Uint16 all; + struct DXR2_BITS bit; +}; + +// McBSP DXR1 register bit definitions: +struct DXR1_BITS { // bit description + Uint16 LWLB:8; // 16:23 Low word low byte + Uint16 LWHB:8; // 24:31 low word high byte +}; + +union DXR1_REG { + Uint16 all; + struct DXR1_BITS bit; +}; + +// SPCR2 control register bit definitions: +struct SPCR2_BITS { // bit description + Uint16 XRST:1; // 0 transmit reset + Uint16 XRDY:1; // 1 transmit ready + Uint16 XEMPTY:1; // 2 Transmit empty + Uint16 XSYNCERR:1; // 3 Transmit syn errorINT flag + Uint16 XINTM:2; // 5:4 Transmit interrupt types + Uint16 GRST:1; // 6 CLKG reset + Uint16 FRST:1; // 7 Frame sync reset + Uint16 SOFT:1; // 8 SOFT bit + Uint16 FREE:1; // 9 FREE bit + Uint16 rsvd:6; // 15:10 reserved +}; + +union SPCR2_REG { + Uint16 all; + struct SPCR2_BITS bit; +}; + +// SPCR1 control register bit definitions: +struct SPCR1_BITS { // bit description + Uint16 RRST:1; // 0 Receive reset + Uint16 RRDY:1; // 1 Receive ready + Uint16 RFULL:1; // 2 Receive full + Uint16 RSYNCERR:1; // 7 Receive syn error + Uint16 RINTM:2; // 5:4 Receive interrupt types + Uint16 ABIS:1; // 6 ABIS mode select + Uint16 DXENA:1; // 7 DX hi-z enable + Uint16 rsvd:3; // 10:8 reserved + Uint16 CLKSTP:2; // 12:11 CLKSTOP mode bit + Uint16 RJUST:2; // 13:14 Right justified + Uint16 DLB:1; // 15 Digital loop back +}; + +union SPCR1_REG { + Uint16 all; + struct SPCR1_BITS bit; +}; + +// RCR2 control register bit definitions: +struct RCR2_BITS { // bit description + Uint16 RDATDLY:2; // 1:0 Receive data delay + Uint16 RFIG:1; // 2 Receive frame sync ignore + Uint16 RCOMPAND:2; // 4:3 Receive Companding Mode selects + Uint16 RWDLEN2:3; // 7:5 Receive word length + Uint16 RFRLEN2:7; // 14:8 Receive Frame sync + Uint16 RPHASE:1; // 15 Receive Phase +}; + +union RCR2_REG { + Uint16 all; + struct RCR2_BITS bit; +}; + +// RCR1 control register bit definitions: +struct RCR1_BITS { // bit description + Uint16 rsvd1:5; // 4:0 reserved + Uint16 RWDLEN1:3; // 7:5 Receive word length + Uint16 RFRLEN1:7; // 14:8 Receive frame length + Uint16 rsvd2:1; // 15 reserved +}; + +union RCR1_REG { + Uint16 all; + struct RCR1_BITS bit; +}; + +// XCR2 control register bit definitions: + +struct XCR2_BITS { // bit description + Uint16 XDATDLY:2; // 1:0 Transmit data delay + Uint16 XFIG:1; // 2 Transmit frame sync ignore + Uint16 XCOMPAND:2; // 4:3 Transmit Companding Mode selects + Uint16 XWDLEN2:3; // 7:5 Transmit word length + Uint16 XFRLEN2:7; // 14:8 Transmit Frame sync + Uint16 XPHASE:1; // 15 Transmit Phase +}; + +union XCR2_REG { + Uint16 all; + struct XCR2_BITS bit; +}; + +// XCR1 control register bit definitions: +struct XCR1_BITS { // bit description + Uint16 rsvd1:5; // 4:0 reserved + Uint16 XWDLEN1:3; // 7:5 Transmit word length + Uint16 XFRLEN1:7; // 14:8 Transmit frame length + Uint16 rsvd2:1; // 15 reserved +}; + +union XCR1_REG { + Uint16 all; + struct XCR1_BITS bit; +}; + +// SRGR2 Sample rate generator control register bit definitions: +struct SRGR2_BITS { // bit description + Uint16 FPER:12; // 11:0 Frame period + Uint16 FSGM:1; // 12 Frame sync generator mode + Uint16 CLKSM:1; // 13 Sample rate generator mode + Uint16 rsvd:1; // 14 reserved + Uint16 GSYNC:1; // 15 CLKG sync +}; + +union SRGR2_REG { + Uint16 all; + struct SRGR2_BITS bit; +}; + +// SRGR1 control register bit definitions: +struct SRGR1_BITS { // bit description + Uint16 CLKGDV:8; // 7:0 CLKG divider + Uint16 FWID:8; // 15:8 Frame width +}; + +union SRGR1_REG { + Uint16 all; + struct SRGR1_BITS bit; +}; + +// MCR2 Multichannel control register bit definitions: +struct MCR2_BITS { // bit description + Uint16 XMCM:2; // 1:0 Transmit multichannel mode + Uint16 XCBLK:3; // 2:4 Transmit current block + Uint16 XPABLK:2; // 5:6 Transmit partition A Block + Uint16 XPBBLK:2; // 7:8 Transmit partition B Block + Uint16 XMCME:1; // 9 Transmit multi-channel enhance mode + Uint16 rsvd:6; // 15:10 reserved +}; + +union MCR2_REG { + Uint16 all; + struct MCR2_BITS bit; +}; + +// MCR1 Multichannel control register bit definitions: +struct MCR1_BITS { // bit description + Uint16 RMCM:1; // 0 Receive multichannel mode + Uint16 rsvd:1; // 1 reserved + Uint16 RCBLK:3; // 4:2 Receive current block + Uint16 RPABLK:2; // 6:5 Receive partition A Block + Uint16 RPBBLK:2; // 7:8 Receive partition B Block + Uint16 RMCME:1; // 9 Receive multi-channel enhance mode + Uint16 rsvd1:6; // 15:10 reserved +}; + +union MCR1_REG { + Uint16 all; + struct MCR1_BITS bit; +}; + +// RCERA control register bit definitions: +struct RCERA_BITS { // bit description + Uint16 RCEA0:1; // 0 Receive Channel enable bit + Uint16 RCEA1:1; // 1 Receive Channel enable bit + Uint16 RCEA2:1; // 2 Receive Channel enable bit + Uint16 RCEA3:1; // 3 Receive Channel enable bit + Uint16 RCEA4:1; // 4 Receive Channel enable bit + Uint16 RCEA5:1; // 5 Receive Channel enable bit + Uint16 RCEA6:1; // 6 Receive Channel enable bit + Uint16 RCEA7:1; // 7 Receive Channel enable bit + Uint16 RCEA8:1; // 8 Receive Channel enable bit + Uint16 RCEA9:1; // 9 Receive Channel enable bit + Uint16 RCEA10:1; // 10 Receive Channel enable bit + Uint16 RCEA11:1; // 11 Receive Channel enable bit + Uint16 RCEA12:1; // 12 Receive Channel enable bit + Uint16 RCEA13:1; // 13 Receive Channel enable bit + Uint16 RCEA14:1; // 14 Receive Channel enable bit + Uint16 RCEA15:1; // 15 Receive Channel enable bit +}; + +union RCERA_REG { + Uint16 all; + struct RCERA_BITS bit; +}; + +// RCERB control register bit definitions: +struct RCERB_BITS { // bit description + Uint16 RCEB0:1; // 0 Receive Channel enable bit + Uint16 RCEB1:1; // 1 Receive Channel enable bit + Uint16 RCEB2:1; // 2 Receive Channel enable bit + Uint16 RCEB3:1; // 3 Receive Channel enable bit + Uint16 RCEB4:1; // 4 Receive Channel enable bit + Uint16 RCEB5:1; // 5 Receive Channel enable bit + Uint16 RCEB6:1; // 6 Receive Channel enable bit + Uint16 RCEB7:1; // 7 Receive Channel enable bit + Uint16 RCEB8:1; // 8 Receive Channel enable bit + Uint16 RCEB9:1; // 9 Receive Channel enable bit + Uint16 RCEB10:1; // 10 Receive Channel enable bit + Uint16 RCEB11:1; // 11 Receive Channel enable bit + Uint16 RCEB12:1; // 12 Receive Channel enable bit + Uint16 RCEB13:1; // 13 Receive Channel enable bit + Uint16 RCEB14:1; // 14 Receive Channel enable bit + Uint16 RCEB15:1; // 15 Receive Channel enable bit +}; + +union RCERB_REG { + Uint16 all; + struct RCERB_BITS bit; +}; + +// XCERA control register bit definitions: +struct XCERA_BITS { // bit description + Uint16 XCERA0:1; // 0 Receive Channel enable bit + Uint16 XCERA1:1; // 1 Receive Channel enable bit + Uint16 XCERA2:1; // 2 Receive Channel enable bit + Uint16 XCERA3:1; // 3 Receive Channel enable bit + Uint16 XCERA4:1; // 4 Receive Channel enable bit + Uint16 XCERA5:1; // 5 Receive Channel enable bit + Uint16 XCERA6:1; // 6 Receive Channel enable bit + Uint16 XCERA7:1; // 7 Receive Channel enable bit + Uint16 XCERA8:1; // 8 Receive Channel enable bit + Uint16 XCERA9:1; // 9 Receive Channel enable bit + Uint16 XCERA10:1; // 10 Receive Channel enable bit + Uint16 XCERA11:1; // 11 Receive Channel enable bit + Uint16 XCERA12:1; // 12 Receive Channel enable bit + Uint16 XCERA13:1; // 13 Receive Channel enable bit + Uint16 XCERA14:1; // 14 Receive Channel enable bit + Uint16 XCERA15:1; // 15 Receive Channel enable bit +}; + +union XCERA_REG { + Uint16 all; + struct XCERA_BITS bit; +}; + +// XCERB control register bit definitions: +struct XCERB_BITS { // bit description + Uint16 XCERB0:1; // 0 Receive Channel enable bit + Uint16 XCERB1:1; // 1 Receive Channel enable bit + Uint16 XCERB2:1; // 2 Receive Channel enable bit + Uint16 XCERB3:1; // 3 Receive Channel enable bit + Uint16 XCERB4:1; // 4 Receive Channel enable bit + Uint16 XCERB5:1; // 5 Receive Channel enable bit + Uint16 XCERB6:1; // 6 Receive Channel enable bit + Uint16 XCERB7:1; // 7 Receive Channel enable bit + Uint16 XCERB8:1; // 8 Receive Channel enable bit + Uint16 XCERB9:1; // 9 Receive Channel enable bit + Uint16 XCERB10:1; // 10 Receive Channel enable bit + Uint16 XCERB11:1; // 11 Receive Channel enable bit + Uint16 XCERB12:1; // 12 Receive Channel enable bit + Uint16 XCERB13:1; // 13 Receive Channel enable bit + Uint16 XCERB14:1; // 14 Receive Channel enable bit + Uint16 XCERB15:1; // 15 Receive Channel enable bit +}; + +union XCERB_REG { + Uint16 all; + struct XCERB_BITS bit; +}; + +// PCR control register bit definitions: +struct PCR_BITS { // bit description + Uint16 CLKRP:1; // 0 Receive Clock polarity + Uint16 CLKXP:1; // 1 Transmit clock polarity + Uint16 FSRP:1; // 2 Receive Frame synchronization polarity + Uint16 FSXP:1; // 3 Transmit Frame synchronization polarity + Uint16 DR_STAT:1; // 4 DR pin status - reserved for this McBSP + Uint16 DX_STAT:1; // 5 DX pin status - reserved for this McBSP + Uint16 CLKS_STAT:1; // 6 CLKS pin status - reserved for 28x -McBSP + Uint16 SCLKME:1; // 7 Enhanced sample clock mode selection bit. + Uint16 CLKRM:1; // 8 Receiver Clock Mode + Uint16 CLKXM:1; // 9 Transmitter Clock Mode. + Uint16 FSRM:1; // 10 Receive Frame Synchronization Mode + Uint16 FSXM:1; // 11 Transmit Frame Synchronization Mode + Uint16 RIOEN:1; // 12 General Purpose I/O Mode - reserved in this 28x-McBSP + Uint16 XIOEN:1; // 13 General Purpose I/O Mode - reserved in this 28x-McBSP + Uint16 IDEL_EN:1; // 14 reserved in this 28x-McBSP + Uint16 rsvd:1 ; // 15 reserved +}; + +union PCR_REG { + Uint16 all; + struct PCR_BITS bit; +}; + +// RCERC control register bit definitions: +struct RCERC_BITS { // bit description + Uint16 RCEC0:1; // 0 Receive Channel enable bit + Uint16 RCEC1:1; // 1 Receive Channel enable bit + Uint16 RCEC2:1; // 2 Receive Channel enable bit + Uint16 RCEC3:1; // 3 Receive Channel enable bit + Uint16 RCEC4:1; // 4 Receive Channel enable bit + Uint16 RCEC5:1; // 5 Receive Channel enable bit + Uint16 RCEC6:1; // 6 Receive Channel enable bit + Uint16 RCEC7:1; // 7 Receive Channel enable bit + Uint16 RCEC8:1; // 8 Receive Channel enable bit + Uint16 RCEC9:1; // 9 Receive Channel enable bit + Uint16 RCEC10:1; // 10 Receive Channel enable bit + Uint16 RCEC11:1; // 11 Receive Channel enable bit + Uint16 RCEC12:1; // 12 Receive Channel enable bit + Uint16 RCEC13:1; // 13 Receive Channel enable bit + Uint16 RCEC14:1; // 14 Receive Channel enable bit + Uint16 RCEC15:1; // 15 Receive Channel enable bit +}; + +union RCERC_REG { + Uint16 all; + struct RCERC_BITS bit; +}; + +// RCERD control register bit definitions: +struct RCERD_BITS { // bit description + Uint16 RCED0:1; // 0 Receive Channel enable bit + Uint16 RCED1:1; // 1 Receive Channel enable bit + Uint16 RCED2:1; // 2 Receive Channel enable bit + Uint16 RCED3:1; // 3 Receive Channel enable bit + Uint16 RCED4:1; // 4 Receive Channel enable bit + Uint16 RCED5:1; // 5 Receive Channel enable bit + Uint16 RCED6:1; // 6 Receive Channel enable bit + Uint16 RCED7:1; // 7 Receive Channel enable bit + Uint16 RCED8:1; // 8 Receive Channel enable bit + Uint16 RCED9:1; // 9 Receive Channel enable bit + Uint16 RCED10:1; // 10 Receive Channel enable bit + Uint16 RCED11:1; // 11 Receive Channel enable bit + Uint16 RCED12:1; // 12 Receive Channel enable bit + Uint16 RCED13:1; // 13 Receive Channel enable bit + Uint16 RCED14:1; // 14 Receive Channel enable bit + Uint16 RCED15:1; // 15 Receive Channel enable bit +}; + +union RCERD_REG { + Uint16 all; + struct RCERD_BITS bit; +}; + +// XCERC control register bit definitions: +struct XCERC_BITS { // bit description + Uint16 XCERC0:1; // 0 Receive Channel enable bit + Uint16 XCERC1:1; // 1 Receive Channel enable bit + Uint16 XCERC2:1; // 2 Receive Channel enable bit + Uint16 XCERC3:1; // 3 Receive Channel enable bit + Uint16 XCERC4:1; // 4 Receive Channel enable bit + Uint16 XCERC5:1; // 5 Receive Channel enable bit + Uint16 XCERC6:1; // 6 Receive Channel enable bit + Uint16 XCERC7:1; // 7 Receive Channel enable bit + Uint16 XCERC8:1; // 8 Receive Channel enable bit + Uint16 XCERC9:1; // 9 Receive Channel enable bit + Uint16 XCERC10:1; // 10 Receive Channel enable bit + Uint16 XCERC11:1; // 11 Receive Channel enable bit + Uint16 XCERC12:1; // 12 Receive Channel enable bit + Uint16 XCERC13:1; // 13 Receive Channel enable bit + Uint16 XCERC14:1; // 14 Receive Channel enable bit + Uint16 XCERC15:1; // 15 Receive Channel enable bit +}; + +union XCERC_REG { + Uint16 all; + struct XCERC_BITS bit; +}; + +// XCERD control register bit definitions: +struct XCERD_BITS { // bit description + Uint16 XCERD0:1; // 0 Receive Channel enable bit + Uint16 XCERD1:1; // 1 Receive Channel enable bit + Uint16 XCERD2:1; // 2 Receive Channel enable bit + Uint16 XCERD3:1; // 3 Receive Channel enable bit + Uint16 XCERD4:1; // 4 Receive Channel enable bit + Uint16 XCERD5:1; // 5 Receive Channel enable bit + Uint16 XCERD6:1; // 6 Receive Channel enable bit + Uint16 XCERD7:1; // 7 Receive Channel enable bit + Uint16 XCERD8:1; // 8 Receive Channel enable bit + Uint16 XCERD9:1; // 9 Receive Channel enable bit + Uint16 XCERD10:1; // 10 Receive Channel enable bit + Uint16 XCERD11:1; // 11 Receive Channel enable bit + Uint16 XCERD12:1; // 12 Receive Channel enable bit + Uint16 XCERD13:1; // 13 Receive Channel enable bit + Uint16 XCERD14:1; // 14 Receive Channel enable bit + Uint16 XCERD15:1; // 15 Receive Channel enable bit +}; + +union XCERD_REG { + Uint16 all; + struct XCERD_BITS bit; +}; + +// RCERE control register bit definitions: +struct RCERE_BITS { // bit description + Uint16 RCEE0:1; // 0 Receive Channel enable bit + Uint16 RCEE1:1; // 1 Receive Channel enable bit + Uint16 RCEE2:1; // 2 Receive Channel enable bit + Uint16 RCEE3:1; // 3 Receive Channel enable bit + Uint16 RCEE4:1; // 4 Receive Channel enable bit + Uint16 RCEE5:1; // 5 Receive Channel enable bit + Uint16 RCEE6:1; // 6 Receive Channel enable bit + Uint16 RCEE7:1; // 7 Receive Channel enable bit + Uint16 RCEE8:1; // 8 Receive Channel enable bit + Uint16 RCEE9:1; // 9 Receive Channel enable bit + Uint16 RCEE10:1; // 10 Receive Channel enable bit + Uint16 RCEE11:1; // 11 Receive Channel enable bit + Uint16 RCEE12:1; // 12 Receive Channel enable bit + Uint16 RCEE13:1; // 13 Receive Channel enable bit + Uint16 RCEE14:1; // 14 Receive Channel enable bit + Uint16 RCEE15:1; // 15 Receive Channel enable bit +}; + +union RCERE_REG { + Uint16 all; + struct RCERE_BITS bit; +}; + +// RCERF control register bit definitions: +struct RCERF_BITS { // bit description + Uint16 RCEF0:1; // 0 Receive Channel enable bit + Uint16 RCEF1:1; // 1 Receive Channel enable bit + Uint16 RCEF2:1; // 2 Receive Channel enable bit + Uint16 RCEF3:1; // 3 Receive Channel enable bit + Uint16 RCEF4:1; // 4 Receive Channel enable bit + Uint16 RCEF5:1; // 5 Receive Channel enable bit + Uint16 RCEF6:1; // 6 Receive Channel enable bit + Uint16 RCEF7:1; // 7 Receive Channel enable bit + Uint16 RCEF8:1; // 8 Receive Channel enable bit + Uint16 RCEF9:1; // 9 Receive Channel enable bit + Uint16 RCEF10:1; // 10 Receive Channel enable bit + Uint16 RCEF11:1; // 11 Receive Channel enable bit + Uint16 RCEF12:1; // 12 Receive Channel enable bit + Uint16 RCEF13:1; // 13 Receive Channel enable bit + Uint16 RCEF14:1; // 14 Receive Channel enable bit + Uint16 RCEF15:1; // 15 Receive Channel enable bit +}; + +union RCERF_REG { + Uint16 all; + struct RCERF_BITS bit; +}; + +// XCERE control register bit definitions: +struct XCERE_BITS { // bit description + Uint16 XCERE0:1; // 0 Receive Channel enable bit + Uint16 XCERE1:1; // 1 Receive Channel enable bit + Uint16 XCERE2:1; // 2 Receive Channel enable bit + Uint16 XCERE3:1; // 3 Receive Channel enable bit + Uint16 XCERE4:1; // 4 Receive Channel enable bit + Uint16 XCERE5:1; // 5 Receive Channel enable bit + Uint16 XCERE6:1; // 6 Receive Channel enable bit + Uint16 XCERE7:1; // 7 Receive Channel enable bit + Uint16 XCERE8:1; // 8 Receive Channel enable bit + Uint16 XCERE9:1; // 9 Receive Channel enable bit + Uint16 XCERE10:1; // 10 Receive Channel enable bit + Uint16 XCERE11:1; // 11 Receive Channel enable bit + Uint16 XCERE12:1; // 12 Receive Channel enable bit + Uint16 XCERE13:1; // 13 Receive Channel enable bit + Uint16 XCERE14:1; // 14 Receive Channel enable bit + Uint16 XCERE15:1; // 15 Receive Channel enable bit +}; + +union XCERE_REG { + Uint16 all; + struct XCERE_BITS bit; +}; + +// XCERF control register bit definitions: +struct XCERF_BITS { // bit description + Uint16 XCERF0:1; // 0 Receive Channel enable bit + Uint16 XCERF1:1; // 1 Receive Channel enable bit + Uint16 XCERF2:1; // 2 Receive Channel enable bit + Uint16 XCERF3:1; // 3 Receive Channel enable bit + Uint16 XCERF4:1; // 4 Receive Channel enable bit + Uint16 XCERF5:1; // 5 Receive Channel enable bit + Uint16 XCERF6:1; // 6 Receive Channel enable bit + Uint16 XCERF7:1; // 7 Receive Channel enable bit + Uint16 XCERF8:1; // 8 Receive Channel enable bit + Uint16 XCERF9:1; // 9 Receive Channel enable bit + Uint16 XCERF10:1; // 10 Receive Channel enable bit + Uint16 XCERF11:1; // 11 Receive Channel enable bit + Uint16 XCERF12:1; // 12 Receive Channel enable bit + Uint16 XCERF13:1; // 13 Receive Channel enable bit + Uint16 XCERF14:1; // 14 Receive Channel enable bit + Uint16 XCERF15:1; // 15 Receive Channel enable bit +}; + +union XCERF_REG { + Uint16 all; + struct XCERF_BITS bit; +}; + +// RCERG control register bit definitions: +struct RCERG_BITS { // bit description + Uint16 RCEG0:1; // 0 Receive Channel enable bit + Uint16 RCEG1:1; // 1 Receive Channel enable bit + Uint16 RCEG2:1; // 2 Receive Channel enable bit + Uint16 RCEG3:1; // 3 Receive Channel enable bit + Uint16 RCEG4:1; // 4 Receive Channel enable bit + Uint16 RCEG5:1; // 5 Receive Channel enable bit + Uint16 RCEG6:1; // 6 Receive Channel enable bit + Uint16 RCEG7:1; // 7 Receive Channel enable bit + Uint16 RCEG8:1; // 8 Receive Channel enable bit + Uint16 RCEG9:1; // 9 Receive Channel enable bit + Uint16 RCEG10:1; // 10 Receive Channel enable bit + Uint16 RCEG11:1; // 11 Receive Channel enable bit + Uint16 RCEG12:1; // 12 Receive Channel enable bit + Uint16 RCEG13:1; // 13 Receive Channel enable bit + Uint16 RCEG14:1; // 14 Receive Channel enable bit + Uint16 RCEG15:1; // 15 Receive Channel enable bit +}; + +union RCERG_REG { + Uint16 all; + struct RCERG_BITS bit; +}; + +// RCERH control register bit definitions: +struct RCERH_BITS { // bit description + Uint16 RCEH0:1; // 0 Receive Channel enable bit + Uint16 RCEH1:1; // 1 Receive Channel enable bit + Uint16 RCEH2:1; // 2 Receive Channel enable bit + Uint16 RCEH3:1; // 3 Receive Channel enable bit + Uint16 RCEH4:1; // 4 Receive Channel enable bit + Uint16 RCEH5:1; // 5 Receive Channel enable bit + Uint16 RCEH6:1; // 6 Receive Channel enable bit + Uint16 RCEH7:1; // 7 Receive Channel enable bit + Uint16 RCEH8:1; // 8 Receive Channel enable bit + Uint16 RCEH9:1; // 9 Receive Channel enable bit + Uint16 RCEH10:1; // 10 Receive Channel enable bit + Uint16 RCEH11:1; // 11 Receive Channel enable bit + Uint16 RCEH12:1; // 12 Receive Channel enable bit + Uint16 RCEH13:1; // 13 Receive Channel enable bit + Uint16 RCEH14:1; // 14 Receive Channel enable bit + Uint16 RCEH15:1; // 15 Receive Channel enable bit +}; + +union RCERH_REG { + Uint16 all; + struct RCERH_BITS bit; +}; + +// XCERG control register bit definitions: +struct XCERG_BITS { // bit description + Uint16 XCERG0:1; // 0 Receive Channel enable bit + Uint16 XCERG1:1; // 1 Receive Channel enable bit + Uint16 XCERG2:1; // 2 Receive Channel enable bit + Uint16 XCERG3:1; // 3 Receive Channel enable bit + Uint16 XCERG4:1; // 4 Receive Channel enable bit + Uint16 XCERG5:1; // 5 Receive Channel enable bit + Uint16 XCERG6:1; // 6 Receive Channel enable bit + Uint16 XCERG7:1; // 7 Receive Channel enable bit + Uint16 XCERG8:1; // 8 Receive Channel enable bit + Uint16 XCERG9:1; // 9 Receive Channel enable bit + Uint16 XCERG10:1; // 10 Receive Channel enable bit + Uint16 XCERG11:1; // 11 Receive Channel enable bit + Uint16 XCERG12:1; // 12 Receive Channel enable bit + Uint16 XCERG13:1; // 13 Receive Channel enable bit + Uint16 XCERG14:1; // 14 Receive Channel enable bit + Uint16 XCERG15:1; // 15 Receive Channel enable bit +}; + +union XCERG_REG { + Uint16 all; + struct XCERG_BITS bit; +}; + +// XCERH control register bit definitions: +struct XCERH_BITS { // bit description + Uint16 XCEH0:1; // 0 Receive Channel enable bit + Uint16 XCEH1:1; // 1 Receive Channel enable bit + Uint16 XCEH2:1; // 2 Receive Channel enable bit + Uint16 XCEH3:1; // 3 Receive Channel enable bit + Uint16 XCEH4:1; // 4 Receive Channel enable bit + Uint16 XCEH5:1; // 5 Receive Channel enable bit + Uint16 XCEH6:1; // 6 Receive Channel enable bit + Uint16 XCEH7:1; // 7 Receive Channel enable bit + Uint16 XCEH8:1; // 8 Receive Channel enable bit + Uint16 XCEH9:1; // 9 Receive Channel enable bit + Uint16 XCEH10:1; // 10 Receive Channel enable bit + Uint16 XCEH11:1; // 11 Receive Channel enable bit + Uint16 XCEH12:1; // 12 Receive Channel enable bit + Uint16 XCEH13:1; // 13 Receive Channel enable bit + Uint16 XCEH14:1; // 14 Receive Channel enable bit + Uint16 XCEH15:1; // 15 Receive Channel enable bit +}; + +union XCERH_REG { + Uint16 all; + struct XCERH_BITS bit; +}; + +// McBSP FIFO Transmit register bit definitions: +struct MFFTX_BITS { // bit description + Uint16 TXFFIL:5; // 4:0 Interrupt level + Uint16 TXFFIENA:1; // 5 Interrupt enable + Uint16 TXFFINT_CLEAR:1; // 6 Clear INT flag + Uint16 TXFFINT_FLAG:1; // 7 INT flag + Uint16 TXFFST:5; // 12:8 FIFO status + Uint16 TXFIFO_RESET:1; // 13 FIFO reset + Uint16 MFFENA:1; // 14 Enhancement enable + Uint16 rsvd:1; // 15 reserved +}; + +union MFFTX_REG { + Uint16 all; + struct MFFTX_BITS bit; +}; + +// McBSP FIFO recieve register bit definitions: +struct MFFRX_BITS { // bits description + Uint16 RXFFIL:5; // 4:0 Interrupt level + Uint16 RXFFIENA:1; // 5 Interrupt enable + Uint16 RXFFINT_CLEAR:1; // 6 Clear INT flag + Uint16 RXFFINT_FLAG:1; // 7 INT flag + Uint16 RXFFST:5; // 12:8 FIFO status + Uint16 RXFIFO_RESET:1; // 13 FIFO reset + Uint16 RXFFOVF_CLEAR:1; // 14 Clear overflow + Uint16 RXFFOVF_FLAG:1; // 15 FIFO overflow +}; + +union MFFRX_REG { + Uint16 all; + struct MFFRX_BITS bit; +}; + +// McBSP FIFO control register bit definitions: +struct MFFCT_BITS { // bits description + Uint16 FFTXTXDLY:8; // 7:0 FIFO transmit delay + Uint16 rsvd:7; // 15:7 reserved + Uint16 IACKM:1; // 15 is IACK mode enable bit +}; + +union MFFCT_REG { + Uint16 all; + struct MFFCT_BITS bit; +}; + +// McBSP FIFO INTERRUPT control register bit definitions: +struct MFFINT_BITS { // bits description + Uint16 XINT:1; // 0 XINT interrupt enable + Uint16 XEVTA:1; // 1 XEVTA interrupt enable + Uint16 RINT:1; // 2 RINT interrupt enable + Uint16 REVTA:1; // 3 REVTA interrupt enable + Uint16 rsvd:12; // 15:4 reserved +}; + +union MFFINT_REG { + Uint16 all; + struct MFFINT_BITS bit; +}; + +// McBSP FIFO INTERRUPT status register bit definitions: +struct MFFST_BITS { // bits description + Uint16 EOBX:1; // 0 EOBX flag + Uint16 FSX:1; // 1 FSX flag + Uint16 EOBR:1; // 2 EOBR flag + Uint16 FSR:1; // 3 FSR flag + Uint16 rsvd:12; // 15:4 reserved +}; + +union MFFST_REG { + Uint16 all; + struct MFFST_BITS bit; +}; + + +//--------------------------------------------------------------------------- +// McBSP Register File: +// +struct MCBSP_REGS { + union DRR2_REG DRR2; // 0x7800, MCBSP Data receive register bits 31-16 + union DRR1_REG DRR1; // 0x7801, MCBSP Data receive register bits 15-0 + union DXR2_REG DXR2; // 0x7802, MCBSP Data transmit register bits 31-16 + union DXR1_REG DXR1; // 0x7803, MCBSP Data transmit register bits 15-0 + union SPCR2_REG SPCR2; // 0x7804, MCBSP control register bits 31-16 + union SPCR1_REG SPCR1; // 0x7805, MCBSP control register bits 15-0 + union RCR2_REG RCR2; // 0x7806, MCBSP receive control register bits 31-16 + union RCR1_REG RCR1; // 0x7807, MCBSP receive control register bits 15-0 + union XCR2_REG XCR2; // 0x7808, MCBSP transmit control register bits 31-16 + union XCR1_REG XCR1; // 0x7809, MCBSP transmit control register bits 15-0 + union SRGR2_REG SRGR2; // 0x7810, MCBSP sample rate gen register bits 31-16 + union SRGR1_REG SRGR1; // 0x7811, MCBSP sample rate gen register bits 15-0 + union MCR2_REG MCR2; // 0x7812, MCBSP multichannel register bits 31-16 + union MCR1_REG MCR1; // 0x7813, MCBSP multichannel register bits 15-0 + union RCERA_REG RCERA; // 0x7814, MCBSP Receive channel enable partition A + union RCERB_REG RCERB; // 0x7815, MCBSP Receive channel enable partition B + union XCERA_REG XCERA; // 0x7816, MCBSP Transmit channel enable partition A + union XCERB_REG XCERB; // 0x7817, MCBSP Transmit channel enable partition B + union PCR_REG PCR; // 0x7818, MCBSP Pin control register bits 15-0 + union RCERC_REG RCERC; // 0x7819, MCBSP Receive channel enable partition C + union RCERD_REG RCERD; // 0x7820, MCBSP Receive channel enable partition D + union XCERC_REG XCERC; // 0x7821, MCBSP Transmit channel enable partition C + union XCERD_REG XCERD; // 0x7823, MCBSP Transmit channel enable partition D + union RCERE_REG RCERE; // 0x7824, MCBSP Receive channel enable partition E + union RCERF_REG RCERF; // 0x7825, MCBSP Receive channel enable partition F + union XCERE_REG XCERE; // 0x7826, MCBSP Transmit channel enable partition E + union XCERF_REG XCERF; // 0x7827, MCBSP Transmit channel enable partition F + union RCERG_REG RCERG; // 0x7828, MCBSP Receive channel enable partition G + union RCERH_REG RCERH; // 0x7829, MCBSP Receive channel enable partition H + union XCERG_REG XCERG; // 0x7830, MCBSP Transmit channel enable partition G + union XCERH_REG XCERH; // 0x7831, MCBSP Transmit channel enable partition H + Uint16 rsvd1; // 0x7832, reserved + union MFFTX_REG MFFTX; // 0x7833, MCBSP Transmit FIFO register bits + union MFFRX_REG MFFRX; // 0x7834, MCBSP Receive FIFO register bits + union MFFCT_REG MFFCT; // 0x7835, MCBSP FIFO control register bits + union MFFINT_REG MFFINT; // 0x7836, MCBSP Interrupt register bits + union MFFST_REG MFFST; // 0x7837, MCBSP Status register bits +}; + +//--------------------------------------------------------------------------- +// McBSP External References & Function Declarations: +// +extern volatile struct MCBSP_REGS McbspaRegs; + +#ifdef __cplusplus +} +#endif /* extern "C" */ + +#endif // end of DSP281x_MCBSP_H definition + +//=========================================================================== +// No more. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f2812/include/DSP281x_PieCtrl.h b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_PieCtrl.h new file mode 100644 index 0000000..512b29a --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_PieCtrl.h @@ -0,0 +1,153 @@ +// TI File $Revision: /main/2 $ +// Checkin $Date: April 28, 2005 14:57:22 $ +//########################################################################### +// +// FILE: DSP281x_PieCtrl.h +// +// TITLE: DSP281x Device PIE Control Register Definitions. +// +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + + +#ifndef DSP281x_PIE_CTRL_H +#define DSP281x_PIE_CTRL_H + +#ifdef __cplusplus +extern "C" { +#endif + +//--------------------------------------------------------------------------- +// PIE Control Register Bit Definitions: +// +// PIECTRL: Register bit definitions: +struct PIECTRL_BITS { // bits description + Uint16 ENPIE:1; // 0 Enable PIE block + Uint16 PIEVECT:15; // 15:1 Fetched vector address +}; + +union PIECTRL_REG { + Uint16 all; + struct PIECTRL_BITS bit; +}; + +// PIEIER: Register bit definitions: +struct PIEIER_BITS { // bits description + Uint16 INTx1:1; // 0 INTx.1 + Uint16 INTx2:1; // 1 INTx.2 + Uint16 INTx3:1; // 2 INTx.3 + Uint16 INTx4:1; // 3 INTx.4 + Uint16 INTx5:1; // 4 INTx.5 + Uint16 INTx6:1; // 5 INTx.6 + Uint16 INTx7:1; // 6 INTx.7 + Uint16 INTx8:1; // 7 INTx.8 + Uint16 rsvd:8; // 15:8 reserved +}; + +union PIEIER_REG { + Uint16 all; + struct PIEIER_BITS bit; +}; + +// PIEIFR: Register bit definitions: +struct PIEIFR_BITS { // bits description + Uint16 INTx1:1; // 0 INTx.1 + Uint16 INTx2:1; // 1 INTx.2 + Uint16 INTx3:1; // 2 INTx.3 + Uint16 INTx4:1; // 3 INTx.4 + Uint16 INTx5:1; // 4 INTx.5 + Uint16 INTx6:1; // 5 INTx.6 + Uint16 INTx7:1; // 6 INTx.7 + Uint16 INTx8:1; // 7 INTx.8 + Uint16 rsvd:8; // 15:8 reserved +}; + +union PIEIFR_REG { + Uint16 all; + struct PIEIFR_BITS bit; +}; + +// PIEACK: Register bit definitions: +struct PIEACK_BITS { // bits description + Uint16 ACK1:1; // 0 Acknowledge PIE interrupt group 1 + Uint16 ACK2:1; // 1 Acknowledge PIE interrupt group 2 + Uint16 ACK3:1; // 2 Acknowledge PIE interrupt group 3 + Uint16 ACK4:1; // 3 Acknowledge PIE interrupt group 4 + Uint16 ACK5:1; // 4 Acknowledge PIE interrupt group 5 + Uint16 ACK6:1; // 5 Acknowledge PIE interrupt group 6 + Uint16 ACK7:1; // 6 Acknowledge PIE interrupt group 7 + Uint16 ACK8:1; // 7 Acknowledge PIE interrupt group 8 + Uint16 ACK9:1; // 8 Acknowledge PIE interrupt group 9 + Uint16 ACK10:1; // 9 Acknowledge PIE interrupt group 10 + Uint16 ACK11:1; // 10 Acknowledge PIE interrupt group 11 + Uint16 ACK12:1; // 11 Acknowledge PIE interrupt group 12 + Uint16 rsvd:4; // 15:12 reserved +}; + +union PIEACK_REG { + Uint16 all; + struct PIEACK_BITS bit; +}; + +//--------------------------------------------------------------------------- +// PIE Control Register File: +// +struct PIE_CTRL_REGS { + union PIECTRL_REG PIECRTL; // PIE control register + union PIEACK_REG PIEACK; // PIE acknowledge + union PIEIER_REG PIEIER1; // PIE INT1 IER register + union PIEIFR_REG PIEIFR1; // PIE INT1 IFR register + union PIEIER_REG PIEIER2; // PIE INT2 IER register + union PIEIFR_REG PIEIFR2; // PIE INT2 IFR register + union PIEIER_REG PIEIER3; // PIE INT3 IER register + union PIEIFR_REG PIEIFR3; // PIE INT3 IFR register + union PIEIER_REG PIEIER4; // PIE INT4 IER register + union PIEIFR_REG PIEIFR4; // PIE INT4 IFR register + union PIEIER_REG PIEIER5; // PIE INT5 IER register + union PIEIFR_REG PIEIFR5; // PIE INT5 IFR register + union PIEIER_REG PIEIER6; // PIE INT6 IER register + union PIEIFR_REG PIEIFR6; // PIE INT6 IFR register + union PIEIER_REG PIEIER7; // PIE INT7 IER register + union PIEIFR_REG PIEIFR7; // PIE INT7 IFR register + union PIEIER_REG PIEIER8; // PIE INT8 IER register + union PIEIFR_REG PIEIFR8; // PIE INT8 IFR register + union PIEIER_REG PIEIER9; // PIE INT9 IER register + union PIEIFR_REG PIEIFR9; // PIE INT9 IFR register + union PIEIER_REG PIEIER10; // PIE INT10 IER register + union PIEIFR_REG PIEIFR10; // PIE INT10 IFR register + union PIEIER_REG PIEIER11; // PIE INT11 IER register + union PIEIFR_REG PIEIFR11; // PIE INT11 IFR register + union PIEIER_REG PIEIER12; // PIE INT12 IER register + union PIEIFR_REG PIEIFR12; // PIE INT12 IFR register +}; + +#define PIEACK_GROUP1 0x0001; +#define PIEACK_GROUP2 0x0002; +#define PIEACK_GROUP3 0x0004; +#define PIEACK_GROUP4 0x0008; +#define PIEACK_GROUP5 0x0010; +#define PIEACK_GROUP6 0x0020; +#define PIEACK_GROUP7 0x0040; +#define PIEACK_GROUP8 0x0080; +#define PIEACK_GROUP9 0x0100; +#define PIEACK_GROUP10 0x0200; +#define PIEACK_GROUP11 0x0400; +#define PIEACK_GROUP12 0x0800; + +//--------------------------------------------------------------------------- +// PIE Control Registers External References & Function Declarations: +// +extern volatile struct PIE_CTRL_REGS PieCtrlRegs; + + +#ifdef __cplusplus +} +#endif /* extern "C" */ + +#endif // end of DSP281x_PIE_CTRL_H definition + +//=========================================================================== +// No more. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f2812/include/DSP281x_PieVect.h b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_PieVect.h new file mode 100644 index 0000000..ec34743 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_PieVect.h @@ -0,0 +1,210 @@ +// TI File $Revision: /main/2 $ +// Checkin $Date: April 28, 2005 14:57:21 $ +//########################################################################### +// +// FILE: DSP281x_PieVect.h +// +// TITLE: DSP281x Devices PIE Vector Table Definitions. +// +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + +#ifndef DSP281x_PIE_VECT_H +#define DSP281x_PIE_VECT_H + + +#ifdef __cplusplus +extern "C" { +#endif + + +//--------------------------------------------------------------------------- +// PIE Interrupt Vector Table Definition: +// +// Create a user type called PINT (pointer to interrupt): + +typedef interrupt void(*PINT)(void); + +// Define Vector Table: +struct PIE_VECT_TABLE { + +// Reset is never fetched from this table. +// It will always be fetched from 0x3FFFC0 in either +// boot ROM or XINTF Zone 7 depending on the state of +// the XMP/MC input signal. On the F2810 it is always +// fetched from boot ROM. + + PINT PIE1_RESERVED; // @suppress("Type cannot be resolved") + PINT PIE2_RESERVED; // @suppress("Type cannot be resolved") + PINT PIE3_RESERVED; // @suppress("Type cannot be resolved") + PINT PIE4_RESERVED; // @suppress("Type cannot be resolved") + PINT PIE5_RESERVED; // @suppress("Type cannot be resolved") + PINT PIE6_RESERVED; // @suppress("Type cannot be resolved") + PINT PIE7_RESERVED; // @suppress("Type cannot be resolved") + PINT PIE8_RESERVED; // @suppress("Type cannot be resolved") + PINT PIE9_RESERVED; // @suppress("Type cannot be resolved") + PINT PIE10_RESERVED; // @suppress("Type cannot be resolved") + PINT PIE11_RESERVED; // @suppress("Type cannot be resolved") + PINT PIE12_RESERVED; // @suppress("Type cannot be resolved") + PINT PIE13_RESERVED; // @suppress("Type cannot be resolved") + +// Non-Peripheral Interrupts: + PINT XINT13; // XINT13 // @suppress("Type cannot be resolved") + PINT TINT2; // CPU-Timer2 // @suppress("Type cannot be resolved") + PINT DATALOG; // Datalogging interrupt // @suppress("Type cannot be resolved") + PINT RTOSINT; // RTOS interrupt // @suppress("Type cannot be resolved") + PINT EMUINT; // Emulation interrupt // @suppress("Type cannot be resolved") + PINT XNMI; // Non-maskable interrupt // @suppress("Type cannot be resolved") + PINT ILLEGAL; // Illegal operation TRAP // @suppress("Type cannot be resolved") + PINT USER1; // User Defined trap 1 // @suppress("Type cannot be resolved") + PINT USER2; // User Defined trap 2 // @suppress("Type cannot be resolved") + PINT USER3; // User Defined trap 3 // @suppress("Type cannot be resolved") + PINT USER4; // User Defined trap 4 // @suppress("Type cannot be resolved") + PINT USER5; // User Defined trap 5 // @suppress("Type cannot be resolved") + PINT USER6; // User Defined trap 6 // @suppress("Type cannot be resolved") + PINT USER7; // User Defined trap 7 // @suppress("Type cannot be resolved") + PINT USER8; // User Defined trap 8 // @suppress("Type cannot be resolved") + PINT USER9; // User Defined trap 9 // @suppress("Type cannot be resolved") + PINT USER10; // User Defined trap 10 // @suppress("Type cannot be resolved") + PINT USER11; // User Defined trap 11 // @suppress("Type cannot be resolved") + PINT USER12; // User Defined trap 12 // @suppress("Type cannot be resolved") + +// Group 1 PIE Peripheral Vectors: + PINT PDPINTA; // EV-A // @suppress("Type cannot be resolved") + PINT PDPINTB; // EV-B // @suppress("Type cannot be resolved") + PINT rsvd1_3; // @suppress("Type cannot be resolved") + PINT XINT1; // @suppress("Type cannot be resolved") + PINT XINT2; // @suppress("Type cannot be resolved") + PINT ADCINT; // ADC // @suppress("Type cannot be resolved") + PINT TINT0; // Timer 0 // @suppress("Type cannot be resolved") + PINT WAKEINT; // WD // @suppress("Type cannot be resolved") + +// Group 2 PIE Peripheral Vectors: + PINT CMP1INT; // EV-A // @suppress("Type cannot be resolved") + PINT CMP2INT; // EV-A // @suppress("Type cannot be resolved") + PINT CMP3INT; // EV-A // @suppress("Type cannot be resolved") + PINT T1PINT; // EV-A // @suppress("Type cannot be resolved") + PINT T1CINT; // EV-A // @suppress("Type cannot be resolved") + PINT T1UFINT; // EV-A // @suppress("Type cannot be resolved") + PINT T1OFINT; // EV-A // @suppress("Type cannot be resolved") + PINT rsvd2_8; // @suppress("Type cannot be resolved") + +// Group 3 PIE Peripheral Vectors: + PINT T2PINT; // EV-A // @suppress("Type cannot be resolved") + PINT T2CINT; // EV-A // @suppress("Type cannot be resolved") + PINT T2UFINT; // EV-A // @suppress("Type cannot be resolved") + PINT T2OFINT; // EV-A // @suppress("Type cannot be resolved") + PINT CAPINT1; // EV-A // @suppress("Type cannot be resolved") + PINT CAPINT2; // EV-A // @suppress("Type cannot be resolved") + PINT CAPINT3; // EV-A // @suppress("Type cannot be resolved") + PINT rsvd3_8; // @suppress("Type cannot be resolved") + +// Group 4 PIE Peripheral Vectors: + PINT CMP4INT; // EV-B // @suppress("Type cannot be resolved") + PINT CMP5INT; // EV-B // @suppress("Type cannot be resolved") + PINT CMP6INT; // EV-B // @suppress("Type cannot be resolved") + PINT T3PINT; // EV-B // @suppress("Type cannot be resolved") + PINT T3CINT; // EV-B // @suppress("Type cannot be resolved") + PINT T3UFINT; // EV-B // @suppress("Type cannot be resolved") + PINT T3OFINT; // EV-B // @suppress("Type cannot be resolved") + PINT rsvd4_8; // @suppress("Type cannot be resolved") + +// Group 5 PIE Peripheral Vectors: + PINT T4PINT; // EV-B // @suppress("Type cannot be resolved") + PINT T4CINT; // EV-B // @suppress("Type cannot be resolved") + PINT T4UFINT; // EV-B // @suppress("Type cannot be resolved") + PINT T4OFINT; // EV-B // @suppress("Type cannot be resolved") + PINT CAPINT4; // EV-B // @suppress("Type cannot be resolved") + PINT CAPINT5; // EV-B // @suppress("Type cannot be resolved") + PINT CAPINT6; // EV-B // @suppress("Type cannot be resolved") + PINT rsvd5_8; // @suppress("Type cannot be resolved") + +// Group 6 PIE Peripheral Vectors: + PINT SPIRXINTA; // SPI-A // @suppress("Type cannot be resolved") + PINT SPITXINTA; // SPI-A // @suppress("Type cannot be resolved") + PINT rsvd6_3; // @suppress("Type cannot be resolved") + PINT rsvd6_4; // @suppress("Type cannot be resolved") + PINT MRINTA; // McBSP-A // @suppress("Type cannot be resolved") + PINT MXINTA; // McBSP-A // @suppress("Type cannot be resolved") + PINT rsvd6_7; // @suppress("Type cannot be resolved") + PINT rsvd6_8; // @suppress("Type cannot be resolved") + +// Group 7 PIE Peripheral Vectors: + PINT rsvd7_1; // @suppress("Type cannot be resolved") + PINT rsvd7_2; // @suppress("Type cannot be resolved") + PINT rsvd7_3; // @suppress("Type cannot be resolved") + PINT rsvd7_4; // @suppress("Type cannot be resolved") + PINT rsvd7_5; // @suppress("Type cannot be resolved") + PINT rsvd7_6; // @suppress("Type cannot be resolved") + PINT rsvd7_7; // @suppress("Type cannot be resolved") + PINT rsvd7_8; // @suppress("Type cannot be resolved") + +// Group 8 PIE Peripheral Vectors: + PINT rsvd8_1; // @suppress("Type cannot be resolved") + PINT rsvd8_2; // @suppress("Type cannot be resolved") + PINT rsvd8_3; // @suppress("Type cannot be resolved") + PINT rsvd8_4; // @suppress("Type cannot be resolved") + PINT rsvd8_5; // @suppress("Type cannot be resolved") + PINT rsvd8_6; // @suppress("Type cannot be resolved") + PINT rsvd8_7; // @suppress("Type cannot be resolved") + PINT rsvd8_8; // @suppress("Type cannot be resolved") + +// Group 9 PIE Peripheral Vectors: + PINT RXAINT; // SCI-A // @suppress("Type cannot be resolved") + PINT TXAINT; // SCI-A // @suppress("Type cannot be resolved") + PINT RXBINT; // SCI-B // @suppress("Type cannot be resolved") + PINT TXBINT; // SCI-B // @suppress("Type cannot be resolved") + PINT ECAN0INTA; // eCAN // @suppress("Type cannot be resolved") + PINT ECAN1INTA; // eCAN // @suppress("Type cannot be resolved") + PINT rsvd9_7; // @suppress("Type cannot be resolved") + PINT rsvd9_8; // @suppress("Type cannot be resolved") + +// Group 10 PIE Peripheral Vectors: + PINT rsvd10_1; // @suppress("Type cannot be resolved") + PINT rsvd10_2; // @suppress("Type cannot be resolved") + PINT rsvd10_3; // @suppress("Type cannot be resolved") + PINT rsvd10_4; // @suppress("Type cannot be resolved") + PINT rsvd10_5; // @suppress("Type cannot be resolved") + PINT rsvd10_6; // @suppress("Type cannot be resolved") + PINT rsvd10_7; // @suppress("Type cannot be resolved") + PINT rsvd10_8; // @suppress("Type cannot be resolved") + +// Group 11 PIE Peripheral Vectors: + PINT rsvd11_1; // @suppress("Type cannot be resolved") + PINT rsvd11_2; // @suppress("Type cannot be resolved") + PINT rsvd11_3; // @suppress("Type cannot be resolved") + PINT rsvd11_4; // @suppress("Type cannot be resolved") + PINT rsvd11_5; // @suppress("Type cannot be resolved") + PINT rsvd11_6; // @suppress("Type cannot be resolved") + PINT rsvd11_7; // @suppress("Type cannot be resolved") + PINT rsvd11_8; // @suppress("Type cannot be resolved") + +// Group 12 PIE Peripheral Vectors: + PINT rsvd12_1; // @suppress("Type cannot be resolved") + PINT rsvd12_2; // @suppress("Type cannot be resolved") + PINT rsvd12_3; // @suppress("Type cannot be resolved") + PINT rsvd12_4; // @suppress("Type cannot be resolved") + PINT rsvd12_5; // @suppress("Type cannot be resolved") + PINT rsvd12_6; // @suppress("Type cannot be resolved") + PINT rsvd12_7; // @suppress("Type cannot be resolved") + PINT rsvd12_8; // @suppress("Type cannot be resolved") +}; + +//--------------------------------------------------------------------------- +// PIE Interrupt Vector Table External References & Function Declarations: +// +extern struct PIE_VECT_TABLE PieVectTable; + + +#ifdef __cplusplus +} +#endif /* extern "C" */ + +#endif // end of DSP281x_PIE_VECT_H definition + +//=========================================================================== +// No more. +//=========================================================================== + diff --git a/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Sci.h b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Sci.h new file mode 100644 index 0000000..2a86da0 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Sci.h @@ -0,0 +1,233 @@ +// TI File $Revision: /main/2 $ +// Checkin $Date: April 28, 2005 14:57:19 $ +//########################################################################### +// +// FILE: DSP281x_Sci.h +// +// TITLE: DSP281x Device SCI Register Definitions. +// +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + +#ifndef DSP281x_SCI_H +#define DSP281x_SCI_H + + +#ifdef __cplusplus +extern "C" { +#endif + +//--------------------------------------------------------------------------- +// SCI Individual Register Bit Definitions + +//---------------------------------------------------------- +// SCICCR communication control register bit definitions: +// + +struct SCICCR_BITS { // bit description + Uint16 SCICHAR:3; // 2:0 Character length control + Uint16 ADDRIDLE_MODE:1; // 3 ADDR/IDLE Mode control + Uint16 LOOPBKENA:1; // 4 Loop Back enable + Uint16 PARITYENA:1; // 5 Parity enable + Uint16 PARITY:1; // 6 Even or Odd Parity + Uint16 STOPBITS:1; // 7 Number of Stop Bits + Uint16 rsvd1:8; // 15:8 reserved +}; + + +union SCICCR_REG { + Uint16 all; + struct SCICCR_BITS bit; +}; + +//------------------------------------------- +// SCICTL1 control register 1 bit definitions: +// + +struct SCICTL1_BITS { // bit description + Uint16 RXENA:1; // 0 SCI receiver enable + Uint16 TXENA:1; // 1 SCI transmitter enable + Uint16 SLEEP:1; // 2 SCI sleep + Uint16 TXWAKE:1; // 3 Transmitter wakeup method + Uint16 rsvd:1; // 4 reserved + Uint16 SWRESET:1; // 5 Software reset + Uint16 RXERRINTENA:1; // 6 Recieve interrupt enable + Uint16 rsvd1:9; // 15:7 reserved + +}; + +union SCICTL1_REG { + Uint16 all; + struct SCICTL1_BITS bit; +}; + +//--------------------------------------------- +// SCICTL2 control register 2 bit definitions: +// + +struct SCICTL2_BITS { // bit description + Uint16 TXINTENA:1; // 0 Transmit interrupt enable + Uint16 RXBKINTENA:1; // 1 Receiver-buffer break enable + Uint16 rsvd:4; // 5:2 reserved + Uint16 TXEMPTY:1; // 6 Transmitter empty flag + Uint16 TXRDY:1; // 7 Transmitter ready flag + Uint16 rsvd1:8; // 15:8 reserved + +}; + +union SCICTL2_REG { + Uint16 all; + struct SCICTL2_BITS bit; +}; + +//--------------------------------------------------- +// SCIRXST Receiver status register bit definitions: +// + +struct SCIRXST_BITS { // bit description + Uint16 rsvd:1; // 0 reserved + Uint16 RXWAKE:1; // 1 Receiver wakeup detect flag + Uint16 PE:1; // 2 Parity error flag + Uint16 OE:1; // 3 Overrun error flag + Uint16 FE:1; // 4 Framing error flag + Uint16 BRKDT:1; // 5 Break-detect flag + Uint16 RXRDY:1; // 6 Receiver ready flag + Uint16 RXERROR:1; // 7 Receiver error flag + +}; + +union SCIRXST_REG { + Uint16 all; + struct SCIRXST_BITS bit; +}; + +//---------------------------------------------------- +// SCIRXBUF Receiver Data Buffer with FIFO bit definitions: +// + +struct SCIRXBUF_BITS { // bits description + Uint16 RXDT:8; // 7:0 Receive word + Uint16 rsvd:6; // 13:8 reserved + Uint16 SCIFFPE:1; // 14 SCI PE error in FIFO mode + Uint16 SCIFFFE:1; // 15 SCI FE error in FIFO mode +}; + +union SCIRXBUF_REG { + Uint16 all; + struct SCIRXBUF_BITS bit; +}; + +//-------------------------------------------------- +// SCIPRI Priority control register bit definitions: +// +// + +struct SCIPRI_BITS { // bit description + Uint16 rsvd:3; // 2:0 reserved + Uint16 FREE:1; // 3 Free emulation suspend mode + Uint16 SOFT:1; // 4 Soft emulation suspend mode + Uint16 rsvd1:3; // 7:5 reserved +}; + +union SCIPRI_REG { + Uint16 all; + struct SCIPRI_BITS bit; +}; + +//------------------------------------------------- +// SCI FIFO Transmit register bit definitions: +// +// + +struct SCIFFTX_BITS { // bit description + Uint16 TXFFILIL:5; // 4:0 Interrupt level + Uint16 TXFFIENA:1; // 5 Interrupt enable + Uint16 TXINTCLR:1; // 6 Clear INT flag + Uint16 TXFFINT:1; // 7 INT flag + Uint16 TXFFST:5; // 12:8 FIFO status + Uint16 TXFIFOXRESET:1; // 13 FIFO reset + Uint16 SCIFFENA:1; // 14 Enhancement enable + Uint16 SCIRST:1; // 15 SCI reset rx/tx channels + +}; + +union SCIFFTX_REG { + Uint16 all; + struct SCIFFTX_BITS bit; +}; + +//------------------------------------------------ +// SCI FIFO recieve register bit definitions: +// +// + +struct SCIFFRX_BITS { // bits description + Uint16 RXFFIL:5; // 4:0 Interrupt level + Uint16 RXFFIENA:1; // 5 Interrupt enable + Uint16 RXFFINTCLR:1; // 6 Clear INT flag + Uint16 RXFFINT:1; // 7 INT flag + Uint16 RXFIFST:5; // 12:8 FIFO status + Uint16 RXFIFORESET:1; // 13 FIFO reset + Uint16 RXFFOVRCLR:1; // 14 Clear overflow + Uint16 RXFFOVF:1; // 15 FIFO overflow + +}; + +union SCIFFRX_REG { + Uint16 all; + struct SCIFFRX_BITS bit; +}; + +// SCI FIFO control register bit definitions: +struct SCIFFCT_BITS { // bits description + Uint16 FFTXDLY:8; // 7:0 FIFO transmit delay + Uint16 rsvd:5; // 12:8 reserved + Uint16 CDC:1; // 13 Auto baud mode enable + Uint16 ABDCLR:1; // 14 Auto baud clear + Uint16 ABD:1; // 15 Auto baud detect +}; + +union SCIFFCT_REG { + Uint16 all; + struct SCIFFCT_BITS bit; +}; + +//--------------------------------------------------------------------------- +// SCI Register File: +// +struct SCI_REGS { + union SCICCR_REG SCICCR; // Communications control register + union SCICTL1_REG SCICTL1; // Control register 1 + Uint16 SCIHBAUD; // Baud rate (high) register + Uint16 SCILBAUD; // Baud rate (low) register + union SCICTL2_REG SCICTL2; // Control register 2 + union SCIRXST_REG SCIRXST; // Recieve status register + Uint16 SCIRXEMU; // Recieve emulation buffer register + union SCIRXBUF_REG SCIRXBUF; // Recieve data buffer + Uint16 rsvd1; // reserved + Uint16 SCITXBUF; // Transmit data buffer + union SCIFFTX_REG SCIFFTX; // FIFO transmit register + union SCIFFRX_REG SCIFFRX; // FIFO recieve register + union SCIFFCT_REG SCIFFCT; // FIFO control register + Uint16 rsvd2; // reserved + Uint16 rsvd3; // reserved + union SCIPRI_REG SCIPRI; // FIFO Priority control +}; + +//--------------------------------------------------------------------------- +// SCI External References & Function Declarations: +// +extern volatile struct SCI_REGS SciaRegs; +extern volatile struct SCI_REGS ScibRegs; + +#ifdef __cplusplus +} +#endif /* extern "C" */ + +#endif // end of DSP281x_SCI_H definition + +//=========================================================================== +// No more. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Spi.h b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Spi.h new file mode 100644 index 0000000..a5c29ab --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Spi.h @@ -0,0 +1,183 @@ +// TI File $Revision: /main/2 $ +// Checkin $Date: April 28, 2005 14:57:16 $ +//########################################################################### +// +// FILE: DSP281x_Spi.h +// +// TITLE: DSP281x Device SPI Register Definitions. +// +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + +#ifndef DSP281x_SPI_H +#define DSP281x_SPI_H + + +#ifdef __cplusplus +extern "C" { +#endif + + +//--------------------------------------------------------------------------- +// SPI Individual Register Bit Definitions: +// +// SPI FIFO Transmit register bit definitions: +struct SPIFFTX_BITS { // bit description + Uint16 TXFFIL:5; // 4:0 Interrupt level + Uint16 TXFFIENA:1; // 5 Interrupt enable + Uint16 TXFFINTCLR:1; // 6 Clear INT flag + Uint16 TXFFINT:1; // 7 INT flag + Uint16 TXFFST:5; // 12:8 FIFO status + Uint16 TXFIFO:1; // 13 FIFO reset + Uint16 SPIFFENA:1; // 14 Enhancement enable + Uint16 SPIRST:1; // 15 Reset SPI +}; + +union SPIFFTX_REG { + Uint16 all; + struct SPIFFTX_BITS bit; +}; + +//-------------------------------------------- +// SPI FIFO recieve register bit definitions: +// +// +struct SPIFFRX_BITS { // bits description + Uint16 RXFFIL:5; // 4:0 Interrupt level + Uint16 RXFFIENA:1; // 5 Interrupt enable + Uint16 RXFFINTCLR:1; // 6 Clear INT flag + Uint16 RXFFINT:1; // 7 INT flag + Uint16 RXFFST:5; // 12:8 FIFO status + Uint16 RXFIFORESET:1; // 13 FIFO reset + Uint16 RXFFOVFCLR:1; // 14 Clear overflow + Uint16 RXFFOVF:1; // 15 FIFO overflow + +}; + +union SPIFFRX_REG { + Uint16 all; + struct SPIFFRX_BITS bit; +}; + +//-------------------------------------------- +// SPI FIFO control register bit definitions: +// +// +struct SPIFFCT_BITS { // bits description + Uint16 TXDLY:8; // 7:0 FIFO transmit delay + Uint16 rsvd:8; // 15:8 reserved +}; + +union SPIFFCT_REG { + Uint16 all; + struct SPIFFCT_BITS bit; +}; + +//--------------------------------------------- +// SPI configuration register bit definitions: +// +// +struct SPICCR_BITS { // bits description + Uint16 SPICHAR:4; // 3:0 Character length control + Uint16 SPILBK:1; // 4 Loop-back enable/disable + Uint16 rsvd1:1; // 5 reserved + Uint16 CLKPOLARITY:1; // 6 Clock polarity + Uint16 SPISWRESET:1; // 7 SPI SW Reset + Uint16 rsvd2:8; // 15:8 reserved +}; + +union SPICCR_REG { + Uint16 all; + struct SPICCR_BITS bit; +}; + +//------------------------------------------------- +// SPI operation control register bit definitions: +// +// +struct SPICTL_BITS { // bits description + Uint16 SPIINTENA:1; // 0 Interrupt enable + Uint16 TALK:1; // 1 Master/Slave transmit enable + Uint16 MASTER_SLAVE:1; // 2 Network control mode + Uint16 CLK_PHASE:1; // 3 Clock phase select + Uint16 OVERRUNINTENA:1; // 4 Overrun interrupt enable + Uint16 rsvd:11; // 15:5 reserved +}; + +union SPICTL_REG { + Uint16 all; + struct SPICTL_BITS bit; +}; + +//-------------------------------------- +// SPI status register bit definitions: +// +// +struct SPISTS_BITS { // bits description + Uint16 rsvd1:5; // 4:0 reserved + Uint16 BUFFULL_FLAG:1; // 5 SPI transmit buffer full flag + Uint16 INT_FLAG:1; // 6 SPI interrupt flag + Uint16 OVERRUN_FLAG:1; // 7 SPI reciever overrun flag + Uint16 rsvd2:8; // 15:8 reserved +}; + +union SPISTS_REG { + Uint16 all; + struct SPISTS_BITS bit; +}; + +//------------------------------------------------ +// SPI priority control register bit definitions: +// +// +struct SPIPRI_BITS { // bits description + Uint16 rsvd1:4; // 3:0 reserved + Uint16 FREE:1; // 4 Free emulation mode control + Uint16 SOFT:1; // 5 Soft emulation mode control + Uint16 PRIORITY:1; // 6 Interrupt priority select + Uint16 rsvd2:9; // 15:7 reserved +}; + +union SPIPRI_REG { + Uint16 all; + struct SPIPRI_BITS bit; +}; + +//--------------------------------------------------------------------------- +// SPI Register File: +// +struct SPI_REGS { + union SPICCR_REG SPICCR; // Configuration register + union SPICTL_REG SPICTL; // Operation control register + union SPISTS_REG SPISTS; // Status register + Uint16 rsvd1; // reserved + Uint16 SPIBRR; // Baud Rate + Uint16 rsvd2; // reserved + Uint16 SPIRXEMU; // Emulation buffer + Uint16 SPIRXBUF; // Serial input buffer + Uint16 SPITXBUF; // Serial output buffer + Uint16 SPIDAT; // Serial data + union SPIFFTX_REG SPIFFTX; // FIFO transmit register + union SPIFFRX_REG SPIFFRX; // FIFO recieve register + union SPIFFCT_REG SPIFFCT; // FIFO control register + Uint16 rsvd3[2]; // reserved + union SPIPRI_REG SPIPRI; // FIFO Priority control +}; + +//--------------------------------------------------------------------------- +// SPI External References & Function Declarations: +// +extern volatile struct SPI_REGS SpiaRegs; + + +#ifdef __cplusplus +} +#endif /* extern "C" */ + +#endif // end of DSP281x_SPI_H definition + +//=========================================================================== +// No more. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f2812/include/DSP281x_SysCtrl.h b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_SysCtrl.h new file mode 100644 index 0000000..6700f62 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_SysCtrl.h @@ -0,0 +1,325 @@ +// TI File $Revision: /main/3 $ +// Checkin $Date: March 16, 2007 13:58:47 $ +//########################################################################### +// +// FILE: DSP281x_SysCtrl.h +// +// TITLE: DSP281x Device System Control Register Definitions. +// +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + +#ifndef DSP281x_SYS_CTRL_H +#define DSP281x_SYS_CTRL_H + + +#ifdef __cplusplus +extern "C" { +#endif + + +//--------------------------------------------------------------------------- +// System Control Individual Register Bit Definitions: +// +// High speed peripheral clock register bit definitions: +struct HISPCP_BITS { // bits description + Uint16 HSPCLK:3; // 2:0 Rate relative to SYSCLKOUT + Uint16 rsvd1:13; // 15:3 reserved +}; + +union HISPCP_REG { + Uint16 all; + struct HISPCP_BITS bit; +}; + +// Low speed peripheral clock register bit definitions: +struct LOSPCP_BITS { // bits description + Uint16 LSPCLK:3; // 2:0 Rate relative to SYSCLKOUT + Uint16 rsvd1:13; // 15:3 reserved +}; + +union LOSPCP_REG { + Uint16 all; + struct LOSPCP_BITS bit; +}; + +// Peripheral clock control register bit definitions: +struct PCLKCR_BITS { // bits description + Uint16 EVAENCLK:1; // 0 Enable high speed clk to EV-A + Uint16 EVBENCLK:1; // 1 Enable high speed clk to EV-B + Uint16 rsvd1:1; // 2 + Uint16 ADCENCLK:1; // 3 Enable high speed clk to ADC + Uint16 rsvd2:4; // 7:4 reserved + Uint16 SPIENCLK:1; // 8 Enable low speed clk to SPI + Uint16 rsvd3:1; // 9 reserved + Uint16 SCIAENCLK:1; // 10 Enable low speed clk to SCI-A + Uint16 SCIBENCLK:1; // 11 Enable low speed clk to SCI-B + Uint16 MCBSPENCLK:1; // 12 Enable low speed clk to McBSP + Uint16 rsvd4:1; // 13 reserved + Uint16 ECANENCLK:1; // 14 Enable system clk to eCAN +}; + +union PCLKCR_REG { + Uint16 all; + struct PCLKCR_BITS bit; +}; + +// PLL control register bit definitions: +struct PLLCR_BITS { // bits description + Uint16 DIV:4; // 3:0 Set clock ratio for the PLL + Uint16 rsvd1:12; // 15:4 reserved +}; + +union PLLCR_REG { + Uint16 all; + struct PLLCR_BITS bit; +}; + +// Low Power Mode 0 control register bit definitions: +struct LPMCR0_BITS { // bits description + Uint16 LPM:2; // 1:0 Set the low power mode + Uint16 QUALSTDBY:6; // 7:2 Qualification + Uint16 rsvd1:8; // 15:8 reserved +}; + +union LPMCR0_REG { + Uint16 all; + struct LPMCR0_BITS bit; +}; + +// Low Power Mode 1 control register bit definitions: +struct LPMCR1_BITS { // bits description + Uint16 XINT1:1; // 0 Enable XINT1 to wake the device from standby + Uint16 XNMI:1; // 1 Enable XMNI to wake the device from standby + Uint16 WDINT:1; // 2 Enable watchdog interrupt to wake the device from standby + Uint16 T1CTRIP:1; // 3 Enable T1CTRIP to wake the device from standby + Uint16 T2CTRIP:1; // 4 Enable T2CTRIP to wake the device from standby + Uint16 T3CTRIP:1; // 5 Enable T3CTRIP to wake the device from standby + Uint16 T4CTRIP:1; // 6 Enable T4CTRIP to wake the device from standby + Uint16 C1TRIP:1; // 7 Enable C1TRIP to wake the device from standby + Uint16 C2TRIP:1; // 8 Enable C2TRIP to wake the device from standby + Uint16 C3TRIP:1; // 9 Enable C3TRIP to wake the device from standby + Uint16 C4TRIP:1; // 10 Enable C4TRIP to wake the device from standby + Uint16 C5TRIP:1; // 11 Enable C5TRIP to wake the device from standby + Uint16 C6TRIP:1; // 12 Enable C6TRIP to wake the device from standby + Uint16 SCIRXA:1; // 13 Enable SCIRXA to wake the device from standby + Uint16 SCIRXB:1; // 14 Enable SCIRXB to wake the device from standby + Uint16 CANRX:1; // 15 Enable CANRX to wake the device from standby +}; + +union LPMCR1_REG { + Uint16 all; + struct LPMCR1_BITS bit; +}; + +//--------------------------------------------------------------------------- +// System Control Register File: +// +struct SYS_CTRL_REGS { + Uint16 rsvd1[10]; // 0-9 + union HISPCP_REG HISPCP; // 10: High-speed peripheral clock pre-scaler + union LOSPCP_REG LOSPCP; // 11: Low-speed peripheral clock pre-scaler + union PCLKCR_REG PCLKCR; // 12: Peripheral clock control register + Uint16 rsvd2; // 13: reserved + union LPMCR0_REG LPMCR0; // 14: Low-power mode control register 0 + union LPMCR1_REG LPMCR1; // 15: Low-power mode control register 1 + Uint16 rsvd3; // 16: reserved + union PLLCR_REG PLLCR; // 17: PLL control register + // No bit definitions are defined for SCSR because + // a read-modify-write instruction can clear the WDOVERRIDE bit + Uint16 SCSR; // 18: System control and status register + Uint16 WDCNTR; // 19: WD counter register + Uint16 rsvd4; // 20 + Uint16 WDKEY; // 21: WD reset key register + Uint16 rsvd5[3]; // 22-24 + // No bit definitions are defined for WDCR because + // the proper value must be written to the WDCHK field + // whenever writing to this register. + Uint16 WDCR; // 25: WD timer control register + Uint16 rsvd6[6]; // 26-31 +}; + + +/* --------------------------------------------------- */ +/* CSM Registers */ +/* */ +/* ----------------------------------------------------*/ + +/* CSM Status & Control register bit definitions */ +struct CSMSCR_BITS { // bit description + Uint16 SECURE:1; // 0 Secure flag + Uint16 rsvd1:14; // 14-1 reserved + Uint16 FORCESEC:1; // 15 Force Secure control bit + +}; + +/* Allow access to the bit fields or entire register */ +union CSMSCR_REG { + Uint16 all; + struct CSMSCR_BITS bit; +}; + +/* CSM Register File */ +struct CSM_REGS { + Uint16 KEY0; // KEY reg bits 15-0 + Uint16 KEY1; // KEY reg bits 31-16 + Uint16 KEY2; // KEY reg bits 47-32 + Uint16 KEY3; // KEY reg bits 63-48 + Uint16 KEY4; // KEY reg bits 79-64 + Uint16 KEY5; // KEY reg bits 95-80 + Uint16 KEY6; // KEY reg bits 111-96 + Uint16 KEY7; // KEY reg bits 127-112 + Uint16 rsvd1; // reserved + Uint16 rsvd2; // reserved + Uint16 rsvd3; // reserved + Uint16 rsvd4; // reserved + Uint16 rsvd5; // reserved + Uint16 rsvd6; // reserved + Uint16 rsvd7; // reserved + union CSMSCR_REG CSMSCR; // CSM Status & Control register +}; + +/* Password locations */ +struct CSM_PWL { + Uint16 PSWD0; // PSWD bits 15-0 + Uint16 PSWD1; // PSWD bits 31-16 + Uint16 PSWD2; // PSWD bits 47-32 + Uint16 PSWD3; // PSWD bits 63-48 + Uint16 PSWD4; // PSWD bits 79-64 + Uint16 PSWD5; // PSWD bits 95-80 + Uint16 PSWD6; // PSWD bits 111-96 + Uint16 PSWD7; // PSWD bits 127-112 +}; + + + +/* Flash Registers */ + +#define FLASH_SLEEP 0x0000; +#define FLASH_STANDBY 0x0001; +#define FLASH_ACTIVE 0x0003; + + +/* Flash Option Register bit definitions */ +struct FOPT_BITS { // bit description + Uint16 ENPIPE:1; // 0 Enable Pipeline Mode + Uint16 rsvd:15; // 1-15 reserved +}; + +/* Allow access to the bit fields or entire register */ +union FOPT_REG { + Uint16 all; + struct FOPT_BITS bit; +}; + +/* Flash Power Modes Register bit definitions */ +struct FPWR_BITS { // bit description + Uint16 PWR:2; // 0-1 Power Mode bits + Uint16 rsvd:14; // 2-15 reserved +}; + +/* Allow access to the bit fields or entire register */ +union FPWR_REG { + Uint16 all; + struct FPWR_BITS bit; +}; + + +/* Flash Status Register bit definitions */ +struct FSTATUS_BITS { // bit description + Uint16 PWRS:2; // 0-1 Power Mode Status bits + Uint16 STDBYWAITS:1; // 2 Bank/Pump Sleep to Standby Wait Counter Status bits + Uint16 ACTIVEWAITS:1; // 3 Bank/Pump Standby to Active Wait Counter Status bits + Uint16 rsvd1:4; // 4-7 reserved + Uint16 V3STAT:1; // 8 VDD3V Status Latch bit + Uint16 rsvd2:7; // 9-15 reserved +}; + +/* Allow access to the bit fields or entire register */ +union FSTATUS_REG { + Uint16 all; + struct FSTATUS_BITS bit; +}; + +/* Flash Sleep to Standby Wait Counter Register bit definitions */ +struct FSTDBYWAIT_BITS { // bit description + Uint16 STDBYWAIT:9; // 0-8 Bank/Pump Sleep to Standby Wait Count bits + Uint16 rsvd:7; // 9-15 reserved +}; + +/* Allow access to the bit fields or entire register */ +union FSTDBYWAIT_REG { + Uint16 all; + struct FSTDBYWAIT_BITS bit; +}; + +/* Flash Standby to Active Wait Counter Register bit definitions */ +struct FACTIVEWAIT_BITS { // bit description + Uint16 ACTIVEWAIT:9; // 0-8 Bank/Pump Standby to Active Wait Count bits + Uint16 rsvd:7; // 9-15 reserved +}; + +/* Allow access to the bit fields or entire register */ +union FACTIVEWAIT_REG { + Uint16 all; + struct FACTIVEWAIT_BITS bit; +}; + +/* Bank Read Access Wait State Register bit definitions */ +struct FBANKWAIT_BITS { // bit description + Uint16 RANDWAIT:4; // 0-3 Flash Random Read Wait State bits + Uint16 rsvd1:4; // 4-7 reserved + Uint16 PAGEWAIT:4; // 8-11 Flash Paged Read Wait State bits + Uint16 rsvd2:4; // 12-15 reserved +}; + +/* Allow access to the bit fields or entire register */ +union FBANKWAIT_REG { + Uint16 all; + struct FBANKWAIT_BITS bit; +}; + +/* OTP Read Access Wait State Register bit definitions */ +struct FOTPWAIT_BITS { // bit description + Uint16 OTPWAIT:5; // 0-4 OTP Read Wait State bits + Uint16 rsvd:11; // 5-15 reserved +}; + +/* Allow access to the bit fields or entire register */ +union FOTPWAIT_REG { + Uint16 all; + struct FOTPWAIT_BITS bit; +}; + + +struct FLASH_REGS { + union FOPT_REG FOPT; // Option Register + Uint16 rsvd1; // reserved + union FPWR_REG FPWR; // Power Modes Register + union FSTATUS_REG FSTATUS; // Status Register + union FSTDBYWAIT_REG FSTDBYWAIT; // Pump/Bank Sleep to Standby Wait State Register + union FACTIVEWAIT_REG FACTIVEWAIT; // Pump/Bank Standby to Active Wait State Register + union FBANKWAIT_REG FBANKWAIT; // Bank Read Access Wait State Register + union FOTPWAIT_REG FOTPWAIT; // OTP Read Access Wait State Register +}; + +//--------------------------------------------------------------------------- +// System Control External References & Function Declarations: +// +extern volatile struct SYS_CTRL_REGS SysCtrlRegs; +extern volatile struct CSM_REGS CsmRegs; +extern volatile struct CSM_PWL CsmPwl; +extern volatile struct FLASH_REGS FlashRegs; + + +#ifdef __cplusplus +} +#endif /* extern "C" */ + +#endif // end of DSP281x_SYS_CTRL_H definition + +//=========================================================================== +// No more. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f2812/include/DSP281x_XIntrupt.h b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_XIntrupt.h new file mode 100644 index 0000000..7cb66d7 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_XIntrupt.h @@ -0,0 +1,78 @@ +// TI File $Revision: /main/2 $ +// Checkin $Date: April 28, 2005 14:57:07 $ +//########################################################################### +// +// FILE: DSP281x_XIntrupt.h +// +// TITLE: DSP281x Device External Interrupt Register Definitions. +// +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + +#ifndef DSP281x_XINTRUPT_H +#define DSP281x_XINTRUPT_H + + +#ifdef __cplusplus +extern "C" { +#endif + +//--------------------------------------------------------------------------- + +struct XINTCR_BITS { + Uint16 ENABLE:1; // 0 enable/disable + Uint16 rsvd1:1; // 1 reserved + Uint16 POLARITY:1; // 2 pos/neg triggered + Uint16 rsvd2:12; // 15:3 reserved +}; + +union XINTCR_REG { + Uint16 all; + struct XINTCR_BITS bit; +}; + +struct XNMICR_BITS { + Uint16 ENABLE:1; // 0 enable/disable + Uint16 SELECT:1; // 1 Timer 1 or XNMI connected to INT13 + Uint16 POLARITY:1; // 2 pos/neg triggered + Uint16 rsvd2:12; // 15:3 reserved +}; + +union XNMICR_REG { + Uint16 all; + struct XNMICR_BITS bit; +}; + + + + +//--------------------------------------------------------------------------- +// External Interrupt Register File: +// +struct XINTRUPT_REGS { + union XINTCR_REG XINT1CR; + union XINTCR_REG XINT2CR; + Uint16 rsvd1[5]; + union XNMICR_REG XNMICR; + Uint16 XINT1CTR; + Uint16 XINT2CTR; + Uint16 rsvd[5]; + Uint16 XNMICTR; +}; + +//--------------------------------------------------------------------------- +// External Interrupt References & Function Declarations: +// +extern volatile struct XINTRUPT_REGS XIntruptRegs; + +#ifdef __cplusplus +} +#endif /* extern "C" */ + +#endif // end of DSP281x_XINTF_H definition + +//=========================================================================== +// No more. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Xintf.h b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Xintf.h new file mode 100644 index 0000000..b394f72 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/include/DSP281x_Xintf.h @@ -0,0 +1,111 @@ +// TI File $Revision: /main/3 $ +// Checkin $Date: March 20, 2007 16:30:14 $ +//########################################################################### +// +// FILE: DSP281x_Xintf.h +// +// TITLE: DSP281x Device External Interface Register Definitions. +// +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + +#ifndef DSP281x_XINTF_H +#define DSP281x_XINTF_H + + +#ifdef __cplusplus +extern "C" { +#endif + + +// XINTF timing register bit definitions: +struct XTIMING_BITS { // bits description + Uint16 XWRTRAIL:2; // 1:0 Write access trail timing + Uint16 XWRACTIVE:3; // 4:2 Write access active timing + Uint16 XWRLEAD:2; // 6:5 Write access lead timing + Uint16 XRDTRAIL:2; // 8:7 Read access trail timing + Uint16 XRDACTIVE:3; // 11:9 Read access active timing + Uint16 XRDLEAD:2; // 13:12 Read access lead timing + Uint16 USEREADY:1; // 14 Extend access using HW waitstates + Uint16 READYMODE:1; // 15 Ready mode + Uint16 XSIZE:2; // 17:16 XINTF bus width - must be written as 11b + Uint16 rsvd1:4; // 21:18 reserved + Uint16 X2TIMING:1; // 22 Double lead/active/trail timing + Uint16 rsvd3:9; // 31:23 reserved +}; + +union XTIMING_REG { + Uint32 all; + struct XTIMING_BITS bit; +}; + +// XINTF control register bit definitions: +struct XINTCNF2_BITS { // bits description + Uint16 WRBUFF:2; // 1:0 Write buffer depth + Uint16 CLKMODE:1; // 2 Ratio for XCLKOUT with respect to XTIMCLK + Uint16 CLKOFF:1; // 3 Disable XCLKOUT + Uint16 rsvd1:2; // 5:4 reserved + Uint16 WLEVEL:2; // 7:6 Current level of the write buffer + Uint16 MPNMC:1; // 8 Micro-processor/micro-computer mode + Uint16 HOLD:1; // 9 Hold enable/disable + Uint16 HOLDS:1; // 10 Current state of HOLDn input + Uint16 HOLDAS:1; // 11 Current state of HOLDAn output + Uint16 rsvd2:4; // 15:12 reserved + Uint16 XTIMCLK:3; // 18:16 Ratio for XTIMCLK + Uint16 rsvd3:13; // 31:19 reserved +}; + +union XINTCNF2_REG { + Uint32 all; + struct XINTCNF2_BITS bit; +}; + +// XINTF bank switching register bit definitions: +struct XBANK_BITS { // bits description + Uint16 BANK:3; // 2:0 Zone for which banking is enabled + Uint16 BCYC:3; // 5:3 XTIMCLK cycles to add + Uint16 rsvd:10; // 15:6 reserved +}; + +union XBANK_REG { + Uint16 all; + struct XBANK_BITS bit; +}; + + +//--------------------------------------------------------------------------- +// XINTF Register File: +// +struct XINTF_REGS { + union XTIMING_REG XTIMING0; + union XTIMING_REG XTIMING1; + union XTIMING_REG XTIMING2; + Uint32 rsvd1[3]; + union XTIMING_REG XTIMING6; + union XTIMING_REG XTIMING7; + Uint32 rsvd2[2]; + union XINTCNF2_REG XINTCNF2; + Uint32 rsvd3; + union XBANK_REG XBANK; + Uint16 rsvd4; + Uint16 XREVISION; + Uint16 rsvd5[5]; +}; + +//--------------------------------------------------------------------------- +// XINTF External References & Function Declarations: +// +extern volatile struct XINTF_REGS XintfRegs; + + +#ifdef __cplusplus +} +#endif /* extern "C" */ + +#endif // end of DSP281x_XINTF_H definition + +//=========================================================================== +// No more. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f2812/source/DSP281x_CpuTimers.c b/c/protocan-boot/vendor/ti/f2812/source/DSP281x_CpuTimers.c new file mode 100644 index 0000000..63bdc48 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/source/DSP281x_CpuTimers.c @@ -0,0 +1,109 @@ +// TI File $Revision: /main/3 $ +// Checkin $Date: July 9, 2009 10:51:58 $ +//########################################################################### +// +// FILE: DSP281x_CpuTimers.c +// +// TITLE: CPU 32-bit Timers Initialization & Support Functions. +// +// NOTES: CpuTimer2 is reserved for use with DSP BIOS and +// other realtime operating systems. +// +// Do not use these this timer in your application if you ever plan +// on integrating DSP-BIOS or another realtime OS. +// +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + +#include "DSP281x_Device.h" // Headerfile Include File +#include "DSP281x_Examples.h" // Examples Include File +#include "DSP281x_CpuTimers.h" +struct CPUTIMER_VARS CpuTimer0; + +// When using DSP BIOS & other RTOS, comment out CPU Timer 2 code. +struct CPUTIMER_VARS CpuTimer1; +struct CPUTIMER_VARS CpuTimer2; + +//--------------------------------------------------------------------------- +// InitCpuTimers: +//--------------------------------------------------------------------------- +// This function initializes all three CPU timers to a known state. +// +void InitCpuTimers(void) +{ + // CPU Timer 0 + // Initialize address pointers to respective timer registers: + CpuTimer0.RegsAddr = &CpuTimer0Regs; + // Initialize timer period to maximum: + CpuTimer0Regs.PRD.all = 0xFFFFFFFF; + // Initialize pre-scale counter to divide by 1 (SYSCLKOUT): + CpuTimer0Regs.TPR.all = 0; + CpuTimer0Regs.TPRH.all = 0; + // Make sure timer is stopped: + CpuTimer0Regs.TCR.bit.TSS = 1; + // Reload all counter register with period value: + CpuTimer0Regs.TCR.bit.TRB = 1; + // Reset interrupt counters: + CpuTimer0.InterruptCount = 0; + + +// CpuTimer2 is reserved for DSP BIOS & other RTOS +// Do not use this timer if you ever plan on integrating +// DSP-BIOS or another realtime OS. + + // Initialize address pointers to respective timer registers: + CpuTimer1.RegsAddr = &CpuTimer1Regs; + CpuTimer2.RegsAddr = &CpuTimer2Regs; + // Initialize timer period to maximum: + CpuTimer1Regs.PRD.all = 0xFFFFFFFF; + CpuTimer2Regs.PRD.all = 0xFFFFFFFF; + // Make sure timers are stopped: + CpuTimer1Regs.TCR.bit.TSS = 1; + CpuTimer2Regs.TCR.bit.TSS = 1; + // Reload all counter register with period value: + CpuTimer1Regs.TCR.bit.TRB = 1; + CpuTimer2Regs.TCR.bit.TRB = 1; + // Reset interrupt counters: + CpuTimer1.InterruptCount = 0; + CpuTimer2.InterruptCount = 0; + +} + +//--------------------------------------------------------------------------- +// ConfigCpuTimer: +//--------------------------------------------------------------------------- +// This function initializes the selected timer to the period specified +// by the "Freq" and "Period" parameters. The "Freq" is entered as "MHz" +// and the period in "uSeconds". The timer is held in the stopped state +// after configuration. +// +void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period) +{ + Uint32 temp; + + // Initialize timer period: + Timer->CPUFreqInMHz = Freq; + Timer->PeriodInUSec = Period; + temp = (long) (Freq * Period); + Timer->RegsAddr->PRD.all = temp; + + // Set pre-scale counter to divide by 1 (SYSCLKOUT): + Timer->RegsAddr->TPR.all = 0; + Timer->RegsAddr->TPRH.all = 0; + + // Initialize timer control register: + Timer->RegsAddr->TCR.bit.TSS = 1; // 1 = Stop timer, 0 = Start/Restart Timer + Timer->RegsAddr->TCR.bit.TRB = 1; // 1 = reload timer + Timer->RegsAddr->TCR.bit.SOFT = 1; + Timer->RegsAddr->TCR.bit.FREE = 1; // Timer Free Run + Timer->RegsAddr->TCR.bit.TIE = 1; // 0 = Disable/ 1 = Enable Timer Interrupt + + // Reset interrupt counter: + Timer->InterruptCount = 0; +} + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f2812/source/DSP281x_GlobalVariableDefs.c b/c/protocan-boot/vendor/ti/f2812/source/DSP281x_GlobalVariableDefs.c new file mode 100644 index 0000000..cdd93b0 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/source/DSP281x_GlobalVariableDefs.c @@ -0,0 +1,265 @@ +// TI File $Revision: /main/3 $ +// Checkin $Date: July 9, 2009 17:28:45 $ +//########################################################################### +// +// FILE: DSP281x_GlobalVariableDefs.c +// +// TITLE: DSP281x Global Variables and Data Section Pragmas. +// +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + +#include "DSP281x_Device.h" // DSP281x Headerfile Include File + +//--------------------------------------------------------------------------- +// Define Global Peripheral Variables: +// + +#ifdef __cplusplus +#pragma DATA_SECTION("AdcRegsFile") +#else +#pragma DATA_SECTION(AdcRegs,"AdcRegsFile"); +#endif +volatile struct ADC_REGS AdcRegs; + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("CpuTimer0RegsFile") +#else +#pragma DATA_SECTION(CpuTimer0Regs,"CpuTimer0RegsFile"); +#endif +volatile struct CPUTIMER_REGS CpuTimer0Regs; +//---------------------------------------- + +#ifdef __cplusplus +#pragma DATA_SECTION("CpuTimer1RegsFile") +#else +#pragma DATA_SECTION(CpuTimer1Regs,"CpuTimer1RegsFile"); +#endif +volatile struct CPUTIMER_REGS CpuTimer1Regs; +//---------------------------------------- + +#ifdef __cplusplus +#pragma DATA_SECTION("CpuTimer2RegsFile") +#else +#pragma DATA_SECTION(CpuTimer2Regs,"CpuTimer2RegsFile"); +#endif +volatile struct CPUTIMER_REGS CpuTimer2Regs; + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("ECanaRegsFile") +#else +#pragma DATA_SECTION(ECanaRegs,"ECanaRegsFile"); +#endif +volatile struct ECAN_REGS ECanaRegs; + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("ECanaMboxesFile") +#else +#pragma DATA_SECTION(ECanaMboxes,"ECanaMboxesFile"); +#endif +volatile struct ECAN_MBOXES ECanaMboxes; + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("ECanaLAMRegsFile") +#else +#pragma DATA_SECTION(ECanaLAMRegs,"ECanaLAMRegsFile"); +#endif +volatile struct LAM_REGS ECanaLAMRegs; + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("ECanaMOTSRegsFile") +#else +#pragma DATA_SECTION(ECanaMOTSRegs,"ECanaMOTSRegsFile"); +#endif +volatile struct MOTS_REGS ECanaMOTSRegs; + + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("ECanaMOTORegsFile") +#else +#pragma DATA_SECTION(ECanaMOTORegs,"ECanaMOTORegsFile"); +#endif +volatile struct MOTO_REGS ECanaMOTORegs; + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("EvaRegsFile") +#else +#pragma DATA_SECTION(EvaRegs,"EvaRegsFile"); +#endif +volatile struct EVA_REGS EvaRegs; + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("EvbRegsFile") +#else +#pragma DATA_SECTION(EvbRegs,"EvbRegsFile"); +#endif +volatile struct EVB_REGS EvbRegs; + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("GpioDataRegsFile") +#else +#pragma DATA_SECTION(GpioDataRegs,"GpioDataRegsFile"); +#endif +volatile struct GPIO_DATA_REGS GpioDataRegs; + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("GpioMuxRegsFile") +#else +#pragma DATA_SECTION(GpioMuxRegs,"GpioMuxRegsFile"); +#endif +volatile struct GPIO_MUX_REGS GpioMuxRegs; + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("McbspaRegsFile") +#else +#pragma DATA_SECTION(McbspaRegs,"McbspaRegsFile"); +#endif +volatile struct MCBSP_REGS McbspaRegs; + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("PieCtrlRegsFile") +#else +#pragma DATA_SECTION(PieCtrlRegs,"PieCtrlRegsFile"); +#endif +volatile struct PIE_CTRL_REGS PieCtrlRegs; + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("PieVectTableFile") +#else +#pragma DATA_SECTION(PieVectTable,"PieVectTableFile"); +#endif +struct PIE_VECT_TABLE PieVectTable; + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("SciaRegsFile") +#else +#pragma DATA_SECTION(SciaRegs,"SciaRegsFile"); +#endif +volatile struct SCI_REGS SciaRegs; + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("ScibRegsFile") +#else +#pragma DATA_SECTION(ScibRegs,"ScibRegsFile"); +#endif +volatile struct SCI_REGS ScibRegs; + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("SpiaRegsFile") +#else +#pragma DATA_SECTION(SpiaRegs,"SpiaRegsFile"); +#endif +volatile struct SPI_REGS SpiaRegs; + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("SysCtrlRegsFile") +#else +#pragma DATA_SECTION(SysCtrlRegs,"SysCtrlRegsFile"); +#endif +volatile struct SYS_CTRL_REGS SysCtrlRegs; + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("DevEmuRegsFile") +#else +#pragma DATA_SECTION(DevEmuRegs,"DevEmuRegsFile"); +#endif +volatile struct DEV_EMU_REGS DevEmuRegs; + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("CsmRegsFile") +#else +#pragma DATA_SECTION(CsmRegs,"CsmRegsFile"); +#endif +volatile struct CSM_REGS CsmRegs; + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("CsmPwlFile") +#else +#pragma DATA_SECTION(CsmPwl,"CsmPwlFile"); +#endif +volatile struct CSM_PWL CsmPwl; + + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("FlashRegsFile") +#else +#pragma DATA_SECTION(FlashRegs,"FlashRegsFile"); +#endif +volatile struct FLASH_REGS FlashRegs; + +#if DSP28_F2812 +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("XintfRegsFile") +#else +#pragma DATA_SECTION(XintfRegs,"XintfRegsFile"); +#endif +volatile struct XINTF_REGS XintfRegs; +#endif + +//---------------------------------------- +#ifdef __cplusplus +#pragma DATA_SECTION("XIntruptRegsFile") +#else +#pragma DATA_SECTION(XIntruptRegs,"XIntruptRegsFile"); +#endif +volatile struct XINTRUPT_REGS XIntruptRegs; + + + +// The following are provided to support alternate notation +// that was used in an early version of the header files + +#define ADCRegs AdcRegs +#define CPUTimer0Regs CpuTimer0Regs +#define CPUTimer1Regs CpuTimer1Regs +#define CPUTimer2Regs CpuTimer2Regs +#define ECANARegs ECanaRegs +#define ECANAMboxes ECanaMboxes +#define EVARegs EvaRegs +#define GPIODataRegs GpioDataRegs +#define GPIOMuxRegs GpioMuxRegs +#define MCBSPARegs McbspaRegs +#define PIECtrlRegs PieCtrlRegs +#define PIEVectTable PieVectTable +#define SCIARegs SciaRegs +#define SCIBRegs ScibRegs +#define SYSCtrlRegs SysCtrlRegs +#define DEVEmuRegs DevEmuRegs +#define CSMRegs CsmRegs +#define CSMPwl CsmPwl +#define FLASHRegs FlashRegs +#define XINTFRegs XintfRegs +#define XINTRUPTRegs XIntruptRegs + + + + + + + + + diff --git a/c/protocan-boot/vendor/ti/f2812/source/DSP281x_PieCtrl.c b/c/protocan-boot/vendor/ti/f2812/source/DSP281x_PieCtrl.c new file mode 100644 index 0000000..8d38af6 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/source/DSP281x_PieCtrl.c @@ -0,0 +1,84 @@ +// TI File $Revision: /main/2 $ +// Checkin $Date: April 29, 2005 11:09:05 $ +//########################################################################### +// +// FILE: DSP281x_PieCtrl.c +// +// TITLE: DSP281x Device PIE Control Register Initialization Functions. +// + +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + +#include "DSP281x_Device.h" // DSP281x Headerfile Include File +#include "DSP281x_Examples.h" // DSP281x Examples Include File + +//--------------------------------------------------------------------------- +// InitPieCtrl: +//--------------------------------------------------------------------------- +// This function initializes the PIE control registers to a known state. +// +void InitPieCtrl(void) +{ + // Disable Interrupts at the CPU level: + DINT; + + // Disable the PIE + PieCtrlRegs.PIECRTL.bit.ENPIE = 0; + + // Clear all PIEIER registers: + PieCtrlRegs.PIEIER1.all = 0; + PieCtrlRegs.PIEIER2.all = 0; + PieCtrlRegs.PIEIER3.all = 0; + PieCtrlRegs.PIEIER4.all = 0; + PieCtrlRegs.PIEIER5.all = 0; + PieCtrlRegs.PIEIER6.all = 0; + PieCtrlRegs.PIEIER7.all = 0; + PieCtrlRegs.PIEIER8.all = 0; + PieCtrlRegs.PIEIER9.all = 0; + PieCtrlRegs.PIEIER10.all = 0; + PieCtrlRegs.PIEIER11.all = 0; + PieCtrlRegs.PIEIER12.all = 0; + + // Clear all PIEIFR registers: + PieCtrlRegs.PIEIFR1.all = 0; + PieCtrlRegs.PIEIFR2.all = 0; + PieCtrlRegs.PIEIFR3.all = 0; + PieCtrlRegs.PIEIFR4.all = 0; + PieCtrlRegs.PIEIFR5.all = 0; + PieCtrlRegs.PIEIFR6.all = 0; + PieCtrlRegs.PIEIFR7.all = 0; + PieCtrlRegs.PIEIFR8.all = 0; + PieCtrlRegs.PIEIFR9.all = 0; + PieCtrlRegs.PIEIFR10.all = 0; + PieCtrlRegs.PIEIFR11.all = 0; + PieCtrlRegs.PIEIFR12.all = 0; + + +} + +//--------------------------------------------------------------------------- +// EnableInterrupts: +//--------------------------------------------------------------------------- +// This function enables the PIE module and CPU interrupts +// +void EnableInterrupts() +{ + + // Enable the PIE + PieCtrlRegs.PIECRTL.bit.ENPIE = 1; + + // Enables PIE to drive a pulse into the CPU + PieCtrlRegs.PIEACK.all = 0xFFFF; + + // Enable Interrupts at the CPU level + EINT; + +} + + +//=========================================================================== +// No more. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f2812/source/DSP281x_SysCtrl.c b/c/protocan-boot/vendor/ti/f2812/source/DSP281x_SysCtrl.c new file mode 100644 index 0000000..9db37eb --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/source/DSP281x_SysCtrl.c @@ -0,0 +1,295 @@ +// TI File $Revision: /main/3 $ +// Checkin $Date: April 4, 2007 13:20:29 $ +//########################################################################### +// +// FILE: DSP281x_SysCtrl.c +// +// TITLE: DSP281x Device System Control Initialization & Support Functions. +// +// DESCRIPTION: +// +// Example initialization of system resources. +// +//########################################################################### +// $TI Release: DSP281x C/C++ Header Files V1.20 $ +// $Release Date: July 27, 2009 $ +//########################################################################### + +#include "DSP281x_Device.h" // DSP281x Headerfile Include File +#include "DSP281x_Examples.h" // DSP281x Examples Include File + +// Functions that will be run from RAM need to be assigned to +// a different section. This section will then be mapped to a load and +// run address using the linker cmd file. + +#pragma CODE_SECTION(InitFlash, "ramfuncs"); + +#pragma DATA_SECTION(HSPCLK,".fast_vars1"); +float SYSCLKOUT, LSPCLK, HSPCLK; + +//--------------------------------------------------------------------------- +// InitSysCtrl: +//--------------------------------------------------------------------------- +// This function initializes the System Control registers to a known state. +// - Disables the watchdog +// - Set the PLLCR for proper SYSCLKOUT frequency +// - Set the pre-scaler for the high and low frequency peripheral clocks +// - Enable the clocks to the peripherals + +void InitSysCtrl(void) +{ + +// On F2812/F2810 TMX samples prior to rev C this initialization was +// required. For Rev C and after this is no longer required +/* + EALLOW; + DevEmuRegs.M0RAMDFT = 0x0300; + DevEmuRegs.M1RAMDFT = 0x0300; + DevEmuRegs.L0RAMDFT = 0x0300; + DevEmuRegs.L1RAMDFT = 0x0300; + DevEmuRegs.H0RAMDFT = 0x0300; + EDIS; +*/ + // Disable the watchdog + DisableDog(); + + // Initialize the PLLCR to 0xA + InitPll(0xA); + + // Initialize the peripheral clocks + InitPeripheralClocks(); +} + + +//--------------------------------------------------------------------------- +// Example: InitFlash: +//--------------------------------------------------------------------------- +// This function initializes the Flash Control registers + +// CAUTION +// This function MUST be executed out of RAM. Executing it +// out of OTP/Flash will yield unpredictable results + +void InitFlash(void) +{ + + + + EALLOW; + //Enable Flash Pipeline mode to improve performance + //of code executed from Flash. + FlashRegs.FOPT.bit.ENPIPE = 1; + + // CAUTION + //Minimum waitstates required for the flash operating + //at a given CPU rate must be characterized by TI. + //Refer to the datasheet for the latest information. + + //Set the Random Waitstate for the Flash + FlashRegs.FBANKWAIT.bit.RANDWAIT = 5; + + //Set the Paged Waitstate for the Flash + FlashRegs.FBANKWAIT.bit.PAGEWAIT = 5; + + // CAUTION + //Minimum cycles required to move between power states + //at a given CPU rate must be characterized by TI. + //Refer to the datasheet for the latest information. + + //For now use the default count + //Set number of cycles to transition from sleep to standby + FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF; + + //Set number of cycles to transition from standby to active + FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF; + +// new add!!! + + FlashRegs.FPWR.bit.PWR = 3; // Pump and bank set to active mode + FlashRegs.FSTATUS.bit.V3STAT = 1; // Clear the 3VSTAT bit + FlashRegs.FOTPWAIT.bit.OTPWAIT = 8; // OTP waitstates + +///////// + + EDIS; + + //Force a pipeline flush to ensure that the write to + //the last register configured occurs before returning. + + asm(" RPT #7 || NOP"); +} + + +//--------------------------------------------------------------------------- +// Example: KickDog: +//--------------------------------------------------------------------------- +// This function resets the watchdog timer. +// Enable this function for using KickDog in the application + +void KickDog(void) +{ + EALLOW; + SysCtrlRegs.WDKEY = 0x0055; + SysCtrlRegs.WDKEY = 0x00AA; + EDIS; +} + +//--------------------------------------------------------------------------- +// Example: DisableDog: +//--------------------------------------------------------------------------- +// This function disables the watchdog timer. + +void DisableDog(void) +{ + EALLOW; + SysCtrlRegs.WDCR= 0x0068; + EDIS; +} + +//--------------------------------------------------------------------------- +// Example: InitPll: +//--------------------------------------------------------------------------- +// This function initializes the PLLCR register. + +void InitPll(Uint16 val) +{ + float Val; + volatile Uint16 iVol; + + Val = (val)?val:1; + Val = XCLKIN * (Val / 2); + SYSCLKOUT = Val; + + + + if (SysCtrlRegs.PLLCR.bit.DIV != val) + { + EALLOW; + SysCtrlRegs.PLLCR.bit.DIV = val; + EDIS; + + // Optional: Wait for PLL to lock. + // During this time the CPU will switch to OSCCLK/2 until the PLL is + // stable. Once the PLL is stable the CPU will switch to the new PLL value. + // + // This switch time is 131072 CLKIN cycles as of Rev C silicon. + // + // Code is not required to sit and wait for the PLL to lock. + // However, if the code does anything that is timing critical, + // and requires the correct clock be locked, then it is best to + // wait until this switching has completed. + + // If this function is run from waitstated memory, then the loop count can + // be reduced as long as the minimum switch time is still met. + + // iVol is volatile so the compiler will not optimize this loop out + // + // The watchdog should be disabled before this loop, or fed within + // the loop. + + DisableDog(); + + // Wait lock cycles. + // Note, This loop is tuned to 0-waitstate RAM memory. If this + // function is run from wait-stated memory such as Flash or XINTF, + // then the number of times through the loop can be reduced + // accordingly. + for(iVol= 0; iVol< ( (131072/2)/12 ); iVol++) + { + + } + } +} + +//-------------------------------------------------------------------------- +// Example: InitPeripheralClocks: +//--------------------------------------------------------------------------- +// This function initializes the clocks to the peripheral modules. +// First the high and low clock prescalers are set +// Second the clocks are enabled to each peripheral. +// To reduce power, leave clocks to unused peripherals disabled +// Note: If a peripherals clock is not enabled then you cannot +// read or write to the registers for that peripheral + +void InitPeripheralClocks(void) +{ + float Val; + + EALLOW; +// HISPCP/LOSPCP prescale register settings, normally it will be set to default values + SysCtrlRegs.HISPCP.all = 0x002;//0x0002; + SysCtrlRegs.LOSPCP.all = 0x0000;//0x4 + + + Val = (SysCtrlRegs.HISPCP.all)? + SysCtrlRegs.HISPCP.all*2 : 1; + Val = SYSCLKOUT / Val; + + HSPCLK = Val; + + Val = (SysCtrlRegs.LOSPCP.all)? + SysCtrlRegs.LOSPCP.all*2 : 1; + Val = SYSCLKOUT / Val; + LSPCLK = Val; + +// Peripheral clock enables set for the selected peripherals. + SysCtrlRegs.PCLKCR.bit.EVAENCLK=1; + SysCtrlRegs.PCLKCR.bit.EVBENCLK=1; + SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1; + SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1; + SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=1; + SysCtrlRegs.PCLKCR.bit.SPIENCLK=1; + SysCtrlRegs.PCLKCR.bit.ECANENCLK=1; + SysCtrlRegs.PCLKCR.bit.ADCENCLK=1; + EDIS; +} + +//--------------------------------------------------------------------------- +// Example: CsmUnlock: +//--------------------------------------------------------------------------- +// This function unlocks the CSM. User must replace 0xFFFF's with current +// password for the DSP. Returns 1 if unlock is successful. + +#define STATUS_FAIL 0 +#define STATUS_SUCCESS 1 + +Uint16 CsmUnlock() +{ + volatile Uint16 temp; + + // Load the key registers with the current password. The 0xFFFF's are dummy + // passwords. User should replace them with the correct password for the DSP. + + EALLOW; + CsmRegs.KEY0 = 0xFFFF; + CsmRegs.KEY1 = 0xFFFF; + CsmRegs.KEY2 = 0xFFFF; + CsmRegs.KEY3 = 0xFFFF; + CsmRegs.KEY4 = 0xFFFF; + CsmRegs.KEY5 = 0xFFFF; + CsmRegs.KEY6 = 0xFFFF; + CsmRegs.KEY7 = 0xFFFF; + EDIS; + + // Perform a dummy read of the password locations + // if they match the key values, the CSM will unlock + + temp = CsmPwl.PSWD0; + temp = CsmPwl.PSWD1; + temp = CsmPwl.PSWD2; + temp = CsmPwl.PSWD3; + temp = CsmPwl.PSWD4; + temp = CsmPwl.PSWD5; + temp = CsmPwl.PSWD6; + temp = CsmPwl.PSWD7; + + // If the CSM unlocked, return succes, otherwise return + // failure. + if (CsmRegs.CSMSCR.bit.SECURE == 0) return STATUS_SUCCESS; + else return STATUS_FAIL; + +} + +//=========================================================================== +// No more. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f2812/source/DSP281x_usDelay.asm b/c/protocan-boot/vendor/ti/f2812/source/DSP281x_usDelay.asm new file mode 100644 index 0000000..e1b644e --- /dev/null +++ b/c/protocan-boot/vendor/ti/f2812/source/DSP281x_usDelay.asm @@ -0,0 +1,71 @@ +;// TI File $Revision: /main/2 $ +;// Checkin $Date: April 29, 2005 11:01:42 $ +;//########################################################################### +;// +;// FILE: DSP281x_usDelay.asm +;// +;// TITLE: Simple delay function +;// +;// DESCRIPTION: +;// +;// This is a simple delay function that can be used to insert a specified +;// delay into code. +;// +;// This function is only accurate if executed from internal zero-waitstate +;// SARAM. If it is executed from waitstate memory then the delay will be +;// longer then specified. +;// +;// To use this function: +;// +;// 1 - update the CPU clock speed in the DSP281x_Examples.h +;// file. For example: +;// #define CPU_CLOCK_SPEED 6.6667L // for a 150MHz CPU clock speed +;// +;// 2 - Call this function by using the DELAY_US(A) macro +;// that is defined in the DSP28_Device.h file. This macro +;// will convert the number of microseconds specified +;// into a loop count for use with this function. +;// This count will be based on the CPU frequency you specify. +;// +;// 3 - For the most accurate delay +;// - Execute this function in 0 waitstate RAM. +;// - Disable interrupts before calling the function +;// If you do not disable interrupts, then think of +;// this as an "at least" delay function as the actual +;// delay may be longer. +;// +;// The C assembly call from the DELAY_US(time) macro will +;// look as follows: +;// +;// extern void Delay(long LoopCount); +;// +;// MOV AL,#LowLoopCount +;// MOV AH,#HighLoopCount +;// LCR _Delay +;// +;// Or as follows (if count is less then 16-bits): +;// +;// MOV ACC,#LoopCount +;// LCR _Delay +;// +;// +;//########################################################################### +;// $TI Release: DSP281x C/C++ Header Files V1.20 $ +;// $Release Date: July 27, 2009 $ +;//########################################################################### + .def _DSP28x_usDelay + .sect ".fast_run" + + .global __DSP28x_usDelay +_DSP28x_usDelay: + SUB ACC,#1 + BF _DSP28x_usDelay,GEQ ;; Loop if ACC >= 0 + LRETR + +;There is a 9/10 cycle overhead and each loop +;takes five cycles. The LoopCount is given by +;the following formula: +; DELAY_CPU_CYCLES = 9 + 5*LoopCount +; LoopCount = (DELAY_CPU_CYCLES - 9) / 5 +; The macro DELAY_US(A) performs this calculation for you +;================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/cmd/DSP2833x_Headers_nonBIOS.cmd b/c/protocan-boot/vendor/ti/f28335/cmd/DSP2833x_Headers_nonBIOS.cmd new file mode 100644 index 0000000..d16ae33 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/cmd/DSP2833x_Headers_nonBIOS.cmd @@ -0,0 +1,240 @@ +/* Поставляемое TI описание Headers_nonBIOS для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +/* +// TI File $Revision: /main/8 $ +// Checkin $Date: June 2, 2008 11:12:24 $ +//########################################################################### +// +// FILE: DSP2833x_Headers_nonBIOS.cmd +// +// TITLE: DSP2833x Peripheral registers linker command file +// +// DESCRIPTION: +// +// This file is for use in Non-BIOS applications. +// +// Linker command file to place the peripheral structures +// used within the DSP2833x headerfiles into the correct memory +// mapped locations. +// +// This version of the file includes the PieVectorTable structure. +// For BIOS applications, please use the DSP2833x_Headers_BIOS.cmd file +// which does not include the PieVectorTable structure. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### +*/ + +/* Начинает описание физических блоков памяти для линкера. */ +MEMORY +/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ +{ + PAGE 0: /* Program Memory */ /* Выбирает страницу адресного пространства линкера: 0 — программа, 1 — данные. */ + + PAGE 1: /* Data Memory */ /* Выбирает страницу адресного пространства линкера: 0 — программа, 1 — данные. */ + + DEV_EMU : origin = 0x000880, length = 0x000180 /* device emulation registers */ /* Записывает origin значением 0x000880, length = 0x000180; данные origin. */ + FLASH_REGS : origin = 0x000A80, length = 0x000060 /* FLASH registers */ /* Записывает origin значением 0x000A80, length = 0x000060; данные origin. */ + CSM : origin = 0x000AE0, length = 0x000010 /* code security module registers */ /* Записывает origin значением 0x000AE0, length = 0x000010; данные origin. */ + + ADC_MIRROR : origin = 0x000B00, length = 0x000010 /* ADC Results register mirror */ /* Записывает origin значением 0x000B00, length = 0x000010; данные origin. */ + + XINTF : origin = 0x000B20, length = 0x000020 /* external interface registers */ /* Записывает origin значением 0x000B20, length = 0x000020; данные origin. */ + + CPU_TIMER0 : origin = 0x000C00, length = 0x000008 /* CPU Timer0 registers */ /* Записывает origin значением 0x000C00, length = 0x000008; данные origin. */ + CPU_TIMER1 : origin = 0x000C08, length = 0x000008 /* CPU Timer0 registers (CPU Timer1 & Timer2 reserved TI use)*/ /* Записывает origin значением 0x000C08, length = 0x000008; данные origin. */ + CPU_TIMER2 : origin = 0x000C10, length = 0x000008 /* CPU Timer0 registers (CPU Timer1 & Timer2 reserved TI use)*/ /* Записывает origin значением 0x000C10, length = 0x000008; данные origin. */ + + PIE_CTRL : origin = 0x000CE0, length = 0x000020 /* PIE control registers */ /* Записывает origin значением 0x000CE0, length = 0x000020; данные origin. */ + PIE_VECT : origin = 0x000D00, length = 0x000100 /* PIE Vector Table */ /* Записывает origin значением 0x000D00, length = 0x000100; данные origin. */ + + DMA : origin = 0x001000, length = 0x000200 /* DMA registers */ /* Записывает origin значением 0x001000, length = 0x000200; данные origin. */ + + MCBSPA : origin = 0x005000, length = 0x000040 /* McBSP-A registers */ /* Записывает origin значением 0x005000, length = 0x000040; данные origin. */ + MCBSPB : origin = 0x005040, length = 0x000040 /* McBSP-B registers */ /* Записывает origin значением 0x005040, length = 0x000040; данные origin. */ + + ECANA : origin = 0x006000, length = 0x000040 /* eCAN-A control and status registers */ /* Записывает origin значением 0x006000, length = 0x000040; данные origin. */ + ECANA_LAM : origin = 0x006040, length = 0x000040 /* eCAN-A local acceptance masks */ /* Записывает origin значением 0x006040, length = 0x000040; данные origin. */ + ECANA_MOTS : origin = 0x006080, length = 0x000040 /* eCAN-A message object time stamps */ /* Записывает origin значением 0x006080, length = 0x000040; данные origin. */ + ECANA_MOTO : origin = 0x0060C0, length = 0x000040 /* eCAN-A object time-out registers */ /* Записывает origin значением 0x0060C0, length = 0x000040; данные origin. */ + ECANA_MBOX : origin = 0x006100, length = 0x000100 /* eCAN-A mailboxes */ /* Записывает origin значением 0x006100, length = 0x000100; данные origin. */ + + ECANB : origin = 0x006200, length = 0x000040 /* eCAN-B control and status registers */ /* Записывает origin значением 0x006200, length = 0x000040; данные origin. */ + ECANB_LAM : origin = 0x006240, length = 0x000040 /* eCAN-B local acceptance masks */ /* Записывает origin значением 0x006240, length = 0x000040; данные origin. */ + ECANB_MOTS : origin = 0x006280, length = 0x000040 /* eCAN-B message object time stamps */ /* Записывает origin значением 0x006280, length = 0x000040; данные origin. */ + ECANB_MOTO : origin = 0x0062C0, length = 0x000040 /* eCAN-B object time-out registers */ /* Записывает origin значением 0x0062C0, length = 0x000040; данные origin. */ + ECANB_MBOX : origin = 0x006300, length = 0x000100 /* eCAN-B mailboxes */ /* Записывает origin значением 0x006300, length = 0x000100; данные origin. */ + + EPWM1 : origin = 0x006800, length = 0x000022 /* Enhanced PWM 1 registers */ /* Записывает origin значением 0x006800, length = 0x000022; данные origin. */ + EPWM2 : origin = 0x006840, length = 0x000022 /* Enhanced PWM 2 registers */ /* Записывает origin значением 0x006840, length = 0x000022; данные origin. */ + EPWM3 : origin = 0x006880, length = 0x000022 /* Enhanced PWM 3 registers */ /* Записывает origin значением 0x006880, length = 0x000022; данные origin. */ + EPWM4 : origin = 0x0068C0, length = 0x000022 /* Enhanced PWM 4 registers */ /* Записывает origin значением 0x0068C0, length = 0x000022; данные origin. */ + EPWM5 : origin = 0x006900, length = 0x000022 /* Enhanced PWM 5 registers */ /* Записывает origin значением 0x006900, length = 0x000022; данные origin. */ + EPWM6 : origin = 0x006940, length = 0x000022 /* Enhanced PWM 6 registers */ /* Записывает origin значением 0x006940, length = 0x000022; данные origin. */ + + ECAP1 : origin = 0x006A00, length = 0x000020 /* Enhanced Capture 1 registers */ /* Записывает origin значением 0x006A00, length = 0x000020; данные origin. */ + ECAP2 : origin = 0x006A20, length = 0x000020 /* Enhanced Capture 2 registers */ /* Записывает origin значением 0x006A20, length = 0x000020; данные origin. */ + ECAP3 : origin = 0x006A40, length = 0x000020 /* Enhanced Capture 3 registers */ /* Записывает origin значением 0x006A40, length = 0x000020; данные origin. */ + ECAP4 : origin = 0x006A60, length = 0x000020 /* Enhanced Capture 4 registers */ /* Записывает origin значением 0x006A60, length = 0x000020; данные origin. */ + ECAP5 : origin = 0x006A80, length = 0x000020 /* Enhanced Capture 5 registers */ /* Записывает origin значением 0x006A80, length = 0x000020; данные origin. */ + ECAP6 : origin = 0x006AA0, length = 0x000020 /* Enhanced Capture 6 registers */ /* Записывает origin значением 0x006AA0, length = 0x000020; данные origin. */ + + EQEP1 : origin = 0x006B00, length = 0x000040 /* Enhanced QEP 1 registers */ /* Записывает origin значением 0x006B00, length = 0x000040; данные origin. */ + EQEP2 : origin = 0x006B40, length = 0x000040 /* Enhanced QEP 2 registers */ /* Записывает origin значением 0x006B40, length = 0x000040; данные origin. */ + + GPIOCTRL : origin = 0x006F80, length = 0x000040 /* GPIO control registers */ /* Записывает origin значением 0x006F80, length = 0x000040; данные origin. */ + GPIODAT : origin = 0x006FC0, length = 0x000020 /* GPIO data registers */ /* Записывает origin значением 0x006FC0, length = 0x000020; данные origin. */ + GPIOINT : origin = 0x006FE0, length = 0x000020 /* GPIO interrupt/LPM registers */ /* Записывает origin значением 0x006FE0, length = 0x000020; данные origin. */ + + SYSTEM : origin = 0x007010, length = 0x000020 /* System control registers */ /* Записывает origin значением 0x007010, length = 0x000020; данные origin. */ + SPIA : origin = 0x007040, length = 0x000010 /* SPI-A registers */ /* Записывает origin значением 0x007040, length = 0x000010; данные origin. */ + SCIA : origin = 0x007050, length = 0x000010 /* SCI-A registers */ /* Записывает origin значением 0x007050, length = 0x000010; данные origin. */ + XINTRUPT : origin = 0x007070, length = 0x000010 /* external interrupt registers */ /* Записывает origin значением 0x007070, length = 0x000010; данные origin. */ + + ADC : origin = 0x007100, length = 0x000020 /* ADC registers */ /* Записывает origin значением 0x007100, length = 0x000020; данные origin. */ + + SCIB : origin = 0x007750, length = 0x000010 /* SCI-B registers */ /* Записывает origin значением 0x007750, length = 0x000010; данные origin. */ + + SCIC : origin = 0x007770, length = 0x000010 /* SCI-C registers */ /* Записывает origin значением 0x007770, length = 0x000010; данные origin. */ + + I2CA : origin = 0x007900, length = 0x000040 /* I2C-A registers */ /* Записывает origin значением 0x007900, length = 0x000040; данные origin. */ + + CSM_PWL : origin = 0x33FFF8, length = 0x000008 /* Part of FLASHA. CSM password locations. */ /* Записывает origin значением 0x33FFF8, length = 0x000008; данные origin. */ + + PARTID : origin = 0x380090, length = 0x000001 /* Part ID register location */ /* Записывает origin значением 0x380090, length = 0x000001; данные origin. */ +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} + + +/* Начинает описание размещения секций объектных файлов для линкера. */ +SECTIONS +/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ +{ + /* Записывает PAGE значением 1; данные PAGE. */ + PieVectTableFile : > PIE_VECT, PAGE = 1 + +/*** Peripheral Frame 0 Register Structures ***/ + /* Записывает PAGE значением 1; данные PAGE. */ + DevEmuRegsFile : > DEV_EMU, PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + FlashRegsFile : > FLASH_REGS, PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + CsmRegsFile : > CSM, PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + AdcMirrorFile : > ADC_MIRROR, PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + XintfRegsFile : > XINTF, PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + CpuTimer0RegsFile : > CPU_TIMER0, PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + CpuTimer1RegsFile : > CPU_TIMER1, PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + CpuTimer2RegsFile : > CPU_TIMER2, PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + PieCtrlRegsFile : > PIE_CTRL, PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + DmaRegsFile : > DMA, PAGE = 1 + +/*** Peripheral Frame 3 Register Structures ***/ + /* Записывает PAGE значением 1; данные PAGE. */ + McbspaRegsFile : > MCBSPA, PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + McbspbRegsFile : > MCBSPB, PAGE = 1 + +/*** Peripheral Frame 1 Register Structures ***/ + /* Записывает PAGE значением 1; данные PAGE. */ + ECanaRegsFile : > ECANA, PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + ECanaLAMRegsFile : > ECANA_LAM PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + ECanaMboxesFile : > ECANA_MBOX PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + ECanaMOTSRegsFile : > ECANA_MOTS PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + ECanaMOTORegsFile : > ECANA_MOTO PAGE = 1 + + /* Записывает PAGE значением 1; данные PAGE. */ + ECanbRegsFile : > ECANB, PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + ECanbLAMRegsFile : > ECANB_LAM PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + ECanbMboxesFile : > ECANB_MBOX PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + ECanbMOTSRegsFile : > ECANB_MOTS PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + ECanbMOTORegsFile : > ECANB_MOTO PAGE = 1 + + /* Записывает PAGE значением 1; данные PAGE. */ + EPwm1RegsFile : > EPWM1 PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + EPwm2RegsFile : > EPWM2 PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + EPwm3RegsFile : > EPWM3 PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + EPwm4RegsFile : > EPWM4 PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + EPwm5RegsFile : > EPWM5 PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + EPwm6RegsFile : > EPWM6 PAGE = 1 + + /* Записывает PAGE значением 1; данные PAGE. */ + ECap1RegsFile : > ECAP1 PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + ECap2RegsFile : > ECAP2 PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + ECap3RegsFile : > ECAP3 PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + ECap4RegsFile : > ECAP4 PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + ECap5RegsFile : > ECAP5 PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + ECap6RegsFile : > ECAP6 PAGE = 1 + + /* Записывает PAGE значением 1; данные PAGE. */ + EQep1RegsFile : > EQEP1 PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + EQep2RegsFile : > EQEP2 PAGE = 1 + + /* Записывает PAGE значением 1; данные PAGE. */ + GpioCtrlRegsFile : > GPIOCTRL PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + GpioDataRegsFile : > GPIODAT PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + GpioIntRegsFile : > GPIOINT PAGE = 1 + +/*** Peripheral Frame 2 Register Structures ***/ + /* Записывает PAGE значением 1; данные PAGE. */ + SysCtrlRegsFile : > SYSTEM, PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + SpiaRegsFile : > SPIA, PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + SciaRegsFile : > SCIA, PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + XIntruptRegsFile : > XINTRUPT, PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + AdcRegsFile : > ADC, PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + ScibRegsFile : > SCIB, PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + ScicRegsFile : > SCIC, PAGE = 1 + /* Записывает PAGE значением 1; данные PAGE. */ + I2caRegsFile : > I2CA, PAGE = 1 + +/*** Code Security Module Register Structures ***/ + /* Записывает PAGE значением 1; данные PAGE. */ + CsmPwlFile : > CSM_PWL, PAGE = 1 + +/*** Device Part ID Register Structures ***/ + /* Записывает PAGE значением 1; данные PAGE. */ + PartIdRegsFile : > PARTID, PAGE = 1 + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} + + +/* +//=========================================================================== +// End of file. +//=========================================================================== +*/ diff --git a/c/protocan-boot/vendor/ti/f28335/common/include/DSP2833x_DefaultIsr.h b/c/protocan-boot/vendor/ti/f28335/common/include/DSP2833x_DefaultIsr.h new file mode 100644 index 0000000..648872d --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/common/include/DSP2833x_DefaultIsr.h @@ -0,0 +1,236 @@ +/* Поставляемое TI описание DefaultIsr для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/1 $ +// Checkin $Date: August 18, 2006 13:45:37 $ +//########################################################################### +// +// FILE: DSP2833x_DefaultIsr.h +// +// TITLE: DSP2833x Devices Default Interrupt Service Routines Definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_DEFAULT_ISR_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_DEFAULT_ISR_H +/* Определяет защитный символ или переключатель DSP2833x_DEFAULT_ISR_H для последующей компиляции. */ +#define DSP2833x_DEFAULT_ISR_H + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + + +//--------------------------------------------------------------------------- +// Default Interrupt Service Routine Declarations: +// +// The following function prototypes are for the +// default ISR routines used with the default PIE vector table. +// This default vector table is found in the DSP2833x_PieVect.h +// file. +// + +// Non-Peripheral Interrupts: +/* Объявляет обработчик INT13_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void INT13_ISR(void); // XINT13 or CPU-Timer 1 +/* Объявляет обработчик INT14_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void INT14_ISR(void); // CPU-Timer2 +/* Объявляет обработчик DATALOG_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void DATALOG_ISR(void); // Datalogging interrupt +/* Объявляет обработчик RTOSINT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void RTOSINT_ISR(void); // RTOS interrupt +/* Объявляет обработчик EMUINT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void EMUINT_ISR(void); // Emulation interrupt +/* Объявляет обработчик NMI_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void NMI_ISR(void); // Non-maskable interrupt +/* Объявляет обработчик ILLEGAL_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void ILLEGAL_ISR(void); // Illegal operation TRAP +/* Объявляет обработчик USER1_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void USER1_ISR(void); // User Defined trap 1 +/* Объявляет обработчик USER2_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void USER2_ISR(void); // User Defined trap 2 +/* Объявляет обработчик USER3_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void USER3_ISR(void); // User Defined trap 3 +/* Объявляет обработчик USER4_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void USER4_ISR(void); // User Defined trap 4 +/* Объявляет обработчик USER5_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void USER5_ISR(void); // User Defined trap 5 +/* Объявляет обработчик USER6_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void USER6_ISR(void); // User Defined trap 6 +/* Объявляет обработчик USER7_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void USER7_ISR(void); // User Defined trap 7 +/* Объявляет обработчик USER8_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void USER8_ISR(void); // User Defined trap 8 +/* Объявляет обработчик USER9_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void USER9_ISR(void); // User Defined trap 9 +/* Объявляет обработчик USER10_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void USER10_ISR(void); // User Defined trap 10 +/* Объявляет обработчик USER11_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void USER11_ISR(void); // User Defined trap 11 +/* Объявляет обработчик USER12_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void USER12_ISR(void); // User Defined trap 12 + +// Group 1 PIE Interrupt Service Routines: +/* Объявляет обработчик SEQ1INT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void SEQ1INT_ISR(void); // ADC Sequencer 1 ISR +/* Объявляет обработчик SEQ2INT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void SEQ2INT_ISR(void); // ADC Sequencer 2 ISR +/* Объявляет обработчик XINT1_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void XINT1_ISR(void); // External interrupt 1 +/* Объявляет обработчик XINT2_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void XINT2_ISR(void); // External interrupt 2 +/* Объявляет обработчик ADCINT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void ADCINT_ISR(void); // ADC +/* Объявляет обработчик TINT0_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void TINT0_ISR(void); // Timer 0 +/* Объявляет обработчик WAKEINT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void WAKEINT_ISR(void); // WD + +// Group 2 PIE Interrupt Service Routines: +/* Объявляет обработчик EPWM1_TZINT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void EPWM1_TZINT_ISR(void); // EPWM-1 +/* Объявляет обработчик EPWM2_TZINT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void EPWM2_TZINT_ISR(void); // EPWM-2 +/* Объявляет обработчик EPWM3_TZINT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void EPWM3_TZINT_ISR(void); // EPWM-3 +/* Объявляет обработчик EPWM4_TZINT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void EPWM4_TZINT_ISR(void); // EPWM-4 +/* Объявляет обработчик EPWM5_TZINT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void EPWM5_TZINT_ISR(void); // EPWM-5 +/* Объявляет обработчик EPWM6_TZINT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void EPWM6_TZINT_ISR(void); // EPWM-6 + +// Group 3 PIE Interrupt Service Routines: +/* Объявляет обработчик EPWM1_INT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void EPWM1_INT_ISR(void); // EPWM-1 +/* Объявляет обработчик EPWM2_INT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void EPWM2_INT_ISR(void); // EPWM-2 +/* Объявляет обработчик EPWM3_INT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void EPWM3_INT_ISR(void); // EPWM-3 +/* Объявляет обработчик EPWM4_INT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void EPWM4_INT_ISR(void); // EPWM-4 +/* Объявляет обработчик EPWM5_INT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void EPWM5_INT_ISR(void); // EPWM-5 +/* Объявляет обработчик EPWM6_INT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void EPWM6_INT_ISR(void); // EPWM-6 + +// Group 4 PIE Interrupt Service Routines: +/* Объявляет обработчик ECAP1_INT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void ECAP1_INT_ISR(void); // ECAP-1 +/* Объявляет обработчик ECAP2_INT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void ECAP2_INT_ISR(void); // ECAP-2 +/* Объявляет обработчик ECAP3_INT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void ECAP3_INT_ISR(void); // ECAP-3 +/* Объявляет обработчик ECAP4_INT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void ECAP4_INT_ISR(void); // ECAP-4 +/* Объявляет обработчик ECAP5_INT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void ECAP5_INT_ISR(void); // ECAP-5 +/* Объявляет обработчик ECAP6_INT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void ECAP6_INT_ISR(void); // ECAP-6 + +// Group 5 PIE Interrupt Service Routines: +/* Объявляет обработчик EQEP1_INT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void EQEP1_INT_ISR(void); // EQEP-1 +/* Объявляет обработчик EQEP2_INT_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void EQEP2_INT_ISR(void); // EQEP-2 + +// Group 6 PIE Interrupt Service Routines: +/* Объявляет обработчик SPIRXINTA_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void SPIRXINTA_ISR(void); // SPI-A +/* Объявляет обработчик SPITXINTA_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void SPITXINTA_ISR(void); // SPI-A +/* Объявляет обработчик MRINTA_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void MRINTA_ISR(void); // McBSP-A +/* Объявляет обработчик MXINTA_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void MXINTA_ISR(void); // McBSP-A +/* Объявляет обработчик MRINTB_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void MRINTB_ISR(void); // McBSP-B +/* Объявляет обработчик MXINTB_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void MXINTB_ISR(void); // McBSP-B + +// Group 7 PIE Interrupt Service Routines: +/* Объявляет обработчик DINTCH1_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void DINTCH1_ISR(void); // DMA-Channel 1 +/* Объявляет обработчик DINTCH2_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void DINTCH2_ISR(void); // DMA-Channel 2 +/* Объявляет обработчик DINTCH3_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void DINTCH3_ISR(void); // DMA-Channel 3 +/* Объявляет обработчик DINTCH4_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void DINTCH4_ISR(void); // DMA-Channel 4 +/* Объявляет обработчик DINTCH5_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void DINTCH5_ISR(void); // DMA-Channel 5 +/* Объявляет обработчик DINTCH6_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void DINTCH6_ISR(void); // DMA-Channel 6 + +// Group 8 PIE Interrupt Service Routines: +/* Объявляет обработчик I2CINT1A_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void I2CINT1A_ISR(void); // I2C-A +/* Объявляет обработчик I2CINT2A_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void I2CINT2A_ISR(void); // I2C-A +/* Объявляет обработчик SCIRXINTC_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void SCIRXINTC_ISR(void); // SCI-C +/* Объявляет обработчик SCITXINTC_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void SCITXINTC_ISR(void); // SCI-C + +// Group 9 PIE Interrupt Service Routines: +/* Объявляет обработчик SCIRXINTA_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void SCIRXINTA_ISR(void); // SCI-A +/* Объявляет обработчик SCITXINTA_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void SCITXINTA_ISR(void); // SCI-A +/* Объявляет обработчик SCIRXINTB_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void SCIRXINTB_ISR(void); // SCI-B +/* Объявляет обработчик SCITXINTB_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void SCITXINTB_ISR(void); // SCI-B +/* Объявляет обработчик ECAN0INTA_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void ECAN0INTA_ISR(void); // eCAN-A +/* Объявляет обработчик ECAN1INTA_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void ECAN1INTA_ISR(void); // eCAN-A +/* Объявляет обработчик ECAN0INTB_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void ECAN0INTB_ISR(void); // eCAN-B +/* Объявляет обработчик ECAN1INTB_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void ECAN1INTB_ISR(void); // eCAN-B + +// Group 10 PIE Interrupt Service Routines: + +// Group 11 PIE Interrupt Service Routines: + +// Group 12 PIE Interrupt Service Routines: +/* Объявляет обработчик XINT3_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void XINT3_ISR(void); // External interrupt 3 +/* Объявляет обработчик XINT4_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void XINT4_ISR(void); // External interrupt 4 +/* Объявляет обработчик XINT5_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void XINT5_ISR(void); // External interrupt 5 +/* Объявляет обработчик XINT6_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void XINT6_ISR(void); // External interrupt 6 +/* Объявляет обработчик XINT7_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void XINT7_ISR(void); // External interrupt 7 +/* Объявляет обработчик LVF_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void LVF_ISR(void); // Latched overflow flag +/* Объявляет обработчик LUF_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void LUF_ISR(void); // Latched underflow flag + +// Catch-all for Reserved Locations For testing purposes: +/* Объявляет интерфейс функции PIE_RESERVED; реализация вызывается через этот прототип. */ +interrupt void PIE_RESERVED(void); // Reserved for test +/* Объявляет обработчик rsvd_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void rsvd_ISR(void); // for test +/* Объявляет обработчик INT_NOTUSED_ISR; обслуживает источник прерывания и его аппаратные флаги. */ +interrupt void INT_NOTUSED_ISR(void); // for unused interrupts + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_DEFAULT_ISR_H definition + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/common/include/DSP2833x_Dma_defines.h b/c/protocan-boot/vendor/ti/f28335/common/include/DSP2833x_Dma_defines.h new file mode 100644 index 0000000..a327969 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/common/include/DSP2833x_Dma_defines.h @@ -0,0 +1,125 @@ +/* Поставляемое TI описание Dma_defines для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/2 $ +// Checkin $Date: August 14, 2007 16:32:29 $ +//########################################################################### +// +// FILE: DSP2833x_Dma_defines.h +// +// TITLE: #defines used in DMA examples +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_DMA_DEFINES_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_DMA_DEFINES_H +/* Определяет защитный символ или переключатель DSP2833x_DMA_DEFINES_H для последующей компиляции. */ +#define DSP2833x_DMA_DEFINES_H + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +// MODE +//========================== +// PERINTSEL bits +/* Задаёт DMA_SEQ1INT = 1; DMA 1 INT. */ +#define DMA_SEQ1INT 1 +/* Задаёт DMA_SEQ2INT = 2; DMA 2 INT. */ +#define DMA_SEQ2INT 2 +/* Задаёт DMA_XINT1 = 3; DMA 1. */ +#define DMA_XINT1 3 +/* Задаёт DMA_XINT2 = 4; DMA 2. */ +#define DMA_XINT2 4 +/* Задаёт DMA_XINT3 = 5; DMA 3. */ +#define DMA_XINT3 5 +/* Задаёт DMA_XINT4 = 6; DMA 4. */ +#define DMA_XINT4 6 +/* Задаёт DMA_XINT5 = 7; DMA 5. */ +#define DMA_XINT5 7 +/* Задаёт DMA_XINT6 = 8; DMA 6. */ +#define DMA_XINT6 8 +/* Задаёт DMA_XINT7 = 9; DMA 7. */ +#define DMA_XINT7 9 +/* Задаёт DMA_XINT13 = 10; DMA 13. */ +#define DMA_XINT13 10 +/* Задаёт DMA_TINT0 = 11; DMA 0. */ +#define DMA_TINT0 11 +/* Задаёт DMA_TINT1 = 12; DMA 1. */ +#define DMA_TINT1 12 +/* Задаёт DMA_TINT2 = 13; DMA 2. */ +#define DMA_TINT2 13 +/* Задаёт DMA_MXEVTA = 14; DMA MXEVTA. */ +#define DMA_MXEVTA 14 +/* Задаёт DMA_MREVTA = 15; DMA MREVTA. */ +#define DMA_MREVTA 15 +/* Задаёт DMA_MXREVTB = 16; DMA MXREVTB. */ +#define DMA_MXREVTB 16 +/* Задаёт DMA_MREVTB = 17; DMA MREVTB. */ +#define DMA_MREVTB 17 +// OVERINTE bit +/* Задаёт OVRFLOW_DISABLE = 0x0; OVRFLOW запрет. */ +#define OVRFLOW_DISABLE 0x0 +/* Задаёт OVEFLOW_ENABLE = 0x1; OVEFLOW разрешение. */ +#define OVEFLOW_ENABLE 0x1 +// PERINTE bit +/* Задаёт PERINT_DISABLE = 0x0; PERINT запрет. */ +#define PERINT_DISABLE 0x0 +/* Задаёт PERINT_ENABLE = 0x1; PERINT разрешение. */ +#define PERINT_ENABLE 0x1 +// CHINTMODE bits +/* Задаёт CHINT_BEGIN = 0x0; данные CHINT_BEGIN. */ +#define CHINT_BEGIN 0x0 +/* Задаёт CHINT_END = 0x1; данные CHINT_END. */ +#define CHINT_END 0x1 +// ONESHOT bits +/* Задаёт ONESHOT_DISABLE = 0x0; ONESHOT запрет. */ +#define ONESHOT_DISABLE 0x0 +/* Задаёт ONESHOT_ENABLE = 0x1; ONESHOT разрешение. */ +#define ONESHOT_ENABLE 0x1 +// CONTINOUS bit +/* Задаёт CONT_DISABLE = 0x0; CONT запрет. */ +#define CONT_DISABLE 0x0 +/* Задаёт CONT_ENABLE = 0x1; CONT разрешение. */ +#define CONT_ENABLE 0x1 +// SYNCE bit +/* Задаёт SYNC_DISABLE = 0x0; синхронизация запрет. */ +#define SYNC_DISABLE 0x0 +/* Задаёт SYNC_ENABLE = 0x1; синхронизация разрешение. */ +#define SYNC_ENABLE 0x1 +// SYNCSEL bit +/* Задаёт SYNC_SRC = 0x0; синхронизация SRC. */ +#define SYNC_SRC 0x0 +/* Задаёт SYNC_DST = 0x1; синхронизация DST. */ +#define SYNC_DST 0x1 +// DATASIZE bit +/* Задаёт SIXTEEN_BIT = 0x0; SIXTEEN бит. */ +#define SIXTEEN_BIT 0x0 +/* Задаёт THIRTYTWO_BIT = 0x1; THIRTYTWO бит. */ +#define THIRTYTWO_BIT 0x1 +// CHINTE bit +/* Задаёт CHINT_DISABLE = 0x0; CHINT запрет. */ +#define CHINT_DISABLE 0x0 +/* Задаёт CHINT_ENABLE = 0x1; CHINT разрешение. */ +#define CHINT_ENABLE 0x1 + + + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // - end of DSP2833x_EPWM_DEFINES_H + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/common/include/DSP2833x_EPwm_defines.h b/c/protocan-boot/vendor/ti/f28335/common/include/DSP2833x_EPwm_defines.h new file mode 100644 index 0000000..0084f16 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/common/include/DSP2833x_EPwm_defines.h @@ -0,0 +1,253 @@ +/* Поставляемое TI описание EPwm_defines для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/1 $ +// Checkin $Date: August 18, 2006 13:45:39 $ +//########################################################################### +// +// FILE: DSP2833x_EPwm_defines.h +// +// TITLE: #defines used in ePWM examples examples +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_EPWM_DEFINES_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_EPWM_DEFINES_H +/* Определяет защитный символ или переключатель DSP2833x_EPWM_DEFINES_H для последующей компиляции. */ +#define DSP2833x_EPWM_DEFINES_H + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +// TBCTL (Time-Base Control) +//========================== +// CTRMODE bits +/* Задаёт TB_COUNT_UP = 0x0; TB число UP. */ +#define TB_COUNT_UP 0x0 +/* Задаёт TB_COUNT_DOWN = 0x1; TB число DOWN. */ +#define TB_COUNT_DOWN 0x1 +/* Задаёт TB_COUNT_UPDOWN = 0x2; TB число UPDOWN. */ +#define TB_COUNT_UPDOWN 0x2 +/* Задаёт TB_FREEZE = 0x3; данные TB_FREEZE. */ +#define TB_FREEZE 0x3 +// PHSEN bit +/* Задаёт TB_DISABLE = 0x0; TB запрет. */ +#define TB_DISABLE 0x0 +/* Задаёт TB_ENABLE = 0x1; TB разрешение. */ +#define TB_ENABLE 0x1 +// PRDLD bit +/* Задаёт TB_SHADOW = 0x0; данные TB_SHADOW. */ +#define TB_SHADOW 0x0 +/* Задаёт TB_IMMEDIATE = 0x1; данные TB_IMMEDIATE. */ +#define TB_IMMEDIATE 0x1 +// SYNCOSEL bits +/* Задаёт TB_SYNC_IN = 0x0; TB синхронизация IN. */ +#define TB_SYNC_IN 0x0 +/* Задаёт TB_CTR_ZERO = 0x1; данные TB_CTR_ZERO. */ +#define TB_CTR_ZERO 0x1 +/* Задаёт TB_CTR_CMPB = 0x2; данные TB_CTR_CMPB. */ +#define TB_CTR_CMPB 0x2 +/* Задаёт TB_SYNC_DISABLE = 0x3; TB синхронизация запрет. */ +#define TB_SYNC_DISABLE 0x3 +// HSPCLKDIV and CLKDIV bits +/* Задаёт TB_DIV1 = 0x0; данные TB_DIV1. */ +#define TB_DIV1 0x0 +/* Задаёт TB_DIV2 = 0x1; данные TB_DIV2. */ +#define TB_DIV2 0x1 +/* Задаёт TB_DIV4 = 0x2; данные TB_DIV4. */ +#define TB_DIV4 0x2 +// PHSDIR bit +/* Задаёт TB_DOWN = 0x0; данные TB_DOWN. */ +#define TB_DOWN 0x0 +/* Задаёт TB_UP = 0x1; данные TB_UP. */ +#define TB_UP 0x1 + +// CMPCTL (Compare Control) +//========================== +// LOADAMODE and LOADBMODE bits +/* Задаёт CC_CTR_ZERO = 0x0; данные CC_CTR_ZERO. */ +#define CC_CTR_ZERO 0x0 +/* Задаёт CC_CTR_PRD = 0x1; данные CC_CTR_PRD. */ +#define CC_CTR_PRD 0x1 +/* Задаёт CC_CTR_ZERO_PRD = 0x2; данные CC_CTR_ZERO_PRD. */ +#define CC_CTR_ZERO_PRD 0x2 +/* Задаёт CC_LD_DISABLE = 0x3; CC LD запрет. */ +#define CC_LD_DISABLE 0x3 +// SHDWAMODE and SHDWBMODE bits +/* Задаёт CC_SHADOW = 0x0; данные CC_SHADOW. */ +#define CC_SHADOW 0x0 +/* Задаёт CC_IMMEDIATE = 0x1; данные CC_IMMEDIATE. */ +#define CC_IMMEDIATE 0x1 + +// AQCTLA and AQCTLB (Action Qualifier Control) +//============================================= +// ZRO, PRD, CAU, CAD, CBU, CBD bits +/* Задаёт AQ_NO_ACTION = 0x0; данные AQ_NO_ACTION. */ +#define AQ_NO_ACTION 0x0 +/* Задаёт AQ_CLEAR = 0x1; AQ очистка. */ +#define AQ_CLEAR 0x1 +/* Задаёт AQ_SET = 0x2; AQ установка. */ +#define AQ_SET 0x2 +/* Задаёт AQ_TOGGLE = 0x3; данные AQ_TOGGLE. */ +#define AQ_TOGGLE 0x3 + +// DBCTL (Dead-Band Control) +//========================== +// OUT MODE bits +/* Задаёт DB_DISABLE = 0x0; DB запрет. */ +#define DB_DISABLE 0x0 +/* Задаёт DBA_ENABLE = 0x1; DBA разрешение. */ +#define DBA_ENABLE 0x1 +/* Задаёт DBB_ENABLE = 0x2; DBB разрешение. */ +#define DBB_ENABLE 0x2 +/* Задаёт DB_FULL_ENABLE = 0x3; DB FULL разрешение. */ +#define DB_FULL_ENABLE 0x3 +// POLSEL bits +/* Задаёт DB_ACTV_HI = 0x0; данные DB_ACTV_HI. */ +#define DB_ACTV_HI 0x0 +/* Задаёт DB_ACTV_LOC = 0x1; данные DB_ACTV_LOC. */ +#define DB_ACTV_LOC 0x1 +/* Задаёт DB_ACTV_HIC = 0x2; данные DB_ACTV_HIC. */ +#define DB_ACTV_HIC 0x2 +/* Задаёт DB_ACTV_LO = 0x3; данные DB_ACTV_LO. */ +#define DB_ACTV_LO 0x3 +// IN MODE +/* Задаёт DBA_ALL = 0x0; данные DBA_ALL. */ +#define DBA_ALL 0x0 +/* Задаёт DBB_RED_DBA_FED = 0x1; данные DBB_RED_DBA_FED. */ +#define DBB_RED_DBA_FED 0x1 +/* Задаёт DBA_RED_DBB_FED = 0x2; данные DBA_RED_DBB_FED. */ +#define DBA_RED_DBB_FED 0x2 +/* Задаёт DBB_ALL = 0x3; данные DBB_ALL. */ +#define DBB_ALL 0x3 + +// CHPCTL (chopper control) +//========================== +// CHPEN bit +/* Задаёт CHP_DISABLE = 0x0; CHP запрет. */ +#define CHP_DISABLE 0x0 +/* Задаёт CHP_ENABLE = 0x1; CHP разрешение. */ +#define CHP_ENABLE 0x1 +// CHPFREQ bits +/* Задаёт CHP_DIV1 = 0x0; данные CHP_DIV1. */ +#define CHP_DIV1 0x0 +/* Задаёт CHP_DIV2 = 0x1; данные CHP_DIV2. */ +#define CHP_DIV2 0x1 +/* Задаёт CHP_DIV3 = 0x2; данные CHP_DIV3. */ +#define CHP_DIV3 0x2 +/* Задаёт CHP_DIV4 = 0x3; данные CHP_DIV4. */ +#define CHP_DIV4 0x3 +/* Задаёт CHP_DIV5 = 0x4; данные CHP_DIV5. */ +#define CHP_DIV5 0x4 +/* Задаёт CHP_DIV6 = 0x5; данные CHP_DIV6. */ +#define CHP_DIV6 0x5 +/* Задаёт CHP_DIV7 = 0x6; данные CHP_DIV7. */ +#define CHP_DIV7 0x6 +/* Задаёт CHP_DIV8 = 0x7; данные CHP_DIV8. */ +#define CHP_DIV8 0x7 +// CHPDUTY bits +/* Задаёт CHP1_8TH = 0x0; данные CHP1_8TH. */ +#define CHP1_8TH 0x0 +/* Задаёт CHP2_8TH = 0x1; данные CHP2_8TH. */ +#define CHP2_8TH 0x1 +/* Задаёт CHP3_8TH = 0x2; данные CHP3_8TH. */ +#define CHP3_8TH 0x2 +/* Задаёт CHP4_8TH = 0x3; данные CHP4_8TH. */ +#define CHP4_8TH 0x3 +/* Задаёт CHP5_8TH = 0x4; данные CHP5_8TH. */ +#define CHP5_8TH 0x4 +/* Задаёт CHP6_8TH = 0x5; данные CHP6_8TH. */ +#define CHP6_8TH 0x5 +/* Задаёт CHP7_8TH = 0x6; данные CHP7_8TH. */ +#define CHP7_8TH 0x6 + +// TZSEL (Trip Zone Select) +//========================== +// CBCn and OSHTn bits +/* Задаёт TZ_DISABLE = 0x0; TZ запрет. */ +#define TZ_DISABLE 0x0 +/* Задаёт TZ_ENABLE = 0x1; TZ разрешение. */ +#define TZ_ENABLE 0x1 + +// TZCTL (Trip Zone Control) +//========================== +// TZA and TZB bits +/* Задаёт TZ_HIZ = 0x0; данные TZ_HIZ. */ +#define TZ_HIZ 0x0 +/* Задаёт TZ_FORCE_HI = 0x1; TZ принудительная установка HI. */ +#define TZ_FORCE_HI 0x1 +/* Задаёт TZ_FORCE_LO = 0x2; TZ принудительная установка LO. */ +#define TZ_FORCE_LO 0x2 +/* Задаёт TZ_NO_CHANGE = 0x3; данные TZ_NO_CHANGE. */ +#define TZ_NO_CHANGE 0x3 + +// ETSEL (Event Trigger Select) +//============================= +/* Задаёт ET_CTR_ZERO = 0x1; данные ET_CTR_ZERO. */ +#define ET_CTR_ZERO 0x1 +/* Задаёт ET_CTR_PRD = 0x2; данные ET_CTR_PRD. */ +#define ET_CTR_PRD 0x2 +/* Задаёт ET_CTRU_CMPA = 0x4; данные ET_CTRU_CMPA. */ +#define ET_CTRU_CMPA 0x4 +/* Задаёт ET_CTRD_CMPA = 0x5; данные ET_CTRD_CMPA. */ +#define ET_CTRD_CMPA 0x5 +/* Задаёт ET_CTRU_CMPB = 0x6; данные ET_CTRU_CMPB. */ +#define ET_CTRU_CMPB 0x6 +/* Задаёт ET_CTRD_CMPB = 0x7; данные ET_CTRD_CMPB. */ +#define ET_CTRD_CMPB 0x7 + +// ETPS (Event Trigger Pre-scale) +//=============================== +// INTPRD, SOCAPRD, SOCBPRD bits +/* Задаёт ET_DISABLE = 0x0; ET запрет. */ +#define ET_DISABLE 0x0 +/* Задаёт ET_1ST = 0x1; данные ET_1ST. */ +#define ET_1ST 0x1 +/* Задаёт ET_2ND = 0x2; данные ET_2ND. */ +#define ET_2ND 0x2 +/* Задаёт ET_3RD = 0x3; данные ET_3RD. */ +#define ET_3RD 0x3 + + +//-------------------------------- +// HRPWM (High Resolution PWM) +//================================ +// HRCNFG +/* Задаёт HR_Disable = 0x0; HR запрет. */ +#define HR_Disable 0x0 +/* Задаёт HR_REP = 0x1; данные HR_REP. */ +#define HR_REP 0x1 +/* Задаёт HR_FEP = 0x2; данные HR_FEP. */ +#define HR_FEP 0x2 +/* Задаёт HR_BEP = 0x3; данные HR_BEP. */ +#define HR_BEP 0x3 + +/* Задаёт HR_CMP = 0x0; данные HR_CMP. */ +#define HR_CMP 0x0 +/* Задаёт HR_PHS = 0x1; данные HR_PHS. */ +#define HR_PHS 0x1 + +/* Задаёт HR_CTR_ZERO = 0x0; данные HR_CTR_ZERO. */ +#define HR_CTR_ZERO 0x0 +/* Задаёт HR_CTR_PRD = 0x1; данные HR_CTR_PRD. */ +#define HR_CTR_PRD 0x1 + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // - end of DSP2833x_EPWM_DEFINES_H + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/common/include/DSP2833x_Examples.h b/c/protocan-boot/vendor/ti/f28335/common/include/DSP2833x_Examples.h new file mode 100644 index 0000000..eaa6500 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/common/include/DSP2833x_Examples.h @@ -0,0 +1,176 @@ +/* Поставляемое TI описание Examples для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/9 $ +// Checkin $Date: July 2, 2008 14:31:12 $ +//########################################################################### +// +// FILE: DSP2833x_Examples.h +// +// TITLE: DSP2833x Device Definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_EXAMPLES_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_EXAMPLES_H +/* Определяет защитный символ или переключатель DSP2833x_EXAMPLES_H для последующей компиляции. */ +#define DSP2833x_EXAMPLES_H + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + + +/*----------------------------------------------------------------------------- + Specify the PLL control register (PLLCR) and divide select (DIVSEL) value. +-----------------------------------------------------------------------------*/ +//#define DSP28_DIVSEL 0 // Enable /4 for SYSCLKOUT +//#define DSP28_DIVSEL 1 // Enable /4 for SYSCKOUT +/* Задаёт DSP28_DIVSEL = 2; данные DSP28_DIVSEL. */ +#define DSP28_DIVSEL 2 // Enable /2 for SYSCLKOUT +//#define DSP28_DIVSEL 3 // Enable /1 for SYSCLKOUT + +/* Задаёт DSP28_PLLCR = CLKMULT*2; данные DSP28_PLLCR. */ +#define DSP28_PLLCR CLKMULT*2 + +//#define DSP28_PLLCR 10 +//#define DSP28_PLLCR 9 +//#define DSP28_PLLCR 8 +//#define DSP28_PLLCR 7 +//#define DSP28_PLLCR 6 +//#define DSP28_PLLCR 5 +//#define DSP28_PLLCR 4 +//#define DSP28_PLLCR 3 +//#define DSP28_PLLCR 2 +//#define DSP28_PLLCR 1 +//#define DSP28_PLLCR 0 // PLL is bypassed in this mode +//---------------------------------------------------------------------------- + + +/*----------------------------------------------------------------------------- + Specify the clock rate of the CPU (SYSCLKOUT) in nS. + + Take into account the input clock frequency and the PLL multiplier + selected in step 1. + + Use one of the values provided, or define your own. + The trailing L is required tells the compiler to treat + the number as a 64-bit value. + + Only one statement should be uncommented. + + Example 1:150 MHz devices: + CLKIN is a 30MHz crystal. + + In step 1 the user specified PLLCR = 0xA for a + 150Mhz CPU clock (SYSCLKOUT = 150MHz). + + In this case, the CPU_RATE will be 6.667L + Uncomment the line: #define CPU_RATE 6.667L + + Example 2: 100 MHz devices: + CLKIN is a 20MHz crystal. + + In step 1 the user specified PLLCR = 0xA for a + 100Mhz CPU clock (SYSCLKOUT = 100MHz). + + In this case, the CPU_RATE will be 10.000L + Uncomment the line: #define CPU_RATE 10.000L +-----------------------------------------------------------------------------*/ +/* Задаёт CPU_RATE = 6.667L; данные CPU_RATE. */ +#define CPU_RATE 6.667L // for a 150MHz CPU clock speed (SYSCLKOUT) +//#define CPU_RATE 7.143L // for a 140MHz CPU clock speed (SYSCLKOUT) +//#define CPU_RATE 8.333L // for a 120MHz CPU clock speed (SYSCLKOUT) +//#define CPU_RATE 10.000L // for a 100MHz CPU clock speed (SYSCLKOUT) +//#define CPU_RATE 13.330L // for a 75MHz CPU clock speed (SYSCLKOUT) +//#define CPU_RATE 20.000L // for a 50MHz CPU clock speed (SYSCLKOUT) +//#define CPU_RATE 33.333L // for a 30MHz CPU clock speed (SYSCLKOUT) +//#define CPU_RATE 41.667L // for a 24MHz CPU clock speed (SYSCLKOUT) +//#define CPU_RATE 50.000L // for a 20MHz CPU clock speed (SYSCLKOUT) +//#define CPU_RATE 66.667L // for a 15MHz CPU clock speed (SYSCLKOUT) +//#define CPU_RATE 100.000L // for a 10MHz CPU clock speed (SYSCLKOUT) + +//---------------------------------------------------------------------------- + +/*----------------------------------------------------------------------------- + Target device (in DSP2833x_Device.h) determines CPU frequency + (for examples) - either 150 MHz (for 28335 and 28334) or 100 MHz + (for 28332). User does not have to change anything here. +-----------------------------------------------------------------------------*/ +/* Условие компиляции DSP28_28332: выбранный блок включается в текущий вариант прошивки. */ +#if DSP28_28332 // DSP28_28332 device only + /* Задаёт CPU_FRQ_100MHZ = 1; данные CPU_FRQ_100MHZ. */ + #define CPU_FRQ_100MHZ 1 // 100 Mhz CPU Freq (20 MHz input freq) + /* Задаёт CPU_FRQ_150MHZ = 0; данные CPU_FRQ_150MHZ. */ + #define CPU_FRQ_150MHZ 0 +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else + /* Задаёт CPU_FRQ_100MHZ = 0; данные CPU_FRQ_100MHZ. */ + #define CPU_FRQ_100MHZ 0 // DSP28_28335||DSP28_28334 + /* Задаёт CPU_FRQ_150MHZ = 1; данные CPU_FRQ_150MHZ. */ + #define CPU_FRQ_150MHZ 1 // 150 MHz CPU Freq (30 MHz input freq) by DEFAULT +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + + +//--------------------------------------------------------------------------- +// Include Example Header Files: +// + +/* Подключает "DSP2833x_GlobalPrototypes.h": поставляемое TI описание GlobalPrototypes для семейства C2833x. */ +#include "DSP2833x_GlobalPrototypes.h" // Prototypes for global functions within the + // .c files. + +/* Подключает "DSP2833x_ePwm_defines.h": поставляемое TI описание ePwm_defines для семейства C2833x. */ +#include "DSP2833x_ePwm_defines.h" // Macros used for PWM examples. +/* Подключает "DSP2833x_Dma_defines.h": поставляемое TI описание Dma_defines для семейства C2833x. */ +#include "DSP2833x_Dma_defines.h" // Macros used for DMA examples. +/* Подключает "DSP2833x_I2C_defines.h": поставляемое TI описание I2C_defines для семейства C2833x. */ +#include "DSP2833x_I2C_defines.h" // Macros used for I2C examples. + +/* Задаёт PARTNO_28335 = 0xEF; данные PARTNO_28335. */ +#define PARTNO_28335 0xEF +/* Задаёт PARTNO_28334 = 0xEE; данные PARTNO_28334. */ +#define PARTNO_28334 0xEE +/* Задаёт PARTNO_28332 = 0xED; данные PARTNO_28332. */ +#define PARTNO_28332 0xED +/* Задаёт PARTNO_28235 = 0xE8; данные PARTNO_28235. */ +#define PARTNO_28235 0xE8 +/* Задаёт PARTNO_28234 = 0xE7; данные PARTNO_28234. */ +#define PARTNO_28234 0xE7 +/* Задаёт PARTNO_28232 = 0xE6; данные PARTNO_28232. */ +#define PARTNO_28232 0xE6 + + +// Include files not used with DSP/BIOS +/* Начинает условие: DSP28_BIOS ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP28_BIOS +/* Подключает "DSP2833x_DefaultISR.h": поставляемое TI описание DefaultISR для семейства C2833x. */ +#include "DSP2833x_DefaultISR.h" +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + + +// DO NOT MODIFY THIS LINE. +/* Задаёт DELAY_US = DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_RATE) - 9.0L) / 5.0L); данные DELAY_US. */ +#define DELAY_US(A) DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_RATE) - 9.0L) / 5.0L) + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_EXAMPLES_H definition + + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/common/include/DSP2833x_GlobalPrototypes.h b/c/protocan-boot/vendor/ti/f28335/common/include/DSP2833x_GlobalPrototypes.h new file mode 100644 index 0000000..4cd293d --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/common/include/DSP2833x_GlobalPrototypes.h @@ -0,0 +1,363 @@ +/* Поставляемое TI описание GlobalPrototypes для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/11 $ +// Checkin $Date: May 12, 2008 14:30:08 $ +//########################################################################### +// +// FILE: DSP2833x_GlobalPrototypes.h +// +// TITLE: Global prototypes for DSP2833x Examples +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_GLOBALPROTOTYPES_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_GLOBALPROTOTYPES_H +/* Определяет защитный символ или переключатель DSP2833x_GLOBALPROTOTYPES_H для последующей компиляции. */ +#define DSP2833x_GLOBALPROTOTYPES_H + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/*---- shared global function prototypes -----------------------------------*/ +/* Объявляет интерфейс функции InitAdc; реализация вызывается через этот прототип. */ +extern void InitAdc(void); + +/* Объявляет интерфейс функции DMAInitialize; реализация вызывается через этот прототип. */ +extern void DMAInitialize(void); +// DMA Channel 1 +/* Объявляет интерфейс функции DMACH1AddrConfig; реализация вызывается через этот прототип. */ +extern void DMACH1AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source); +/* Объявляет интерфейс функции DMACH1BurstConfig; реализация вызывается через этот прототип. */ +extern void DMACH1BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep); +/* Объявляет интерфейс функции DMACH1TransferConfig; реализация вызывается через этот прототип. */ +extern void DMACH1TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep); +/* Объявляет интерфейс функции DMACH1WrapConfig; реализация вызывается через этот прототип. */ +extern void DMACH1WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep); +/* Объявляет интерфейс функции DMACH1ModeConfig; реализация вызывается через этот прототип. */ +extern void DMACH1ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte); +/* Объявляет интерфейс функции StartDMACH1; реализация вызывается через этот прототип. */ +extern void StartDMACH1(void); +// DMA Channel 2 +/* Объявляет интерфейс функции DMACH2AddrConfig; реализация вызывается через этот прототип. */ +extern void DMACH2AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source); +/* Объявляет интерфейс функции DMACH2BurstConfig; реализация вызывается через этот прототип. */ +extern void DMACH2BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep); +/* Объявляет интерфейс функции DMACH2TransferConfig; реализация вызывается через этот прототип. */ +extern void DMACH2TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep); +/* Объявляет интерфейс функции DMACH2WrapConfig; реализация вызывается через этот прототип. */ +extern void DMACH2WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep); +/* Объявляет интерфейс функции DMACH2ModeConfig; реализация вызывается через этот прототип. */ +extern void DMACH2ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte); +/* Объявляет интерфейс функции StartDMACH2; реализация вызывается через этот прототип. */ +extern void StartDMACH2(void); +// DMA Channel 3 +/* Объявляет интерфейс функции DMACH3AddrConfig; реализация вызывается через этот прототип. */ +extern void DMACH3AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source); +/* Объявляет интерфейс функции DMACH3BurstConfig; реализация вызывается через этот прототип. */ +extern void DMACH3BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep); +/* Объявляет интерфейс функции DMACH3TransferConfig; реализация вызывается через этот прототип. */ +extern void DMACH3TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep); +/* Объявляет интерфейс функции DMACH3WrapConfig; реализация вызывается через этот прототип. */ +extern void DMACH3WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep); +/* Объявляет интерфейс функции DMACH3ModeConfig; реализация вызывается через этот прототип. */ +extern void DMACH3ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte); +/* Объявляет интерфейс функции StartDMACH3; реализация вызывается через этот прототип. */ +extern void StartDMACH3(void); +// DMA Channel 4 +/* Объявляет интерфейс функции DMACH4AddrConfig; реализация вызывается через этот прототип. */ +extern void DMACH4AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source); +/* Объявляет интерфейс функции DMACH4BurstConfig; реализация вызывается через этот прототип. */ +extern void DMACH4BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep); +/* Объявляет интерфейс функции DMACH4TransferConfig; реализация вызывается через этот прототип. */ +extern void DMACH4TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep); +/* Объявляет интерфейс функции DMACH4WrapConfig; реализация вызывается через этот прототип. */ +extern void DMACH4WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep); +/* Объявляет интерфейс функции DMACH4ModeConfig; реализация вызывается через этот прототип. */ +extern void DMACH4ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte); +/* Объявляет интерфейс функции StartDMACH4; реализация вызывается через этот прототип. */ +extern void StartDMACH4(void); +// DMA Channel 5 +/* Объявляет интерфейс функции DMACH5AddrConfig; реализация вызывается через этот прототип. */ +extern void DMACH5AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source); +/* Объявляет интерфейс функции DMACH5BurstConfig; реализация вызывается через этот прототип. */ +extern void DMACH5BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep); +/* Объявляет интерфейс функции DMACH5TransferConfig; реализация вызывается через этот прототип. */ +extern void DMACH5TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep); +/* Объявляет интерфейс функции DMACH5WrapConfig; реализация вызывается через этот прототип. */ +extern void DMACH5WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep); +/* Объявляет интерфейс функции DMACH5ModeConfig; реализация вызывается через этот прототип. */ +extern void DMACH5ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte); +/* Объявляет интерфейс функции StartDMACH5; реализация вызывается через этот прототип. */ +extern void StartDMACH5(void); +// DMA Channel 6 +/* Объявляет интерфейс функции DMACH6AddrConfig; реализация вызывается через этот прототип. */ +extern void DMACH6AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source); +/* Объявляет интерфейс функции DMACH6BurstConfig; реализация вызывается через этот прототип. */ +extern void DMACH6BurstConfig(Uint16 bsize,Uint16 srcbstep, int16 desbstep); +/* Объявляет интерфейс функции DMACH6TransferConfig; реализация вызывается через этот прототип. */ +extern void DMACH6TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep); +/* Объявляет интерфейс функции DMACH6WrapConfig; реализация вызывается через этот прототип. */ +extern void DMACH6WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep); +/* Объявляет интерфейс функции DMACH6ModeConfig; реализация вызывается через этот прототип. */ +extern void DMACH6ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte); +/* Объявляет интерфейс функции StartDMACH6; реализация вызывается через этот прототип. */ +extern void StartDMACH6(void); + +/* Объявляет интерфейс функции InitPeripherals; реализация вызывается через этот прототип. */ +extern void InitPeripherals(void); +/* Условие компиляции DSP28_ECANA: выбранный блок включается в текущий вариант прошивки. */ +#if DSP28_ECANA +/* Объявляет интерфейс функции InitECan; реализация вызывается через этот прототип. */ +extern void InitECan(void); +/* Объявляет интерфейс функции InitECana; реализация вызывается через этот прототип. */ +extern void InitECana(void); +/* Объявляет интерфейс функции InitECanGpio; реализация вызывается через этот прототип. */ +extern void InitECanGpio(void); +/* Объявляет интерфейс функции InitECanaGpio; реализация вызывается через этот прототип. */ +extern void InitECanaGpio(void); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // endif DSP28_ECANA +/* Условие компиляции DSP28_ECANB: выбранный блок включается в текущий вариант прошивки. */ +#if DSP28_ECANB +/* Объявляет интерфейс функции InitECanb; реализация вызывается через этот прототип. */ +extern void InitECanb(void); +/* Объявляет интерфейс функции InitECanbGpio; реализация вызывается через этот прототип. */ +extern void InitECanbGpio(void); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // endif DSP28_ECANB +/* Объявляет интерфейс функции InitECap; реализация вызывается через этот прототип. */ +extern void InitECap(void); +/* Объявляет интерфейс функции InitECapGpio; реализация вызывается через этот прототип. */ +extern void InitECapGpio(void); +/* Объявляет интерфейс функции InitECap1Gpio; реализация вызывается через этот прототип. */ +extern void InitECap1Gpio(void); +/* Объявляет интерфейс функции InitECap2Gpio; реализация вызывается через этот прототип. */ +extern void InitECap2Gpio(void); +/* Условие компиляции DSP28_ECAP3: выбранный блок включается в текущий вариант прошивки. */ +#if DSP28_ECAP3 +/* Объявляет интерфейс функции InitECap3Gpio; реализация вызывается через этот прототип. */ +extern void InitECap3Gpio(void); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // endif DSP28_ECAP3 +/* Условие компиляции DSP28_ECAP4: выбранный блок включается в текущий вариант прошивки. */ +#if DSP28_ECAP4 +/* Объявляет интерфейс функции InitECap4Gpio; реализация вызывается через этот прототип. */ +extern void InitECap4Gpio(void); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // endif DSP28_ECAP4 +/* Условие компиляции DSP28_ECAP5: выбранный блок включается в текущий вариант прошивки. */ +#if DSP28_ECAP5 +/* Объявляет интерфейс функции InitECap5Gpio; реализация вызывается через этот прототип. */ +extern void InitECap5Gpio(void); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // endif DSP28_ECAP5 +/* Условие компиляции DSP28_ECAP6: выбранный блок включается в текущий вариант прошивки. */ +#if DSP28_ECAP6 +/* Объявляет интерфейс функции InitECap6Gpio; реализация вызывается через этот прототип. */ +extern void InitECap6Gpio(void); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // endif DSP28_ECAP6 +/* Объявляет интерфейс функции InitEPwm; реализация вызывается через этот прототип. */ +extern void InitEPwm(void); +/* Объявляет интерфейс функции InitEPwmGpio; реализация вызывается через этот прототип. */ +extern void InitEPwmGpio(void); +/* Объявляет интерфейс функции InitEPwm1Gpio; реализация вызывается через этот прототип. */ +extern void InitEPwm1Gpio(void); +/* Объявляет интерфейс функции InitEPwm2Gpio; реализация вызывается через этот прототип. */ +extern void InitEPwm2Gpio(void); +/* Объявляет интерфейс функции InitEPwm3Gpio; реализация вызывается через этот прототип. */ +extern void InitEPwm3Gpio(void); +/* Условие компиляции DSP28_EPWM4: выбранный блок включается в текущий вариант прошивки. */ +#if DSP28_EPWM4 +/* Объявляет интерфейс функции InitEPwm4Gpio; реализация вызывается через этот прототип. */ +extern void InitEPwm4Gpio(void); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // endif DSP28_EPWM4 +/* Условие компиляции DSP28_EPWM5: выбранный блок включается в текущий вариант прошивки. */ +#if DSP28_EPWM5 +/* Объявляет интерфейс функции InitEPwm5Gpio; реализация вызывается через этот прототип. */ +extern void InitEPwm5Gpio(void); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // endif DSP28_EPWM5 +/* Условие компиляции DSP28_EPWM6: выбранный блок включается в текущий вариант прошивки. */ +#if DSP28_EPWM6 +/* Объявляет интерфейс функции InitEPwm6Gpio; реализация вызывается через этот прототип. */ +extern void InitEPwm6Gpio(void); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // endif DSP28_EPWM6 +/* Условие компиляции DSP28_EQEP1: выбранный блок включается в текущий вариант прошивки. */ +#if DSP28_EQEP1 +/* Объявляет интерфейс функции InitEQep; реализация вызывается через этот прототип. */ +extern void InitEQep(void); +/* Объявляет интерфейс функции InitEQepGpio; реализация вызывается через этот прототип. */ +extern void InitEQepGpio(void); +/* Объявляет интерфейс функции InitEQep1Gpio; реализация вызывается через этот прототип. */ +extern void InitEQep1Gpio(void); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // if DSP28_EQEP1 +/* Условие компиляции DSP28_EQEP2: выбранный блок включается в текущий вариант прошивки. */ +#if DSP28_EQEP2 +/* Объявляет интерфейс функции InitEQep2Gpio; реализация вызывается через этот прототип. */ +extern void InitEQep2Gpio(void); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // endif DSP28_EQEP2 +/* Объявляет интерфейс функции InitGpio; реализация вызывается через этот прототип. */ +extern void InitGpio(void); +/* Объявляет интерфейс функции InitI2CGpio; реализация вызывается через этот прототип. */ +extern void InitI2CGpio(void); + +/* Объявляет интерфейс функции InitMcbsp; реализация вызывается через этот прототип. */ +extern void InitMcbsp(void); +/* Объявляет интерфейс функции InitMcbspa; реализация вызывается через этот прототип. */ +extern void InitMcbspa(void); +/* Объявляет интерфейс функции delay_loop; реализация вызывается через этот прототип. */ +extern void delay_loop(void); +/* Объявляет интерфейс функции InitMcbspaGpio; реализация вызывается через этот прототип. */ +extern void InitMcbspaGpio(void); +/* Объявляет интерфейс функции InitMcbspa8bit; реализация вызывается через этот прототип. */ +extern void InitMcbspa8bit(void); +/* Объявляет интерфейс функции InitMcbspa12bit; реализация вызывается через этот прототип. */ +extern void InitMcbspa12bit(void); +/* Объявляет интерфейс функции InitMcbspa16bit; реализация вызывается через этот прототип. */ +extern void InitMcbspa16bit(void); +/* Объявляет интерфейс функции InitMcbspa20bit; реализация вызывается через этот прототип. */ +extern void InitMcbspa20bit(void); +/* Объявляет интерфейс функции InitMcbspa24bit; реализация вызывается через этот прототип. */ +extern void InitMcbspa24bit(void); +/* Объявляет интерфейс функции InitMcbspa32bit; реализация вызывается через этот прототип. */ +extern void InitMcbspa32bit(void); +/* Условие компиляции DSP28_MCBSPB: выбранный блок включается в текущий вариант прошивки. */ +#if DSP28_MCBSPB +/* Объявляет интерфейс функции InitMcbspb; реализация вызывается через этот прототип. */ +extern void InitMcbspb(void); +/* Объявляет интерфейс функции InitMcbspbGpio; реализация вызывается через этот прототип. */ +extern void InitMcbspbGpio(void); +/* Объявляет интерфейс функции InitMcbspb8bit; реализация вызывается через этот прототип. */ +extern void InitMcbspb8bit(void); +/* Объявляет интерфейс функции InitMcbspb12bit; реализация вызывается через этот прототип. */ +extern void InitMcbspb12bit(void); +/* Объявляет интерфейс функции InitMcbspb16bit; реализация вызывается через этот прототип. */ +extern void InitMcbspb16bit(void); +/* Объявляет интерфейс функции InitMcbspb20bit; реализация вызывается через этот прототип. */ +extern void InitMcbspb20bit(void); +/* Объявляет интерфейс функции InitMcbspb24bit; реализация вызывается через этот прототип. */ +extern void InitMcbspb24bit(void); +/* Объявляет интерфейс функции InitMcbspb32bit; реализация вызывается через этот прототип. */ +extern void InitMcbspb32bit(void); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // endif DSP28_MCBSPB + +/* Объявляет интерфейс функции InitPieCtrl; реализация вызывается через этот прототип. */ +extern void InitPieCtrl(void); +/* Объявляет интерфейс функции InitPieVectTable; реализация вызывается через этот прототип. */ +extern void InitPieVectTable(void); + +/* Объявляет интерфейс функции InitSci; реализация вызывается через этот прототип. */ +extern void InitSci(void); +/* Объявляет интерфейс функции InitSciGpio; реализация вызывается через этот прототип. */ +extern void InitSciGpio(void); +/* Объявляет интерфейс функции InitSciaGpio; реализация вызывается через этот прототип. */ +extern void InitSciaGpio(void); +/* Условие компиляции DSP28_SCIB: выбранный блок включается в текущий вариант прошивки. */ +#if DSP28_SCIB +/* Объявляет интерфейс функции InitScibGpio; реализация вызывается через этот прототип. */ +extern void InitScibGpio(void); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // endif DSP28_SCIB +/* Условие компиляции DSP28_SCIC: выбранный блок включается в текущий вариант прошивки. */ +#if DSP28_SCIC +/* Объявляет интерфейс функции InitScicGpio; реализация вызывается через этот прототип. */ +extern void InitScicGpio(void); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Объявляет интерфейс функции InitSpi; реализация вызывается через этот прототип. */ +extern void InitSpi(void); +/* Объявляет интерфейс функции InitSpiGpio; реализация вызывается через этот прототип. */ +extern void InitSpiGpio(void); +/* Объявляет интерфейс функции InitSpiaGpio; реализация вызывается через этот прототип. */ +extern void InitSpiaGpio(void); +/* Объявляет интерфейс функции InitSysCtrl; реализация вызывается через этот прототип. */ +extern void InitSysCtrl(void); +/* Объявляет интерфейс функции InitTzGpio; реализация вызывается через этот прототип. */ +extern void InitTzGpio(void); +/* Объявляет интерфейс функции InitXIntrupt; реализация вызывается через этот прототип. */ +extern void InitXIntrupt(void); +/* Объявляет интерфейс функции XintfInit; реализация вызывается через этот прототип. */ +extern void XintfInit(void); +/* Объявляет интерфейс функции InitXintf16Gpio; реализация вызывается через этот прототип. */ +extern void InitXintf16Gpio(); +/* Объявляет интерфейс функции InitXintf32Gpio; реализация вызывается через этот прототип. */ +extern void InitXintf32Gpio(); +/* Объявляет интерфейс функции InitPll; реализация вызывается через этот прототип. */ +extern void InitPll(Uint16 pllcr, Uint16 clkindiv); +/* Объявляет интерфейс функции InitPeripheralClocks; реализация вызывается через этот прототип. */ +extern void InitPeripheralClocks(void); +/* Объявляет интерфейс функции EnableInterrupts; реализация вызывается через этот прототип. */ +extern void EnableInterrupts(void); +/* Объявляет интерфейс функции DSP28x_usDelay; реализация вызывается через этот прототип. */ +extern void DSP28x_usDelay(Uint32 Count); +/* Объявляет интерфейс функции ADC_cal; реализация вызывается через этот прототип. */ +extern void ADC_cal (void); +/* Задаёт KickDog = ServiceDog; данные KickDog. */ +#define KickDog ServiceDog // For compatiblity with previous versions +/* Объявляет интерфейс функции ServiceDog; реализация вызывается через этот прототип. */ +extern void ServiceDog(void); +/* Объявляет интерфейс функции DisableDog; реализация вызывается через этот прототип. */ +extern void DisableDog(void); +/* Объявляет интерфейс функции CsmUnlock; реализация вызывается через этот прототип. */ +extern Uint16 CsmUnlock(void); + +// DSP28_DBGIER.asm +/* Объявляет интерфейс функции SetDBGIER; реализация вызывается через этот прототип. */ +extern void SetDBGIER(Uint16 dbgier); + +// CAUTION +// This function MUST be executed out of RAM. Executing it +// out of OTP/Flash will yield unpredictable results +/* Объявляет интерфейс функции InitFlash; реализация вызывается через этот прототип. */ +extern void InitFlash(void); + + +/* Объявляет интерфейс функции MemCopy; реализация вызывается через этот прототип. */ +void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr); + + +//--------------------------------------------------------------------------- +// External symbols created by the linker cmd file +// DSP28 examples will use these to relocate code from one LOAD location +// in either Flash or XINTF to a different RUN location in internal +// RAM +/* Объявляет RamfuncsLoadStart — данные RamfuncsLoadStart. Память определена в другом модуле. */ +extern Uint16 RamfuncsLoadStart; +/* Объявляет RamfuncsLoadEnd — данные RamfuncsLoadEnd. Память определена в другом модуле. */ +extern Uint16 RamfuncsLoadEnd; +/* Объявляет RamfuncsRunStart — данные RamfuncsRunStart. Память определена в другом модуле. */ +extern Uint16 RamfuncsRunStart; + +/* Объявляет XintffuncsLoadStart — данные XintffuncsLoadStart. Память определена в другом модуле. */ +extern Uint16 XintffuncsLoadStart; +/* Объявляет XintffuncsLoadEnd — данные XintffuncsLoadEnd. Память определена в другом модуле. */ +extern Uint16 XintffuncsLoadEnd; +/* Объявляет XintffuncsRunStart — данные XintffuncsRunStart. Память определена в другом модуле. */ +extern Uint16 XintffuncsRunStart; + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // - end of DSP2833x_GLOBALPROTOTYPES_H + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/common/include/DSP2833x_I2c_defines.h b/c/protocan-boot/vendor/ti/f28335/common/include/DSP2833x_I2c_defines.h new file mode 100644 index 0000000..6dfd58d --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/common/include/DSP2833x_I2c_defines.h @@ -0,0 +1,176 @@ +/* Поставляемое TI описание I2c_defines для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/2 $ +// Checkin $Date: April 16, 2008 17:16:47 $ +//########################################################################### +// +// FILE: DSP2833x_I2cExample.h +// +// TITLE: 2833x I2C Example Code Definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_I2C_DEFINES_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_I2C_DEFINES_H +/* Определяет защитный символ или переключатель DSP2833x_I2C_DEFINES_H для последующей компиляции. */ +#define DSP2833x_I2C_DEFINES_H + +//-------------------------------------------- +// Defines +//-------------------------------------------- + +// Error Messages +/* Задаёт I2C_ERROR = 0xFFFF; 2 C ошибка. */ +#define I2C_ERROR 0xFFFF +/* Задаёт I2C_ARB_LOST_ERROR = 0x0001; 2 C ARB LOST ошибка. */ +#define I2C_ARB_LOST_ERROR 0x0001 +/* Задаёт I2C_NACK_ERROR = 0x0002; 2 C NACK ошибка. */ +#define I2C_NACK_ERROR 0x0002 +/* Задаёт I2C_BUS_BUSY_ERROR = 0x1000; 2 C BUS BUSY ошибка. */ +#define I2C_BUS_BUSY_ERROR 0x1000 +/* Задаёт I2C_STP_NOT_READY_ERROR = 0x5555; 2 C STP NOT READY ошибка. */ +#define I2C_STP_NOT_READY_ERROR 0x5555 +/* Задаёт I2C_NO_FLAGS = 0xAAAA; 2 C NO флаги. */ +#define I2C_NO_FLAGS 0xAAAA +/* Задаёт I2C_SUCCESS = 0x0000; данные I2C_SUCCESS. */ +#define I2C_SUCCESS 0x0000 + +// Clear Status Flags +/* Задаёт I2C_CLR_AL_BIT = 0x0001; 2 C CLR AL бит. */ +#define I2C_CLR_AL_BIT 0x0001 +/* Задаёт I2C_CLR_NACK_BIT = 0x0002; 2 C CLR NACK бит. */ +#define I2C_CLR_NACK_BIT 0x0002 +/* Задаёт I2C_CLR_ARDY_BIT = 0x0004; 2 C CLR ARDY бит. */ +#define I2C_CLR_ARDY_BIT 0x0004 +/* Задаёт I2C_CLR_RRDY_BIT = 0x0008; 2 C CLR RRDY бит. */ +#define I2C_CLR_RRDY_BIT 0x0008 +/* Задаёт I2C_CLR_SCD_BIT = 0x0020; 2 C CLR SCD бит. */ +#define I2C_CLR_SCD_BIT 0x0020 + +// Interrupt Source Messages +/* Задаёт I2C_NO_ISRC = 0x0000; данные I2C_NO_ISRC. */ +#define I2C_NO_ISRC 0x0000 +/* Задаёт I2C_ARB_ISRC = 0x0001; данные I2C_ARB_ISRC. */ +#define I2C_ARB_ISRC 0x0001 +/* Задаёт I2C_NACK_ISRC = 0x0002; данные I2C_NACK_ISRC. */ +#define I2C_NACK_ISRC 0x0002 +/* Задаёт I2C_ARDY_ISRC = 0x0003; данные I2C_ARDY_ISRC. */ +#define I2C_ARDY_ISRC 0x0003 +/* Задаёт I2C_RX_ISRC = 0x0004; данные I2C_RX_ISRC. */ +#define I2C_RX_ISRC 0x0004 +/* Задаёт I2C_TX_ISRC = 0x0005; данные I2C_TX_ISRC. */ +#define I2C_TX_ISRC 0x0005 +/* Задаёт I2C_SCD_ISRC = 0x0006; данные I2C_SCD_ISRC. */ +#define I2C_SCD_ISRC 0x0006 +/* Задаёт I2C_AAS_ISRC = 0x0007; данные I2C_AAS_ISRC. */ +#define I2C_AAS_ISRC 0x0007 + +// I2CMSG structure defines +/* Задаёт I2C_NO_STOP = 0; данные I2C_NO_STOP. */ +#define I2C_NO_STOP 0 +/* Задаёт I2C_YES_STOP = 1; данные I2C_YES_STOP. */ +#define I2C_YES_STOP 1 +/* Задаёт I2C_RECEIVE = 0; 2 C приём. */ +#define I2C_RECEIVE 0 +/* Задаёт I2C_TRANSMIT = 1; 2 C передача. */ +#define I2C_TRANSMIT 1 +/* Задаёт I2C_MAX_BUFFER_SIZE = 16; 2 C MAX буфер размер. */ +#define I2C_MAX_BUFFER_SIZE 16 + +// I2C Slave State defines +/* Задаёт I2C_NOTSLAVE = 0; данные I2C_NOTSLAVE. */ +#define I2C_NOTSLAVE 0 +/* Задаёт I2C_ADDR_AS_SLAVE = 1; данные I2C_ADDR_AS_SLAVE. */ +#define I2C_ADDR_AS_SLAVE 1 +/* Задаёт I2C_ST_MSG_READY = 2; данные I2C_ST_MSG_READY. */ +#define I2C_ST_MSG_READY 2 + +// I2C Slave Receiver messages defines +/* Задаёт I2C_SND_MSG1 = 1; данные I2C_SND_MSG1. */ +#define I2C_SND_MSG1 1 +/* Задаёт I2C_SND_MSG2 = 2; данные I2C_SND_MSG2. */ +#define I2C_SND_MSG2 2 + +// I2C State defines +/* Задаёт I2C_IDLE = 0; данные I2C_IDLE. */ +#define I2C_IDLE 0 +/* Задаёт I2C_SLAVE_RECEIVER = 1; данные I2C_SLAVE_RECEIVER. */ +#define I2C_SLAVE_RECEIVER 1 +/* Задаёт I2C_SLAVE_TRANSMITTER = 2; данные I2C_SLAVE_TRANSMITTER. */ +#define I2C_SLAVE_TRANSMITTER 2 +/* Задаёт I2C_MASTER_RECEIVER = 3; данные I2C_MASTER_RECEIVER. */ +#define I2C_MASTER_RECEIVER 3 +/* Задаёт I2C_MASTER_TRANSMITTER = 4; данные I2C_MASTER_TRANSMITTER. */ +#define I2C_MASTER_TRANSMITTER 4 + +// I2C Message Commands for I2CMSG struct +/* Задаёт I2C_MSGSTAT_INACTIVE = 0x0000; данные I2C_MSGSTAT_INACTIVE. */ +#define I2C_MSGSTAT_INACTIVE 0x0000 +/* Задаёт I2C_MSGSTAT_SEND_WITHSTOP = 0x0010; данные I2C_MSGSTAT_SEND_WITHSTOP. */ +#define I2C_MSGSTAT_SEND_WITHSTOP 0x0010 +/* Задаёт I2C_MSGSTAT_WRITE_BUSY = 0x0011; 2 C MSGSTAT запись BUSY. */ +#define I2C_MSGSTAT_WRITE_BUSY 0x0011 +/* Задаёт I2C_MSGSTAT_SEND_NOSTOP = 0x0020; данные I2C_MSGSTAT_SEND_NOSTOP. */ +#define I2C_MSGSTAT_SEND_NOSTOP 0x0020 +/* Задаёт I2C_MSGSTAT_SEND_NOSTOP_BUSY = 0x0021; данные I2C_MSGSTAT_SEND_NOSTOP_BUSY. */ +#define I2C_MSGSTAT_SEND_NOSTOP_BUSY 0x0021 +/* Задаёт I2C_MSGSTAT_RESTART = 0x0022; данные I2C_MSGSTAT_RESTART. */ +#define I2C_MSGSTAT_RESTART 0x0022 +/* Задаёт I2C_MSGSTAT_READ_BUSY = 0x0023; 2 C MSGSTAT чтение BUSY. */ +#define I2C_MSGSTAT_READ_BUSY 0x0023 + +// Generic defines +/* Задаёт I2C_TRUE = 1; данные I2C_TRUE. */ +#define I2C_TRUE 1 +/* Задаёт I2C_FALSE = 0; данные I2C_FALSE. */ +#define I2C_FALSE 0 +/* Задаёт I2C_YES = 1; данные I2C_YES. */ +#define I2C_YES 1 +/* Задаёт I2C_NO = 0; данные I2C_NO. */ +#define I2C_NO 0 +/* Задаёт I2C_DUMMY_BYTE = 0; данные I2C_DUMMY_BYTE. */ +#define I2C_DUMMY_BYTE 0 + + +//-------------------------------------------- +// Structures +//-------------------------------------------- + +// I2C Message Structure +/* Описывает структуру I2CMSG; порядок полей определяет расположение данных. */ +struct I2CMSG { + /* Объявляет MsgStatus — Msg состояние. */ + Uint16 MsgStatus; // Word stating what state msg is in: + // I2C_MSGCMD_INACTIVE = do not send msg + // I2C_MSGCMD_BUSY = msg start has been sent, + // awaiting stop + // I2C_MSGCMD_SEND_WITHSTOP = command to send + // master trans msg complete with a stop bit + // I2C_MSGCMD_SEND_NOSTOP = command to send + // master trans msg without the stop bit + // I2C_MSGCMD_RESTART = command to send a restart + // as a master receiver with a stop bit + /* Объявляет SlaveAddress — Slave адрес. */ + Uint16 SlaveAddress; // I2C address of slave msg is intended for + /* Объявляет NumOfBytes — данные NumOfBytes. */ + Uint16 NumOfBytes; // Num of valid bytes in (or to be put in MsgBuffer) + /* Объявляет MemoryHighAddr — данные MemoryHighAddr. */ + Uint16 MemoryHighAddr; // EEPROM address of data associated with msg (high byte) + /* Объявляет MemoryLowAddr — данные MemoryLowAddr. */ + Uint16 MemoryLowAddr; // EEPROM address of data associated with msg (low byte) + /* Объявляет MsgBuffer — Msg буфер. */ + Uint16 MsgBuffer[I2C_MAX_BUFFER_SIZE]; // Array holding msg data - max that + // MAX_BUFFER_SIZE can be is 16 due to + // the FIFO's +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_I2C_DEFINES_H definition + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/common/include/DSP2833x_SWPrioritizedIsrLevels.h b/c/protocan-boot/vendor/ti/f28335/common/include/DSP2833x_SWPrioritizedIsrLevels.h new file mode 100644 index 0000000..67fb657 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/common/include/DSP2833x_SWPrioritizedIsrLevels.h @@ -0,0 +1,10803 @@ +/* Поставляемое TI описание SWPrioritizedIsrLevels для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/2 $ +// Checkin $Date: April 4, 2007 14:25:21 $ +//########################################################################### +// +// FILE: DSP2833x_SWPrioritizedIsrLevels.h +// +// TITLE: DSP28 Devices Software Prioritized Interrupt Service Routine +// Level definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_SW_PRIORITZIED_ISR_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_SW_PRIORITZIED_ISR_H +/* Определяет защитный символ или переключатель DSP2833x_SW_PRIORITZIED_ISR_H для последующей компиляции. */ +#define DSP2833x_SW_PRIORITZIED_ISR_H + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + + +//------------------------------------------------------------------------------- +// Interrupt Enable Register Allocation For 2833x Devices: +//------------------------------------------------------------------------------- +// Interrupts can be enabled/disabled using the CPU interrupt enable register +// (IER) and the PIE interrupt enable registers (PIEIER1 to PIEIER12). +//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------- +// Set "Global" Interrupt Priority Level (IER register): +//------------------------------------------------------------------------------- +// The user must set the appropriate priority level for each of the CPU +// interrupts. This is termed as the "global" priority. The priority level +// must be a number between 1 (highest) to 16 (lowest). A value of 0 must +// be entered for reserved interrupts or interrupts that are not used. This +// will also reduce code size by not including ISR's that are not used. +// +// Note: The priority levels below are used to calculate the IER register +// interrupt masks MINT1 to MINT16. +// +// +// Note: The priority levels shown here may not make sense in a +// real application. This is for demonstration purposes only!!! +// +// The user should change these to values that make sense for +// their application. +// +// 0 = not used +// 1 = highest priority +// ... +// 16 = lowest priority +/* Задаёт INT1PL = 2; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define INT1PL 2 // Group1 Interrupts (PIEIER1) +/* Задаёт INT2PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define INT2PL 0 // Group2 Interrupts (PIEIER2) +/* Задаёт INT3PL = 4; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define INT3PL 4 // Group3 Interrupts (PIEIER3) +/* Задаёт INT4PL = 2; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define INT4PL 2 // Group4 Interrupts (PIEIER4) +/* Задаёт INT5PL = 2; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define INT5PL 2 // Group5 Interrupts (PIEIER5) +/* Задаёт INT6PL = 3; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define INT6PL 3 // Group6 Interrupts (PIEIER6) +/* Задаёт INT7PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define INT7PL 0 // reserved +/* Задаёт INT8PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define INT8PL 0 // reserved +/* Задаёт INT9PL = 1; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define INT9PL 1 // Group9 Interrupts (PIEIER9) +/* Задаёт INT10PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define INT10PL 0 // reserved +/* Задаёт INT11PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define INT11PL 0 // reserved +/* Задаёт INT12PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define INT12PL 0 // reserved +/* Задаёт INT13PL = 4; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define INT13PL 4 // XINT13 +/* Задаёт INT14PL = 4; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define INT14PL 4 // INT14 (TINT2) +/* Задаёт INT15PL = 4; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define INT15PL 4 // DATALOG +/* Задаёт INT16PL = 4; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define INT16PL 4 // RTOSINT + +//------------------------------------------------------------------------------- +// Set "Group" Interrupt Priority Level (PIEIER1 to PIEIER12 registers): +//------------------------------------------------------------------------------- +// The user must set the appropriate priority level for each of the PIE +// interrupts. This is termed as the "group" priority. The priority level +// must be a number between 1 (highest) to 8 (lowest). A value of 0 must +// be entered for reserved interrupts or interrupts that are not used. This +// will also reduce code size by not including ISR's that are not used: +// +// Note: The priority levels below are used to calculate the following +// PIEIER register interrupt masks: +// MG11 to MG18 +// MG21 to MG28 +// MG31 to MG38 +// MG41 to MG48 +// MG51 to MG58 +// MG61 to MG68 +// MG71 to MG78 +// MG81 to MG88 +// MG91 to MG98 +// MG101 to MG108 +// MG111 to MG118 +// MG121 to MG128 +// +// Note: The priority levels shown here may not make sense in a +// real application. This is for demonstration purposes only!!! +// +// The user should change these to values that make sense for +// their application. +// +// 0 = not used +// 1 = highest priority +// ... +// 8 = lowest priority +// +/* Задаёт G11PL = 7; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G11PL 7 // SEQ1INT (ADC) +/* Задаёт G12PL = 6; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G12PL 6 // SEQ2INT (ADC) +/* Задаёт G13PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G13PL 0 // reserved +/* Задаёт G14PL = 1; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G14PL 1 // XINT1 (External) +/* Задаёт G15PL = 3; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G15PL 3 // XINT2 (External) +/* Задаёт G16PL = 2; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G16PL 2 // ADCINT (ADC) +/* Задаёт G17PL = 1; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G17PL 1 // TINT0 (CPU Timer 0) +/* Задаёт G18PL = 5; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G18PL 5 // WAKEINT (WD/LPM) + +/* Задаёт G21PL = 4; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G21PL 4 // EPWM1_TZINT (ePWM1 Trip) +/* Задаёт G22PL = 3; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G22PL 3 // EPWM2_TZINT (ePWM2 Trip) +/* Задаёт G23PL = 2; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G23PL 2 // EPWM3_TZINT (ePWM3 Trip) +/* Задаёт G24PL = 1; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G24PL 1 // EPWM4_TZINT (ePWM4 Trip) +/* Задаёт G25PL = 5; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G25PL 5 // EPWM5_TZINT (ePWM5 Trip) +/* Задаёт G26PL = 6; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G26PL 6 // EPWM6_TZINT (ePWM6 Trip) +/* Задаёт G27PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G27PL 0 // reserved +/* Задаёт G28PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G28PL 0 // reserved + +/* Задаёт G31PL = 4; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G31PL 4 // EPWM1_INT (ePWM1 Int) +/* Задаёт G32PL = 1; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G32PL 1 // EPWM2_INT (ePWM2 Int) +/* Задаёт G33PL = 1; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G33PL 1 // EPWM3_INT (ePWM3 Int) +/* Задаёт G34PL = 2; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G34PL 2 // EPWM4_INT (ePWM4 Int) +/* Задаёт G35PL = 2; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G35PL 2 // EPWM5_INT (ePWM5 Int) +/* Задаёт G36PL = 1; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G36PL 1 // EPWM6_INT (ePWM6 Int) +/* Задаёт G37PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G37PL 0 // reserved +/* Задаёт G38PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G38PL 0 // reserved + +/* Задаёт G41PL = 2; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G41PL 2 // ECAP1_INT (eCAP1 Int) +/* Задаёт G42PL = 1; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G42PL 1 // ECAP2_INT (eCAP2 Int) +/* Задаёт G43PL = 3; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G43PL 3 // ECAP3_INT (eCAP3 Int) +/* Задаёт G44PL = 3; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G44PL 3 // ECAP4_INT (eCAP4 Int) +/* Задаёт G45PL = 5; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G45PL 5 // ECAP5_INT (eCAP5 Int) +/* Задаёт G46PL = 5; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G46PL 5 // ECAP6_INT (eCAP6 Int) +/* Задаёт G47PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G47PL 0 // reserved +/* Задаёт G48PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G48PL 0 // reserved + +/* Задаёт G51PL = 2; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G51PL 2 // EQEP1_INT (eQEP1 Int) +/* Задаёт G52PL = 1; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G52PL 1 // EQEP2_INT (eQEP2 Int) +/* Задаёт G53PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G53PL 0 // reserved +/* Задаёт G54PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G54PL 0 // reserved +/* Задаёт G55PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G55PL 0 // reserved +/* Задаёт G56PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G56PL 0 // reserved +/* Задаёт G57PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G57PL 0 // reserved +/* Задаёт G58PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G58PL 0 // reserved + +/* Задаёт G61PL = 3; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G61PL 3 // SPIRXINTA (SPI-A) +/* Задаёт G62PL = 1; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G62PL 1 // SPITXINTA (SPI-A) +/* Задаёт G63PL = 4; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G63PL 4 // MRINTB (McBSP-B) +/* Задаёт G64PL = 6; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G64PL 6 // MXINTB (McBSP-B) +/* Задаёт G65PL = 2; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G65PL 2 // MRINTA (McBSP-A) +/* Задаёт G66PL = 1; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G66PL 1 // MXINTA (McBSP-A) +/* Задаёт G67PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G67PL 0 // reserved +/* Задаёт G68PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G68PL 0 // reserved + +/* Задаёт G71PL = 5; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G71PL 5 // DINTCH1 (DMA) +/* Задаёт G72PL = 4; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G72PL 4 // DINTCH2 (DMA) +/* Задаёт G73PL = 4; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G73PL 4 // DINTCH3 (DMA) +/* Задаёт G74PL = 2; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G74PL 2 // DINTCH4 (DMA) +/* Задаёт G75PL = 3; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G75PL 3 // DINTCH5 (DMA) +/* Задаёт G76PL = 1; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G76PL 1 // DINTCH6 (DMA) +/* Задаёт G77PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G77PL 0 // reserved +/* Задаёт G78PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G78PL 0 // reserved + +/* Задаёт G81PL = 1; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G81PL 1 // I2CINT1A (I2C-A) +/* Задаёт G82PL = 2; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G82PL 2 // I2CINT2A (I2C-A) +/* Задаёт G83PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G83PL 0 // reserved +/* Задаёт G84PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G84PL 0 // reserved +/* Задаёт G85PL = 4; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G85PL 4 // SCIRXINTC (SCI-C) +/* Задаёт G86PL = 3; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G86PL 3 // SCITXINTC (SCI-C) +/* Задаёт G87PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G87PL 0 // reserved +/* Задаёт G88PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G88PL 0 // reserved + +/* Задаёт G91PL = 1; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G91PL 1 // SCIRXINTA (SCI-A) +/* Задаёт G92PL = 5; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G92PL 5 // SCITXINTA (SCI-A) +/* Задаёт G93PL = 3; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G93PL 3 // SCIRXINTB (SCI-B) +/* Задаёт G94PL = 4; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G94PL 4 // SCITXINTB (SCI-B) +/* Задаёт G95PL = 1; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G95PL 1 // ECAN0INTA (ECAN-A) +/* Задаёт G96PL = 1; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G96PL 1 // ECAN1INTA (ECAN-A) +/* Задаёт G97PL = 2; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G97PL 2 // ECAN0INTB (ECAN-B) +/* Задаёт G98PL = 4; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G98PL 4 // ECAN1INTB (ECAN-B) + +/* Задаёт G101PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G101PL 0 // reserved +/* Задаёт G102PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G102PL 0 // reserved +/* Задаёт G103PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G103PL 0 // reserved +/* Задаёт G104PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G104PL 0 // reserved +/* Задаёт G105PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G105PL 0 // reserved +/* Задаёт G106PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G106PL 0 // reserved +/* Задаёт G107PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G107PL 0 // reserved +/* Задаёт G108PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G108PL 0 // reserved + +/* Задаёт G111PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G111PL 0 // reserved +/* Задаёт G112PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G112PL 0 // reserved +/* Задаёт G113PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G113PL 0 // reserved +/* Задаёт G114PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G114PL 0 // reserved +/* Задаёт G115PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G115PL 0 // reserved +/* Задаёт G116PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G116PL 0 // reserved +/* Задаёт G117PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G117PL 0 // reserved +/* Задаёт G118PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G118PL 0 // reserved + +/* Задаёт G121PL = 5; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G121PL 5 // XINT3 (External) +/* Задаёт G122PL = 3; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G122PL 3 // XINT4 (External) +/* Задаёт G123PL = 2; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G123PL 2 // XINT5 (External) +/* Задаёт G124PL = 2; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G124PL 2 // XINT6 (External) +/* Задаёт G125PL = 1; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G125PL 1 // XINT7 (External) +/* Задаёт G126PL = 0; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G126PL 0 // reserved +/* Задаёт G127PL = 6; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G127PL 6 // LVF (FPA32) +/* Задаёт G128PL = 1; уровень приоритета; 0 отключает источник, меньшее ненулевое число означает более высокий приоритет. */ +#define G128PL 1 // LUF (FPA32) + + +// There should be no need to modify code below this line +//------------------------------------------------------------------------------- +// Automatically generate IER interrupt masks MINT1 to MINT16: +// + +// Beginning of MINT1: +/* Условие компиляции (INT1PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT1PL == 0) +/* Задаёт MINT1_1PL = ~(1 << 0); маска разрешённых прерываний ядра для приоритетного обработчика 1_1PL. */ +#define MINT1_1PL ~(1 << 0) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT1_1PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 1_1PL. */ +#define MINT1_1PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT2PL >= INT1PL) или (INT2PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT2PL >= INT1PL) || (INT2PL == 0) +/* Задаёт MINT1_2PL = ~(1 << 1); маска разрешённых прерываний ядра для приоритетного обработчика 1_2PL. */ +#define MINT1_2PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT1_2PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 1_2PL. */ +#define MINT1_2PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT3PL >= INT1PL) или (INT3PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT3PL >= INT1PL) || (INT3PL == 0) +/* Задаёт MINT1_3PL = ~(1 << 2); маска разрешённых прерываний ядра для приоритетного обработчика 1_3PL. */ +#define MINT1_3PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT1_3PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 1_3PL. */ +#define MINT1_3PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT4PL >= INT1PL) или (INT4PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT4PL >= INT1PL) || (INT4PL == 0) +/* Задаёт MINT1_4PL = ~(1 << 3); маска разрешённых прерываний ядра для приоритетного обработчика 1_4PL. */ +#define MINT1_4PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT1_4PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 1_4PL. */ +#define MINT1_4PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT5PL >= INT1PL) или (INT5PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT5PL >= INT1PL) || (INT5PL == 0) +/* Задаёт MINT1_5PL = ~(1 << 4); маска разрешённых прерываний ядра для приоритетного обработчика 1_5PL. */ +#define MINT1_5PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT1_5PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 1_5PL. */ +#define MINT1_5PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT6PL >= INT1PL) или (INT6PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT6PL >= INT1PL) || (INT6PL == 0) +/* Задаёт MINT1_6PL = ~(1 << 5); маска разрешённых прерываний ядра для приоритетного обработчика 1_6PL. */ +#define MINT1_6PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT1_6PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 1_6PL. */ +#define MINT1_6PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT7PL >= INT1PL) или (INT7PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT7PL >= INT1PL) || (INT7PL == 0) +/* Задаёт MINT1_7PL = ~(1 << 6); маска разрешённых прерываний ядра для приоритетного обработчика 1_7PL. */ +#define MINT1_7PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT1_7PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 1_7PL. */ +#define MINT1_7PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT8PL >= INT1PL) или (INT8PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT8PL >= INT1PL) || (INT8PL == 0) +/* Задаёт MINT1_8PL = ~(1 << 7); маска разрешённых прерываний ядра для приоритетного обработчика 1_8PL. */ +#define MINT1_8PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT1_8PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 1_8PL. */ +#define MINT1_8PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT9PL >= INT1PL) или (INT9PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT9PL >= INT1PL) || (INT9PL == 0) +/* Задаёт MINT1_9PL = ~(1 << 8); маска разрешённых прерываний ядра для приоритетного обработчика 1_9PL. */ +#define MINT1_9PL ~(1 << 8) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT1_9PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 1_9PL. */ +#define MINT1_9PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT10PL >= INT1PL) или (INT10PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT10PL >= INT1PL) || (INT10PL == 0) +/* Задаёт MINT1_10PL = ~(1 << 9); маска разрешённых прерываний ядра для приоритетного обработчика 1_10PL. */ +#define MINT1_10PL ~(1 << 9) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT1_10PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 1_10PL. */ +#define MINT1_10PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT11PL >= INT1PL) или (INT11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT11PL >= INT1PL) || (INT11PL == 0) +/* Задаёт MINT1_11PL = ~(1 << 10); маска разрешённых прерываний ядра для приоритетного обработчика 1_11PL. */ +#define MINT1_11PL ~(1 << 10) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT1_11PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 1_11PL. */ +#define MINT1_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT12PL >= INT1PL) или (INT12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT12PL >= INT1PL) || (INT12PL == 0) +/* Задаёт MINT1_12PL = ~(1 << 11); маска разрешённых прерываний ядра для приоритетного обработчика 1_12PL. */ +#define MINT1_12PL ~(1 << 11) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT1_12PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 1_12PL. */ +#define MINT1_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT13PL >= INT1PL) или (INT13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT13PL >= INT1PL) || (INT13PL == 0) +/* Задаёт MINT1_13PL = ~(1 << 12); маска разрешённых прерываний ядра для приоритетного обработчика 1_13PL. */ +#define MINT1_13PL ~(1 << 12) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT1_13PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 1_13PL. */ +#define MINT1_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT14PL >= INT1PL) или (INT14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT14PL >= INT1PL) || (INT14PL == 0) +/* Задаёт MINT1_14PL = ~(1 << 13); маска разрешённых прерываний ядра для приоритетного обработчика 1_14PL. */ +#define MINT1_14PL ~(1 << 13) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT1_14PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 1_14PL. */ +#define MINT1_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT15PL >= INT1PL) или (INT15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT15PL >= INT1PL) || (INT15PL == 0) +/* Задаёт MINT1_15PL = ~(1 << 14); маска разрешённых прерываний ядра для приоритетного обработчика 1_15PL. */ +#define MINT1_15PL ~(1 << 14) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT1_15PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 1_15PL. */ +#define MINT1_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT16PL >= INT1PL) или (INT16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT16PL >= INT1PL) || (INT16PL == 0) +/* Задаёт MINT1_16PL = ~(1 << 15); маска разрешённых прерываний ядра для приоритетного обработчика 1_16PL. */ +#define MINT1_16PL ~(1 << 15) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT1_16PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 1_16PL. */ +#define MINT1_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Задаёт MINT1 = (MINT1_1PL & MINT1_2PL & MINT1_3PL & MINT1_4PL &; маска разрешённых прерываний ядра для приоритетного обработчика 1. */ +#define MINT1 (MINT1_1PL & MINT1_2PL & MINT1_3PL & MINT1_4PL & \ + MINT1_5PL & MINT1_6PL & MINT1_7PL & MINT1_8PL & /* Продолжает список аргументов, полей или выражение MINT1_5PL & MINT1_6PL & MINT1_7PL & MINT1_8PL &; порядок элементов сохраняется. */ \ + MINT1_9PL & MINT1_10PL & MINT1_11PL & MINT1_12PL & /* Продолжает список аргументов, полей или выражение MINT1_9PL & MINT1_10PL & MINT1_11PL & MINT1_12PL &; порядок элементов сохраняется. */ \ + MINT1_13PL & MINT1_14PL & MINT1_15PL & MINT1_16PL) /* Продолжает список аргументов, полей или выражение MINT1_13PL & MINT1_14PL & MINT1_15PL & MINT1_16PL); порядок элементов сохраняется. */ +// End Of MINT1. + +// Beginning of MINT2: +/* Условие компиляции (INT1PL >= INT2PL) или (INT1PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT1PL >= INT2PL) || (INT1PL == 0) +/* Задаёт MINT2_1PL = ~(1 << 0); маска разрешённых прерываний ядра для приоритетного обработчика 2_1PL. */ +#define MINT2_1PL ~(1 << 0) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT2_1PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 2_1PL. */ +#define MINT2_1PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT2PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT2PL == 0) +/* Задаёт MINT2_2PL = ~(1 << 1); маска разрешённых прерываний ядра для приоритетного обработчика 2_2PL. */ +#define MINT2_2PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT2_2PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 2_2PL. */ +#define MINT2_2PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT3PL >= INT2PL) или (INT3PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT3PL >= INT2PL) || (INT3PL == 0) +/* Задаёт MINT2_3PL = ~(1 << 2); маска разрешённых прерываний ядра для приоритетного обработчика 2_3PL. */ +#define MINT2_3PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT2_3PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 2_3PL. */ +#define MINT2_3PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT4PL >= INT2PL) или (INT4PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT4PL >= INT2PL) || (INT4PL == 0) +/* Задаёт MINT2_4PL = ~(1 << 3); маска разрешённых прерываний ядра для приоритетного обработчика 2_4PL. */ +#define MINT2_4PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT2_4PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 2_4PL. */ +#define MINT2_4PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT5PL >= INT2PL) или (INT5PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT5PL >= INT2PL) || (INT5PL == 0) +/* Задаёт MINT2_5PL = ~(1 << 4); маска разрешённых прерываний ядра для приоритетного обработчика 2_5PL. */ +#define MINT2_5PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT2_5PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 2_5PL. */ +#define MINT2_5PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT6PL >= INT2PL) или (INT6PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT6PL >= INT2PL) || (INT6PL == 0) +/* Задаёт MINT2_6PL = ~(1 << 5); маска разрешённых прерываний ядра для приоритетного обработчика 2_6PL. */ +#define MINT2_6PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT2_6PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 2_6PL. */ +#define MINT2_6PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT7PL >= INT2PL) или (INT7PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT7PL >= INT2PL) || (INT7PL == 0) +/* Задаёт MINT2_7PL = ~(1 << 6); маска разрешённых прерываний ядра для приоритетного обработчика 2_7PL. */ +#define MINT2_7PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT2_7PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 2_7PL. */ +#define MINT2_7PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT8PL >= INT2PL) или (INT8PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT8PL >= INT2PL) || (INT8PL == 0) +/* Задаёт MINT2_8PL = ~(1 << 7); маска разрешённых прерываний ядра для приоритетного обработчика 2_8PL. */ +#define MINT2_8PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT2_8PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 2_8PL. */ +#define MINT2_8PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT9PL >= INT2PL) или (INT9PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT9PL >= INT2PL) || (INT9PL == 0) +/* Задаёт MINT2_9PL = ~(1 << 8); маска разрешённых прерываний ядра для приоритетного обработчика 2_9PL. */ +#define MINT2_9PL ~(1 << 8) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT2_9PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 2_9PL. */ +#define MINT2_9PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT10PL >= INT2PL) или (INT10PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT10PL >= INT2PL) || (INT10PL == 0) +/* Задаёт MINT2_10PL = ~(1 << 9); маска разрешённых прерываний ядра для приоритетного обработчика 2_10PL. */ +#define MINT2_10PL ~(1 << 9) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT2_10PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 2_10PL. */ +#define MINT2_10PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT11PL >= INT2PL) или (INT11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT11PL >= INT2PL) || (INT11PL == 0) +/* Задаёт MINT2_11PL = ~(1 << 10); маска разрешённых прерываний ядра для приоритетного обработчика 2_11PL. */ +#define MINT2_11PL ~(1 << 10) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT2_11PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 2_11PL. */ +#define MINT2_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT12PL >= INT2PL) или (INT12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT12PL >= INT2PL) || (INT12PL == 0) +/* Задаёт MINT2_12PL = ~(1 << 11); маска разрешённых прерываний ядра для приоритетного обработчика 2_12PL. */ +#define MINT2_12PL ~(1 << 11) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT2_12PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 2_12PL. */ +#define MINT2_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT13PL >= INT2PL) или (INT13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT13PL >= INT2PL) || (INT13PL == 0) +/* Задаёт MINT2_13PL = ~(1 << 12); маска разрешённых прерываний ядра для приоритетного обработчика 2_13PL. */ +#define MINT2_13PL ~(1 << 12) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT2_13PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 2_13PL. */ +#define MINT2_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT14PL >= INT2PL) или (INT14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT14PL >= INT2PL) || (INT14PL == 0) +/* Задаёт MINT2_14PL = ~(1 << 13); маска разрешённых прерываний ядра для приоритетного обработчика 2_14PL. */ +#define MINT2_14PL ~(1 << 13) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT2_14PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 2_14PL. */ +#define MINT2_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT15PL >= INT2PL) или (INT15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT15PL >= INT2PL) || (INT15PL == 0) +/* Задаёт MINT2_15PL = ~(1 << 14); маска разрешённых прерываний ядра для приоритетного обработчика 2_15PL. */ +#define MINT2_15PL ~(1 << 14) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT2_15PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 2_15PL. */ +#define MINT2_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT16PL >= INT2PL) или (INT16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT16PL >= INT2PL) || (INT16PL == 0) +/* Задаёт MINT2_16PL = ~(1 << 15); маска разрешённых прерываний ядра для приоритетного обработчика 2_16PL. */ +#define MINT2_16PL ~(1 << 15) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT2_16PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 2_16PL. */ +#define MINT2_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Задаёт MINT2 = (MINT2_1PL & MINT2_2PL & MINT2_3PL & MINT2_4PL &; маска разрешённых прерываний ядра для приоритетного обработчика 2. */ +#define MINT2 (MINT2_1PL & MINT2_2PL & MINT2_3PL & MINT2_4PL & \ + MINT2_5PL & MINT2_6PL & MINT2_7PL & MINT2_8PL & /* Продолжает список аргументов, полей или выражение MINT2_5PL & MINT2_6PL & MINT2_7PL & MINT2_8PL &; порядок элементов сохраняется. */ \ + MINT2_9PL & MINT2_10PL & MINT2_11PL & MINT2_12PL & /* Продолжает список аргументов, полей или выражение MINT2_9PL & MINT2_10PL & MINT2_11PL & MINT2_12PL &; порядок элементов сохраняется. */ \ + MINT2_13PL & MINT2_14PL & MINT2_15PL & MINT2_16PL) /* Продолжает список аргументов, полей или выражение MINT2_13PL & MINT2_14PL & MINT2_15PL & MINT2_16PL); порядок элементов сохраняется. */ +// End Of MINT2. + +// Beginning of MINT3: +/* Условие компиляции (INT1PL >= INT3PL) или (INT1PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT1PL >= INT3PL) || (INT1PL == 0) +/* Задаёт MINT3_1PL = ~(1 << 0); маска разрешённых прерываний ядра для приоритетного обработчика 3_1PL. */ +#define MINT3_1PL ~(1 << 0) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT3_1PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 3_1PL. */ +#define MINT3_1PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT2PL >= INT3PL) или (INT2PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT2PL >= INT3PL) || (INT2PL == 0) +/* Задаёт MINT3_2PL = ~(1 << 1); маска разрешённых прерываний ядра для приоритетного обработчика 3_2PL. */ +#define MINT3_2PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT3_2PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 3_2PL. */ +#define MINT3_2PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT3PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT3PL == 0) +/* Задаёт MINT3_3PL = ~(1 << 2); маска разрешённых прерываний ядра для приоритетного обработчика 3_3PL. */ +#define MINT3_3PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT3_3PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 3_3PL. */ +#define MINT3_3PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT4PL >= INT3PL) или (INT4PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT4PL >= INT3PL) || (INT4PL == 0) +/* Задаёт MINT3_4PL = ~(1 << 3); маска разрешённых прерываний ядра для приоритетного обработчика 3_4PL. */ +#define MINT3_4PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT3_4PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 3_4PL. */ +#define MINT3_4PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT5PL >= INT3PL) или (INT5PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT5PL >= INT3PL) || (INT5PL == 0) +/* Задаёт MINT3_5PL = ~(1 << 4); маска разрешённых прерываний ядра для приоритетного обработчика 3_5PL. */ +#define MINT3_5PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT3_5PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 3_5PL. */ +#define MINT3_5PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT6PL >= INT3PL) или (INT6PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT6PL >= INT3PL) || (INT6PL == 0) +/* Задаёт MINT3_6PL = ~(1 << 5); маска разрешённых прерываний ядра для приоритетного обработчика 3_6PL. */ +#define MINT3_6PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT3_6PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 3_6PL. */ +#define MINT3_6PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT7PL >= INT3PL) или (INT7PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT7PL >= INT3PL) || (INT7PL == 0) +/* Задаёт MINT3_7PL = ~(1 << 6); маска разрешённых прерываний ядра для приоритетного обработчика 3_7PL. */ +#define MINT3_7PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT3_7PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 3_7PL. */ +#define MINT3_7PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT8PL >= INT3PL) или (INT8PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT8PL >= INT3PL) || (INT8PL == 0) +/* Задаёт MINT3_8PL = ~(1 << 7); маска разрешённых прерываний ядра для приоритетного обработчика 3_8PL. */ +#define MINT3_8PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT3_8PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 3_8PL. */ +#define MINT3_8PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT9PL >= INT3PL) или (INT9PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT9PL >= INT3PL) || (INT9PL == 0) +/* Задаёт MINT3_9PL = ~(1 << 8); маска разрешённых прерываний ядра для приоритетного обработчика 3_9PL. */ +#define MINT3_9PL ~(1 << 8) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT3_9PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 3_9PL. */ +#define MINT3_9PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT10PL >= INT3PL) или (INT10PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT10PL >= INT3PL) || (INT10PL == 0) +/* Задаёт MINT3_10PL = ~(1 << 9); маска разрешённых прерываний ядра для приоритетного обработчика 3_10PL. */ +#define MINT3_10PL ~(1 << 9) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT3_10PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 3_10PL. */ +#define MINT3_10PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT11PL >= INT3PL) или (INT11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT11PL >= INT3PL) || (INT11PL == 0) +/* Задаёт MINT3_11PL = ~(1 << 10); маска разрешённых прерываний ядра для приоритетного обработчика 3_11PL. */ +#define MINT3_11PL ~(1 << 10) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT3_11PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 3_11PL. */ +#define MINT3_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT12PL >= INT3PL) или (INT12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT12PL >= INT3PL) || (INT12PL == 0) +/* Задаёт MINT3_12PL = ~(1 << 11); маска разрешённых прерываний ядра для приоритетного обработчика 3_12PL. */ +#define MINT3_12PL ~(1 << 11) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT3_12PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 3_12PL. */ +#define MINT3_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT13PL >= INT3PL) или (INT13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT13PL >= INT3PL) || (INT13PL == 0) +/* Задаёт MINT3_13PL = ~(1 << 12); маска разрешённых прерываний ядра для приоритетного обработчика 3_13PL. */ +#define MINT3_13PL ~(1 << 12) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT3_13PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 3_13PL. */ +#define MINT3_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT14PL >= INT3PL) или (INT14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT14PL >= INT3PL) || (INT14PL == 0) +/* Задаёт MINT3_14PL = ~(1 << 13); маска разрешённых прерываний ядра для приоритетного обработчика 3_14PL. */ +#define MINT3_14PL ~(1 << 13) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT3_14PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 3_14PL. */ +#define MINT3_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT15PL >= INT3PL) или (INT15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT15PL >= INT3PL) || (INT15PL == 0) +/* Задаёт MINT3_15PL = ~(1 << 14); маска разрешённых прерываний ядра для приоритетного обработчика 3_15PL. */ +#define MINT3_15PL ~(1 << 14) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT3_15PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 3_15PL. */ +#define MINT3_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT16PL >= INT3PL) или (INT16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT16PL >= INT3PL) || (INT16PL == 0) +/* Задаёт MINT3_16PL = ~(1 << 15); маска разрешённых прерываний ядра для приоритетного обработчика 3_16PL. */ +#define MINT3_16PL ~(1 << 15) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT3_16PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 3_16PL. */ +#define MINT3_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Задаёт MINT3 = (MINT3_1PL & MINT3_2PL & MINT3_3PL & MINT3_4PL &; маска разрешённых прерываний ядра для приоритетного обработчика 3. */ +#define MINT3 (MINT3_1PL & MINT3_2PL & MINT3_3PL & MINT3_4PL & \ + MINT3_5PL & MINT3_6PL & MINT3_7PL & MINT3_8PL & /* Продолжает список аргументов, полей или выражение MINT3_5PL & MINT3_6PL & MINT3_7PL & MINT3_8PL &; порядок элементов сохраняется. */ \ + MINT3_9PL & MINT3_10PL & MINT3_11PL & MINT3_12PL & /* Продолжает список аргументов, полей или выражение MINT3_9PL & MINT3_10PL & MINT3_11PL & MINT3_12PL &; порядок элементов сохраняется. */ \ + MINT3_13PL & MINT3_14PL & MINT3_15PL & MINT3_16PL) /* Продолжает список аргументов, полей или выражение MINT3_13PL & MINT3_14PL & MINT3_15PL & MINT3_16PL); порядок элементов сохраняется. */ +// End Of MINT3. + +// Beginning of MINT4: +/* Условие компиляции (INT1PL >= INT4PL) или (INT1PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT1PL >= INT4PL) || (INT1PL == 0) +/* Задаёт MINT4_1PL = ~(1 << 0); маска разрешённых прерываний ядра для приоритетного обработчика 4_1PL. */ +#define MINT4_1PL ~(1 << 0) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT4_1PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 4_1PL. */ +#define MINT4_1PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT2PL >= INT4PL) или (INT2PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT2PL >= INT4PL) || (INT2PL == 0) +/* Задаёт MINT4_2PL = ~(1 << 1); маска разрешённых прерываний ядра для приоритетного обработчика 4_2PL. */ +#define MINT4_2PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT4_2PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 4_2PL. */ +#define MINT4_2PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT3PL >= INT4PL) или (INT3PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT3PL >= INT4PL) || (INT3PL == 0) +/* Задаёт MINT4_3PL = ~(1 << 2); маска разрешённых прерываний ядра для приоритетного обработчика 4_3PL. */ +#define MINT4_3PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT4_3PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 4_3PL. */ +#define MINT4_3PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT4PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT4PL == 0) +/* Задаёт MINT4_4PL = ~(1 << 3); маска разрешённых прерываний ядра для приоритетного обработчика 4_4PL. */ +#define MINT4_4PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT4_4PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 4_4PL. */ +#define MINT4_4PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT5PL >= INT4PL) или (INT5PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT5PL >= INT4PL) || (INT5PL == 0) +/* Задаёт MINT4_5PL = ~(1 << 4); маска разрешённых прерываний ядра для приоритетного обработчика 4_5PL. */ +#define MINT4_5PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT4_5PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 4_5PL. */ +#define MINT4_5PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT6PL >= INT4PL) или (INT6PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT6PL >= INT4PL) || (INT6PL == 0) +/* Задаёт MINT4_6PL = ~(1 << 5); маска разрешённых прерываний ядра для приоритетного обработчика 4_6PL. */ +#define MINT4_6PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT4_6PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 4_6PL. */ +#define MINT4_6PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT7PL >= INT4PL) или (INT7PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT7PL >= INT4PL) || (INT7PL == 0) +/* Задаёт MINT4_7PL = ~(1 << 6); маска разрешённых прерываний ядра для приоритетного обработчика 4_7PL. */ +#define MINT4_7PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT4_7PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 4_7PL. */ +#define MINT4_7PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT8PL >= INT4PL) или (INT8PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT8PL >= INT4PL) || (INT8PL == 0) +/* Задаёт MINT4_8PL = ~(1 << 7); маска разрешённых прерываний ядра для приоритетного обработчика 4_8PL. */ +#define MINT4_8PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT4_8PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 4_8PL. */ +#define MINT4_8PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT9PL >= INT4PL) или (INT9PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT9PL >= INT4PL) || (INT9PL == 0) +/* Задаёт MINT4_9PL = ~(1 << 8); маска разрешённых прерываний ядра для приоритетного обработчика 4_9PL. */ +#define MINT4_9PL ~(1 << 8) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT4_9PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 4_9PL. */ +#define MINT4_9PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT10PL >= INT4PL) или (INT10PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT10PL >= INT4PL) || (INT10PL == 0) +/* Задаёт MINT4_10PL = ~(1 << 9); маска разрешённых прерываний ядра для приоритетного обработчика 4_10PL. */ +#define MINT4_10PL ~(1 << 9) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT4_10PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 4_10PL. */ +#define MINT4_10PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT11PL >= INT4PL) или (INT11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT11PL >= INT4PL) || (INT11PL == 0) +/* Задаёт MINT4_11PL = ~(1 << 10); маска разрешённых прерываний ядра для приоритетного обработчика 4_11PL. */ +#define MINT4_11PL ~(1 << 10) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT4_11PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 4_11PL. */ +#define MINT4_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT12PL >= INT4PL) или (INT12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT12PL >= INT4PL) || (INT12PL == 0) +/* Задаёт MINT4_12PL = ~(1 << 11); маска разрешённых прерываний ядра для приоритетного обработчика 4_12PL. */ +#define MINT4_12PL ~(1 << 11) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT4_12PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 4_12PL. */ +#define MINT4_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT13PL >= INT4PL) или (INT13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT13PL >= INT4PL) || (INT13PL == 0) +/* Задаёт MINT4_13PL = ~(1 << 12); маска разрешённых прерываний ядра для приоритетного обработчика 4_13PL. */ +#define MINT4_13PL ~(1 << 12) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT4_13PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 4_13PL. */ +#define MINT4_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT14PL >= INT4PL) или (INT14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT14PL >= INT4PL) || (INT14PL == 0) +/* Задаёт MINT4_14PL = ~(1 << 13); маска разрешённых прерываний ядра для приоритетного обработчика 4_14PL. */ +#define MINT4_14PL ~(1 << 13) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT4_14PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 4_14PL. */ +#define MINT4_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT15PL >= INT4PL) или (INT15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT15PL >= INT4PL) || (INT15PL == 0) +/* Задаёт MINT4_15PL = ~(1 << 14); маска разрешённых прерываний ядра для приоритетного обработчика 4_15PL. */ +#define MINT4_15PL ~(1 << 14) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT4_15PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 4_15PL. */ +#define MINT4_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT16PL >= INT4PL) или (INT16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT16PL >= INT4PL) || (INT16PL == 0) +/* Задаёт MINT4_16PL = ~(1 << 15); маска разрешённых прерываний ядра для приоритетного обработчика 4_16PL. */ +#define MINT4_16PL ~(1 << 15) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT4_16PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 4_16PL. */ +#define MINT4_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Задаёт MINT4 = (MINT4_1PL & MINT4_2PL & MINT4_3PL & MINT4_4PL &; маска разрешённых прерываний ядра для приоритетного обработчика 4. */ +#define MINT4 (MINT4_1PL & MINT4_2PL & MINT4_3PL & MINT4_4PL & \ + MINT4_5PL & MINT4_6PL & MINT4_7PL & MINT4_8PL & /* Продолжает список аргументов, полей или выражение MINT4_5PL & MINT4_6PL & MINT4_7PL & MINT4_8PL &; порядок элементов сохраняется. */ \ + MINT4_9PL & MINT4_10PL & MINT4_11PL & MINT4_12PL & /* Продолжает список аргументов, полей или выражение MINT4_9PL & MINT4_10PL & MINT4_11PL & MINT4_12PL &; порядок элементов сохраняется. */ \ + MINT4_13PL & MINT4_14PL & MINT4_15PL & MINT4_16PL) /* Продолжает список аргументов, полей или выражение MINT4_13PL & MINT4_14PL & MINT4_15PL & MINT4_16PL); порядок элементов сохраняется. */ +// End Of MINT4. + +// Beginning of MINT5: +/* Условие компиляции (INT1PL >= INT5PL) или (INT1PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT1PL >= INT5PL) || (INT1PL == 0) +/* Задаёт MINT5_1PL = ~(1 << 0); маска разрешённых прерываний ядра для приоритетного обработчика 5_1PL. */ +#define MINT5_1PL ~(1 << 0) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT5_1PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 5_1PL. */ +#define MINT5_1PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT2PL >= INT5PL) или (INT2PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT2PL >= INT5PL) || (INT2PL == 0) +/* Задаёт MINT5_2PL = ~(1 << 1); маска разрешённых прерываний ядра для приоритетного обработчика 5_2PL. */ +#define MINT5_2PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT5_2PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 5_2PL. */ +#define MINT5_2PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT3PL >= INT5PL) или (INT3PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT3PL >= INT5PL) || (INT3PL == 0) +/* Задаёт MINT5_3PL = ~(1 << 2); маска разрешённых прерываний ядра для приоритетного обработчика 5_3PL. */ +#define MINT5_3PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT5_3PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 5_3PL. */ +#define MINT5_3PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT4PL >= INT5PL) или (INT4PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT4PL >= INT5PL) || (INT4PL == 0) +/* Задаёт MINT5_4PL = ~(1 << 3); маска разрешённых прерываний ядра для приоритетного обработчика 5_4PL. */ +#define MINT5_4PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT5_4PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 5_4PL. */ +#define MINT5_4PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT5PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT5PL == 0) +/* Задаёт MINT5_5PL = ~(1 << 4); маска разрешённых прерываний ядра для приоритетного обработчика 5_5PL. */ +#define MINT5_5PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT5_5PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 5_5PL. */ +#define MINT5_5PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT6PL >= INT5PL) или (INT6PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT6PL >= INT5PL) || (INT6PL == 0) +/* Задаёт MINT5_6PL = ~(1 << 5); маска разрешённых прерываний ядра для приоритетного обработчика 5_6PL. */ +#define MINT5_6PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT5_6PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 5_6PL. */ +#define MINT5_6PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT7PL >= INT5PL) или (INT7PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT7PL >= INT5PL) || (INT7PL == 0) +/* Задаёт MINT5_7PL = ~(1 << 6); маска разрешённых прерываний ядра для приоритетного обработчика 5_7PL. */ +#define MINT5_7PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT5_7PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 5_7PL. */ +#define MINT5_7PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT8PL >= INT5PL) или (INT8PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT8PL >= INT5PL) || (INT8PL == 0) +/* Задаёт MINT5_8PL = ~(1 << 7); маска разрешённых прерываний ядра для приоритетного обработчика 5_8PL. */ +#define MINT5_8PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT5_8PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 5_8PL. */ +#define MINT5_8PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT9PL >= INT5PL) или (INT9PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT9PL >= INT5PL) || (INT9PL == 0) +/* Задаёт MINT5_9PL = ~(1 << 8); маска разрешённых прерываний ядра для приоритетного обработчика 5_9PL. */ +#define MINT5_9PL ~(1 << 8) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT5_9PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 5_9PL. */ +#define MINT5_9PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT10PL >= INT5PL) или (INT10PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT10PL >= INT5PL) || (INT10PL == 0) +/* Задаёт MINT5_10PL = ~(1 << 9); маска разрешённых прерываний ядра для приоритетного обработчика 5_10PL. */ +#define MINT5_10PL ~(1 << 9) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT5_10PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 5_10PL. */ +#define MINT5_10PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT11PL >= INT5PL) или (INT11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT11PL >= INT5PL) || (INT11PL == 0) +/* Задаёт MINT5_11PL = ~(1 << 10); маска разрешённых прерываний ядра для приоритетного обработчика 5_11PL. */ +#define MINT5_11PL ~(1 << 10) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT5_11PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 5_11PL. */ +#define MINT5_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT12PL >= INT5PL) или (INT12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT12PL >= INT5PL) || (INT12PL == 0) +/* Задаёт MINT5_12PL = ~(1 << 11); маска разрешённых прерываний ядра для приоритетного обработчика 5_12PL. */ +#define MINT5_12PL ~(1 << 11) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT5_12PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 5_12PL. */ +#define MINT5_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT13PL >= INT5PL) или (INT13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT13PL >= INT5PL) || (INT13PL == 0) +/* Задаёт MINT5_13PL = ~(1 << 12); маска разрешённых прерываний ядра для приоритетного обработчика 5_13PL. */ +#define MINT5_13PL ~(1 << 12) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT5_13PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 5_13PL. */ +#define MINT5_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT14PL >= INT5PL) или (INT14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT14PL >= INT5PL) || (INT14PL == 0) +/* Задаёт MINT5_14PL = ~(1 << 13); маска разрешённых прерываний ядра для приоритетного обработчика 5_14PL. */ +#define MINT5_14PL ~(1 << 13) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT5_14PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 5_14PL. */ +#define MINT5_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT15PL >= INT5PL) или (INT15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT15PL >= INT5PL) || (INT15PL == 0) +/* Задаёт MINT5_15PL = ~(1 << 14); маска разрешённых прерываний ядра для приоритетного обработчика 5_15PL. */ +#define MINT5_15PL ~(1 << 14) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT5_15PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 5_15PL. */ +#define MINT5_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT16PL >= INT5PL) или (INT16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT16PL >= INT5PL) || (INT16PL == 0) +/* Задаёт MINT5_16PL = ~(1 << 15); маска разрешённых прерываний ядра для приоритетного обработчика 5_16PL. */ +#define MINT5_16PL ~(1 << 15) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT5_16PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 5_16PL. */ +#define MINT5_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Задаёт MINT5 = (MINT5_1PL & MINT5_2PL & MINT5_3PL & MINT5_4PL &; маска разрешённых прерываний ядра для приоритетного обработчика 5. */ +#define MINT5 (MINT5_1PL & MINT5_2PL & MINT5_3PL & MINT5_4PL & \ + MINT5_5PL & MINT5_6PL & MINT5_7PL & MINT5_8PL & /* Продолжает список аргументов, полей или выражение MINT5_5PL & MINT5_6PL & MINT5_7PL & MINT5_8PL &; порядок элементов сохраняется. */ \ + MINT5_9PL & MINT5_10PL & MINT5_11PL & MINT5_12PL & /* Продолжает список аргументов, полей или выражение MINT5_9PL & MINT5_10PL & MINT5_11PL & MINT5_12PL &; порядок элементов сохраняется. */ \ + MINT5_13PL & MINT5_14PL & MINT5_15PL & MINT5_16PL) /* Продолжает список аргументов, полей или выражение MINT5_13PL & MINT5_14PL & MINT5_15PL & MINT5_16PL); порядок элементов сохраняется. */ +// End Of MINT5. + +// Beginning of MINT6: +/* Условие компиляции (INT1PL >= INT6PL) или (INT1PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT1PL >= INT6PL) || (INT1PL == 0) +/* Задаёт MINT6_1PL = ~(1 << 0); маска разрешённых прерываний ядра для приоритетного обработчика 6_1PL. */ +#define MINT6_1PL ~(1 << 0) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT6_1PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 6_1PL. */ +#define MINT6_1PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT2PL >= INT6PL) или (INT2PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT2PL >= INT6PL) || (INT2PL == 0) +/* Задаёт MINT6_2PL = ~(1 << 1); маска разрешённых прерываний ядра для приоритетного обработчика 6_2PL. */ +#define MINT6_2PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT6_2PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 6_2PL. */ +#define MINT6_2PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT3PL >= INT6PL) или (INT3PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT3PL >= INT6PL) || (INT3PL == 0) +/* Задаёт MINT6_3PL = ~(1 << 2); маска разрешённых прерываний ядра для приоритетного обработчика 6_3PL. */ +#define MINT6_3PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT6_3PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 6_3PL. */ +#define MINT6_3PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT4PL >= INT6PL) или (INT4PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT4PL >= INT6PL) || (INT4PL == 0) +/* Задаёт MINT6_4PL = ~(1 << 3); маска разрешённых прерываний ядра для приоритетного обработчика 6_4PL. */ +#define MINT6_4PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT6_4PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 6_4PL. */ +#define MINT6_4PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT5PL >= INT6PL) или (INT5PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT5PL >= INT6PL) || (INT5PL == 0) +/* Задаёт MINT6_5PL = ~(1 << 4); маска разрешённых прерываний ядра для приоритетного обработчика 6_5PL. */ +#define MINT6_5PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT6_5PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 6_5PL. */ +#define MINT6_5PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT6PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT6PL == 0) +/* Задаёт MINT6_6PL = ~(1 << 5); маска разрешённых прерываний ядра для приоритетного обработчика 6_6PL. */ +#define MINT6_6PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT6_6PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 6_6PL. */ +#define MINT6_6PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT7PL >= INT6PL) или (INT7PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT7PL >= INT6PL) || (INT7PL == 0) +/* Задаёт MINT6_7PL = ~(1 << 6); маска разрешённых прерываний ядра для приоритетного обработчика 6_7PL. */ +#define MINT6_7PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT6_7PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 6_7PL. */ +#define MINT6_7PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT8PL >= INT6PL) или (INT8PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT8PL >= INT6PL) || (INT8PL == 0) +/* Задаёт MINT6_8PL = ~(1 << 7); маска разрешённых прерываний ядра для приоритетного обработчика 6_8PL. */ +#define MINT6_8PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT6_8PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 6_8PL. */ +#define MINT6_8PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT9PL >= INT6PL) или (INT9PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT9PL >= INT6PL) || (INT9PL == 0) +/* Задаёт MINT6_9PL = ~(1 << 8); маска разрешённых прерываний ядра для приоритетного обработчика 6_9PL. */ +#define MINT6_9PL ~(1 << 8) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT6_9PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 6_9PL. */ +#define MINT6_9PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT10PL >= INT6PL) или (INT10PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT10PL >= INT6PL) || (INT10PL == 0) +/* Задаёт MINT6_10PL = ~(1 << 9); маска разрешённых прерываний ядра для приоритетного обработчика 6_10PL. */ +#define MINT6_10PL ~(1 << 9) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT6_10PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 6_10PL. */ +#define MINT6_10PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT11PL >= INT6PL) или (INT11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT11PL >= INT6PL) || (INT11PL == 0) +/* Задаёт MINT6_11PL = ~(1 << 10); маска разрешённых прерываний ядра для приоритетного обработчика 6_11PL. */ +#define MINT6_11PL ~(1 << 10) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT6_11PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 6_11PL. */ +#define MINT6_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT12PL >= INT6PL) или (INT12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT12PL >= INT6PL) || (INT12PL == 0) +/* Задаёт MINT6_12PL = ~(1 << 11); маска разрешённых прерываний ядра для приоритетного обработчика 6_12PL. */ +#define MINT6_12PL ~(1 << 11) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT6_12PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 6_12PL. */ +#define MINT6_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT13PL >= INT6PL) или (INT13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT13PL >= INT6PL) || (INT13PL == 0) +/* Задаёт MINT6_13PL = ~(1 << 12); маска разрешённых прерываний ядра для приоритетного обработчика 6_13PL. */ +#define MINT6_13PL ~(1 << 12) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT6_13PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 6_13PL. */ +#define MINT6_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT14PL >= INT6PL) или (INT14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT14PL >= INT6PL) || (INT14PL == 0) +/* Задаёт MINT6_14PL = ~(1 << 13); маска разрешённых прерываний ядра для приоритетного обработчика 6_14PL. */ +#define MINT6_14PL ~(1 << 13) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT6_14PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 6_14PL. */ +#define MINT6_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT15PL >= INT6PL) или (INT15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT15PL >= INT6PL) || (INT15PL == 0) +/* Задаёт MINT6_15PL = ~(1 << 14); маска разрешённых прерываний ядра для приоритетного обработчика 6_15PL. */ +#define MINT6_15PL ~(1 << 14) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT6_15PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 6_15PL. */ +#define MINT6_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT16PL >= INT6PL) или (INT16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT16PL >= INT6PL) || (INT16PL == 0) +/* Задаёт MINT6_16PL = ~(1 << 15); маска разрешённых прерываний ядра для приоритетного обработчика 6_16PL. */ +#define MINT6_16PL ~(1 << 15) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT6_16PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 6_16PL. */ +#define MINT6_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Задаёт MINT6 = (MINT6_1PL & MINT6_2PL & MINT6_3PL & MINT6_4PL &; маска разрешённых прерываний ядра для приоритетного обработчика 6. */ +#define MINT6 (MINT6_1PL & MINT6_2PL & MINT6_3PL & MINT6_4PL & \ + MINT6_5PL & MINT6_6PL & MINT6_7PL & MINT6_8PL & /* Продолжает список аргументов, полей или выражение MINT6_5PL & MINT6_6PL & MINT6_7PL & MINT6_8PL &; порядок элементов сохраняется. */ \ + MINT6_9PL & MINT6_10PL & MINT6_11PL & MINT6_12PL & /* Продолжает список аргументов, полей или выражение MINT6_9PL & MINT6_10PL & MINT6_11PL & MINT6_12PL &; порядок элементов сохраняется. */ \ + MINT6_13PL & MINT6_14PL & MINT6_15PL & MINT6_16PL) /* Продолжает список аргументов, полей или выражение MINT6_13PL & MINT6_14PL & MINT6_15PL & MINT6_16PL); порядок элементов сохраняется. */ +// End Of MINT6. + +// Beginning of MINT7: +/* Условие компиляции (INT1PL >= INT7PL) или (INT1PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT1PL >= INT7PL) || (INT1PL == 0) +/* Задаёт MINT7_1PL = ~(1 << 0); маска разрешённых прерываний ядра для приоритетного обработчика 7_1PL. */ +#define MINT7_1PL ~(1 << 0) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT7_1PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 7_1PL. */ +#define MINT7_1PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT2PL >= INT7PL) или (INT2PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT2PL >= INT7PL) || (INT2PL == 0) +/* Задаёт MINT7_2PL = ~(1 << 1); маска разрешённых прерываний ядра для приоритетного обработчика 7_2PL. */ +#define MINT7_2PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT7_2PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 7_2PL. */ +#define MINT7_2PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT3PL >= INT7PL) или (INT3PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT3PL >= INT7PL) || (INT3PL == 0) +/* Задаёт MINT7_3PL = ~(1 << 2); маска разрешённых прерываний ядра для приоритетного обработчика 7_3PL. */ +#define MINT7_3PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT7_3PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 7_3PL. */ +#define MINT7_3PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT4PL >= INT7PL) или (INT4PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT4PL >= INT7PL) || (INT4PL == 0) +/* Задаёт MINT7_4PL = ~(1 << 3); маска разрешённых прерываний ядра для приоритетного обработчика 7_4PL. */ +#define MINT7_4PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT7_4PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 7_4PL. */ +#define MINT7_4PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT5PL >= INT7PL) или (INT5PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT5PL >= INT7PL) || (INT5PL == 0) +/* Задаёт MINT7_5PL = ~(1 << 4); маска разрешённых прерываний ядра для приоритетного обработчика 7_5PL. */ +#define MINT7_5PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT7_5PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 7_5PL. */ +#define MINT7_5PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT6PL >= INT7PL) или (INT6PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT6PL >= INT7PL) || (INT6PL == 0) +/* Задаёт MINT7_6PL = ~(1 << 5); маска разрешённых прерываний ядра для приоритетного обработчика 7_6PL. */ +#define MINT7_6PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT7_6PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 7_6PL. */ +#define MINT7_6PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT7PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT7PL == 0) +/* Задаёт MINT7_7PL = ~(1 << 6); маска разрешённых прерываний ядра для приоритетного обработчика 7_7PL. */ +#define MINT7_7PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT7_7PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 7_7PL. */ +#define MINT7_7PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT8PL >= INT7PL) или (INT8PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT8PL >= INT7PL) || (INT8PL == 0) +/* Задаёт MINT7_8PL = ~(1 << 7); маска разрешённых прерываний ядра для приоритетного обработчика 7_8PL. */ +#define MINT7_8PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT7_8PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 7_8PL. */ +#define MINT7_8PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT9PL >= INT7PL) или (INT9PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT9PL >= INT7PL) || (INT9PL == 0) +/* Задаёт MINT7_9PL = ~(1 << 8); маска разрешённых прерываний ядра для приоритетного обработчика 7_9PL. */ +#define MINT7_9PL ~(1 << 8) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT7_9PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 7_9PL. */ +#define MINT7_9PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT10PL >= INT7PL) или (INT10PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT10PL >= INT7PL) || (INT10PL == 0) +/* Задаёт MINT7_10PL = ~(1 << 9); маска разрешённых прерываний ядра для приоритетного обработчика 7_10PL. */ +#define MINT7_10PL ~(1 << 9) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT7_10PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 7_10PL. */ +#define MINT7_10PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT11PL >= INT7PL) или (INT11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT11PL >= INT7PL) || (INT11PL == 0) +/* Задаёт MINT7_11PL = ~(1 << 10); маска разрешённых прерываний ядра для приоритетного обработчика 7_11PL. */ +#define MINT7_11PL ~(1 << 10) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT7_11PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 7_11PL. */ +#define MINT7_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT12PL >= INT7PL) или (INT12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT12PL >= INT7PL) || (INT12PL == 0) +/* Задаёт MINT7_12PL = ~(1 << 11); маска разрешённых прерываний ядра для приоритетного обработчика 7_12PL. */ +#define MINT7_12PL ~(1 << 11) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT7_12PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 7_12PL. */ +#define MINT7_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT13PL >= INT7PL) или (INT13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT13PL >= INT7PL) || (INT13PL == 0) +/* Задаёт MINT7_13PL = ~(1 << 12); маска разрешённых прерываний ядра для приоритетного обработчика 7_13PL. */ +#define MINT7_13PL ~(1 << 12) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT7_13PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 7_13PL. */ +#define MINT7_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT14PL >= INT7PL) или (INT14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT14PL >= INT7PL) || (INT14PL == 0) +/* Задаёт MINT7_14PL = ~(1 << 13); маска разрешённых прерываний ядра для приоритетного обработчика 7_14PL. */ +#define MINT7_14PL ~(1 << 13) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT7_14PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 7_14PL. */ +#define MINT7_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT15PL >= INT7PL) или (INT15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT15PL >= INT7PL) || (INT15PL == 0) +/* Задаёт MINT7_15PL = ~(1 << 14); маска разрешённых прерываний ядра для приоритетного обработчика 7_15PL. */ +#define MINT7_15PL ~(1 << 14) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT7_15PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 7_15PL. */ +#define MINT7_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT16PL >= INT7PL) или (INT16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT16PL >= INT7PL) || (INT16PL == 0) +/* Задаёт MINT7_16PL = ~(1 << 15); маска разрешённых прерываний ядра для приоритетного обработчика 7_16PL. */ +#define MINT7_16PL ~(1 << 15) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT7_16PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 7_16PL. */ +#define MINT7_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Задаёт MINT7 = (MINT7_1PL & MINT7_2PL & MINT7_3PL & MINT7_4PL &; маска разрешённых прерываний ядра для приоритетного обработчика 7. */ +#define MINT7 (MINT7_1PL & MINT7_2PL & MINT7_3PL & MINT7_4PL & \ + MINT7_5PL & MINT7_6PL & MINT7_7PL & MINT7_8PL & /* Продолжает список аргументов, полей или выражение MINT7_5PL & MINT7_6PL & MINT7_7PL & MINT7_8PL &; порядок элементов сохраняется. */ \ + MINT7_9PL & MINT7_10PL & MINT7_11PL & MINT7_12PL & /* Продолжает список аргументов, полей или выражение MINT7_9PL & MINT7_10PL & MINT7_11PL & MINT7_12PL &; порядок элементов сохраняется. */ \ + MINT7_13PL & MINT7_14PL & MINT7_15PL & MINT7_16PL) /* Продолжает список аргументов, полей или выражение MINT7_13PL & MINT7_14PL & MINT7_15PL & MINT7_16PL); порядок элементов сохраняется. */ +// End Of MINT7. + +// Beginning of MINT8: +/* Условие компиляции (INT1PL >= INT8PL) или (INT1PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT1PL >= INT8PL) || (INT1PL == 0) +/* Задаёт MINT8_1PL = ~(1 << 0); маска разрешённых прерываний ядра для приоритетного обработчика 8_1PL. */ +#define MINT8_1PL ~(1 << 0) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT8_1PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 8_1PL. */ +#define MINT8_1PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT2PL >= INT8PL) или (INT2PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT2PL >= INT8PL) || (INT2PL == 0) +/* Задаёт MINT8_2PL = ~(1 << 1); маска разрешённых прерываний ядра для приоритетного обработчика 8_2PL. */ +#define MINT8_2PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT8_2PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 8_2PL. */ +#define MINT8_2PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT3PL >= INT8PL) или (INT3PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT3PL >= INT8PL) || (INT3PL == 0) +/* Задаёт MINT8_3PL = ~(1 << 2); маска разрешённых прерываний ядра для приоритетного обработчика 8_3PL. */ +#define MINT8_3PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT8_3PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 8_3PL. */ +#define MINT8_3PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT4PL >= INT8PL) или (INT4PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT4PL >= INT8PL) || (INT4PL == 0) +/* Задаёт MINT8_4PL = ~(1 << 3); маска разрешённых прерываний ядра для приоритетного обработчика 8_4PL. */ +#define MINT8_4PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT8_4PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 8_4PL. */ +#define MINT8_4PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT5PL >= INT8PL) или (INT5PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT5PL >= INT8PL) || (INT5PL == 0) +/* Задаёт MINT8_5PL = ~(1 << 4); маска разрешённых прерываний ядра для приоритетного обработчика 8_5PL. */ +#define MINT8_5PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT8_5PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 8_5PL. */ +#define MINT8_5PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT6PL >= INT8PL) или (INT6PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT6PL >= INT8PL) || (INT6PL == 0) +/* Задаёт MINT8_6PL = ~(1 << 5); маска разрешённых прерываний ядра для приоритетного обработчика 8_6PL. */ +#define MINT8_6PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT8_6PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 8_6PL. */ +#define MINT8_6PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT7PL >= INT8PL) или (INT7PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT7PL >= INT8PL) || (INT7PL == 0) +/* Задаёт MINT8_7PL = ~(1 << 6); маска разрешённых прерываний ядра для приоритетного обработчика 8_7PL. */ +#define MINT8_7PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT8_7PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 8_7PL. */ +#define MINT8_7PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT8PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT8PL == 0) +/* Задаёт MINT8_8PL = ~(1 << 7); маска разрешённых прерываний ядра для приоритетного обработчика 8_8PL. */ +#define MINT8_8PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT8_8PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 8_8PL. */ +#define MINT8_8PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT9PL >= INT8PL) или (INT9PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT9PL >= INT8PL) || (INT9PL == 0) +/* Задаёт MINT8_9PL = ~(1 << 8); маска разрешённых прерываний ядра для приоритетного обработчика 8_9PL. */ +#define MINT8_9PL ~(1 << 8) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT8_9PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 8_9PL. */ +#define MINT8_9PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT10PL >= INT8PL) или (INT10PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT10PL >= INT8PL) || (INT10PL == 0) +/* Задаёт MINT8_10PL = ~(1 << 9); маска разрешённых прерываний ядра для приоритетного обработчика 8_10PL. */ +#define MINT8_10PL ~(1 << 9) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT8_10PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 8_10PL. */ +#define MINT8_10PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT11PL >= INT8PL) или (INT11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT11PL >= INT8PL) || (INT11PL == 0) +/* Задаёт MINT8_11PL = ~(1 << 10); маска разрешённых прерываний ядра для приоритетного обработчика 8_11PL. */ +#define MINT8_11PL ~(1 << 10) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT8_11PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 8_11PL. */ +#define MINT8_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT12PL >= INT8PL) или (INT12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT12PL >= INT8PL) || (INT12PL == 0) +/* Задаёт MINT8_12PL = ~(1 << 11); маска разрешённых прерываний ядра для приоритетного обработчика 8_12PL. */ +#define MINT8_12PL ~(1 << 11) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT8_12PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 8_12PL. */ +#define MINT8_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT13PL >= INT8PL) или (INT13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT13PL >= INT8PL) || (INT13PL == 0) +/* Задаёт MINT8_13PL = ~(1 << 12); маска разрешённых прерываний ядра для приоритетного обработчика 8_13PL. */ +#define MINT8_13PL ~(1 << 12) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT8_13PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 8_13PL. */ +#define MINT8_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT14PL >= INT8PL) или (INT14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT14PL >= INT8PL) || (INT14PL == 0) +/* Задаёт MINT8_14PL = ~(1 << 13); маска разрешённых прерываний ядра для приоритетного обработчика 8_14PL. */ +#define MINT8_14PL ~(1 << 13) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT8_14PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 8_14PL. */ +#define MINT8_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT15PL >= INT8PL) или (INT15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT15PL >= INT8PL) || (INT15PL == 0) +/* Задаёт MINT8_15PL = ~(1 << 14); маска разрешённых прерываний ядра для приоритетного обработчика 8_15PL. */ +#define MINT8_15PL ~(1 << 14) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT8_15PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 8_15PL. */ +#define MINT8_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT16PL >= INT8PL) или (INT16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT16PL >= INT8PL) || (INT16PL == 0) +/* Задаёт MINT8_16PL = ~(1 << 15); маска разрешённых прерываний ядра для приоритетного обработчика 8_16PL. */ +#define MINT8_16PL ~(1 << 15) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT8_16PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 8_16PL. */ +#define MINT8_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Задаёт MINT8 = (MINT8_1PL & MINT8_2PL & MINT8_3PL & MINT8_4PL &; маска разрешённых прерываний ядра для приоритетного обработчика 8. */ +#define MINT8 (MINT8_1PL & MINT8_2PL & MINT8_3PL & MINT8_4PL & \ + MINT8_5PL & MINT8_6PL & MINT8_7PL & MINT8_8PL & /* Продолжает список аргументов, полей или выражение MINT8_5PL & MINT8_6PL & MINT8_7PL & MINT8_8PL &; порядок элементов сохраняется. */ \ + MINT8_9PL & MINT8_10PL & MINT8_11PL & MINT8_12PL & /* Продолжает список аргументов, полей или выражение MINT8_9PL & MINT8_10PL & MINT8_11PL & MINT8_12PL &; порядок элементов сохраняется. */ \ + MINT8_13PL & MINT8_14PL & MINT8_15PL & MINT8_16PL) /* Продолжает список аргументов, полей или выражение MINT8_13PL & MINT8_14PL & MINT8_15PL & MINT8_16PL); порядок элементов сохраняется. */ +// End Of MINT8. + +// Beginning of MINT9: +/* Условие компиляции (INT1PL >= INT9PL) или (INT1PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT1PL >= INT9PL) || (INT1PL == 0) +/* Задаёт MINT9_1PL = ~(1 << 0); маска разрешённых прерываний ядра для приоритетного обработчика 9_1PL. */ +#define MINT9_1PL ~(1 << 0) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT9_1PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 9_1PL. */ +#define MINT9_1PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT2PL >= INT9PL) или (INT2PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT2PL >= INT9PL) || (INT2PL == 0) +/* Задаёт MINT9_2PL = ~(1 << 1); маска разрешённых прерываний ядра для приоритетного обработчика 9_2PL. */ +#define MINT9_2PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT9_2PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 9_2PL. */ +#define MINT9_2PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT3PL >= INT9PL) или (INT3PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT3PL >= INT9PL) || (INT3PL == 0) +/* Задаёт MINT9_3PL = ~(1 << 2); маска разрешённых прерываний ядра для приоритетного обработчика 9_3PL. */ +#define MINT9_3PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT9_3PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 9_3PL. */ +#define MINT9_3PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT4PL >= INT9PL) или (INT4PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT4PL >= INT9PL) || (INT4PL == 0) +/* Задаёт MINT9_4PL = ~(1 << 3); маска разрешённых прерываний ядра для приоритетного обработчика 9_4PL. */ +#define MINT9_4PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT9_4PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 9_4PL. */ +#define MINT9_4PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT5PL >= INT9PL) или (INT5PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT5PL >= INT9PL) || (INT5PL == 0) +/* Задаёт MINT9_5PL = ~(1 << 4); маска разрешённых прерываний ядра для приоритетного обработчика 9_5PL. */ +#define MINT9_5PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT9_5PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 9_5PL. */ +#define MINT9_5PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT6PL >= INT9PL) или (INT6PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT6PL >= INT9PL) || (INT6PL == 0) +/* Задаёт MINT9_6PL = ~(1 << 5); маска разрешённых прерываний ядра для приоритетного обработчика 9_6PL. */ +#define MINT9_6PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT9_6PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 9_6PL. */ +#define MINT9_6PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT7PL >= INT9PL) или (INT7PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT7PL >= INT9PL) || (INT7PL == 0) +/* Задаёт MINT9_7PL = ~(1 << 6); маска разрешённых прерываний ядра для приоритетного обработчика 9_7PL. */ +#define MINT9_7PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT9_7PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 9_7PL. */ +#define MINT9_7PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT8PL >= INT9PL) или (INT8PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT8PL >= INT9PL) || (INT8PL == 0) +/* Задаёт MINT9_8PL = ~(1 << 7); маска разрешённых прерываний ядра для приоритетного обработчика 9_8PL. */ +#define MINT9_8PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT9_8PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 9_8PL. */ +#define MINT9_8PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT9PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT9PL == 0) +/* Задаёт MINT9_9PL = ~(1 << 8); маска разрешённых прерываний ядра для приоритетного обработчика 9_9PL. */ +#define MINT9_9PL ~(1 << 8) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT9_9PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 9_9PL. */ +#define MINT9_9PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT10PL >= INT9PL) или (INT10PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT10PL >= INT9PL) || (INT10PL == 0) +/* Задаёт MINT9_10PL = ~(1 << 9); маска разрешённых прерываний ядра для приоритетного обработчика 9_10PL. */ +#define MINT9_10PL ~(1 << 9) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT9_10PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 9_10PL. */ +#define MINT9_10PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT11PL >= INT9PL) или (INT11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT11PL >= INT9PL) || (INT11PL == 0) +/* Задаёт MINT9_11PL = ~(1 << 10); маска разрешённых прерываний ядра для приоритетного обработчика 9_11PL. */ +#define MINT9_11PL ~(1 << 10) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT9_11PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 9_11PL. */ +#define MINT9_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT12PL >= INT9PL) или (INT12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT12PL >= INT9PL) || (INT12PL == 0) +/* Задаёт MINT9_12PL = ~(1 << 11); маска разрешённых прерываний ядра для приоритетного обработчика 9_12PL. */ +#define MINT9_12PL ~(1 << 11) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT9_12PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 9_12PL. */ +#define MINT9_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT13PL >= INT9PL) или (INT13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT13PL >= INT9PL) || (INT13PL == 0) +/* Задаёт MINT9_13PL = ~(1 << 12); маска разрешённых прерываний ядра для приоритетного обработчика 9_13PL. */ +#define MINT9_13PL ~(1 << 12) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT9_13PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 9_13PL. */ +#define MINT9_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT14PL >= INT9PL) или (INT14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT14PL >= INT9PL) || (INT14PL == 0) +/* Задаёт MINT9_14PL = ~(1 << 13); маска разрешённых прерываний ядра для приоритетного обработчика 9_14PL. */ +#define MINT9_14PL ~(1 << 13) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT9_14PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 9_14PL. */ +#define MINT9_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT15PL >= INT9PL) или (INT15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT15PL >= INT9PL) || (INT15PL == 0) +/* Задаёт MINT9_15PL = ~(1 << 14); маска разрешённых прерываний ядра для приоритетного обработчика 9_15PL. */ +#define MINT9_15PL ~(1 << 14) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT9_15PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 9_15PL. */ +#define MINT9_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT16PL >= INT9PL) или (INT16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT16PL >= INT9PL) || (INT16PL == 0) +/* Задаёт MINT9_16PL = ~(1 << 15); маска разрешённых прерываний ядра для приоритетного обработчика 9_16PL. */ +#define MINT9_16PL ~(1 << 15) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT9_16PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 9_16PL. */ +#define MINT9_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Задаёт MINT9 = (MINT9_1PL & MINT9_2PL & MINT9_3PL & MINT9_4PL &; маска разрешённых прерываний ядра для приоритетного обработчика 9. */ +#define MINT9 (MINT9_1PL & MINT9_2PL & MINT9_3PL & MINT9_4PL & \ + MINT9_5PL & MINT9_6PL & MINT9_7PL & MINT9_8PL & /* Продолжает список аргументов, полей или выражение MINT9_5PL & MINT9_6PL & MINT9_7PL & MINT9_8PL &; порядок элементов сохраняется. */ \ + MINT9_9PL & MINT9_10PL & MINT9_11PL & MINT9_12PL & /* Продолжает список аргументов, полей или выражение MINT9_9PL & MINT9_10PL & MINT9_11PL & MINT9_12PL &; порядок элементов сохраняется. */ \ + MINT9_13PL & MINT9_14PL & MINT9_15PL & MINT9_16PL) /* Продолжает список аргументов, полей или выражение MINT9_13PL & MINT9_14PL & MINT9_15PL & MINT9_16PL); порядок элементов сохраняется. */ +// End Of MINT9. + +// Beginning of MINT10: +/* Условие компиляции (INT1PL >= INT10PL) или (INT1PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT1PL >= INT10PL) || (INT1PL == 0) +/* Задаёт MINT10_1PL = ~(1 << 0); маска разрешённых прерываний ядра для приоритетного обработчика 10_1PL. */ +#define MINT10_1PL ~(1 << 0) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT10_1PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 10_1PL. */ +#define MINT10_1PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT2PL >= INT10PL) или (INT2PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT2PL >= INT10PL) || (INT2PL == 0) +/* Задаёт MINT10_2PL = ~(1 << 1); маска разрешённых прерываний ядра для приоритетного обработчика 10_2PL. */ +#define MINT10_2PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT10_2PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 10_2PL. */ +#define MINT10_2PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT3PL >= INT10PL) или (INT3PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT3PL >= INT10PL) || (INT3PL == 0) +/* Задаёт MINT10_3PL = ~(1 << 2); маска разрешённых прерываний ядра для приоритетного обработчика 10_3PL. */ +#define MINT10_3PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT10_3PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 10_3PL. */ +#define MINT10_3PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT4PL >= INT10PL) или (INT4PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT4PL >= INT10PL) || (INT4PL == 0) +/* Задаёт MINT10_4PL = ~(1 << 3); маска разрешённых прерываний ядра для приоритетного обработчика 10_4PL. */ +#define MINT10_4PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT10_4PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 10_4PL. */ +#define MINT10_4PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT5PL >= INT10PL) или (INT5PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT5PL >= INT10PL) || (INT5PL == 0) +/* Задаёт MINT10_5PL = ~(1 << 4); маска разрешённых прерываний ядра для приоритетного обработчика 10_5PL. */ +#define MINT10_5PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT10_5PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 10_5PL. */ +#define MINT10_5PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT6PL >= INT10PL) или (INT6PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT6PL >= INT10PL) || (INT6PL == 0) +/* Задаёт MINT10_6PL = ~(1 << 5); маска разрешённых прерываний ядра для приоритетного обработчика 10_6PL. */ +#define MINT10_6PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT10_6PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 10_6PL. */ +#define MINT10_6PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT7PL >= INT10PL) или (INT7PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT7PL >= INT10PL) || (INT7PL == 0) +/* Задаёт MINT10_7PL = ~(1 << 6); маска разрешённых прерываний ядра для приоритетного обработчика 10_7PL. */ +#define MINT10_7PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT10_7PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 10_7PL. */ +#define MINT10_7PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT8PL >= INT10PL) или (INT8PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT8PL >= INT10PL) || (INT8PL == 0) +/* Задаёт MINT10_8PL = ~(1 << 7); маска разрешённых прерываний ядра для приоритетного обработчика 10_8PL. */ +#define MINT10_8PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT10_8PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 10_8PL. */ +#define MINT10_8PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT9PL >= INT10PL) или (INT9PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT9PL >= INT10PL) || (INT9PL == 0) +/* Задаёт MINT10_9PL = ~(1 << 8); маска разрешённых прерываний ядра для приоритетного обработчика 10_9PL. */ +#define MINT10_9PL ~(1 << 8) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT10_9PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 10_9PL. */ +#define MINT10_9PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT10PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT10PL == 0) +/* Задаёт MINT10_10PL = ~(1 << 9); маска разрешённых прерываний ядра для приоритетного обработчика 10_10PL. */ +#define MINT10_10PL ~(1 << 9) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT10_10PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 10_10PL. */ +#define MINT10_10PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT11PL >= INT10PL) или (INT11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT11PL >= INT10PL) || (INT11PL == 0) +/* Задаёт MINT10_11PL = ~(1 << 10); маска разрешённых прерываний ядра для приоритетного обработчика 10_11PL. */ +#define MINT10_11PL ~(1 << 10) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT10_11PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 10_11PL. */ +#define MINT10_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT12PL >= INT10PL) или (INT12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT12PL >= INT10PL) || (INT12PL == 0) +/* Задаёт MINT10_12PL = ~(1 << 11); маска разрешённых прерываний ядра для приоритетного обработчика 10_12PL. */ +#define MINT10_12PL ~(1 << 11) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT10_12PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 10_12PL. */ +#define MINT10_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT13PL >= INT10PL) или (INT13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT13PL >= INT10PL) || (INT13PL == 0) +/* Задаёт MINT10_13PL = ~(1 << 12); маска разрешённых прерываний ядра для приоритетного обработчика 10_13PL. */ +#define MINT10_13PL ~(1 << 12) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT10_13PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 10_13PL. */ +#define MINT10_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT14PL >= INT10PL) или (INT14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT14PL >= INT10PL) || (INT14PL == 0) +/* Задаёт MINT10_14PL = ~(1 << 13); маска разрешённых прерываний ядра для приоритетного обработчика 10_14PL. */ +#define MINT10_14PL ~(1 << 13) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT10_14PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 10_14PL. */ +#define MINT10_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT15PL >= INT10PL) или (INT15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT15PL >= INT10PL) || (INT15PL == 0) +/* Задаёт MINT10_15PL = ~(1 << 14); маска разрешённых прерываний ядра для приоритетного обработчика 10_15PL. */ +#define MINT10_15PL ~(1 << 14) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT10_15PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 10_15PL. */ +#define MINT10_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT16PL >= INT10PL) или (INT16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT16PL >= INT10PL) || (INT16PL == 0) +/* Задаёт MINT10_16PL = ~(1 << 15); маска разрешённых прерываний ядра для приоритетного обработчика 10_16PL. */ +#define MINT10_16PL ~(1 << 15) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT10_16PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 10_16PL. */ +#define MINT10_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Задаёт MINT10 = (MINT10_1PL & MINT10_2PL & MINT10_3PL & MINT10_4PL &; маска разрешённых прерываний ядра для приоритетного обработчика 10. */ +#define MINT10 (MINT10_1PL & MINT10_2PL & MINT10_3PL & MINT10_4PL & \ + MINT10_5PL & MINT10_6PL & MINT10_7PL & MINT10_8PL & /* Продолжает список аргументов, полей или выражение MINT10_5PL & MINT10_6PL & MINT10_7PL & MINT10_8PL &; порядок элементов сохраняется. */ \ + MINT10_9PL & MINT10_10PL & MINT10_11PL & MINT10_12PL & /* Продолжает список аргументов, полей или выражение MINT10_9PL & MINT10_10PL & MINT10_11PL & MINT10_12PL &; порядок элементов сохраняется. */ \ + MINT10_13PL & MINT10_14PL & MINT10_15PL & MINT10_16PL) /* Продолжает список аргументов, полей или выражение MINT10_13PL & MINT10_14PL & MINT10_15PL & MINT10_16PL); порядок элементов сохраняется. */ +// End Of MINT10. + +// Beginning of MINT11: +/* Условие компиляции (INT1PL >= INT11PL) или (INT1PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT1PL >= INT11PL) || (INT1PL == 0) +/* Задаёт MINT11_1PL = ~(1 << 0); маска разрешённых прерываний ядра для приоритетного обработчика 11_1PL. */ +#define MINT11_1PL ~(1 << 0) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT11_1PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 11_1PL. */ +#define MINT11_1PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT2PL >= INT11PL) или (INT2PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT2PL >= INT11PL) || (INT2PL == 0) +/* Задаёт MINT11_2PL = ~(1 << 1); маска разрешённых прерываний ядра для приоритетного обработчика 11_2PL. */ +#define MINT11_2PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT11_2PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 11_2PL. */ +#define MINT11_2PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT3PL >= INT11PL) или (INT3PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT3PL >= INT11PL) || (INT3PL == 0) +/* Задаёт MINT11_3PL = ~(1 << 2); маска разрешённых прерываний ядра для приоритетного обработчика 11_3PL. */ +#define MINT11_3PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT11_3PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 11_3PL. */ +#define MINT11_3PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT4PL >= INT11PL) или (INT4PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT4PL >= INT11PL) || (INT4PL == 0) +/* Задаёт MINT11_4PL = ~(1 << 3); маска разрешённых прерываний ядра для приоритетного обработчика 11_4PL. */ +#define MINT11_4PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT11_4PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 11_4PL. */ +#define MINT11_4PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT5PL >= INT11PL) или (INT5PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT5PL >= INT11PL) || (INT5PL == 0) +/* Задаёт MINT11_5PL = ~(1 << 4); маска разрешённых прерываний ядра для приоритетного обработчика 11_5PL. */ +#define MINT11_5PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT11_5PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 11_5PL. */ +#define MINT11_5PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT6PL >= INT11PL) или (INT6PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT6PL >= INT11PL) || (INT6PL == 0) +/* Задаёт MINT11_6PL = ~(1 << 5); маска разрешённых прерываний ядра для приоритетного обработчика 11_6PL. */ +#define MINT11_6PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT11_6PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 11_6PL. */ +#define MINT11_6PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT7PL >= INT11PL) или (INT7PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT7PL >= INT11PL) || (INT7PL == 0) +/* Задаёт MINT11_7PL = ~(1 << 6); маска разрешённых прерываний ядра для приоритетного обработчика 11_7PL. */ +#define MINT11_7PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT11_7PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 11_7PL. */ +#define MINT11_7PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT8PL >= INT11PL) или (INT8PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT8PL >= INT11PL) || (INT8PL == 0) +/* Задаёт MINT11_8PL = ~(1 << 7); маска разрешённых прерываний ядра для приоритетного обработчика 11_8PL. */ +#define MINT11_8PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT11_8PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 11_8PL. */ +#define MINT11_8PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT9PL >= INT11PL) или (INT9PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT9PL >= INT11PL) || (INT9PL == 0) +/* Задаёт MINT11_9PL = ~(1 << 8); маска разрешённых прерываний ядра для приоритетного обработчика 11_9PL. */ +#define MINT11_9PL ~(1 << 8) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT11_9PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 11_9PL. */ +#define MINT11_9PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT10PL >= INT11PL) или (INT10PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT10PL >= INT11PL) || (INT10PL == 0) +/* Задаёт MINT11_10PL = ~(1 << 9); маска разрешённых прерываний ядра для приоритетного обработчика 11_10PL. */ +#define MINT11_10PL ~(1 << 9) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT11_10PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 11_10PL. */ +#define MINT11_10PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT11PL == 0) +/* Задаёт MINT11_11PL = ~(1 << 10); маска разрешённых прерываний ядра для приоритетного обработчика 11_11PL. */ +#define MINT11_11PL ~(1 << 10) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT11_11PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 11_11PL. */ +#define MINT11_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT12PL >= INT11PL) или (INT12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT12PL >= INT11PL) || (INT12PL == 0) +/* Задаёт MINT11_12PL = ~(1 << 11); маска разрешённых прерываний ядра для приоритетного обработчика 11_12PL. */ +#define MINT11_12PL ~(1 << 11) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT11_12PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 11_12PL. */ +#define MINT11_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT13PL >= INT11PL) или (INT13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT13PL >= INT11PL) || (INT13PL == 0) +/* Задаёт MINT11_13PL = ~(1 << 12); маска разрешённых прерываний ядра для приоритетного обработчика 11_13PL. */ +#define MINT11_13PL ~(1 << 12) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT11_13PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 11_13PL. */ +#define MINT11_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT14PL >= INT11PL) или (INT14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT14PL >= INT11PL) || (INT14PL == 0) +/* Задаёт MINT11_14PL = ~(1 << 13); маска разрешённых прерываний ядра для приоритетного обработчика 11_14PL. */ +#define MINT11_14PL ~(1 << 13) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT11_14PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 11_14PL. */ +#define MINT11_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT15PL >= INT11PL) или (INT15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT15PL >= INT11PL) || (INT15PL == 0) +/* Задаёт MINT11_15PL = ~(1 << 14); маска разрешённых прерываний ядра для приоритетного обработчика 11_15PL. */ +#define MINT11_15PL ~(1 << 14) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT11_15PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 11_15PL. */ +#define MINT11_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT16PL >= INT11PL) или (INT16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT16PL >= INT11PL) || (INT16PL == 0) +/* Задаёт MINT11_16PL = ~(1 << 15); маска разрешённых прерываний ядра для приоритетного обработчика 11_16PL. */ +#define MINT11_16PL ~(1 << 15) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT11_16PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 11_16PL. */ +#define MINT11_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Задаёт MINT11 = (MINT11_1PL & MINT11_2PL & MINT11_3PL & MINT11_4PL &; маска разрешённых прерываний ядра для приоритетного обработчика 11. */ +#define MINT11 (MINT11_1PL & MINT11_2PL & MINT11_3PL & MINT11_4PL & \ + MINT11_5PL & MINT11_6PL & MINT11_7PL & MINT11_8PL & /* Продолжает список аргументов, полей или выражение MINT11_5PL & MINT11_6PL & MINT11_7PL & MINT11_8PL &; порядок элементов сохраняется. */ \ + MINT11_9PL & MINT11_10PL & MINT11_11PL & MINT11_12PL & /* Продолжает список аргументов, полей или выражение MINT11_9PL & MINT11_10PL & MINT11_11PL & MINT11_12PL &; порядок элементов сохраняется. */ \ + MINT11_13PL & MINT11_14PL & MINT11_15PL & MINT11_16PL) /* Продолжает список аргументов, полей или выражение MINT11_13PL & MINT11_14PL & MINT11_15PL & MINT11_16PL); порядок элементов сохраняется. */ +// End Of MINT11. + +// Beginning of MINT12: +/* Условие компиляции (INT1PL >= INT12PL) или (INT1PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT1PL >= INT12PL) || (INT1PL == 0) +/* Задаёт MINT12_1PL = ~(1 << 0); маска разрешённых прерываний ядра для приоритетного обработчика 12_1PL. */ +#define MINT12_1PL ~(1 << 0) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT12_1PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 12_1PL. */ +#define MINT12_1PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT2PL >= INT12PL) или (INT2PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT2PL >= INT12PL) || (INT2PL == 0) +/* Задаёт MINT12_2PL = ~(1 << 1); маска разрешённых прерываний ядра для приоритетного обработчика 12_2PL. */ +#define MINT12_2PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT12_2PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 12_2PL. */ +#define MINT12_2PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT3PL >= INT12PL) или (INT3PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT3PL >= INT12PL) || (INT3PL == 0) +/* Задаёт MINT12_3PL = ~(1 << 2); маска разрешённых прерываний ядра для приоритетного обработчика 12_3PL. */ +#define MINT12_3PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT12_3PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 12_3PL. */ +#define MINT12_3PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT4PL >= INT12PL) или (INT4PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT4PL >= INT12PL) || (INT4PL == 0) +/* Задаёт MINT12_4PL = ~(1 << 3); маска разрешённых прерываний ядра для приоритетного обработчика 12_4PL. */ +#define MINT12_4PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT12_4PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 12_4PL. */ +#define MINT12_4PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT5PL >= INT12PL) или (INT5PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT5PL >= INT12PL) || (INT5PL == 0) +/* Задаёт MINT12_5PL = ~(1 << 4); маска разрешённых прерываний ядра для приоритетного обработчика 12_5PL. */ +#define MINT12_5PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT12_5PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 12_5PL. */ +#define MINT12_5PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT6PL >= INT12PL) или (INT6PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT6PL >= INT12PL) || (INT6PL == 0) +/* Задаёт MINT12_6PL = ~(1 << 5); маска разрешённых прерываний ядра для приоритетного обработчика 12_6PL. */ +#define MINT12_6PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT12_6PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 12_6PL. */ +#define MINT12_6PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT7PL >= INT12PL) или (INT7PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT7PL >= INT12PL) || (INT7PL == 0) +/* Задаёт MINT12_7PL = ~(1 << 6); маска разрешённых прерываний ядра для приоритетного обработчика 12_7PL. */ +#define MINT12_7PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT12_7PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 12_7PL. */ +#define MINT12_7PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT8PL >= INT12PL) или (INT8PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT8PL >= INT12PL) || (INT8PL == 0) +/* Задаёт MINT12_8PL = ~(1 << 7); маска разрешённых прерываний ядра для приоритетного обработчика 12_8PL. */ +#define MINT12_8PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT12_8PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 12_8PL. */ +#define MINT12_8PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT9PL >= INT12PL) или (INT9PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT9PL >= INT12PL) || (INT9PL == 0) +/* Задаёт MINT12_9PL = ~(1 << 8); маска разрешённых прерываний ядра для приоритетного обработчика 12_9PL. */ +#define MINT12_9PL ~(1 << 8) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT12_9PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 12_9PL. */ +#define MINT12_9PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT10PL >= INT12PL) или (INT10PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT10PL >= INT12PL) || (INT10PL == 0) +/* Задаёт MINT12_10PL = ~(1 << 9); маска разрешённых прерываний ядра для приоритетного обработчика 12_10PL. */ +#define MINT12_10PL ~(1 << 9) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT12_10PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 12_10PL. */ +#define MINT12_10PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT11PL >= INT12PL) или (INT11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT11PL >= INT12PL) || (INT11PL == 0) +/* Задаёт MINT12_11PL = ~(1 << 10); маска разрешённых прерываний ядра для приоритетного обработчика 12_11PL. */ +#define MINT12_11PL ~(1 << 10) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT12_11PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 12_11PL. */ +#define MINT12_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT12PL == 0) +/* Задаёт MINT12_12PL = ~(1 << 11); маска разрешённых прерываний ядра для приоритетного обработчика 12_12PL. */ +#define MINT12_12PL ~(1 << 11) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT12_12PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 12_12PL. */ +#define MINT12_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT13PL >= INT12PL) или (INT13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT13PL >= INT12PL) || (INT13PL == 0) +/* Задаёт MINT12_13PL = ~(1 << 12); маска разрешённых прерываний ядра для приоритетного обработчика 12_13PL. */ +#define MINT12_13PL ~(1 << 12) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT12_13PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 12_13PL. */ +#define MINT12_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT14PL >= INT12PL) или (INT14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT14PL >= INT12PL) || (INT14PL == 0) +/* Задаёт MINT12_14PL = ~(1 << 13); маска разрешённых прерываний ядра для приоритетного обработчика 12_14PL. */ +#define MINT12_14PL ~(1 << 13) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT12_14PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 12_14PL. */ +#define MINT12_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT15PL >= INT12PL) или (INT15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT15PL >= INT12PL) || (INT15PL == 0) +/* Задаёт MINT12_15PL = ~(1 << 14); маска разрешённых прерываний ядра для приоритетного обработчика 12_15PL. */ +#define MINT12_15PL ~(1 << 14) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT12_15PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 12_15PL. */ +#define MINT12_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT16PL >= INT12PL) или (INT16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT16PL >= INT12PL) || (INT16PL == 0) +/* Задаёт MINT12_16PL = ~(1 << 15); маска разрешённых прерываний ядра для приоритетного обработчика 12_16PL. */ +#define MINT12_16PL ~(1 << 15) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT12_16PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 12_16PL. */ +#define MINT12_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Задаёт MINT12 = (MINT12_1PL & MINT12_2PL & MINT12_3PL & MINT12_4PL &; маска разрешённых прерываний ядра для приоритетного обработчика 12. */ +#define MINT12 (MINT12_1PL & MINT12_2PL & MINT12_3PL & MINT12_4PL & \ + MINT12_5PL & MINT12_6PL & MINT12_7PL & MINT12_8PL & /* Продолжает список аргументов, полей или выражение MINT12_5PL & MINT12_6PL & MINT12_7PL & MINT12_8PL &; порядок элементов сохраняется. */ \ + MINT12_9PL & MINT12_10PL & MINT12_11PL & MINT12_12PL & /* Продолжает список аргументов, полей или выражение MINT12_9PL & MINT12_10PL & MINT12_11PL & MINT12_12PL &; порядок элементов сохраняется. */ \ + MINT12_13PL & MINT12_14PL & MINT12_15PL & MINT12_16PL) /* Продолжает список аргументов, полей или выражение MINT12_13PL & MINT12_14PL & MINT12_15PL & MINT12_16PL); порядок элементов сохраняется. */ +// End Of MINT12. + +// Beginning of MINT13: +/* Условие компиляции (INT1PL >= INT13PL) или (INT1PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT1PL >= INT13PL) || (INT1PL == 0) +/* Задаёт MINT13_1PL = ~(1 << 0); маска разрешённых прерываний ядра для приоритетного обработчика 13_1PL. */ +#define MINT13_1PL ~(1 << 0) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT13_1PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 13_1PL. */ +#define MINT13_1PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT2PL >= INT13PL) или (INT2PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT2PL >= INT13PL) || (INT2PL == 0) +/* Задаёт MINT13_2PL = ~(1 << 1); маска разрешённых прерываний ядра для приоритетного обработчика 13_2PL. */ +#define MINT13_2PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT13_2PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 13_2PL. */ +#define MINT13_2PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT3PL >= INT13PL) или (INT3PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT3PL >= INT13PL) || (INT3PL == 0) +/* Задаёт MINT13_3PL = ~(1 << 2); маска разрешённых прерываний ядра для приоритетного обработчика 13_3PL. */ +#define MINT13_3PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT13_3PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 13_3PL. */ +#define MINT13_3PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT4PL >= INT13PL) или (INT4PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT4PL >= INT13PL) || (INT4PL == 0) +/* Задаёт MINT13_4PL = ~(1 << 3); маска разрешённых прерываний ядра для приоритетного обработчика 13_4PL. */ +#define MINT13_4PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT13_4PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 13_4PL. */ +#define MINT13_4PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT5PL >= INT13PL) или (INT5PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT5PL >= INT13PL) || (INT5PL == 0) +/* Задаёт MINT13_5PL = ~(1 << 4); маска разрешённых прерываний ядра для приоритетного обработчика 13_5PL. */ +#define MINT13_5PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT13_5PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 13_5PL. */ +#define MINT13_5PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT6PL >= INT13PL) или (INT6PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT6PL >= INT13PL) || (INT6PL == 0) +/* Задаёт MINT13_6PL = ~(1 << 5); маска разрешённых прерываний ядра для приоритетного обработчика 13_6PL. */ +#define MINT13_6PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT13_6PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 13_6PL. */ +#define MINT13_6PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT7PL >= INT13PL) или (INT7PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT7PL >= INT13PL) || (INT7PL == 0) +/* Задаёт MINT13_7PL = ~(1 << 6); маска разрешённых прерываний ядра для приоритетного обработчика 13_7PL. */ +#define MINT13_7PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT13_7PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 13_7PL. */ +#define MINT13_7PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT8PL >= INT13PL) или (INT8PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT8PL >= INT13PL) || (INT8PL == 0) +/* Задаёт MINT13_8PL = ~(1 << 7); маска разрешённых прерываний ядра для приоритетного обработчика 13_8PL. */ +#define MINT13_8PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT13_8PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 13_8PL. */ +#define MINT13_8PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT9PL >= INT13PL) или (INT9PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT9PL >= INT13PL) || (INT9PL == 0) +/* Задаёт MINT13_9PL = ~(1 << 8); маска разрешённых прерываний ядра для приоритетного обработчика 13_9PL. */ +#define MINT13_9PL ~(1 << 8) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT13_9PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 13_9PL. */ +#define MINT13_9PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT10PL >= INT13PL) или (INT10PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT10PL >= INT13PL) || (INT10PL == 0) +/* Задаёт MINT13_10PL = ~(1 << 9); маска разрешённых прерываний ядра для приоритетного обработчика 13_10PL. */ +#define MINT13_10PL ~(1 << 9) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT13_10PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 13_10PL. */ +#define MINT13_10PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT11PL >= INT13PL) или (INT11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT11PL >= INT13PL) || (INT11PL == 0) +/* Задаёт MINT13_11PL = ~(1 << 10); маска разрешённых прерываний ядра для приоритетного обработчика 13_11PL. */ +#define MINT13_11PL ~(1 << 10) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT13_11PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 13_11PL. */ +#define MINT13_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Задаёт MINT13_12PL = ~(1 << 11); маска разрешённых прерываний ядра для приоритетного обработчика 13_12PL. */ +#define MINT13_12PL ~(1 << 11) + +/* Условие компиляции (INT13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT13PL == 0) +/* Задаёт MINT13_13PL = ~(1 << 12); маска разрешённых прерываний ядра для приоритетного обработчика 13_13PL. */ +#define MINT13_13PL ~(1 << 12) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT13_13PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 13_13PL. */ +#define MINT13_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT14PL >= INT13PL) или (INT14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT14PL >= INT13PL) || (INT14PL == 0) +/* Задаёт MINT13_14PL = ~(1 << 13); маска разрешённых прерываний ядра для приоритетного обработчика 13_14PL. */ +#define MINT13_14PL ~(1 << 13) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT13_14PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 13_14PL. */ +#define MINT13_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT15PL >= INT13PL) или (INT15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT15PL >= INT13PL) || (INT15PL == 0) +/* Задаёт MINT13_15PL = ~(1 << 14); маска разрешённых прерываний ядра для приоритетного обработчика 13_15PL. */ +#define MINT13_15PL ~(1 << 14) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT13_15PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 13_15PL. */ +#define MINT13_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT16PL >= INT13PL) или (INT16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT16PL >= INT13PL) || (INT16PL == 0) +/* Задаёт MINT13_16PL = ~(1 << 15); маска разрешённых прерываний ядра для приоритетного обработчика 13_16PL. */ +#define MINT13_16PL ~(1 << 15) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT13_16PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 13_16PL. */ +#define MINT13_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Задаёт MINT13 = (MINT13_1PL & MINT13_2PL & MINT13_3PL & MINT13_4PL &; маска разрешённых прерываний ядра для приоритетного обработчика 13. */ +#define MINT13 (MINT13_1PL & MINT13_2PL & MINT13_3PL & MINT13_4PL & \ + MINT13_5PL & MINT13_6PL & MINT13_7PL & MINT13_8PL & /* Продолжает список аргументов, полей или выражение MINT13_5PL & MINT13_6PL & MINT13_7PL & MINT13_8PL &; порядок элементов сохраняется. */ \ + MINT13_9PL & MINT13_10PL & MINT13_11PL & MINT13_12PL & /* Продолжает список аргументов, полей или выражение MINT13_9PL & MINT13_10PL & MINT13_11PL & MINT13_12PL &; порядок элементов сохраняется. */ \ + MINT13_13PL & MINT13_14PL & MINT13_15PL & MINT13_16PL) /* Продолжает список аргументов, полей или выражение MINT13_13PL & MINT13_14PL & MINT13_15PL & MINT13_16PL); порядок элементов сохраняется. */ +// End Of MINT13. + +// Beginning of MINT14: +/* Условие компиляции (INT1PL >= INT14PL) или (INT1PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT1PL >= INT14PL) || (INT1PL == 0) +/* Задаёт MINT14_1PL = ~(1 << 0); маска разрешённых прерываний ядра для приоритетного обработчика 14_1PL. */ +#define MINT14_1PL ~(1 << 0) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT14_1PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 14_1PL. */ +#define MINT14_1PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT2PL >= INT14PL) или (INT2PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT2PL >= INT14PL) || (INT2PL == 0) +/* Задаёт MINT14_2PL = ~(1 << 1); маска разрешённых прерываний ядра для приоритетного обработчика 14_2PL. */ +#define MINT14_2PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT14_2PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 14_2PL. */ +#define MINT14_2PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT3PL >= INT14PL) или (INT3PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT3PL >= INT14PL) || (INT3PL == 0) +/* Задаёт MINT14_3PL = ~(1 << 2); маска разрешённых прерываний ядра для приоритетного обработчика 14_3PL. */ +#define MINT14_3PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT14_3PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 14_3PL. */ +#define MINT14_3PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT4PL >= INT14PL) или (INT4PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT4PL >= INT14PL) || (INT4PL == 0) +/* Задаёт MINT14_4PL = ~(1 << 3); маска разрешённых прерываний ядра для приоритетного обработчика 14_4PL. */ +#define MINT14_4PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT14_4PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 14_4PL. */ +#define MINT14_4PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT5PL >= INT14PL) или (INT5PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT5PL >= INT14PL) || (INT5PL == 0) +/* Задаёт MINT14_5PL = ~(1 << 4); маска разрешённых прерываний ядра для приоритетного обработчика 14_5PL. */ +#define MINT14_5PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT14_5PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 14_5PL. */ +#define MINT14_5PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT6PL >= INT14PL) или (INT6PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT6PL >= INT14PL) || (INT6PL == 0) +/* Задаёт MINT14_6PL = ~(1 << 5); маска разрешённых прерываний ядра для приоритетного обработчика 14_6PL. */ +#define MINT14_6PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT14_6PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 14_6PL. */ +#define MINT14_6PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT7PL >= INT14PL) или (INT7PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT7PL >= INT14PL) || (INT7PL == 0) +/* Задаёт MINT14_7PL = ~(1 << 6); маска разрешённых прерываний ядра для приоритетного обработчика 14_7PL. */ +#define MINT14_7PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT14_7PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 14_7PL. */ +#define MINT14_7PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT8PL >= INT14PL) или (INT8PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT8PL >= INT14PL) || (INT8PL == 0) +/* Задаёт MINT14_8PL = ~(1 << 7); маска разрешённых прерываний ядра для приоритетного обработчика 14_8PL. */ +#define MINT14_8PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT14_8PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 14_8PL. */ +#define MINT14_8PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT9PL >= INT14PL) или (INT9PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT9PL >= INT14PL) || (INT9PL == 0) +/* Задаёт MINT14_9PL = ~(1 << 8); маска разрешённых прерываний ядра для приоритетного обработчика 14_9PL. */ +#define MINT14_9PL ~(1 << 8) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT14_9PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 14_9PL. */ +#define MINT14_9PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT10PL >= INT14PL) или (INT10PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT10PL >= INT14PL) || (INT10PL == 0) +/* Задаёт MINT14_10PL = ~(1 << 9); маска разрешённых прерываний ядра для приоритетного обработчика 14_10PL. */ +#define MINT14_10PL ~(1 << 9) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT14_10PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 14_10PL. */ +#define MINT14_10PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT11PL >= INT14PL) или (INT11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT11PL >= INT14PL) || (INT11PL == 0) +/* Задаёт MINT14_11PL = ~(1 << 10); маска разрешённых прерываний ядра для приоритетного обработчика 14_11PL. */ +#define MINT14_11PL ~(1 << 10) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT14_11PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 14_11PL. */ +#define MINT14_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT12PL >= INT14PL) или (INT12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT12PL >= INT14PL) || (INT12PL == 0) +/* Задаёт MINT14_12PL = ~(1 << 11); маска разрешённых прерываний ядра для приоритетного обработчика 14_12PL. */ +#define MINT14_12PL ~(1 << 11) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT14_12PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 14_12PL. */ +#define MINT14_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT13PL >= INT14PL) или (INT13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT13PL >= INT14PL) || (INT13PL == 0) +/* Задаёт MINT14_13PL = ~(1 << 12); маска разрешённых прерываний ядра для приоритетного обработчика 14_13PL. */ +#define MINT14_13PL ~(1 << 12) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT14_13PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 14_13PL. */ +#define MINT14_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Задаёт MINT14_14PL = ~(1 << 13); маска разрешённых прерываний ядра для приоритетного обработчика 14_14PL. */ +#define MINT14_14PL ~(1 << 13) + +/* Условие компиляции (INT15PL >= INT14PL) или (INT15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT15PL >= INT14PL) || (INT15PL == 0) +/* Задаёт MINT14_15PL = ~(1 << 14); маска разрешённых прерываний ядра для приоритетного обработчика 14_15PL. */ +#define MINT14_15PL ~(1 << 14) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT14_15PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 14_15PL. */ +#define MINT14_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT16PL >= INT14PL) или (INT16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT16PL >= INT14PL) || (INT16PL == 0) +/* Задаёт MINT14_16PL = ~(1 << 15); маска разрешённых прерываний ядра для приоритетного обработчика 14_16PL. */ +#define MINT14_16PL ~(1 << 15) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT14_16PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 14_16PL. */ +#define MINT14_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Задаёт MINT14 = (MINT14_1PL & MINT14_2PL & MINT14_3PL & MINT14_4PL &; маска разрешённых прерываний ядра для приоритетного обработчика 14. */ +#define MINT14 (MINT14_1PL & MINT14_2PL & MINT14_3PL & MINT14_4PL & \ + MINT14_5PL & MINT14_6PL & MINT14_7PL & MINT14_8PL & /* Продолжает список аргументов, полей или выражение MINT14_5PL & MINT14_6PL & MINT14_7PL & MINT14_8PL &; порядок элементов сохраняется. */ \ + MINT14_9PL & MINT14_10PL & MINT14_11PL & MINT14_12PL & /* Продолжает список аргументов, полей или выражение MINT14_9PL & MINT14_10PL & MINT14_11PL & MINT14_12PL &; порядок элементов сохраняется. */ \ + MINT14_13PL & MINT14_14PL & MINT14_15PL & MINT14_16PL) /* Продолжает список аргументов, полей или выражение MINT14_13PL & MINT14_14PL & MINT14_15PL & MINT14_16PL); порядок элементов сохраняется. */ +// End Of MINT14. + +// Beginning of MINT15: +/* Условие компиляции (INT1PL >= INT15PL) или (INT1PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT1PL >= INT15PL) || (INT1PL == 0) +/* Задаёт MINT15_1PL = ~(1 << 0); маска разрешённых прерываний ядра для приоритетного обработчика 15_1PL. */ +#define MINT15_1PL ~(1 << 0) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT15_1PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 15_1PL. */ +#define MINT15_1PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT2PL >= INT15PL) или (INT2PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT2PL >= INT15PL) || (INT2PL == 0) +/* Задаёт MINT15_2PL = ~(1 << 1); маска разрешённых прерываний ядра для приоритетного обработчика 15_2PL. */ +#define MINT15_2PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT15_2PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 15_2PL. */ +#define MINT15_2PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT3PL >= INT15PL) или (INT3PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT3PL >= INT15PL) || (INT3PL == 0) +/* Задаёт MINT15_3PL = ~(1 << 2); маска разрешённых прерываний ядра для приоритетного обработчика 15_3PL. */ +#define MINT15_3PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT15_3PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 15_3PL. */ +#define MINT15_3PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT4PL >= INT15PL) или (INT4PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT4PL >= INT15PL) || (INT4PL == 0) +/* Задаёт MINT15_4PL = ~(1 << 3); маска разрешённых прерываний ядра для приоритетного обработчика 15_4PL. */ +#define MINT15_4PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT15_4PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 15_4PL. */ +#define MINT15_4PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT5PL >= INT15PL) или (INT5PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT5PL >= INT15PL) || (INT5PL == 0) +/* Задаёт MINT15_5PL = ~(1 << 4); маска разрешённых прерываний ядра для приоритетного обработчика 15_5PL. */ +#define MINT15_5PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT15_5PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 15_5PL. */ +#define MINT15_5PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT6PL >= INT15PL) или (INT6PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT6PL >= INT15PL) || (INT6PL == 0) +/* Задаёт MINT15_6PL = ~(1 << 5); маска разрешённых прерываний ядра для приоритетного обработчика 15_6PL. */ +#define MINT15_6PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT15_6PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 15_6PL. */ +#define MINT15_6PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT7PL >= INT15PL) или (INT7PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT7PL >= INT15PL) || (INT7PL == 0) +/* Задаёт MINT15_7PL = ~(1 << 6); маска разрешённых прерываний ядра для приоритетного обработчика 15_7PL. */ +#define MINT15_7PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT15_7PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 15_7PL. */ +#define MINT15_7PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT8PL >= INT15PL) или (INT8PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT8PL >= INT15PL) || (INT8PL == 0) +/* Задаёт MINT15_8PL = ~(1 << 7); маска разрешённых прерываний ядра для приоритетного обработчика 15_8PL. */ +#define MINT15_8PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT15_8PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 15_8PL. */ +#define MINT15_8PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT9PL >= INT15PL) или (INT9PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT9PL >= INT15PL) || (INT9PL == 0) +/* Задаёт MINT15_9PL = ~(1 << 8); маска разрешённых прерываний ядра для приоритетного обработчика 15_9PL. */ +#define MINT15_9PL ~(1 << 8) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT15_9PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 15_9PL. */ +#define MINT15_9PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT10PL >= INT15PL) или (INT10PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT10PL >= INT15PL) || (INT10PL == 0) +/* Задаёт MINT15_10PL = ~(1 << 9); маска разрешённых прерываний ядра для приоритетного обработчика 15_10PL. */ +#define MINT15_10PL ~(1 << 9) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT15_10PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 15_10PL. */ +#define MINT15_10PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT11PL >= INT15PL) или (INT11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT11PL >= INT15PL) || (INT11PL == 0) +/* Задаёт MINT15_11PL = ~(1 << 10); маска разрешённых прерываний ядра для приоритетного обработчика 15_11PL. */ +#define MINT15_11PL ~(1 << 10) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT15_11PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 15_11PL. */ +#define MINT15_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT12PL >= INT15PL) или (INT12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT12PL >= INT15PL) || (INT12PL == 0) +/* Задаёт MINT15_12PL = ~(1 << 11); маска разрешённых прерываний ядра для приоритетного обработчика 15_12PL. */ +#define MINT15_12PL ~(1 << 11) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT15_12PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 15_12PL. */ +#define MINT15_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT13PL >= INT15PL) или (INT13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT13PL >= INT15PL) || (INT13PL == 0) +/* Задаёт MINT15_13PL = ~(1 << 12); маска разрешённых прерываний ядра для приоритетного обработчика 15_13PL. */ +#define MINT15_13PL ~(1 << 12) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT15_13PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 15_13PL. */ +#define MINT15_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT14PL >= INT15PL) или (INT14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT14PL >= INT15PL) || (INT14PL == 0) +/* Задаёт MINT15_14PL = ~(1 << 13); маска разрешённых прерываний ядра для приоритетного обработчика 15_14PL. */ +#define MINT15_14PL ~(1 << 13) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT15_14PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 15_14PL. */ +#define MINT15_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Задаёт MINT15_15PL = ~(1 << 14); маска разрешённых прерываний ядра для приоритетного обработчика 15_15PL. */ +#define MINT15_15PL ~(1 << 14) + +/* Условие компиляции (INT16PL >= INT15PL) или (INT16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT16PL >= INT15PL) || (INT16PL == 0) +/* Задаёт MINT15_16PL = ~(1 << 15); маска разрешённых прерываний ядра для приоритетного обработчика 15_16PL. */ +#define MINT15_16PL ~(1 << 15) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT15_16PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 15_16PL. */ +#define MINT15_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Задаёт MINT15 = (MINT15_1PL & MINT15_2PL & MINT15_3PL & MINT15_4PL &; маска разрешённых прерываний ядра для приоритетного обработчика 15. */ +#define MINT15 (MINT15_1PL & MINT15_2PL & MINT15_3PL & MINT15_4PL & \ + MINT15_5PL & MINT15_6PL & MINT15_7PL & MINT15_8PL & /* Продолжает список аргументов, полей или выражение MINT15_5PL & MINT15_6PL & MINT15_7PL & MINT15_8PL &; порядок элементов сохраняется. */ \ + MINT15_9PL & MINT15_10PL & MINT15_11PL & MINT15_12PL & /* Продолжает список аргументов, полей или выражение MINT15_9PL & MINT15_10PL & MINT15_11PL & MINT15_12PL &; порядок элементов сохраняется. */ \ + MINT15_13PL & MINT15_14PL & MINT15_15PL & MINT15_16PL) /* Продолжает список аргументов, полей или выражение MINT15_13PL & MINT15_14PL & MINT15_15PL & MINT15_16PL); порядок элементов сохраняется. */ +// End Of MINT15. + +// Beginning of MINT16: +/* Условие компиляции (INT1PL >= INT16PL) или (INT1PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT1PL >= INT16PL) || (INT1PL == 0) +/* Задаёт MINT16_1PL = ~(1 << 0); маска разрешённых прерываний ядра для приоритетного обработчика 16_1PL. */ +#define MINT16_1PL ~(1 << 0) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT16_1PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 16_1PL. */ +#define MINT16_1PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT2PL >= INT16PL) или (INT2PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT2PL >= INT16PL) || (INT2PL == 0) +/* Задаёт MINT16_2PL = ~(1 << 1); маска разрешённых прерываний ядра для приоритетного обработчика 16_2PL. */ +#define MINT16_2PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT16_2PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 16_2PL. */ +#define MINT16_2PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT3PL >= INT16PL) или (INT3PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT3PL >= INT16PL) || (INT3PL == 0) +/* Задаёт MINT16_3PL = ~(1 << 2); маска разрешённых прерываний ядра для приоритетного обработчика 16_3PL. */ +#define MINT16_3PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT16_3PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 16_3PL. */ +#define MINT16_3PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT4PL >= INT16PL) или (INT4PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT4PL >= INT16PL) || (INT4PL == 0) +/* Задаёт MINT16_4PL = ~(1 << 3); маска разрешённых прерываний ядра для приоритетного обработчика 16_4PL. */ +#define MINT16_4PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT16_4PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 16_4PL. */ +#define MINT16_4PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT5PL >= INT16PL) или (INT5PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT5PL >= INT16PL) || (INT5PL == 0) +/* Задаёт MINT16_5PL = ~(1 << 4); маска разрешённых прерываний ядра для приоритетного обработчика 16_5PL. */ +#define MINT16_5PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT16_5PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 16_5PL. */ +#define MINT16_5PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT6PL >= INT16PL) или (INT6PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT6PL >= INT16PL) || (INT6PL == 0) +/* Задаёт MINT16_6PL = ~(1 << 5); маска разрешённых прерываний ядра для приоритетного обработчика 16_6PL. */ +#define MINT16_6PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT16_6PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 16_6PL. */ +#define MINT16_6PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT7PL >= INT16PL) или (INT7PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT7PL >= INT16PL) || (INT7PL == 0) +/* Задаёт MINT16_7PL = ~(1 << 6); маска разрешённых прерываний ядра для приоритетного обработчика 16_7PL. */ +#define MINT16_7PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT16_7PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 16_7PL. */ +#define MINT16_7PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT8PL >= INT16PL) или (INT8PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT8PL >= INT16PL) || (INT8PL == 0) +/* Задаёт MINT16_8PL = ~(1 << 7); маска разрешённых прерываний ядра для приоритетного обработчика 16_8PL. */ +#define MINT16_8PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT16_8PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 16_8PL. */ +#define MINT16_8PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT9PL >= INT16PL) или (INT9PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT9PL >= INT16PL) || (INT9PL == 0) +/* Задаёт MINT16_9PL = ~(1 << 8); маска разрешённых прерываний ядра для приоритетного обработчика 16_9PL. */ +#define MINT16_9PL ~(1 << 8) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT16_9PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 16_9PL. */ +#define MINT16_9PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT10PL >= INT16PL) или (INT10PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT10PL >= INT16PL) || (INT10PL == 0) +/* Задаёт MINT16_10PL = ~(1 << 9); маска разрешённых прерываний ядра для приоритетного обработчика 16_10PL. */ +#define MINT16_10PL ~(1 << 9) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT16_10PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 16_10PL. */ +#define MINT16_10PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT11PL >= INT16PL) или (INT11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT11PL >= INT16PL) || (INT11PL == 0) +/* Задаёт MINT16_11PL = ~(1 << 10); маска разрешённых прерываний ядра для приоритетного обработчика 16_11PL. */ +#define MINT16_11PL ~(1 << 10) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT16_11PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 16_11PL. */ +#define MINT16_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT12PL >= INT16PL) или (INT12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT12PL >= INT16PL) || (INT12PL == 0) +/* Задаёт MINT16_12PL = ~(1 << 11); маска разрешённых прерываний ядра для приоритетного обработчика 16_12PL. */ +#define MINT16_12PL ~(1 << 11) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT16_12PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 16_12PL. */ +#define MINT16_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT13PL >= INT16PL) или (INT13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT13PL >= INT16PL) || (INT13PL == 0) +/* Задаёт MINT16_13PL = ~(1 << 12); маска разрешённых прерываний ядра для приоритетного обработчика 16_13PL. */ +#define MINT16_13PL ~(1 << 12) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT16_13PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 16_13PL. */ +#define MINT16_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT14PL >= INT16PL) или (INT14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT14PL >= INT16PL) || (INT14PL == 0) +/* Задаёт MINT16_14PL = ~(1 << 13); маска разрешённых прерываний ядра для приоритетного обработчика 16_14PL. */ +#define MINT16_14PL ~(1 << 13) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT16_14PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 16_14PL. */ +#define MINT16_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (INT15PL >= INT16PL) или (INT15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (INT15PL >= INT16PL) || (INT15PL == 0) +/* Задаёт MINT16_15PL = ~(1 << 14); маска разрешённых прерываний ядра для приоритетного обработчика 16_15PL. */ +#define MINT16_15PL ~(1 << 14) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MINT16_15PL = 0xFFFF; маска разрешённых прерываний ядра для приоритетного обработчика 16_15PL. */ +#define MINT16_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Задаёт MINT16_16PL = ~(1 << 15); маска разрешённых прерываний ядра для приоритетного обработчика 16_16PL. */ +#define MINT16_16PL ~(1 << 15) + +/* Задаёт MINT16 = (MINT16_1PL & MINT16_2PL & MINT16_3PL & MINT16_4PL &; маска разрешённых прерываний ядра для приоритетного обработчика 16. */ +#define MINT16 (MINT16_1PL & MINT16_2PL & MINT16_3PL & MINT16_4PL & \ + MINT16_5PL & MINT16_6PL & MINT16_7PL & MINT16_8PL & /* Продолжает список аргументов, полей или выражение MINT16_5PL & MINT16_6PL & MINT16_7PL & MINT16_8PL &; порядок элементов сохраняется. */ \ + MINT16_9PL & MINT16_10PL & MINT16_11PL & MINT16_12PL & /* Продолжает список аргументов, полей или выражение MINT16_9PL & MINT16_10PL & MINT16_11PL & MINT16_12PL &; порядок элементов сохраняется. */ \ + MINT16_13PL & MINT16_14PL & MINT16_15PL & MINT16_16PL) /* Продолжает список аргументов, полей или выражение MINT16_13PL & MINT16_14PL & MINT16_15PL & MINT16_16PL); порядок элементов сохраняется. */ +// End Of MINT16. + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG11 to MG18: + +// Beginning of MG11: +/* Условие компиляции (G12PL >= G11PL) или (G12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G12PL >= G11PL) || (G12PL == 0) +/* Задаёт MG11_12PL = ~(1 << 1); данные MG11_12PL. */ +#define MG11_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG11_12PL = 0xFFFF; данные MG11_12PL. */ +#define MG11_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (G13PL >= G11PL) или (G13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G13PL >= G11PL) || (G13PL == 0) +/* Задаёт MG11_13PL = ~(1 << 2); данные MG11_13PL. */ +#define MG11_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG11_13PL = 0xFFFF; данные MG11_13PL. */ +#define MG11_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (G14PL >= G11PL) или (G14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G14PL >= G11PL) || (G14PL == 0) +/* Задаёт MG11_14PL = ~(1 << 3); данные MG11_14PL. */ +#define MG11_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG11_14PL = 0xFFFF; данные MG11_14PL. */ +#define MG11_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (G15PL >= G11PL) или (G15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G15PL >= G11PL) || (G15PL == 0) +/* Задаёт MG11_15PL = ~(1 << 4); данные MG11_15PL. */ +#define MG11_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG11_15PL = 0xFFFF; данные MG11_15PL. */ +#define MG11_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (G16PL >= G11PL) или (G16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G16PL >= G11PL) || (G16PL == 0) +/* Задаёт MG11_16PL = ~(1 << 5); данные MG11_16PL. */ +#define MG11_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG11_16PL = 0xFFFF; данные MG11_16PL. */ +#define MG11_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (G17PL >= G11PL) или (G17PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G17PL >= G11PL) || (G17PL == 0) +/* Задаёт MG11_17PL = ~(1 << 6); данные MG11_17PL. */ +#define MG11_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG11_17PL = 0xFFFF; данные MG11_17PL. */ +#define MG11_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции (G18PL >= G11PL) или (G18PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G18PL >= G11PL) || (G18PL == 0) +/* Задаёт MG11_18PL = ~(1 << 7); данные MG11_18PL. */ +#define MG11_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG11_18PL = 0xFFFF; данные MG11_18PL. */ +#define MG11_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Задаёт MG11_11PL = 0x00FE; данные MG11_11PL. */ +#define MG11_11PL 0x00FE +/* Задаёт MG11 = (MG11_11PL & MG11_12PL & MG11_13PL & MG11_14PL &; маска разрешённых прерываний внутри группы PIE 11. */ +#define MG11 (MG11_11PL & MG11_12PL & MG11_13PL & MG11_14PL & \ + MG11_15PL & MG11_16PL & MG11_17PL & MG11_18PL) /* Продолжает список аргументов, полей или выражение MG11_15PL & MG11_16PL & MG11_17PL & MG11_18PL); порядок элементов сохраняется. */ +// End of MG11: + +// Beginning of MG12: +/* Условие компиляции (G11PL >= G12PL) или (G11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G11PL >= G12PL) || (G11PL == 0) +/* Задаёт MG12_11PL = ~(1); данные MG12_11PL. */ +#define MG12_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG12_11PL = 0xFFFF; данные MG12_11PL. */ +#define MG12_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G13PL >= G12PL) или (G13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G13PL >= G12PL) || (G13PL == 0) +/* Задаёт MG12_13PL = ~(1 << 2); данные MG12_13PL. */ +#define MG12_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG12_13PL = 0xFFFF; данные MG12_13PL. */ +#define MG12_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G14PL >= G12PL) или (G14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G14PL >= G12PL) || (G14PL == 0) +/* Задаёт MG12_14PL = ~(1 << 3); данные MG12_14PL. */ +#define MG12_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG12_14PL = 0xFFFF; данные MG12_14PL. */ +#define MG12_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G15PL >= G12PL) или (G15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G15PL >= G12PL) || (G15PL == 0) +/* Задаёт MG12_15PL = ~(1 << 4); данные MG12_15PL. */ +#define MG12_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG12_15PL = 0xFFFF; данные MG12_15PL. */ +#define MG12_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G16PL >= G12PL) или (G16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G16PL >= G12PL) || (G16PL == 0) +/* Задаёт MG12_16PL = ~(1 << 5); данные MG12_16PL. */ +#define MG12_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG12_16PL = 0xFFFF; данные MG12_16PL. */ +#define MG12_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G17PL >= G12PL) или (G17PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G17PL >= G12PL) || (G17PL == 0) +/* Задаёт MG12_17PL = ~(1 << 6); данные MG12_17PL. */ +#define MG12_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG12_17PL = 0xFFFF; данные MG12_17PL. */ +#define MG12_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G18PL >= G12PL) или (G18PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G18PL >= G12PL) || (G18PL == 0) +/* Задаёт MG12_18PL = ~(1 << 7); данные MG12_18PL. */ +#define MG12_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG12_18PL = 0xFFFF; данные MG12_18PL. */ +#define MG12_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG12_12PL = 0x00FD; данные MG12_12PL. */ +#define MG12_12PL 0x00FD +/* Задаёт MG12 = (MG12_11PL & MG12_12PL & MG12_13PL & MG12_14PL &; маска разрешённых прерываний внутри группы PIE 12. */ +#define MG12 (MG12_11PL & MG12_12PL & MG12_13PL & MG12_14PL & \ + MG12_15PL & MG12_16PL & MG12_17PL & MG12_18PL) /* Продолжает список аргументов, полей или выражение MG12_15PL & MG12_16PL & MG12_17PL & MG12_18PL); порядок элементов сохраняется. */ +// End of MG12: + +// Beginning of MG13: +/* Условие компиляции (G11PL >= G13PL) или (G11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G11PL >= G13PL) || (G11PL == 0) +/* Задаёт MG13_11PL = ~(1); данные MG13_11PL. */ +#define MG13_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG13_11PL = 0xFFFF; данные MG13_11PL. */ +#define MG13_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G12PL >= G13PL) или (G12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G12PL >= G13PL) || (G12PL == 0) +/* Задаёт MG13_12PL = ~(1 << 1); данные MG13_12PL. */ +#define MG13_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG13_12PL = 0xFFFF; данные MG13_12PL. */ +#define MG13_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G14PL >= G13PL) или (G14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G14PL >= G13PL) || (G14PL == 0) +/* Задаёт MG13_14PL = ~(1 << 3); данные MG13_14PL. */ +#define MG13_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG13_14PL = 0xFFFF; данные MG13_14PL. */ +#define MG13_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G15PL >= G13PL) или (G15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G15PL >= G13PL) || (G15PL == 0) +/* Задаёт MG13_15PL = ~(1 << 4); данные MG13_15PL. */ +#define MG13_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG13_15PL = 0xFFFF; данные MG13_15PL. */ +#define MG13_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G16PL >= G13PL) или (G16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G16PL >= G13PL) || (G16PL == 0) +/* Задаёт MG13_16PL = ~(1 << 5); данные MG13_16PL. */ +#define MG13_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG13_16PL = 0xFFFF; данные MG13_16PL. */ +#define MG13_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G17PL >= G13PL) или (G17PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G17PL >= G13PL) || (G17PL == 0) +/* Задаёт MG13_17PL = ~(1 << 6); данные MG13_17PL. */ +#define MG13_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG13_17PL = 0xFFFF; данные MG13_17PL. */ +#define MG13_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G18PL >= G13PL) или (G18PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G18PL >= G13PL) || (G18PL == 0) +/* Задаёт MG13_18PL = ~(1 << 7); данные MG13_18PL. */ +#define MG13_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG13_18PL = 0xFFFF; данные MG13_18PL. */ +#define MG13_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG13_13PL = 0x00FB; данные MG13_13PL. */ +#define MG13_13PL 0x00FB +/* Задаёт MG13 = (MG13_11PL & MG13_12PL & MG13_13PL & MG13_14PL &; маска разрешённых прерываний внутри группы PIE 13. */ +#define MG13 (MG13_11PL & MG13_12PL & MG13_13PL & MG13_14PL & \ + MG13_15PL & MG13_16PL & MG13_17PL & MG13_18PL) /* Продолжает список аргументов, полей или выражение MG13_15PL & MG13_16PL & MG13_17PL & MG13_18PL); порядок элементов сохраняется. */ +// End of MG13: + +// Beginning of MG14: +/* Условие компиляции (G11PL >= G14PL) или (G11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G11PL >= G14PL) || (G11PL == 0) +/* Задаёт MG14_11PL = ~(1); данные MG14_11PL. */ +#define MG14_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG14_11PL = 0xFFFF; данные MG14_11PL. */ +#define MG14_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G12PL >= G14PL) или (G12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G12PL >= G14PL) || (G12PL == 0) +/* Задаёт MG14_12PL = ~(1 << 1); данные MG14_12PL. */ +#define MG14_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG14_12PL = 0xFFFF; данные MG14_12PL. */ +#define MG14_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G13PL >= G14PL) или (G13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G13PL >= G14PL) || (G13PL == 0) +/* Задаёт MG14_13PL = ~(1 << 2); данные MG14_13PL. */ +#define MG14_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG14_13PL = 0xFFFF; данные MG14_13PL. */ +#define MG14_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G15PL >= G14PL) или (G15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G15PL >= G14PL) || (G15PL == 0) +/* Задаёт MG14_15PL = ~(1 << 4); данные MG14_15PL. */ +#define MG14_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG14_15PL = 0xFFFF; данные MG14_15PL. */ +#define MG14_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G16PL >= G14PL) или (G16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G16PL >= G14PL) || (G16PL == 0) +/* Задаёт MG14_16PL = ~(1 << 5); данные MG14_16PL. */ +#define MG14_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG14_16PL = 0xFFFF; данные MG14_16PL. */ +#define MG14_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G17PL >= G14PL) или (G17PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G17PL >= G14PL) || (G17PL == 0) +/* Задаёт MG14_17PL = ~(1 << 6); данные MG14_17PL. */ +#define MG14_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG14_17PL = 0xFFFF; данные MG14_17PL. */ +#define MG14_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G18PL >= G14PL) или (G18PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G18PL >= G14PL) || (G18PL == 0) +/* Задаёт MG14_18PL = ~(1 << 7); данные MG14_18PL. */ +#define MG14_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG14_18PL = 0xFFFF; данные MG14_18PL. */ +#define MG14_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG14_14PL = 0x00F7; данные MG14_14PL. */ +#define MG14_14PL 0x00F7 +/* Задаёт MG14 = (MG14_11PL & MG14_12PL & MG14_13PL & MG14_14PL &; маска разрешённых прерываний внутри группы PIE 14. */ +#define MG14 (MG14_11PL & MG14_12PL & MG14_13PL & MG14_14PL & \ + MG14_15PL & MG14_16PL & MG14_17PL & MG14_18PL) /* Продолжает список аргументов, полей или выражение MG14_15PL & MG14_16PL & MG14_17PL & MG14_18PL); порядок элементов сохраняется. */ +// End of MG14: + +// Beginning of MG15: +/* Условие компиляции (G11PL >= G15PL) или (G11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G11PL >= G15PL) || (G11PL == 0) +/* Задаёт MG15_11PL = ~(1); данные MG15_11PL. */ +#define MG15_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG15_11PL = 0xFFFF; данные MG15_11PL. */ +#define MG15_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G12PL >= G15PL) или (G12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G12PL >= G15PL) || (G12PL == 0) +/* Задаёт MG15_12PL = ~(1 << 1); данные MG15_12PL. */ +#define MG15_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG15_12PL = 0xFFFF; данные MG15_12PL. */ +#define MG15_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G13PL >= G15PL) или (G13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G13PL >= G15PL) || (G13PL == 0) +/* Задаёт MG15_13PL = ~(1 << 2); данные MG15_13PL. */ +#define MG15_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG15_13PL = 0xFFFF; данные MG15_13PL. */ +#define MG15_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G14PL >= G15PL) или (G14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G14PL >= G15PL) || (G14PL == 0) +/* Задаёт MG15_14PL = ~(1 << 3); данные MG15_14PL. */ +#define MG15_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG15_14PL = 0xFFFF; данные MG15_14PL. */ +#define MG15_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G16PL >= G15PL) или (G16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G16PL >= G15PL) || (G16PL == 0) +/* Задаёт MG15_16PL = ~(1 << 5); данные MG15_16PL. */ +#define MG15_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG15_16PL = 0xFFFF; данные MG15_16PL. */ +#define MG15_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G17PL >= G15PL) или (G17PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G17PL >= G15PL) || (G17PL == 0) +/* Задаёт MG15_17PL = ~(1 << 6); данные MG15_17PL. */ +#define MG15_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG15_17PL = 0xFFFF; данные MG15_17PL. */ +#define MG15_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G18PL >= G15PL) или (G18PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G18PL >= G15PL) || (G18PL == 0) +/* Задаёт MG15_18PL = ~(1 << 7); данные MG15_18PL. */ +#define MG15_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG15_18PL = 0xFFFF; данные MG15_18PL. */ +#define MG15_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG15_15PL = 0x00EF; данные MG15_15PL. */ +#define MG15_15PL 0x00EF +/* Задаёт MG15 = (MG15_11PL & MG15_12PL & MG15_13PL & MG15_14PL &; маска разрешённых прерываний внутри группы PIE 15. */ +#define MG15 (MG15_11PL & MG15_12PL & MG15_13PL & MG15_14PL & \ + MG15_15PL & MG15_16PL & MG15_17PL & MG15_18PL) /* Продолжает список аргументов, полей или выражение MG15_15PL & MG15_16PL & MG15_17PL & MG15_18PL); порядок элементов сохраняется. */ +// End of MG15: + +// Beginning of MG16: +/* Условие компиляции (G11PL >= G16PL) или (G11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G11PL >= G16PL) || (G11PL == 0) +/* Задаёт MG16_11PL = ~(1); данные MG16_11PL. */ +#define MG16_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG16_11PL = 0xFFFF; данные MG16_11PL. */ +#define MG16_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G12PL >= G16PL) или (G12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G12PL >= G16PL) || (G12PL == 0) +/* Задаёт MG16_12PL = ~(1 << 1); данные MG16_12PL. */ +#define MG16_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG16_12PL = 0xFFFF; данные MG16_12PL. */ +#define MG16_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G13PL >= G16PL) или (G13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G13PL >= G16PL) || (G13PL == 0) +/* Задаёт MG16_13PL = ~(1 << 2); данные MG16_13PL. */ +#define MG16_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG16_13PL = 0xFFFF; данные MG16_13PL. */ +#define MG16_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G14PL >= G16PL) или (G14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G14PL >= G16PL) || (G14PL == 0) +/* Задаёт MG16_14PL = ~(1 << 3); данные MG16_14PL. */ +#define MG16_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG16_14PL = 0xFFFF; данные MG16_14PL. */ +#define MG16_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G15PL >= G16PL) или (G15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G15PL >= G16PL) || (G15PL == 0) +/* Задаёт MG16_15PL = ~(1 << 4); данные MG16_15PL. */ +#define MG16_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG16_15PL = 0xFFFF; данные MG16_15PL. */ +#define MG16_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G17PL >= G16PL) или (G17PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G17PL >= G16PL) || (G17PL == 0) +/* Задаёт MG16_17PL = ~(1 << 6); данные MG16_17PL. */ +#define MG16_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG16_17PL = 0xFFFF; данные MG16_17PL. */ +#define MG16_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G18PL >= G16PL) или (G18PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G18PL >= G16PL) || (G18PL == 0) +/* Задаёт MG16_18PL = ~(1 << 7); данные MG16_18PL. */ +#define MG16_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG16_18PL = 0xFFFF; данные MG16_18PL. */ +#define MG16_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG16_16PL = 0x00DF; данные MG16_16PL. */ +#define MG16_16PL 0x00DF +/* Задаёт MG16 = (MG16_11PL & MG16_12PL & MG16_13PL & MG16_14PL &; маска разрешённых прерываний внутри группы PIE 16. */ +#define MG16 (MG16_11PL & MG16_12PL & MG16_13PL & MG16_14PL & \ + MG16_15PL & MG16_16PL & MG16_17PL & MG16_18PL) /* Продолжает список аргументов, полей или выражение MG16_15PL & MG16_16PL & MG16_17PL & MG16_18PL); порядок элементов сохраняется. */ +// End of MG16: + +// Beginning of MG17: +/* Условие компиляции (G11PL >= G17PL) или (G11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G11PL >= G17PL) || (G11PL == 0) +/* Задаёт MG17_11PL = ~(1); данные MG17_11PL. */ +#define MG17_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG17_11PL = 0xFFFF; данные MG17_11PL. */ +#define MG17_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G12PL >= G17PL) или (G12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G12PL >= G17PL) || (G12PL == 0) +/* Задаёт MG17_12PL = ~(1 << 1); данные MG17_12PL. */ +#define MG17_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG17_12PL = 0xFFFF; данные MG17_12PL. */ +#define MG17_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G13PL >= G17PL) или (G13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G13PL >= G17PL) || (G13PL == 0) +/* Задаёт MG17_13PL = ~(1 << 2); данные MG17_13PL. */ +#define MG17_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG17_13PL = 0xFFFF; данные MG17_13PL. */ +#define MG17_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G14PL >= G17PL) или (G14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G14PL >= G17PL) || (G14PL == 0) +/* Задаёт MG17_14PL = ~(1 << 3); данные MG17_14PL. */ +#define MG17_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG17_14PL = 0xFFFF; данные MG17_14PL. */ +#define MG17_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G15PL >= G17PL) или (G15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G15PL >= G17PL) || (G15PL == 0) +/* Задаёт MG17_15PL = ~(1 << 4); данные MG17_15PL. */ +#define MG17_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG17_15PL = 0xFFFF; данные MG17_15PL. */ +#define MG17_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G16PL >= G17PL) или (G16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G16PL >= G17PL) || (G16PL == 0) +/* Задаёт MG17_16PL = ~(1 << 5); данные MG17_16PL. */ +#define MG17_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG17_16PL = 0xFFFF; данные MG17_16PL. */ +#define MG17_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G18PL >= G17PL) или (G18PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G18PL >= G17PL) || (G18PL == 0) +/* Задаёт MG17_18PL = ~(1 << 7); данные MG17_18PL. */ +#define MG17_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG17_18PL = 0xFFFF; данные MG17_18PL. */ +#define MG17_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG17_17PL = 0x00BF; данные MG17_17PL. */ +#define MG17_17PL 0x00BF +/* Задаёт MG17 = (MG17_11PL & MG17_12PL & MG17_13PL & MG17_14PL &; маска разрешённых прерываний внутри группы PIE 17. */ +#define MG17 (MG17_11PL & MG17_12PL & MG17_13PL & MG17_14PL & \ + MG17_15PL & MG17_16PL & MG17_17PL & MG17_18PL) /* Продолжает список аргументов, полей или выражение MG17_15PL & MG17_16PL & MG17_17PL & MG17_18PL); порядок элементов сохраняется. */ +// End of MG17: + +// Beginning of MG18: +/* Условие компиляции (G11PL >= G18PL) или (G11PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G11PL >= G18PL) || (G11PL == 0) +/* Задаёт MG18_11PL = ~(1); данные MG18_11PL. */ +#define MG18_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG18_11PL = 0xFFFF; данные MG18_11PL. */ +#define MG18_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G12PL >= G18PL) или (G12PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G12PL >= G18PL) || (G12PL == 0) +/* Задаёт MG18_12PL = ~(1 << 1); данные MG18_12PL. */ +#define MG18_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG18_12PL = 0xFFFF; данные MG18_12PL. */ +#define MG18_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G13PL >= G18PL) или (G13PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G13PL >= G18PL) || (G13PL == 0) +/* Задаёт MG18_13PL = ~(1 << 2); данные MG18_13PL. */ +#define MG18_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG18_13PL = 0xFFFF; данные MG18_13PL. */ +#define MG18_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G14PL >= G18PL) или (G14PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G14PL >= G18PL) || (G14PL == 0) +/* Задаёт MG18_14PL = ~(1 << 3); данные MG18_14PL. */ +#define MG18_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG18_14PL = 0xFFFF; данные MG18_14PL. */ +#define MG18_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G15PL >= G18PL) или (G15PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G15PL >= G18PL) || (G15PL == 0) +/* Задаёт MG18_15PL = ~(1 << 4); данные MG18_15PL. */ +#define MG18_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG18_15PL = 0xFFFF; данные MG18_15PL. */ +#define MG18_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G16PL >= G18PL) или (G16PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G16PL >= G18PL) || (G16PL == 0) +/* Задаёт MG18_16PL = ~(1 << 5); данные MG18_16PL. */ +#define MG18_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG18_16PL = 0xFFFF; данные MG18_16PL. */ +#define MG18_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G17PL >= G18PL) или (G17PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G17PL >= G18PL) || (G17PL == 0) +/* Задаёт MG18_17PL = ~(1 << 6); данные MG18_17PL. */ +#define MG18_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG18_17PL = 0xFFFF; данные MG18_17PL. */ +#define MG18_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG18_18PL = 0x007F; данные MG18_18PL. */ +#define MG18_18PL 0x007F +/* Задаёт MG18 = (MG18_11PL & MG18_12PL & MG18_13PL & MG18_14PL &; маска разрешённых прерываний внутри группы PIE 18. */ +#define MG18 (MG18_11PL & MG18_12PL & MG18_13PL & MG18_14PL & \ + MG18_15PL & MG18_16PL & MG18_17PL & MG18_18PL) /* Продолжает список аргументов, полей или выражение MG18_15PL & MG18_16PL & MG18_17PL & MG18_18PL); порядок элементов сохраняется. */ +// End of MG18: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG21 to MG28: +// + +// Beginning of MG21: +/* Условие компиляции (G22PL >= G21PL) или (G22PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G22PL >= G21PL) || (G22PL == 0) +/* Задаёт MG21_12PL = ~(1 << 1); данные MG21_12PL. */ +#define MG21_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG21_12PL = 0xFFFF; данные MG21_12PL. */ +#define MG21_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G23PL >= G21PL) или (G23PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G23PL >= G21PL) || (G23PL == 0) +/* Задаёт MG21_13PL = ~(1 << 2); данные MG21_13PL. */ +#define MG21_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG21_13PL = 0xFFFF; данные MG21_13PL. */ +#define MG21_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G24PL >= G21PL) или (G24PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G24PL >= G21PL) || (G24PL == 0) +/* Задаёт MG21_14PL = ~(1 << 3); данные MG21_14PL. */ +#define MG21_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG21_14PL = 0xFFFF; данные MG21_14PL. */ +#define MG21_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G25PL >= G21PL) или (G25PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G25PL >= G21PL) || (G25PL == 0) +/* Задаёт MG21_15PL = ~(1 << 4); данные MG21_15PL. */ +#define MG21_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG21_15PL = 0xFFFF; данные MG21_15PL. */ +#define MG21_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G26PL >= G21PL) или (G26PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G26PL >= G21PL) || (G26PL == 0) +/* Задаёт MG21_16PL = ~(1 << 5); данные MG21_16PL. */ +#define MG21_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG21_16PL = 0xFFFF; данные MG21_16PL. */ +#define MG21_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G27PL >= G21PL) или (G27PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G27PL >= G21PL) || (G27PL == 0) +/* Задаёт MG21_17PL = ~(1 << 6); данные MG21_17PL. */ +#define MG21_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG21_17PL = 0xFFFF; данные MG21_17PL. */ +#define MG21_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G28PL >= G21PL) или (G28PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G28PL >= G21PL) || (G28PL == 0) +/* Задаёт MG21_18PL = ~(1 << 7); данные MG21_18PL. */ +#define MG21_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG21_18PL = 0xFFFF; данные MG21_18PL. */ +#define MG21_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG21_11PL = 0x00FE; данные MG21_11PL. */ +#define MG21_11PL 0x00FE +/* Задаёт MG21 = (MG21_11PL & MG21_12PL & MG21_13PL & MG21_14PL &; маска разрешённых прерываний внутри группы PIE 21. */ +#define MG21 (MG21_11PL & MG21_12PL & MG21_13PL & MG21_14PL & \ + MG21_15PL & MG21_16PL & MG21_17PL & MG21_18PL) /* Продолжает список аргументов, полей или выражение MG21_15PL & MG21_16PL & MG21_17PL & MG21_18PL); порядок элементов сохраняется. */ +// End of MG21: + +// Beginning of MG22: +/* Условие компиляции (G21PL >= G22PL) или (G21PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G21PL >= G22PL) || (G21PL == 0) +/* Задаёт MG22_11PL = ~(1); данные MG22_11PL. */ +#define MG22_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG22_11PL = 0xFFFF; данные MG22_11PL. */ +#define MG22_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G23PL >= G22PL) или (G23PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G23PL >= G22PL) || (G23PL == 0) +/* Задаёт MG22_13PL = ~(1 << 2); данные MG22_13PL. */ +#define MG22_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG22_13PL = 0xFFFF; данные MG22_13PL. */ +#define MG22_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G24PL >= G22PL) или (G24PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G24PL >= G22PL) || (G24PL == 0) +/* Задаёт MG22_14PL = ~(1 << 3); данные MG22_14PL. */ +#define MG22_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG22_14PL = 0xFFFF; данные MG22_14PL. */ +#define MG22_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G25PL >= G22PL) или (G25PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G25PL >= G22PL) || (G25PL == 0) +/* Задаёт MG22_15PL = ~(1 << 4); данные MG22_15PL. */ +#define MG22_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG22_15PL = 0xFFFF; данные MG22_15PL. */ +#define MG22_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G26PL >= G22PL) или (G26PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G26PL >= G22PL) || (G26PL == 0) +/* Задаёт MG22_16PL = ~(1 << 5); данные MG22_16PL. */ +#define MG22_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG22_16PL = 0xFFFF; данные MG22_16PL. */ +#define MG22_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G27PL >= G22PL) или (G27PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G27PL >= G22PL) || (G27PL == 0) +/* Задаёт MG22_17PL = ~(1 << 6); данные MG22_17PL. */ +#define MG22_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG22_17PL = 0xFFFF; данные MG22_17PL. */ +#define MG22_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G28PL >= G22PL) или (G28PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G28PL >= G22PL) || (G28PL == 0) +/* Задаёт MG22_18PL = ~(1 << 7); данные MG22_18PL. */ +#define MG22_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG22_18PL = 0xFFFF; данные MG22_18PL. */ +#define MG22_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG22_12PL = 0x00FD; данные MG22_12PL. */ +#define MG22_12PL 0x00FD +/* Задаёт MG22 = (MG22_11PL & MG22_12PL & MG22_13PL & MG22_14PL &; маска разрешённых прерываний внутри группы PIE 22. */ +#define MG22 (MG22_11PL & MG22_12PL & MG22_13PL & MG22_14PL & \ + MG22_15PL & MG22_16PL & MG22_17PL & MG22_18PL) /* Продолжает список аргументов, полей или выражение MG22_15PL & MG22_16PL & MG22_17PL & MG22_18PL); порядок элементов сохраняется. */ +// End of MG22: + +// Beginning of MG23: +/* Условие компиляции (G21PL >= G23PL) или (G21PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G21PL >= G23PL) || (G21PL == 0) +/* Задаёт MG23_11PL = ~(1); данные MG23_11PL. */ +#define MG23_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG23_11PL = 0xFFFF; данные MG23_11PL. */ +#define MG23_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G22PL >= G23PL) или (G22PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G22PL >= G23PL) || (G22PL == 0) +/* Задаёт MG23_12PL = ~(1 << 1); данные MG23_12PL. */ +#define MG23_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG23_12PL = 0xFFFF; данные MG23_12PL. */ +#define MG23_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G24PL >= G23PL) или (G24PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G24PL >= G23PL) || (G24PL == 0) +/* Задаёт MG23_14PL = ~(1 << 3); данные MG23_14PL. */ +#define MG23_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG23_14PL = 0xFFFF; данные MG23_14PL. */ +#define MG23_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G25PL >= G23PL) или (G25PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G25PL >= G23PL) || (G25PL == 0) +/* Задаёт MG23_15PL = ~(1 << 4); данные MG23_15PL. */ +#define MG23_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG23_15PL = 0xFFFF; данные MG23_15PL. */ +#define MG23_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G26PL >= G23PL) или (G26PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G26PL >= G23PL) || (G26PL == 0) +/* Задаёт MG23_16PL = ~(1 << 5); данные MG23_16PL. */ +#define MG23_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG23_16PL = 0xFFFF; данные MG23_16PL. */ +#define MG23_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G27PL >= G23PL) или (G27PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G27PL >= G23PL) || (G27PL == 0) +/* Задаёт MG23_17PL = ~(1 << 6); данные MG23_17PL. */ +#define MG23_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG23_17PL = 0xFFFF; данные MG23_17PL. */ +#define MG23_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G28PL >= G23PL) или (G28PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G28PL >= G23PL) || (G28PL == 0) +/* Задаёт MG23_18PL = ~(1 << 7); данные MG23_18PL. */ +#define MG23_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG23_18PL = 0xFFFF; данные MG23_18PL. */ +#define MG23_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG23_13PL = 0x00FB; данные MG23_13PL. */ +#define MG23_13PL 0x00FB +/* Задаёт MG23 = (MG23_11PL & MG23_12PL & MG23_13PL & MG23_14PL &; маска разрешённых прерываний внутри группы PIE 23. */ +#define MG23 (MG23_11PL & MG23_12PL & MG23_13PL & MG23_14PL & \ + MG23_15PL & MG23_16PL & MG23_17PL & MG23_18PL) /* Продолжает список аргументов, полей или выражение MG23_15PL & MG23_16PL & MG23_17PL & MG23_18PL); порядок элементов сохраняется. */ +// End of MG23: + +// Beginning of MG24: +/* Условие компиляции (G21PL >= G24PL) или (G21PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G21PL >= G24PL) || (G21PL == 0) +/* Задаёт MG24_11PL = ~(1); данные MG24_11PL. */ +#define MG24_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG24_11PL = 0xFFFF; данные MG24_11PL. */ +#define MG24_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G22PL >= G24PL) или (G22PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G22PL >= G24PL) || (G22PL == 0) +/* Задаёт MG24_12PL = ~(1 << 1); данные MG24_12PL. */ +#define MG24_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG24_12PL = 0xFFFF; данные MG24_12PL. */ +#define MG24_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G23PL >= G24PL) или (G23PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G23PL >= G24PL) || (G23PL == 0) +/* Задаёт MG24_13PL = ~(1 << 2); данные MG24_13PL. */ +#define MG24_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG24_13PL = 0xFFFF; данные MG24_13PL. */ +#define MG24_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G25PL >= G24PL) или (G25PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G25PL >= G24PL) || (G25PL == 0) +/* Задаёт MG24_15PL = ~(1 << 4); данные MG24_15PL. */ +#define MG24_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG24_15PL = 0xFFFF; данные MG24_15PL. */ +#define MG24_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G26PL >= G24PL) или (G26PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G26PL >= G24PL) || (G26PL == 0) +/* Задаёт MG24_16PL = ~(1 << 5); данные MG24_16PL. */ +#define MG24_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG24_16PL = 0xFFFF; данные MG24_16PL. */ +#define MG24_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G27PL >= G24PL) или (G27PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G27PL >= G24PL) || (G27PL == 0) +/* Задаёт MG24_17PL = ~(1 << 6); данные MG24_17PL. */ +#define MG24_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG24_17PL = 0xFFFF; данные MG24_17PL. */ +#define MG24_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G28PL >= G24PL) или (G28PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G28PL >= G24PL) || (G28PL == 0) +/* Задаёт MG24_18PL = ~(1 << 7); данные MG24_18PL. */ +#define MG24_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG24_18PL = 0xFFFF; данные MG24_18PL. */ +#define MG24_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG24_14PL = 0x00F7; данные MG24_14PL. */ +#define MG24_14PL 0x00F7 +/* Задаёт MG24 = (MG24_11PL & MG24_12PL & MG24_13PL & MG24_14PL &; маска разрешённых прерываний внутри группы PIE 24. */ +#define MG24 (MG24_11PL & MG24_12PL & MG24_13PL & MG24_14PL & \ + MG24_15PL & MG24_16PL & MG24_17PL & MG24_18PL) /* Продолжает список аргументов, полей или выражение MG24_15PL & MG24_16PL & MG24_17PL & MG24_18PL); порядок элементов сохраняется. */ +// End of MG24: + +// Beginning of MG25: +/* Условие компиляции (G21PL >= G25PL) или (G21PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G21PL >= G25PL) || (G21PL == 0) +/* Задаёт MG25_11PL = ~(1); данные MG25_11PL. */ +#define MG25_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG25_11PL = 0xFFFF; данные MG25_11PL. */ +#define MG25_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G22PL >= G25PL) или (G22PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G22PL >= G25PL) || (G22PL == 0) +/* Задаёт MG25_12PL = ~(1 << 1); данные MG25_12PL. */ +#define MG25_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG25_12PL = 0xFFFF; данные MG25_12PL. */ +#define MG25_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G23PL >= G25PL) или (G23PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G23PL >= G25PL) || (G23PL == 0) +/* Задаёт MG25_13PL = ~(1 << 2); данные MG25_13PL. */ +#define MG25_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG25_13PL = 0xFFFF; данные MG25_13PL. */ +#define MG25_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G24PL >= G25PL) или (G24PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G24PL >= G25PL) || (G24PL == 0) +/* Задаёт MG25_14PL = ~(1 << 3); данные MG25_14PL. */ +#define MG25_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG25_14PL = 0xFFFF; данные MG25_14PL. */ +#define MG25_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G26PL >= G25PL) или (G26PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G26PL >= G25PL) || (G26PL == 0) +/* Задаёт MG25_16PL = ~(1 << 5); данные MG25_16PL. */ +#define MG25_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG25_16PL = 0xFFFF; данные MG25_16PL. */ +#define MG25_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G27PL >= G25PL) или (G27PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G27PL >= G25PL) || (G27PL == 0) +/* Задаёт MG25_17PL = ~(1 << 6); данные MG25_17PL. */ +#define MG25_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG25_17PL = 0xFFFF; данные MG25_17PL. */ +#define MG25_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G28PL >= G25PL) или (G28PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G28PL >= G25PL) || (G28PL == 0) +/* Задаёт MG25_18PL = ~(1 << 7); данные MG25_18PL. */ +#define MG25_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG25_18PL = 0xFFFF; данные MG25_18PL. */ +#define MG25_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG25_15PL = 0x00EF; данные MG25_15PL. */ +#define MG25_15PL 0x00EF +/* Задаёт MG25 = (MG25_11PL & MG25_12PL & MG25_13PL & MG25_14PL &; маска разрешённых прерываний внутри группы PIE 25. */ +#define MG25 (MG25_11PL & MG25_12PL & MG25_13PL & MG25_14PL & \ + MG25_15PL & MG25_16PL & MG25_17PL & MG25_18PL) /* Продолжает список аргументов, полей или выражение MG25_15PL & MG25_16PL & MG25_17PL & MG25_18PL); порядок элементов сохраняется. */ +// End of MG25: + +// Beginning of MG26: +/* Условие компиляции (G21PL >= G26PL) или (G21PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G21PL >= G26PL) || (G21PL == 0) +/* Задаёт MG26_11PL = ~(1); данные MG26_11PL. */ +#define MG26_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG26_11PL = 0xFFFF; данные MG26_11PL. */ +#define MG26_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G22PL >= G26PL) или (G22PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G22PL >= G26PL) || (G22PL == 0) +/* Задаёт MG26_12PL = ~(1 << 1); данные MG26_12PL. */ +#define MG26_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG26_12PL = 0xFFFF; данные MG26_12PL. */ +#define MG26_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G23PL >= G26PL) или (G23PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G23PL >= G26PL) || (G23PL == 0) +/* Задаёт MG26_13PL = ~(1 << 2); данные MG26_13PL. */ +#define MG26_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG26_13PL = 0xFFFF; данные MG26_13PL. */ +#define MG26_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G24PL >= G26PL) или (G24PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G24PL >= G26PL) || (G24PL == 0) +/* Задаёт MG26_14PL = ~(1 << 3); данные MG26_14PL. */ +#define MG26_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG26_14PL = 0xFFFF; данные MG26_14PL. */ +#define MG26_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G25PL >= G26PL) или (G25PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G25PL >= G26PL) || (G25PL == 0) +/* Задаёт MG26_15PL = ~(1 << 4); данные MG26_15PL. */ +#define MG26_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG26_15PL = 0xFFFF; данные MG26_15PL. */ +#define MG26_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G27PL >= G26PL) или (G27PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G27PL >= G26PL) || (G27PL == 0) +/* Задаёт MG26_17PL = ~(1 << 6); данные MG26_17PL. */ +#define MG26_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG26_17PL = 0xFFFF; данные MG26_17PL. */ +#define MG26_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G28PL >= G26PL) или (G28PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G28PL >= G26PL) || (G28PL == 0) +/* Задаёт MG26_18PL = ~(1 << 7); данные MG26_18PL. */ +#define MG26_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG26_18PL = 0xFFFF; данные MG26_18PL. */ +#define MG26_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG26_16PL = 0x00DF; данные MG26_16PL. */ +#define MG26_16PL 0x00DF +/* Задаёт MG26 = (MG26_11PL & MG26_12PL & MG26_13PL & MG26_14PL &; маска разрешённых прерываний внутри группы PIE 26. */ +#define MG26 (MG26_11PL & MG26_12PL & MG26_13PL & MG26_14PL & \ + MG26_15PL & MG26_16PL & MG26_17PL & MG26_18PL) /* Продолжает список аргументов, полей или выражение MG26_15PL & MG26_16PL & MG26_17PL & MG26_18PL); порядок элементов сохраняется. */ +// End of MG26: + +// Beginning of MG27: +/* Условие компиляции (G21PL >= G27PL) или (G21PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G21PL >= G27PL) || (G21PL == 0) +/* Задаёт MG27_11PL = ~(1); данные MG27_11PL. */ +#define MG27_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG27_11PL = 0xFFFF; данные MG27_11PL. */ +#define MG27_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G22PL >= G27PL) или (G22PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G22PL >= G27PL) || (G22PL == 0) +/* Задаёт MG27_12PL = ~(1 << 1); данные MG27_12PL. */ +#define MG27_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG27_12PL = 0xFFFF; данные MG27_12PL. */ +#define MG27_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G23PL >= G27PL) или (G23PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G23PL >= G27PL) || (G23PL == 0) +/* Задаёт MG27_13PL = ~(1 << 2); данные MG27_13PL. */ +#define MG27_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG27_13PL = 0xFFFF; данные MG27_13PL. */ +#define MG27_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G24PL >= G27PL) или (G24PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G24PL >= G27PL) || (G24PL == 0) +/* Задаёт MG27_14PL = ~(1 << 3); данные MG27_14PL. */ +#define MG27_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG27_14PL = 0xFFFF; данные MG27_14PL. */ +#define MG27_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G25PL >= G27PL) или (G25PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G25PL >= G27PL) || (G25PL == 0) +/* Задаёт MG27_15PL = ~(1 << 4); данные MG27_15PL. */ +#define MG27_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG27_15PL = 0xFFFF; данные MG27_15PL. */ +#define MG27_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G26PL >= G27PL) или (G26PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G26PL >= G27PL) || (G26PL == 0) +/* Задаёт MG27_16PL = ~(1 << 5); данные MG27_16PL. */ +#define MG27_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG27_16PL = 0xFFFF; данные MG27_16PL. */ +#define MG27_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G28PL >= G27PL) или (G28PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G28PL >= G27PL) || (G28PL == 0) +/* Задаёт MG27_18PL = ~(1 << 7); данные MG27_18PL. */ +#define MG27_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG27_18PL = 0xFFFF; данные MG27_18PL. */ +#define MG27_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG27_17PL = 0x00BF; данные MG27_17PL. */ +#define MG27_17PL 0x00BF +/* Задаёт MG27 = (MG27_11PL & MG27_12PL & MG27_13PL & MG27_14PL &; маска разрешённых прерываний внутри группы PIE 27. */ +#define MG27 (MG27_11PL & MG27_12PL & MG27_13PL & MG27_14PL & \ + MG27_15PL & MG27_16PL & MG27_17PL & MG27_18PL) /* Продолжает список аргументов, полей или выражение MG27_15PL & MG27_16PL & MG27_17PL & MG27_18PL); порядок элементов сохраняется. */ +// End of MG27: + +// Beginning of MG28: +/* Условие компиляции (G21PL >= G28PL) или (G21PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G21PL >= G28PL) || (G21PL == 0) +/* Задаёт MG28_11PL = ~(1); данные MG28_11PL. */ +#define MG28_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG28_11PL = 0xFFFF; данные MG28_11PL. */ +#define MG28_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G22PL >= G28PL) или (G22PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G22PL >= G28PL) || (G22PL == 0) +/* Задаёт MG28_12PL = ~(1 << 1); данные MG28_12PL. */ +#define MG28_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG28_12PL = 0xFFFF; данные MG28_12PL. */ +#define MG28_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G23PL >= G28PL) или (G23PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G23PL >= G28PL) || (G23PL == 0) +/* Задаёт MG28_13PL = ~(1 << 2); данные MG28_13PL. */ +#define MG28_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG28_13PL = 0xFFFF; данные MG28_13PL. */ +#define MG28_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G24PL >= G28PL) или (G24PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G24PL >= G28PL) || (G24PL == 0) +/* Задаёт MG28_14PL = ~(1 << 3); данные MG28_14PL. */ +#define MG28_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG28_14PL = 0xFFFF; данные MG28_14PL. */ +#define MG28_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G25PL >= G28PL) или (G25PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G25PL >= G28PL) || (G25PL == 0) +/* Задаёт MG28_15PL = ~(1 << 4); данные MG28_15PL. */ +#define MG28_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG28_15PL = 0xFFFF; данные MG28_15PL. */ +#define MG28_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G26PL >= G28PL) или (G26PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G26PL >= G28PL) || (G26PL == 0) +/* Задаёт MG28_16PL = ~(1 << 5); данные MG28_16PL. */ +#define MG28_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG28_16PL = 0xFFFF; данные MG28_16PL. */ +#define MG28_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G27PL >= G28PL) или (G27PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G27PL >= G28PL) || (G27PL == 0) +/* Задаёт MG28_17PL = ~(1 << 6); данные MG28_17PL. */ +#define MG28_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG28_17PL = 0xFFFF; данные MG28_17PL. */ +#define MG28_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG28_18PL = 0x007F; данные MG28_18PL. */ +#define MG28_18PL 0x007F +/* Задаёт MG28 = (MG28_11PL & MG28_12PL & MG28_13PL & MG28_14PL &; маска разрешённых прерываний внутри группы PIE 28. */ +#define MG28 (MG28_11PL & MG28_12PL & MG28_13PL & MG28_14PL & \ + MG28_15PL & MG28_16PL & MG28_17PL & MG28_18PL) /* Продолжает список аргументов, полей или выражение MG28_15PL & MG28_16PL & MG28_17PL & MG28_18PL); порядок элементов сохраняется. */ +// End of MG28: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG31 to MG38: +// + +// Beginning of MG31: +/* Условие компиляции (G32PL >= G31PL) или (G32PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G32PL >= G31PL) || (G32PL == 0) +/* Задаёт MG31_12PL = ~(1 << 1); данные MG31_12PL. */ +#define MG31_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG31_12PL = 0xFFFF; данные MG31_12PL. */ +#define MG31_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G33PL >= G31PL) или (G33PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G33PL >= G31PL) || (G33PL == 0) +/* Задаёт MG31_13PL = ~(1 << 2); данные MG31_13PL. */ +#define MG31_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG31_13PL = 0xFFFF; данные MG31_13PL. */ +#define MG31_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G34PL >= G31PL) или (G34PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G34PL >= G31PL) || (G34PL == 0) +/* Задаёт MG31_14PL = ~(1 << 3); данные MG31_14PL. */ +#define MG31_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG31_14PL = 0xFFFF; данные MG31_14PL. */ +#define MG31_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G35PL >= G31PL) или (G35PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G35PL >= G31PL) || (G35PL == 0) +/* Задаёт MG31_15PL = ~(1 << 4); данные MG31_15PL. */ +#define MG31_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG31_15PL = 0xFFFF; данные MG31_15PL. */ +#define MG31_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G36PL >= G31PL) или (G36PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G36PL >= G31PL) || (G36PL == 0) +/* Задаёт MG31_16PL = ~(1 << 5); данные MG31_16PL. */ +#define MG31_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG31_16PL = 0xFFFF; данные MG31_16PL. */ +#define MG31_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G37PL >= G31PL) или (G37PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G37PL >= G31PL) || (G37PL == 0) +/* Задаёт MG31_17PL = ~(1 << 6); данные MG31_17PL. */ +#define MG31_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG31_17PL = 0xFFFF; данные MG31_17PL. */ +#define MG31_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G38PL >= G31PL) или (G38PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G38PL >= G31PL) || (G38PL == 0) +/* Задаёт MG31_18PL = ~(1 << 7); данные MG31_18PL. */ +#define MG31_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG31_18PL = 0xFFFF; данные MG31_18PL. */ +#define MG31_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG31_11PL = 0x00FE; данные MG31_11PL. */ +#define MG31_11PL 0x00FE +/* Задаёт MG31 = (MG31_11PL & MG31_12PL & MG31_13PL & MG31_14PL &; маска разрешённых прерываний внутри группы PIE 31. */ +#define MG31 (MG31_11PL & MG31_12PL & MG31_13PL & MG31_14PL & \ + MG31_15PL & MG31_16PL & MG31_17PL & MG31_18PL) /* Продолжает список аргументов, полей или выражение MG31_15PL & MG31_16PL & MG31_17PL & MG31_18PL); порядок элементов сохраняется. */ +// End of MG31: + +// Beginning of MG32: +/* Условие компиляции (G31PL >= G32PL) или (G31PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G31PL >= G32PL) || (G31PL == 0) +/* Задаёт MG32_11PL = ~(1); данные MG32_11PL. */ +#define MG32_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG32_11PL = 0xFFFF; данные MG32_11PL. */ +#define MG32_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G33PL >= G32PL) или (G33PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G33PL >= G32PL) || (G33PL == 0) +/* Задаёт MG32_13PL = ~(1 << 2); данные MG32_13PL. */ +#define MG32_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG32_13PL = 0xFFFF; данные MG32_13PL. */ +#define MG32_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G34PL >= G32PL) или (G34PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G34PL >= G32PL) || (G34PL == 0) +/* Задаёт MG32_14PL = ~(1 << 3); данные MG32_14PL. */ +#define MG32_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG32_14PL = 0xFFFF; данные MG32_14PL. */ +#define MG32_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G35PL >= G32PL) или (G35PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G35PL >= G32PL) || (G35PL == 0) +/* Задаёт MG32_15PL = ~(1 << 4); данные MG32_15PL. */ +#define MG32_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG32_15PL = 0xFFFF; данные MG32_15PL. */ +#define MG32_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G36PL >= G32PL) или (G36PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G36PL >= G32PL) || (G36PL == 0) +/* Задаёт MG32_16PL = ~(1 << 5); данные MG32_16PL. */ +#define MG32_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG32_16PL = 0xFFFF; данные MG32_16PL. */ +#define MG32_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G37PL >= G32PL) или (G37PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G37PL >= G32PL) || (G37PL == 0) +/* Задаёт MG32_17PL = ~(1 << 6); данные MG32_17PL. */ +#define MG32_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG32_17PL = 0xFFFF; данные MG32_17PL. */ +#define MG32_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G38PL >= G32PL) или (G38PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G38PL >= G32PL) || (G38PL == 0) +/* Задаёт MG32_18PL = ~(1 << 7); данные MG32_18PL. */ +#define MG32_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG32_18PL = 0xFFFF; данные MG32_18PL. */ +#define MG32_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG32_12PL = 0x00FD; данные MG32_12PL. */ +#define MG32_12PL 0x00FD +/* Задаёт MG32 = (MG32_11PL & MG32_12PL & MG32_13PL & MG32_14PL &; маска разрешённых прерываний внутри группы PIE 32. */ +#define MG32 (MG32_11PL & MG32_12PL & MG32_13PL & MG32_14PL & \ + MG32_15PL & MG32_16PL & MG32_17PL & MG32_18PL) /* Продолжает список аргументов, полей или выражение MG32_15PL & MG32_16PL & MG32_17PL & MG32_18PL); порядок элементов сохраняется. */ +// End of MG32: + +// Beginning of MG33: +/* Условие компиляции (G31PL >= G33PL) или (G31PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G31PL >= G33PL) || (G31PL == 0) +/* Задаёт MG33_11PL = ~(1); данные MG33_11PL. */ +#define MG33_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG33_11PL = 0xFFFF; данные MG33_11PL. */ +#define MG33_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G32PL >= G33PL) или (G32PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G32PL >= G33PL) || (G32PL == 0) +/* Задаёт MG33_12PL = ~(1 << 1); данные MG33_12PL. */ +#define MG33_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG33_12PL = 0xFFFF; данные MG33_12PL. */ +#define MG33_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G34PL >= G33PL) или (G34PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G34PL >= G33PL) || (G34PL == 0) +/* Задаёт MG33_14PL = ~(1 << 3); данные MG33_14PL. */ +#define MG33_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG33_14PL = 0xFFFF; данные MG33_14PL. */ +#define MG33_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G35PL >= G33PL) или (G35PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G35PL >= G33PL) || (G35PL == 0) +/* Задаёт MG33_15PL = ~(1 << 4); данные MG33_15PL. */ +#define MG33_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG33_15PL = 0xFFFF; данные MG33_15PL. */ +#define MG33_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G36PL >= G33PL) или (G36PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G36PL >= G33PL) || (G36PL == 0) +/* Задаёт MG33_16PL = ~(1 << 5); данные MG33_16PL. */ +#define MG33_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG33_16PL = 0xFFFF; данные MG33_16PL. */ +#define MG33_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G37PL >= G33PL) или (G37PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G37PL >= G33PL) || (G37PL == 0) +/* Задаёт MG33_17PL = ~(1 << 6); данные MG33_17PL. */ +#define MG33_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG33_17PL = 0xFFFF; данные MG33_17PL. */ +#define MG33_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G38PL >= G33PL) или (G38PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G38PL >= G33PL) || (G38PL == 0) +/* Задаёт MG33_18PL = ~(1 << 7); данные MG33_18PL. */ +#define MG33_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG33_18PL = 0xFFFF; данные MG33_18PL. */ +#define MG33_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG33_13PL = 0x00FB; данные MG33_13PL. */ +#define MG33_13PL 0x00FB +/* Задаёт MG33 = (MG33_11PL & MG33_12PL & MG33_13PL & MG33_14PL &; маска разрешённых прерываний внутри группы PIE 33. */ +#define MG33 (MG33_11PL & MG33_12PL & MG33_13PL & MG33_14PL & \ + MG33_15PL & MG33_16PL & MG33_17PL & MG33_18PL) /* Продолжает список аргументов, полей или выражение MG33_15PL & MG33_16PL & MG33_17PL & MG33_18PL); порядок элементов сохраняется. */ +// End of MG33: + +// Beginning of MG34: +/* Условие компиляции (G31PL >= G34PL) или (G31PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G31PL >= G34PL) || (G31PL == 0) +/* Задаёт MG34_11PL = ~(1); данные MG34_11PL. */ +#define MG34_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG34_11PL = 0xFFFF; данные MG34_11PL. */ +#define MG34_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G32PL >= G34PL) или (G32PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G32PL >= G34PL) || (G32PL == 0) +/* Задаёт MG34_12PL = ~(1 << 1); данные MG34_12PL. */ +#define MG34_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG34_12PL = 0xFFFF; данные MG34_12PL. */ +#define MG34_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G33PL >= G34PL) или (G33PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G33PL >= G34PL) || (G33PL == 0) +/* Задаёт MG34_13PL = ~(1 << 2); данные MG34_13PL. */ +#define MG34_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG34_13PL = 0xFFFF; данные MG34_13PL. */ +#define MG34_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G35PL >= G34PL) или (G35PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G35PL >= G34PL) || (G35PL == 0) +/* Задаёт MG34_15PL = ~(1 << 4); данные MG34_15PL. */ +#define MG34_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG34_15PL = 0xFFFF; данные MG34_15PL. */ +#define MG34_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G36PL >= G34PL) или (G36PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G36PL >= G34PL) || (G36PL == 0) +/* Задаёт MG34_16PL = ~(1 << 5); данные MG34_16PL. */ +#define MG34_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG34_16PL = 0xFFFF; данные MG34_16PL. */ +#define MG34_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G37PL >= G34PL) или (G37PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G37PL >= G34PL) || (G37PL == 0) +/* Задаёт MG34_17PL = ~(1 << 6); данные MG34_17PL. */ +#define MG34_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG34_17PL = 0xFFFF; данные MG34_17PL. */ +#define MG34_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G38PL >= G34PL) или (G38PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G38PL >= G34PL) || (G38PL == 0) +/* Задаёт MG34_18PL = ~(1 << 7); данные MG34_18PL. */ +#define MG34_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG34_18PL = 0xFFFF; данные MG34_18PL. */ +#define MG34_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG34_14PL = 0x00F7; данные MG34_14PL. */ +#define MG34_14PL 0x00F7 +/* Задаёт MG34 = (MG34_11PL & MG34_12PL & MG34_13PL & MG34_14PL &; маска разрешённых прерываний внутри группы PIE 34. */ +#define MG34 (MG34_11PL & MG34_12PL & MG34_13PL & MG34_14PL & \ + MG34_15PL & MG34_16PL & MG34_17PL & MG34_18PL) /* Продолжает список аргументов, полей или выражение MG34_15PL & MG34_16PL & MG34_17PL & MG34_18PL); порядок элементов сохраняется. */ +// End of MG34: + +// Beginning of MG35: +/* Условие компиляции (G31PL >= G35PL) или (G31PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G31PL >= G35PL) || (G31PL == 0) +/* Задаёт MG35_11PL = ~(1); данные MG35_11PL. */ +#define MG35_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG35_11PL = 0xFFFF; данные MG35_11PL. */ +#define MG35_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G32PL >= G35PL) или (G32PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G32PL >= G35PL) || (G32PL == 0) +/* Задаёт MG35_12PL = ~(1 << 1); данные MG35_12PL. */ +#define MG35_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG35_12PL = 0xFFFF; данные MG35_12PL. */ +#define MG35_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G33PL >= G35PL) или (G33PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G33PL >= G35PL) || (G33PL == 0) +/* Задаёт MG35_13PL = ~(1 << 2); данные MG35_13PL. */ +#define MG35_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG35_13PL = 0xFFFF; данные MG35_13PL. */ +#define MG35_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G34PL >= G35PL) или (G34PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G34PL >= G35PL) || (G34PL == 0) +/* Задаёт MG35_14PL = ~(1 << 3); данные MG35_14PL. */ +#define MG35_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG35_14PL = 0xFFFF; данные MG35_14PL. */ +#define MG35_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G36PL >= G35PL) или (G36PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G36PL >= G35PL) || (G36PL == 0) +/* Задаёт MG35_16PL = ~(1 << 5); данные MG35_16PL. */ +#define MG35_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG35_16PL = 0xFFFF; данные MG35_16PL. */ +#define MG35_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G37PL >= G35PL) или (G37PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G37PL >= G35PL) || (G37PL == 0) +/* Задаёт MG35_17PL = ~(1 << 6); данные MG35_17PL. */ +#define MG35_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG35_17PL = 0xFFFF; данные MG35_17PL. */ +#define MG35_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G38PL >= G35PL) или (G38PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G38PL >= G35PL) || (G38PL == 0) +/* Задаёт MG35_18PL = ~(1 << 7); данные MG35_18PL. */ +#define MG35_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG35_18PL = 0xFFFF; данные MG35_18PL. */ +#define MG35_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG35_15PL = 0x00EF; данные MG35_15PL. */ +#define MG35_15PL 0x00EF +/* Задаёт MG35 = (MG35_11PL & MG35_12PL & MG35_13PL & MG35_14PL &; маска разрешённых прерываний внутри группы PIE 35. */ +#define MG35 (MG35_11PL & MG35_12PL & MG35_13PL & MG35_14PL & \ + MG35_15PL & MG35_16PL & MG35_17PL & MG35_18PL) /* Продолжает список аргументов, полей или выражение MG35_15PL & MG35_16PL & MG35_17PL & MG35_18PL); порядок элементов сохраняется. */ +// End of MG35: + +// Beginning of MG36: +/* Условие компиляции (G31PL >= G36PL) или (G31PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G31PL >= G36PL) || (G31PL == 0) +/* Задаёт MG36_11PL = ~(1); данные MG36_11PL. */ +#define MG36_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG36_11PL = 0xFFFF; данные MG36_11PL. */ +#define MG36_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G32PL >= G36PL) или (G32PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G32PL >= G36PL) || (G32PL == 0) +/* Задаёт MG36_12PL = ~(1 << 1); данные MG36_12PL. */ +#define MG36_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG36_12PL = 0xFFFF; данные MG36_12PL. */ +#define MG36_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G33PL >= G36PL) или (G33PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G33PL >= G36PL) || (G33PL == 0) +/* Задаёт MG36_13PL = ~(1 << 2); данные MG36_13PL. */ +#define MG36_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG36_13PL = 0xFFFF; данные MG36_13PL. */ +#define MG36_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G34PL >= G36PL) или (G34PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G34PL >= G36PL) || (G34PL == 0) +/* Задаёт MG36_14PL = ~(1 << 3); данные MG36_14PL. */ +#define MG36_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG36_14PL = 0xFFFF; данные MG36_14PL. */ +#define MG36_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G35PL >= G36PL) или (G35PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G35PL >= G36PL) || (G35PL == 0) +/* Задаёт MG36_15PL = ~(1 << 4); данные MG36_15PL. */ +#define MG36_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG36_15PL = 0xFFFF; данные MG36_15PL. */ +#define MG36_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G37PL >= G36PL) или (G37PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G37PL >= G36PL) || (G37PL == 0) +/* Задаёт MG36_17PL = ~(1 << 6); данные MG36_17PL. */ +#define MG36_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG36_17PL = 0xFFFF; данные MG36_17PL. */ +#define MG36_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G38PL >= G36PL) или (G38PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G38PL >= G36PL) || (G38PL == 0) +/* Задаёт MG36_18PL = ~(1 << 7); данные MG36_18PL. */ +#define MG36_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG36_18PL = 0xFFFF; данные MG36_18PL. */ +#define MG36_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG36_16PL = 0x00DF; данные MG36_16PL. */ +#define MG36_16PL 0x00DF +/* Задаёт MG36 = (MG36_11PL & MG36_12PL & MG36_13PL & MG36_14PL &; маска разрешённых прерываний внутри группы PIE 36. */ +#define MG36 (MG36_11PL & MG36_12PL & MG36_13PL & MG36_14PL & \ + MG36_15PL & MG36_16PL & MG36_17PL & MG36_18PL) /* Продолжает список аргументов, полей или выражение MG36_15PL & MG36_16PL & MG36_17PL & MG36_18PL); порядок элементов сохраняется. */ +// End of MG36: + +// Beginning of MG37: +/* Условие компиляции (G31PL >= G37PL) или (G31PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G31PL >= G37PL) || (G31PL == 0) +/* Задаёт MG37_11PL = ~(1); данные MG37_11PL. */ +#define MG37_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG37_11PL = 0xFFFF; данные MG37_11PL. */ +#define MG37_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G32PL >= G37PL) или (G32PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G32PL >= G37PL) || (G32PL == 0) +/* Задаёт MG37_12PL = ~(1 << 1); данные MG37_12PL. */ +#define MG37_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG37_12PL = 0xFFFF; данные MG37_12PL. */ +#define MG37_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G33PL >= G37PL) или (G33PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G33PL >= G37PL) || (G33PL == 0) +/* Задаёт MG37_13PL = ~(1 << 2); данные MG37_13PL. */ +#define MG37_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG37_13PL = 0xFFFF; данные MG37_13PL. */ +#define MG37_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G34PL >= G37PL) или (G34PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G34PL >= G37PL) || (G34PL == 0) +/* Задаёт MG37_14PL = ~(1 << 3); данные MG37_14PL. */ +#define MG37_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG37_14PL = 0xFFFF; данные MG37_14PL. */ +#define MG37_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G35PL >= G37PL) или (G35PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G35PL >= G37PL) || (G35PL == 0) +/* Задаёт MG37_15PL = ~(1 << 4); данные MG37_15PL. */ +#define MG37_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG37_15PL = 0xFFFF; данные MG37_15PL. */ +#define MG37_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G36PL >= G37PL) или (G36PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G36PL >= G37PL) || (G36PL == 0) +/* Задаёт MG37_16PL = ~(1 << 5); данные MG37_16PL. */ +#define MG37_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG37_16PL = 0xFFFF; данные MG37_16PL. */ +#define MG37_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G38PL >= G37PL) или (G38PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G38PL >= G37PL) || (G38PL == 0) +/* Задаёт MG37_18PL = ~(1 << 7); данные MG37_18PL. */ +#define MG37_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG37_18PL = 0xFFFF; данные MG37_18PL. */ +#define MG37_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG37_17PL = 0x00BF; данные MG37_17PL. */ +#define MG37_17PL 0x00BF +/* Задаёт MG37 = (MG37_11PL & MG37_12PL & MG37_13PL & MG37_14PL &; маска разрешённых прерываний внутри группы PIE 37. */ +#define MG37 (MG37_11PL & MG37_12PL & MG37_13PL & MG37_14PL & \ + MG37_15PL & MG37_16PL & MG37_17PL & MG37_18PL) /* Продолжает список аргументов, полей или выражение MG37_15PL & MG37_16PL & MG37_17PL & MG37_18PL); порядок элементов сохраняется. */ +// End of MG37: + +// Beginning of MG38: +/* Условие компиляции (G31PL >= G38PL) или (G31PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G31PL >= G38PL) || (G31PL == 0) +/* Задаёт MG38_11PL = ~(1); данные MG38_11PL. */ +#define MG38_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG38_11PL = 0xFFFF; данные MG38_11PL. */ +#define MG38_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G32PL >= G38PL) или (G32PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G32PL >= G38PL) || (G32PL == 0) +/* Задаёт MG38_12PL = ~(1 << 1); данные MG38_12PL. */ +#define MG38_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG38_12PL = 0xFFFF; данные MG38_12PL. */ +#define MG38_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G33PL >= G38PL) или (G33PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G33PL >= G38PL) || (G33PL == 0) +/* Задаёт MG38_13PL = ~(1 << 2); данные MG38_13PL. */ +#define MG38_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG38_13PL = 0xFFFF; данные MG38_13PL. */ +#define MG38_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G34PL >= G38PL) или (G34PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G34PL >= G38PL) || (G34PL == 0) +/* Задаёт MG38_14PL = ~(1 << 3); данные MG38_14PL. */ +#define MG38_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG38_14PL = 0xFFFF; данные MG38_14PL. */ +#define MG38_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G35PL >= G38PL) или (G35PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G35PL >= G38PL) || (G35PL == 0) +/* Задаёт MG38_15PL = ~(1 << 4); данные MG38_15PL. */ +#define MG38_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG38_15PL = 0xFFFF; данные MG38_15PL. */ +#define MG38_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G36PL >= G38PL) или (G36PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G36PL >= G38PL) || (G36PL == 0) +/* Задаёт MG38_16PL = ~(1 << 5); данные MG38_16PL. */ +#define MG38_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG38_16PL = 0xFFFF; данные MG38_16PL. */ +#define MG38_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G37PL >= G38PL) или (G37PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G37PL >= G38PL) || (G37PL == 0) +/* Задаёт MG38_17PL = ~(1 << 6); данные MG38_17PL. */ +#define MG38_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG38_17PL = 0xFFFF; данные MG38_17PL. */ +#define MG38_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG38_18PL = 0x007F; данные MG38_18PL. */ +#define MG38_18PL 0x007F +/* Задаёт MG38 = (MG38_11PL & MG38_12PL & MG38_13PL & MG38_14PL &; маска разрешённых прерываний внутри группы PIE 38. */ +#define MG38 (MG38_11PL & MG38_12PL & MG38_13PL & MG38_14PL & \ + MG38_15PL & MG38_16PL & MG38_17PL & MG38_18PL) /* Продолжает список аргументов, полей или выражение MG38_15PL & MG38_16PL & MG38_17PL & MG38_18PL); порядок элементов сохраняется. */ +// End of MG38: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG41 to MG48: +// + +// Beginning of MG41: +/* Условие компиляции (G42PL >= G41PL) или (G42PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G42PL >= G41PL) || (G42PL == 0) +/* Задаёт MG41_12PL = ~(1 << 1); данные MG41_12PL. */ +#define MG41_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG41_12PL = 0xFFFF; данные MG41_12PL. */ +#define MG41_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G43PL >= G41PL) или (G43PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G43PL >= G41PL) || (G43PL == 0) +/* Задаёт MG41_13PL = ~(1 << 2); данные MG41_13PL. */ +#define MG41_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG41_13PL = 0xFFFF; данные MG41_13PL. */ +#define MG41_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G44PL >= G41PL) или (G44PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G44PL >= G41PL) || (G44PL == 0) +/* Задаёт MG41_14PL = ~(1 << 3); данные MG41_14PL. */ +#define MG41_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG41_14PL = 0xFFFF; данные MG41_14PL. */ +#define MG41_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G45PL >= G41PL) или (G45PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G45PL >= G41PL) || (G45PL == 0) +/* Задаёт MG41_15PL = ~(1 << 4); данные MG41_15PL. */ +#define MG41_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG41_15PL = 0xFFFF; данные MG41_15PL. */ +#define MG41_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G46PL >= G41PL) или (G46PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G46PL >= G41PL) || (G46PL == 0) +/* Задаёт MG41_16PL = ~(1 << 5); данные MG41_16PL. */ +#define MG41_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG41_16PL = 0xFFFF; данные MG41_16PL. */ +#define MG41_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G47PL >= G41PL) или (G47PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G47PL >= G41PL) || (G47PL == 0) +/* Задаёт MG41_17PL = ~(1 << 6); данные MG41_17PL. */ +#define MG41_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG41_17PL = 0xFFFF; данные MG41_17PL. */ +#define MG41_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G48PL >= G41PL) или (G48PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G48PL >= G41PL) || (G48PL == 0) +/* Задаёт MG41_18PL = ~(1 << 7); данные MG41_18PL. */ +#define MG41_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG41_18PL = 0xFFFF; данные MG41_18PL. */ +#define MG41_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG41_11PL = 0x00FE; данные MG41_11PL. */ +#define MG41_11PL 0x00FE +/* Задаёт MG41 = (MG41_11PL & MG41_12PL & MG41_13PL & MG41_14PL &; маска разрешённых прерываний внутри группы PIE 41. */ +#define MG41 (MG41_11PL & MG41_12PL & MG41_13PL & MG41_14PL & \ + MG41_15PL & MG41_16PL & MG41_17PL & MG41_18PL) /* Продолжает список аргументов, полей или выражение MG41_15PL & MG41_16PL & MG41_17PL & MG41_18PL); порядок элементов сохраняется. */ +// End of MG41: + +// Beginning of MG42: +/* Условие компиляции (G41PL >= G42PL) или (G41PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G41PL >= G42PL) || (G41PL == 0) +/* Задаёт MG42_11PL = ~(1); данные MG42_11PL. */ +#define MG42_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG42_11PL = 0xFFFF; данные MG42_11PL. */ +#define MG42_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G43PL >= G42PL) или (G43PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G43PL >= G42PL) || (G43PL == 0) +/* Задаёт MG42_13PL = ~(1 << 2); данные MG42_13PL. */ +#define MG42_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG42_13PL = 0xFFFF; данные MG42_13PL. */ +#define MG42_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G44PL >= G42PL) или (G44PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G44PL >= G42PL) || (G44PL == 0) +/* Задаёт MG42_14PL = ~(1 << 3); данные MG42_14PL. */ +#define MG42_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG42_14PL = 0xFFFF; данные MG42_14PL. */ +#define MG42_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G45PL >= G42PL) или (G45PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G45PL >= G42PL) || (G45PL == 0) +/* Задаёт MG42_15PL = ~(1 << 4); данные MG42_15PL. */ +#define MG42_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG42_15PL = 0xFFFF; данные MG42_15PL. */ +#define MG42_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G46PL >= G42PL) или (G46PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G46PL >= G42PL) || (G46PL == 0) +/* Задаёт MG42_16PL = ~(1 << 5); данные MG42_16PL. */ +#define MG42_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG42_16PL = 0xFFFF; данные MG42_16PL. */ +#define MG42_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G47PL >= G42PL) или (G47PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G47PL >= G42PL) || (G47PL == 0) +/* Задаёт MG42_17PL = ~(1 << 6); данные MG42_17PL. */ +#define MG42_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG42_17PL = 0xFFFF; данные MG42_17PL. */ +#define MG42_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G48PL >= G42PL) или (G48PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G48PL >= G42PL) || (G48PL == 0) +/* Задаёт MG42_18PL = ~(1 << 7); данные MG42_18PL. */ +#define MG42_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG42_18PL = 0xFFFF; данные MG42_18PL. */ +#define MG42_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG42_12PL = 0x00FD; данные MG42_12PL. */ +#define MG42_12PL 0x00FD +/* Задаёт MG42 = (MG42_11PL & MG42_12PL & MG42_13PL & MG42_14PL &; маска разрешённых прерываний внутри группы PIE 42. */ +#define MG42 (MG42_11PL & MG42_12PL & MG42_13PL & MG42_14PL & \ + MG42_15PL & MG42_16PL & MG42_17PL & MG42_18PL) /* Продолжает список аргументов, полей или выражение MG42_15PL & MG42_16PL & MG42_17PL & MG42_18PL); порядок элементов сохраняется. */ +// End of MG42: + +// Beginning of MG43: +/* Условие компиляции (G41PL >= G43PL) или (G41PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G41PL >= G43PL) || (G41PL == 0) +/* Задаёт MG43_11PL = ~(1); данные MG43_11PL. */ +#define MG43_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG43_11PL = 0xFFFF; данные MG43_11PL. */ +#define MG43_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G42PL >= G43PL) или (G42PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G42PL >= G43PL) || (G42PL == 0) +/* Задаёт MG43_12PL = ~(1 << 1); данные MG43_12PL. */ +#define MG43_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG43_12PL = 0xFFFF; данные MG43_12PL. */ +#define MG43_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G44PL >= G43PL) или (G44PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G44PL >= G43PL) || (G44PL == 0) +/* Задаёт MG43_14PL = ~(1 << 3); данные MG43_14PL. */ +#define MG43_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG43_14PL = 0xFFFF; данные MG43_14PL. */ +#define MG43_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G45PL >= G43PL) или (G45PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G45PL >= G43PL) || (G45PL == 0) +/* Задаёт MG43_15PL = ~(1 << 4); данные MG43_15PL. */ +#define MG43_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG43_15PL = 0xFFFF; данные MG43_15PL. */ +#define MG43_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G46PL >= G43PL) или (G46PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G46PL >= G43PL) || (G46PL == 0) +/* Задаёт MG43_16PL = ~(1 << 5); данные MG43_16PL. */ +#define MG43_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG43_16PL = 0xFFFF; данные MG43_16PL. */ +#define MG43_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G47PL >= G43PL) или (G47PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G47PL >= G43PL) || (G47PL == 0) +/* Задаёт MG43_17PL = ~(1 << 6); данные MG43_17PL. */ +#define MG43_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG43_17PL = 0xFFFF; данные MG43_17PL. */ +#define MG43_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G48PL >= G43PL) или (G48PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G48PL >= G43PL) || (G48PL == 0) +/* Задаёт MG43_18PL = ~(1 << 7); данные MG43_18PL. */ +#define MG43_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG43_18PL = 0xFFFF; данные MG43_18PL. */ +#define MG43_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG43_13PL = 0x00FB; данные MG43_13PL. */ +#define MG43_13PL 0x00FB +/* Задаёт MG43 = (MG43_11PL & MG43_12PL & MG43_13PL & MG43_14PL &; маска разрешённых прерываний внутри группы PIE 43. */ +#define MG43 (MG43_11PL & MG43_12PL & MG43_13PL & MG43_14PL & \ + MG43_15PL & MG43_16PL & MG43_17PL & MG43_18PL) /* Продолжает список аргументов, полей или выражение MG43_15PL & MG43_16PL & MG43_17PL & MG43_18PL); порядок элементов сохраняется. */ +// End of MG43: + +// Beginning of MG44: +/* Условие компиляции (G41PL >= G44PL) или (G41PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G41PL >= G44PL) || (G41PL == 0) +/* Задаёт MG44_11PL = ~(1); данные MG44_11PL. */ +#define MG44_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG44_11PL = 0xFFFF; данные MG44_11PL. */ +#define MG44_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G42PL >= G44PL) или (G42PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G42PL >= G44PL) || (G42PL == 0) +/* Задаёт MG44_12PL = ~(1 << 1); данные MG44_12PL. */ +#define MG44_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG44_12PL = 0xFFFF; данные MG44_12PL. */ +#define MG44_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G43PL >= G44PL) или (G43PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G43PL >= G44PL) || (G43PL == 0) +/* Задаёт MG44_13PL = ~(1 << 2); данные MG44_13PL. */ +#define MG44_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG44_13PL = 0xFFFF; данные MG44_13PL. */ +#define MG44_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G45PL >= G44PL) или (G45PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G45PL >= G44PL) || (G45PL == 0) +/* Задаёт MG44_15PL = ~(1 << 4); данные MG44_15PL. */ +#define MG44_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG44_15PL = 0xFFFF; данные MG44_15PL. */ +#define MG44_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G46PL >= G44PL) или (G46PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G46PL >= G44PL) || (G46PL == 0) +/* Задаёт MG44_16PL = ~(1 << 5); данные MG44_16PL. */ +#define MG44_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG44_16PL = 0xFFFF; данные MG44_16PL. */ +#define MG44_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G47PL >= G44PL) или (G47PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G47PL >= G44PL) || (G47PL == 0) +/* Задаёт MG44_17PL = ~(1 << 6); данные MG44_17PL. */ +#define MG44_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG44_17PL = 0xFFFF; данные MG44_17PL. */ +#define MG44_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G48PL >= G44PL) или (G48PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G48PL >= G44PL) || (G48PL == 0) +/* Задаёт MG44_18PL = ~(1 << 7); данные MG44_18PL. */ +#define MG44_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG44_18PL = 0xFFFF; данные MG44_18PL. */ +#define MG44_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG44_14PL = 0x00F7; данные MG44_14PL. */ +#define MG44_14PL 0x00F7 +/* Задаёт MG44 = (MG44_11PL & MG44_12PL & MG44_13PL & MG44_14PL &; маска разрешённых прерываний внутри группы PIE 44. */ +#define MG44 (MG44_11PL & MG44_12PL & MG44_13PL & MG44_14PL & \ + MG44_15PL & MG44_16PL & MG44_17PL & MG44_18PL) /* Продолжает список аргументов, полей или выражение MG44_15PL & MG44_16PL & MG44_17PL & MG44_18PL); порядок элементов сохраняется. */ +// End of MG44: + +// Beginning of MG45: +/* Условие компиляции (G41PL >= G45PL) или (G41PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G41PL >= G45PL) || (G41PL == 0) +/* Задаёт MG45_11PL = ~(1); данные MG45_11PL. */ +#define MG45_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG45_11PL = 0xFFFF; данные MG45_11PL. */ +#define MG45_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G42PL >= G45PL) или (G42PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G42PL >= G45PL) || (G42PL == 0) +/* Задаёт MG45_12PL = ~(1 << 1); данные MG45_12PL. */ +#define MG45_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG45_12PL = 0xFFFF; данные MG45_12PL. */ +#define MG45_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G43PL >= G45PL) или (G43PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G43PL >= G45PL) || (G43PL == 0) +/* Задаёт MG45_13PL = ~(1 << 2); данные MG45_13PL. */ +#define MG45_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG45_13PL = 0xFFFF; данные MG45_13PL. */ +#define MG45_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G44PL >= G45PL) или (G44PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G44PL >= G45PL) || (G44PL == 0) +/* Задаёт MG45_14PL = ~(1 << 3); данные MG45_14PL. */ +#define MG45_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG45_14PL = 0xFFFF; данные MG45_14PL. */ +#define MG45_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G46PL >= G45PL) или (G46PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G46PL >= G45PL) || (G46PL == 0) +/* Задаёт MG45_16PL = ~(1 << 5); данные MG45_16PL. */ +#define MG45_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG45_16PL = 0xFFFF; данные MG45_16PL. */ +#define MG45_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G47PL >= G45PL) или (G47PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G47PL >= G45PL) || (G47PL == 0) +/* Задаёт MG45_17PL = ~(1 << 6); данные MG45_17PL. */ +#define MG45_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG45_17PL = 0xFFFF; данные MG45_17PL. */ +#define MG45_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G48PL >= G45PL) или (G48PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G48PL >= G45PL) || (G48PL == 0) +/* Задаёт MG45_18PL = ~(1 << 7); данные MG45_18PL. */ +#define MG45_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG45_18PL = 0xFFFF; данные MG45_18PL. */ +#define MG45_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG45_15PL = 0x00EF; данные MG45_15PL. */ +#define MG45_15PL 0x00EF +/* Задаёт MG45 = (MG45_11PL & MG45_12PL & MG45_13PL & MG45_14PL &; маска разрешённых прерываний внутри группы PIE 45. */ +#define MG45 (MG45_11PL & MG45_12PL & MG45_13PL & MG45_14PL & \ + MG45_15PL & MG45_16PL & MG45_17PL & MG45_18PL) /* Продолжает список аргументов, полей или выражение MG45_15PL & MG45_16PL & MG45_17PL & MG45_18PL); порядок элементов сохраняется. */ +// End of MG45: + +// Beginning of MG46: +/* Условие компиляции (G41PL >= G46PL) или (G41PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G41PL >= G46PL) || (G41PL == 0) +/* Задаёт MG46_11PL = ~(1); данные MG46_11PL. */ +#define MG46_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG46_11PL = 0xFFFF; данные MG46_11PL. */ +#define MG46_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G42PL >= G46PL) или (G42PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G42PL >= G46PL) || (G42PL == 0) +/* Задаёт MG46_12PL = ~(1 << 1); данные MG46_12PL. */ +#define MG46_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG46_12PL = 0xFFFF; данные MG46_12PL. */ +#define MG46_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G43PL >= G46PL) или (G43PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G43PL >= G46PL) || (G43PL == 0) +/* Задаёт MG46_13PL = ~(1 << 2); данные MG46_13PL. */ +#define MG46_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG46_13PL = 0xFFFF; данные MG46_13PL. */ +#define MG46_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G44PL >= G46PL) или (G44PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G44PL >= G46PL) || (G44PL == 0) +/* Задаёт MG46_14PL = ~(1 << 3); данные MG46_14PL. */ +#define MG46_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG46_14PL = 0xFFFF; данные MG46_14PL. */ +#define MG46_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G45PL >= G46PL) или (G45PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G45PL >= G46PL) || (G45PL == 0) +/* Задаёт MG46_15PL = ~(1 << 4); данные MG46_15PL. */ +#define MG46_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG46_15PL = 0xFFFF; данные MG46_15PL. */ +#define MG46_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G47PL >= G46PL) или (G47PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G47PL >= G46PL) || (G47PL == 0) +/* Задаёт MG46_17PL = ~(1 << 6); данные MG46_17PL. */ +#define MG46_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG46_17PL = 0xFFFF; данные MG46_17PL. */ +#define MG46_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G48PL >= G46PL) или (G48PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G48PL >= G46PL) || (G48PL == 0) +/* Задаёт MG46_18PL = ~(1 << 7); данные MG46_18PL. */ +#define MG46_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG46_18PL = 0xFFFF; данные MG46_18PL. */ +#define MG46_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG46_16PL = 0x00DF; данные MG46_16PL. */ +#define MG46_16PL 0x00DF +/* Задаёт MG46 = (MG46_11PL & MG46_12PL & MG46_13PL & MG46_14PL &; маска разрешённых прерываний внутри группы PIE 46. */ +#define MG46 (MG46_11PL & MG46_12PL & MG46_13PL & MG46_14PL & \ + MG46_15PL & MG46_16PL & MG46_17PL & MG46_18PL) /* Продолжает список аргументов, полей или выражение MG46_15PL & MG46_16PL & MG46_17PL & MG46_18PL); порядок элементов сохраняется. */ +// End of MG46: + +// Beginning of MG47: +/* Условие компиляции (G41PL >= G47PL) или (G41PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G41PL >= G47PL) || (G41PL == 0) +/* Задаёт MG47_11PL = ~(1); данные MG47_11PL. */ +#define MG47_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG47_11PL = 0xFFFF; данные MG47_11PL. */ +#define MG47_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G42PL >= G47PL) или (G42PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G42PL >= G47PL) || (G42PL == 0) +/* Задаёт MG47_12PL = ~(1 << 1); данные MG47_12PL. */ +#define MG47_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG47_12PL = 0xFFFF; данные MG47_12PL. */ +#define MG47_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G43PL >= G47PL) или (G43PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G43PL >= G47PL) || (G43PL == 0) +/* Задаёт MG47_13PL = ~(1 << 2); данные MG47_13PL. */ +#define MG47_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG47_13PL = 0xFFFF; данные MG47_13PL. */ +#define MG47_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G44PL >= G47PL) или (G44PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G44PL >= G47PL) || (G44PL == 0) +/* Задаёт MG47_14PL = ~(1 << 3); данные MG47_14PL. */ +#define MG47_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG47_14PL = 0xFFFF; данные MG47_14PL. */ +#define MG47_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G45PL >= G47PL) или (G45PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G45PL >= G47PL) || (G45PL == 0) +/* Задаёт MG47_15PL = ~(1 << 4); данные MG47_15PL. */ +#define MG47_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG47_15PL = 0xFFFF; данные MG47_15PL. */ +#define MG47_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G46PL >= G47PL) или (G46PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G46PL >= G47PL) || (G46PL == 0) +/* Задаёт MG47_16PL = ~(1 << 5); данные MG47_16PL. */ +#define MG47_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG47_16PL = 0xFFFF; данные MG47_16PL. */ +#define MG47_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G48PL >= G47PL) или (G48PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G48PL >= G47PL) || (G48PL == 0) +/* Задаёт MG47_18PL = ~(1 << 7); данные MG47_18PL. */ +#define MG47_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG47_18PL = 0xFFFF; данные MG47_18PL. */ +#define MG47_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG47_17PL = 0x00BF; данные MG47_17PL. */ +#define MG47_17PL 0x00BF +/* Задаёт MG47 = (MG47_11PL & MG47_12PL & MG47_13PL & MG47_14PL &; маска разрешённых прерываний внутри группы PIE 47. */ +#define MG47 (MG47_11PL & MG47_12PL & MG47_13PL & MG47_14PL & \ + MG47_15PL & MG47_16PL & MG47_17PL & MG47_18PL) /* Продолжает список аргументов, полей или выражение MG47_15PL & MG47_16PL & MG47_17PL & MG47_18PL); порядок элементов сохраняется. */ +// End of MG47: + +// Beginning of MG48: +/* Условие компиляции (G41PL >= G48PL) или (G41PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G41PL >= G48PL) || (G41PL == 0) +/* Задаёт MG48_11PL = ~(1); данные MG48_11PL. */ +#define MG48_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG48_11PL = 0xFFFF; данные MG48_11PL. */ +#define MG48_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G42PL >= G48PL) или (G42PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G42PL >= G48PL) || (G42PL == 0) +/* Задаёт MG48_12PL = ~(1 << 1); данные MG48_12PL. */ +#define MG48_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG48_12PL = 0xFFFF; данные MG48_12PL. */ +#define MG48_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G43PL >= G48PL) или (G43PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G43PL >= G48PL) || (G43PL == 0) +/* Задаёт MG48_13PL = ~(1 << 2); данные MG48_13PL. */ +#define MG48_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG48_13PL = 0xFFFF; данные MG48_13PL. */ +#define MG48_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G44PL >= G48PL) или (G44PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G44PL >= G48PL) || (G44PL == 0) +/* Задаёт MG48_14PL = ~(1 << 3); данные MG48_14PL. */ +#define MG48_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG48_14PL = 0xFFFF; данные MG48_14PL. */ +#define MG48_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G45PL >= G48PL) или (G45PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G45PL >= G48PL) || (G45PL == 0) +/* Задаёт MG48_15PL = ~(1 << 4); данные MG48_15PL. */ +#define MG48_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG48_15PL = 0xFFFF; данные MG48_15PL. */ +#define MG48_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G46PL >= G48PL) или (G46PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G46PL >= G48PL) || (G46PL == 0) +/* Задаёт MG48_16PL = ~(1 << 5); данные MG48_16PL. */ +#define MG48_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG48_16PL = 0xFFFF; данные MG48_16PL. */ +#define MG48_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G47PL >= G48PL) или (G47PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G47PL >= G48PL) || (G47PL == 0) +/* Задаёт MG48_17PL = ~(1 << 6); данные MG48_17PL. */ +#define MG48_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG48_17PL = 0xFFFF; данные MG48_17PL. */ +#define MG48_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG48_18PL = 0x007F; данные MG48_18PL. */ +#define MG48_18PL 0x007F +/* Задаёт MG48 = (MG48_11PL & MG48_12PL & MG48_13PL & MG48_14PL &; маска разрешённых прерываний внутри группы PIE 48. */ +#define MG48 (MG48_11PL & MG48_12PL & MG48_13PL & MG48_14PL & \ + MG48_15PL & MG48_16PL & MG48_17PL & MG48_18PL) /* Продолжает список аргументов, полей или выражение MG48_15PL & MG48_16PL & MG48_17PL & MG48_18PL); порядок элементов сохраняется. */ +// End of MG48: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG51 to MG58: +// + +// Beginning of MG51: +/* Условие компиляции (G52PL >= G51PL) или (G52PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G52PL >= G51PL) || (G52PL == 0) +/* Задаёт MG51_12PL = ~(1 << 1); данные MG51_12PL. */ +#define MG51_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG51_12PL = 0xFFFF; данные MG51_12PL. */ +#define MG51_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G53PL >= G51PL) или (G53PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G53PL >= G51PL) || (G53PL == 0) +/* Задаёт MG51_13PL = ~(1 << 2); данные MG51_13PL. */ +#define MG51_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG51_13PL = 0xFFFF; данные MG51_13PL. */ +#define MG51_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G54PL >= G51PL) или (G54PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G54PL >= G51PL) || (G54PL == 0) +/* Задаёт MG51_14PL = ~(1 << 3); данные MG51_14PL. */ +#define MG51_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG51_14PL = 0xFFFF; данные MG51_14PL. */ +#define MG51_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G55PL >= G51PL) или (G55PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G55PL >= G51PL) || (G55PL == 0) +/* Задаёт MG51_15PL = ~(1 << 4); данные MG51_15PL. */ +#define MG51_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG51_15PL = 0xFFFF; данные MG51_15PL. */ +#define MG51_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G56PL >= G51PL) или (G56PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G56PL >= G51PL) || (G56PL == 0) +/* Задаёт MG51_16PL = ~(1 << 5); данные MG51_16PL. */ +#define MG51_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG51_16PL = 0xFFFF; данные MG51_16PL. */ +#define MG51_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G57PL >= G51PL) или (G57PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G57PL >= G51PL) || (G57PL == 0) +/* Задаёт MG51_17PL = ~(1 << 6); данные MG51_17PL. */ +#define MG51_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG51_17PL = 0xFFFF; данные MG51_17PL. */ +#define MG51_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G58PL >= G51PL) или (G58PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G58PL >= G51PL) || (G58PL == 0) +/* Задаёт MG51_18PL = ~(1 << 7); данные MG51_18PL. */ +#define MG51_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG51_18PL = 0xFFFF; данные MG51_18PL. */ +#define MG51_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG51_11PL = 0x00FE; данные MG51_11PL. */ +#define MG51_11PL 0x00FE +/* Задаёт MG51 = (MG51_11PL & MG51_12PL & MG51_13PL & MG51_14PL &; маска разрешённых прерываний внутри группы PIE 51. */ +#define MG51 (MG51_11PL & MG51_12PL & MG51_13PL & MG51_14PL & \ + MG51_15PL & MG51_16PL & MG51_17PL & MG51_18PL) /* Продолжает список аргументов, полей или выражение MG51_15PL & MG51_16PL & MG51_17PL & MG51_18PL); порядок элементов сохраняется. */ +// End of MG51: + +// Beginning of MG52: +/* Условие компиляции (G51PL >= G52PL) или (G51PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G51PL >= G52PL) || (G51PL == 0) +/* Задаёт MG52_11PL = ~(1); данные MG52_11PL. */ +#define MG52_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG52_11PL = 0xFFFF; данные MG52_11PL. */ +#define MG52_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G53PL >= G52PL) или (G53PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G53PL >= G52PL) || (G53PL == 0) +/* Задаёт MG52_13PL = ~(1 << 2); данные MG52_13PL. */ +#define MG52_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG52_13PL = 0xFFFF; данные MG52_13PL. */ +#define MG52_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G54PL >= G52PL) или (G54PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G54PL >= G52PL) || (G54PL == 0) +/* Задаёт MG52_14PL = ~(1 << 3); данные MG52_14PL. */ +#define MG52_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG52_14PL = 0xFFFF; данные MG52_14PL. */ +#define MG52_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G55PL >= G52PL) или (G55PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G55PL >= G52PL) || (G55PL == 0) +/* Задаёт MG52_15PL = ~(1 << 4); данные MG52_15PL. */ +#define MG52_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG52_15PL = 0xFFFF; данные MG52_15PL. */ +#define MG52_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G56PL >= G52PL) или (G56PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G56PL >= G52PL) || (G56PL == 0) +/* Задаёт MG52_16PL = ~(1 << 5); данные MG52_16PL. */ +#define MG52_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG52_16PL = 0xFFFF; данные MG52_16PL. */ +#define MG52_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G57PL >= G52PL) или (G57PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G57PL >= G52PL) || (G57PL == 0) +/* Задаёт MG52_17PL = ~(1 << 6); данные MG52_17PL. */ +#define MG52_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG52_17PL = 0xFFFF; данные MG52_17PL. */ +#define MG52_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G58PL >= G52PL) или (G58PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G58PL >= G52PL) || (G58PL == 0) +/* Задаёт MG52_18PL = ~(1 << 7); данные MG52_18PL. */ +#define MG52_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG52_18PL = 0xFFFF; данные MG52_18PL. */ +#define MG52_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG52_12PL = 0x00FD; данные MG52_12PL. */ +#define MG52_12PL 0x00FD +/* Задаёт MG52 = (MG52_11PL & MG52_12PL & MG52_13PL & MG52_14PL &; маска разрешённых прерываний внутри группы PIE 52. */ +#define MG52 (MG52_11PL & MG52_12PL & MG52_13PL & MG52_14PL & \ + MG52_15PL & MG52_16PL & MG52_17PL & MG52_18PL) /* Продолжает список аргументов, полей или выражение MG52_15PL & MG52_16PL & MG52_17PL & MG52_18PL); порядок элементов сохраняется. */ +// End of MG52: + +// Beginning of MG53: +/* Условие компиляции (G51PL >= G53PL) или (G51PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G51PL >= G53PL) || (G51PL == 0) +/* Задаёт MG53_11PL = ~(1); данные MG53_11PL. */ +#define MG53_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG53_11PL = 0xFFFF; данные MG53_11PL. */ +#define MG53_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G52PL >= G53PL) или (G52PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G52PL >= G53PL) || (G52PL == 0) +/* Задаёт MG53_12PL = ~(1 << 1); данные MG53_12PL. */ +#define MG53_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG53_12PL = 0xFFFF; данные MG53_12PL. */ +#define MG53_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G54PL >= G53PL) или (G54PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G54PL >= G53PL) || (G54PL == 0) +/* Задаёт MG53_14PL = ~(1 << 3); данные MG53_14PL. */ +#define MG53_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG53_14PL = 0xFFFF; данные MG53_14PL. */ +#define MG53_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G55PL >= G53PL) или (G55PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G55PL >= G53PL) || (G55PL == 0) +/* Задаёт MG53_15PL = ~(1 << 4); данные MG53_15PL. */ +#define MG53_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG53_15PL = 0xFFFF; данные MG53_15PL. */ +#define MG53_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G56PL >= G53PL) или (G56PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G56PL >= G53PL) || (G56PL == 0) +/* Задаёт MG53_16PL = ~(1 << 5); данные MG53_16PL. */ +#define MG53_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG53_16PL = 0xFFFF; данные MG53_16PL. */ +#define MG53_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G57PL >= G53PL) или (G57PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G57PL >= G53PL) || (G57PL == 0) +/* Задаёт MG53_17PL = ~(1 << 6); данные MG53_17PL. */ +#define MG53_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG53_17PL = 0xFFFF; данные MG53_17PL. */ +#define MG53_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G58PL >= G53PL) или (G58PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G58PL >= G53PL) || (G58PL == 0) +/* Задаёт MG53_18PL = ~(1 << 7); данные MG53_18PL. */ +#define MG53_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG53_18PL = 0xFFFF; данные MG53_18PL. */ +#define MG53_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG53_13PL = 0x00FB; данные MG53_13PL. */ +#define MG53_13PL 0x00FB +/* Задаёт MG53 = (MG53_11PL & MG53_12PL & MG53_13PL & MG53_14PL &; маска разрешённых прерываний внутри группы PIE 53. */ +#define MG53 (MG53_11PL & MG53_12PL & MG53_13PL & MG53_14PL & \ + MG53_15PL & MG53_16PL & MG53_17PL & MG53_18PL) /* Продолжает список аргументов, полей или выражение MG53_15PL & MG53_16PL & MG53_17PL & MG53_18PL); порядок элементов сохраняется. */ +// End of MG53: + +// Beginning of MG54: +/* Условие компиляции (G51PL >= G54PL) или (G51PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G51PL >= G54PL) || (G51PL == 0) +/* Задаёт MG54_11PL = ~(1); данные MG54_11PL. */ +#define MG54_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG54_11PL = 0xFFFF; данные MG54_11PL. */ +#define MG54_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G52PL >= G54PL) или (G52PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G52PL >= G54PL) || (G52PL == 0) +/* Задаёт MG54_12PL = ~(1 << 1); данные MG54_12PL. */ +#define MG54_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG54_12PL = 0xFFFF; данные MG54_12PL. */ +#define MG54_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G53PL >= G54PL) или (G53PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G53PL >= G54PL) || (G53PL == 0) +/* Задаёт MG54_13PL = ~(1 << 2); данные MG54_13PL. */ +#define MG54_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG54_13PL = 0xFFFF; данные MG54_13PL. */ +#define MG54_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G55PL >= G54PL) или (G55PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G55PL >= G54PL) || (G55PL == 0) +/* Задаёт MG54_15PL = ~(1 << 4); данные MG54_15PL. */ +#define MG54_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG54_15PL = 0xFFFF; данные MG54_15PL. */ +#define MG54_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G56PL >= G54PL) или (G56PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G56PL >= G54PL) || (G56PL == 0) +/* Задаёт MG54_16PL = ~(1 << 5); данные MG54_16PL. */ +#define MG54_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG54_16PL = 0xFFFF; данные MG54_16PL. */ +#define MG54_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G57PL >= G54PL) или (G57PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G57PL >= G54PL) || (G57PL == 0) +/* Задаёт MG54_17PL = ~(1 << 6); данные MG54_17PL. */ +#define MG54_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG54_17PL = 0xFFFF; данные MG54_17PL. */ +#define MG54_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G58PL >= G54PL) или (G58PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G58PL >= G54PL) || (G58PL == 0) +/* Задаёт MG54_18PL = ~(1 << 7); данные MG54_18PL. */ +#define MG54_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG54_18PL = 0xFFFF; данные MG54_18PL. */ +#define MG54_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG54_14PL = 0x00F7; данные MG54_14PL. */ +#define MG54_14PL 0x00F7 +/* Задаёт MG54 = (MG54_11PL & MG54_12PL & MG54_13PL & MG54_14PL &; маска разрешённых прерываний внутри группы PIE 54. */ +#define MG54 (MG54_11PL & MG54_12PL & MG54_13PL & MG54_14PL & \ + MG54_15PL & MG54_16PL & MG54_17PL & MG54_18PL) /* Продолжает список аргументов, полей или выражение MG54_15PL & MG54_16PL & MG54_17PL & MG54_18PL); порядок элементов сохраняется. */ +// End of MG54: + +// Beginning of MG55: +/* Условие компиляции (G51PL >= G55PL) или (G51PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G51PL >= G55PL) || (G51PL == 0) +/* Задаёт MG55_11PL = ~(1); данные MG55_11PL. */ +#define MG55_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG55_11PL = 0xFFFF; данные MG55_11PL. */ +#define MG55_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G52PL >= G55PL) или (G52PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G52PL >= G55PL) || (G52PL == 0) +/* Задаёт MG55_12PL = ~(1 << 1); данные MG55_12PL. */ +#define MG55_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG55_12PL = 0xFFFF; данные MG55_12PL. */ +#define MG55_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G53PL >= G55PL) или (G53PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G53PL >= G55PL) || (G53PL == 0) +/* Задаёт MG55_13PL = ~(1 << 2); данные MG55_13PL. */ +#define MG55_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG55_13PL = 0xFFFF; данные MG55_13PL. */ +#define MG55_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G54PL >= G55PL) или (G54PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G54PL >= G55PL) || (G54PL == 0) +/* Задаёт MG55_14PL = ~(1 << 3); данные MG55_14PL. */ +#define MG55_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG55_14PL = 0xFFFF; данные MG55_14PL. */ +#define MG55_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G56PL >= G55PL) или (G56PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G56PL >= G55PL) || (G56PL == 0) +/* Задаёт MG55_16PL = ~(1 << 5); данные MG55_16PL. */ +#define MG55_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG55_16PL = 0xFFFF; данные MG55_16PL. */ +#define MG55_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G57PL >= G55PL) или (G57PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G57PL >= G55PL) || (G57PL == 0) +/* Задаёт MG55_17PL = ~(1 << 6); данные MG55_17PL. */ +#define MG55_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG55_17PL = 0xFFFF; данные MG55_17PL. */ +#define MG55_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G58PL >= G55PL) или (G58PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G58PL >= G55PL) || (G58PL == 0) +/* Задаёт MG55_18PL = ~(1 << 7); данные MG55_18PL. */ +#define MG55_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG55_18PL = 0xFFFF; данные MG55_18PL. */ +#define MG55_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG55_15PL = 0x00EF; данные MG55_15PL. */ +#define MG55_15PL 0x00EF +/* Задаёт MG55 = (MG55_11PL & MG55_12PL & MG55_13PL & MG55_14PL &; маска разрешённых прерываний внутри группы PIE 55. */ +#define MG55 (MG55_11PL & MG55_12PL & MG55_13PL & MG55_14PL & \ + MG55_15PL & MG55_16PL & MG55_17PL & MG55_18PL) /* Продолжает список аргументов, полей или выражение MG55_15PL & MG55_16PL & MG55_17PL & MG55_18PL); порядок элементов сохраняется. */ +// End of MG55: + +// Beginning of MG56: +/* Условие компиляции (G51PL >= G56PL) или (G51PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G51PL >= G56PL) || (G51PL == 0) +/* Задаёт MG56_11PL = ~(1); данные MG56_11PL. */ +#define MG56_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG56_11PL = 0xFFFF; данные MG56_11PL. */ +#define MG56_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G52PL >= G56PL) или (G52PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G52PL >= G56PL) || (G52PL == 0) +/* Задаёт MG56_12PL = ~(1 << 1); данные MG56_12PL. */ +#define MG56_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG56_12PL = 0xFFFF; данные MG56_12PL. */ +#define MG56_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G53PL >= G56PL) или (G53PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G53PL >= G56PL) || (G53PL == 0) +/* Задаёт MG56_13PL = ~(1 << 2); данные MG56_13PL. */ +#define MG56_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG56_13PL = 0xFFFF; данные MG56_13PL. */ +#define MG56_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G54PL >= G56PL) или (G54PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G54PL >= G56PL) || (G54PL == 0) +/* Задаёт MG56_14PL = ~(1 << 3); данные MG56_14PL. */ +#define MG56_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG56_14PL = 0xFFFF; данные MG56_14PL. */ +#define MG56_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G55PL >= G56PL) или (G55PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G55PL >= G56PL) || (G55PL == 0) +/* Задаёт MG56_15PL = ~(1 << 4); данные MG56_15PL. */ +#define MG56_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG56_15PL = 0xFFFF; данные MG56_15PL. */ +#define MG56_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G57PL >= G56PL) или (G57PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G57PL >= G56PL) || (G57PL == 0) +/* Задаёт MG56_17PL = ~(1 << 6); данные MG56_17PL. */ +#define MG56_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG56_17PL = 0xFFFF; данные MG56_17PL. */ +#define MG56_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G58PL >= G56PL) или (G58PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G58PL >= G56PL) || (G58PL == 0) +/* Задаёт MG56_18PL = ~(1 << 7); данные MG56_18PL. */ +#define MG56_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG56_18PL = 0xFFFF; данные MG56_18PL. */ +#define MG56_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG56_16PL = 0x00DF; данные MG56_16PL. */ +#define MG56_16PL 0x00DF +/* Задаёт MG56 = (MG56_11PL & MG56_12PL & MG56_13PL & MG56_14PL &; маска разрешённых прерываний внутри группы PIE 56. */ +#define MG56 (MG56_11PL & MG56_12PL & MG56_13PL & MG56_14PL & \ + MG56_15PL & MG56_16PL & MG56_17PL & MG56_18PL) /* Продолжает список аргументов, полей или выражение MG56_15PL & MG56_16PL & MG56_17PL & MG56_18PL); порядок элементов сохраняется. */ +// End of MG56: + +// Beginning of MG57: +/* Условие компиляции (G51PL >= G57PL) или (G51PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G51PL >= G57PL) || (G51PL == 0) +/* Задаёт MG57_11PL = ~(1); данные MG57_11PL. */ +#define MG57_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG57_11PL = 0xFFFF; данные MG57_11PL. */ +#define MG57_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G52PL >= G57PL) или (G52PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G52PL >= G57PL) || (G52PL == 0) +/* Задаёт MG57_12PL = ~(1 << 1); данные MG57_12PL. */ +#define MG57_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG57_12PL = 0xFFFF; данные MG57_12PL. */ +#define MG57_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G53PL >= G57PL) или (G53PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G53PL >= G57PL) || (G53PL == 0) +/* Задаёт MG57_13PL = ~(1 << 2); данные MG57_13PL. */ +#define MG57_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG57_13PL = 0xFFFF; данные MG57_13PL. */ +#define MG57_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G54PL >= G57PL) или (G54PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G54PL >= G57PL) || (G54PL == 0) +/* Задаёт MG57_14PL = ~(1 << 3); данные MG57_14PL. */ +#define MG57_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG57_14PL = 0xFFFF; данные MG57_14PL. */ +#define MG57_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G55PL >= G57PL) или (G55PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G55PL >= G57PL) || (G55PL == 0) +/* Задаёт MG57_15PL = ~(1 << 4); данные MG57_15PL. */ +#define MG57_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG57_15PL = 0xFFFF; данные MG57_15PL. */ +#define MG57_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G56PL >= G57PL) или (G56PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G56PL >= G57PL) || (G56PL == 0) +/* Задаёт MG57_16PL = ~(1 << 5); данные MG57_16PL. */ +#define MG57_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG57_16PL = 0xFFFF; данные MG57_16PL. */ +#define MG57_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G58PL >= G57PL) или (G58PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G58PL >= G57PL) || (G58PL == 0) +/* Задаёт MG57_18PL = ~(1 << 7); данные MG57_18PL. */ +#define MG57_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG57_18PL = 0xFFFF; данные MG57_18PL. */ +#define MG57_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG57_17PL = 0x00BF; данные MG57_17PL. */ +#define MG57_17PL 0x00BF +/* Задаёт MG57 = (MG57_11PL & MG57_12PL & MG57_13PL & MG57_14PL &; маска разрешённых прерываний внутри группы PIE 57. */ +#define MG57 (MG57_11PL & MG57_12PL & MG57_13PL & MG57_14PL & \ + MG57_15PL & MG57_16PL & MG57_17PL & MG57_18PL) /* Продолжает список аргументов, полей или выражение MG57_15PL & MG57_16PL & MG57_17PL & MG57_18PL); порядок элементов сохраняется. */ +// End of MG57: + +// Beginning of MG58: +/* Условие компиляции (G51PL >= G58PL) или (G51PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G51PL >= G58PL) || (G51PL == 0) +/* Задаёт MG58_11PL = ~(1); данные MG58_11PL. */ +#define MG58_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG58_11PL = 0xFFFF; данные MG58_11PL. */ +#define MG58_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G52PL >= G58PL) или (G52PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G52PL >= G58PL) || (G52PL == 0) +/* Задаёт MG58_12PL = ~(1 << 1); данные MG58_12PL. */ +#define MG58_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG58_12PL = 0xFFFF; данные MG58_12PL. */ +#define MG58_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G53PL >= G58PL) или (G53PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G53PL >= G58PL) || (G53PL == 0) +/* Задаёт MG58_13PL = ~(1 << 2); данные MG58_13PL. */ +#define MG58_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG58_13PL = 0xFFFF; данные MG58_13PL. */ +#define MG58_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G54PL >= G58PL) или (G54PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G54PL >= G58PL) || (G54PL == 0) +/* Задаёт MG58_14PL = ~(1 << 3); данные MG58_14PL. */ +#define MG58_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG58_14PL = 0xFFFF; данные MG58_14PL. */ +#define MG58_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G55PL >= G58PL) или (G55PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G55PL >= G58PL) || (G55PL == 0) +/* Задаёт MG58_15PL = ~(1 << 4); данные MG58_15PL. */ +#define MG58_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG58_15PL = 0xFFFF; данные MG58_15PL. */ +#define MG58_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G56PL >= G58PL) или (G56PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G56PL >= G58PL) || (G56PL == 0) +/* Задаёт MG58_16PL = ~(1 << 5); данные MG58_16PL. */ +#define MG58_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG58_16PL = 0xFFFF; данные MG58_16PL. */ +#define MG58_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G57PL >= G58PL) или (G57PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G57PL >= G58PL) || (G57PL == 0) +/* Задаёт MG58_17PL = ~(1 << 6); данные MG58_17PL. */ +#define MG58_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG58_17PL = 0xFFFF; данные MG58_17PL. */ +#define MG58_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG58_18PL = 0x007F; данные MG58_18PL. */ +#define MG58_18PL 0x007F +/* Задаёт MG58 = (MG58_11PL & MG58_12PL & MG58_13PL & MG58_14PL &; маска разрешённых прерываний внутри группы PIE 58. */ +#define MG58 (MG58_11PL & MG58_12PL & MG58_13PL & MG58_14PL & \ + MG58_15PL & MG58_16PL & MG58_17PL & MG58_18PL) /* Продолжает список аргументов, полей или выражение MG58_15PL & MG58_16PL & MG58_17PL & MG58_18PL); порядок элементов сохраняется. */ +// End of MG58: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG61 to MG68: +// + +// Beginning of MG61: +/* Условие компиляции (G62PL >= G61PL) или (G62PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G62PL >= G61PL) || (G62PL == 0) +/* Задаёт MG61_12PL = ~(1 << 1); данные MG61_12PL. */ +#define MG61_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG61_12PL = 0xFFFF; данные MG61_12PL. */ +#define MG61_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G63PL >= G61PL) или (G63PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G63PL >= G61PL) || (G63PL == 0) +/* Задаёт MG61_13PL = ~(1 << 2); данные MG61_13PL. */ +#define MG61_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG61_13PL = 0xFFFF; данные MG61_13PL. */ +#define MG61_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G64PL >= G61PL) или (G64PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G64PL >= G61PL) || (G64PL == 0) +/* Задаёт MG61_14PL = ~(1 << 3); данные MG61_14PL. */ +#define MG61_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG61_14PL = 0xFFFF; данные MG61_14PL. */ +#define MG61_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G65PL >= G61PL) или (G65PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G65PL >= G61PL) || (G65PL == 0) +/* Задаёт MG61_15PL = ~(1 << 4); данные MG61_15PL. */ +#define MG61_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG61_15PL = 0xFFFF; данные MG61_15PL. */ +#define MG61_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G66PL >= G61PL) или (G66PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G66PL >= G61PL) || (G66PL == 0) +/* Задаёт MG61_16PL = ~(1 << 5); данные MG61_16PL. */ +#define MG61_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG61_16PL = 0xFFFF; данные MG61_16PL. */ +#define MG61_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G67PL >= G61PL) или (G67PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G67PL >= G61PL) || (G67PL == 0) +/* Задаёт MG61_17PL = ~(1 << 6); данные MG61_17PL. */ +#define MG61_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG61_17PL = 0xFFFF; данные MG61_17PL. */ +#define MG61_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G68PL >= G61PL) или (G68PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G68PL >= G61PL) || (G68PL == 0) +/* Задаёт MG61_18PL = ~(1 << 7); данные MG61_18PL. */ +#define MG61_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG61_18PL = 0xFFFF; данные MG61_18PL. */ +#define MG61_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG61_11PL = 0x00FE; данные MG61_11PL. */ +#define MG61_11PL 0x00FE +/* Задаёт MG61 = (MG61_11PL & MG61_12PL & MG61_13PL & MG61_14PL &; маска разрешённых прерываний внутри группы PIE 61. */ +#define MG61 (MG61_11PL & MG61_12PL & MG61_13PL & MG61_14PL & \ + MG61_15PL & MG61_16PL & MG61_17PL & MG61_18PL) /* Продолжает список аргументов, полей или выражение MG61_15PL & MG61_16PL & MG61_17PL & MG61_18PL); порядок элементов сохраняется. */ +// End of MG61: + +// Beginning of MG62: +/* Условие компиляции (G61PL >= G62PL) или (G61PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G61PL >= G62PL) || (G61PL == 0) +/* Задаёт MG62_11PL = ~(1); данные MG62_11PL. */ +#define MG62_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG62_11PL = 0xFFFF; данные MG62_11PL. */ +#define MG62_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G63PL >= G62PL) или (G63PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G63PL >= G62PL) || (G63PL == 0) +/* Задаёт MG62_13PL = ~(1 << 2); данные MG62_13PL. */ +#define MG62_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG62_13PL = 0xFFFF; данные MG62_13PL. */ +#define MG62_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G64PL >= G62PL) или (G64PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G64PL >= G62PL) || (G64PL == 0) +/* Задаёт MG62_14PL = ~(1 << 3); данные MG62_14PL. */ +#define MG62_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG62_14PL = 0xFFFF; данные MG62_14PL. */ +#define MG62_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G65PL >= G62PL) или (G65PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G65PL >= G62PL) || (G65PL == 0) +/* Задаёт MG62_15PL = ~(1 << 4); данные MG62_15PL. */ +#define MG62_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG62_15PL = 0xFFFF; данные MG62_15PL. */ +#define MG62_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G66PL >= G62PL) или (G66PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G66PL >= G62PL) || (G66PL == 0) +/* Задаёт MG62_16PL = ~(1 << 5); данные MG62_16PL. */ +#define MG62_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG62_16PL = 0xFFFF; данные MG62_16PL. */ +#define MG62_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G67PL >= G62PL) или (G67PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G67PL >= G62PL) || (G67PL == 0) +/* Задаёт MG62_17PL = ~(1 << 6); данные MG62_17PL. */ +#define MG62_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG62_17PL = 0xFFFF; данные MG62_17PL. */ +#define MG62_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G68PL >= G62PL) или (G68PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G68PL >= G62PL) || (G68PL == 0) +/* Задаёт MG62_18PL = ~(1 << 7); данные MG62_18PL. */ +#define MG62_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG62_18PL = 0xFFFF; данные MG62_18PL. */ +#define MG62_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG62_12PL = 0x00FD; данные MG62_12PL. */ +#define MG62_12PL 0x00FD +/* Задаёт MG62 = (MG62_11PL & MG62_12PL & MG62_13PL & MG62_14PL &; маска разрешённых прерываний внутри группы PIE 62. */ +#define MG62 (MG62_11PL & MG62_12PL & MG62_13PL & MG62_14PL & \ + MG62_15PL & MG62_16PL & MG62_17PL & MG62_18PL) /* Продолжает список аргументов, полей или выражение MG62_15PL & MG62_16PL & MG62_17PL & MG62_18PL); порядок элементов сохраняется. */ +// End of MG62: + +// Beginning of MG63: +/* Условие компиляции (G61PL >= G63PL) или (G61PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G61PL >= G63PL) || (G61PL == 0) +/* Задаёт MG63_11PL = ~(1); данные MG63_11PL. */ +#define MG63_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG63_11PL = 0xFFFF; данные MG63_11PL. */ +#define MG63_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G62PL >= G63PL) или (G62PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G62PL >= G63PL) || (G62PL == 0) +/* Задаёт MG63_12PL = ~(1 << 1); данные MG63_12PL. */ +#define MG63_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG63_12PL = 0xFFFF; данные MG63_12PL. */ +#define MG63_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G64PL >= G63PL) или (G64PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G64PL >= G63PL) || (G64PL == 0) +/* Задаёт MG63_14PL = ~(1 << 3); данные MG63_14PL. */ +#define MG63_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG63_14PL = 0xFFFF; данные MG63_14PL. */ +#define MG63_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G65PL >= G63PL) или (G65PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G65PL >= G63PL) || (G65PL == 0) +/* Задаёт MG63_15PL = ~(1 << 4); данные MG63_15PL. */ +#define MG63_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG63_15PL = 0xFFFF; данные MG63_15PL. */ +#define MG63_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G66PL >= G63PL) или (G66PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G66PL >= G63PL) || (G66PL == 0) +/* Задаёт MG63_16PL = ~(1 << 5); данные MG63_16PL. */ +#define MG63_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG63_16PL = 0xFFFF; данные MG63_16PL. */ +#define MG63_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G67PL >= G63PL) или (G67PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G67PL >= G63PL) || (G67PL == 0) +/* Задаёт MG63_17PL = ~(1 << 6); данные MG63_17PL. */ +#define MG63_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG63_17PL = 0xFFFF; данные MG63_17PL. */ +#define MG63_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G68PL >= G63PL) или (G68PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G68PL >= G63PL) || (G68PL == 0) +/* Задаёт MG63_18PL = ~(1 << 7); данные MG63_18PL. */ +#define MG63_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG63_18PL = 0xFFFF; данные MG63_18PL. */ +#define MG63_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG63_13PL = 0x00FB; данные MG63_13PL. */ +#define MG63_13PL 0x00FB +/* Задаёт MG63 = (MG63_11PL & MG63_12PL & MG63_13PL & MG63_14PL &; маска разрешённых прерываний внутри группы PIE 63. */ +#define MG63 (MG63_11PL & MG63_12PL & MG63_13PL & MG63_14PL & \ + MG63_15PL & MG63_16PL & MG63_17PL & MG63_18PL) /* Продолжает список аргументов, полей или выражение MG63_15PL & MG63_16PL & MG63_17PL & MG63_18PL); порядок элементов сохраняется. */ +// End of MG63: + +// Beginning of MG64: +/* Условие компиляции (G61PL >= G64PL) или (G61PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G61PL >= G64PL) || (G61PL == 0) +/* Задаёт MG64_11PL = ~(1); данные MG64_11PL. */ +#define MG64_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG64_11PL = 0xFFFF; данные MG64_11PL. */ +#define MG64_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G62PL >= G64PL) или (G62PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G62PL >= G64PL) || (G62PL == 0) +/* Задаёт MG64_12PL = ~(1 << 1); данные MG64_12PL. */ +#define MG64_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG64_12PL = 0xFFFF; данные MG64_12PL. */ +#define MG64_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G63PL >= G64PL) или (G63PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G63PL >= G64PL) || (G63PL == 0) +/* Задаёт MG64_13PL = ~(1 << 2); данные MG64_13PL. */ +#define MG64_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG64_13PL = 0xFFFF; данные MG64_13PL. */ +#define MG64_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G65PL >= G64PL) или (G65PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G65PL >= G64PL) || (G65PL == 0) +/* Задаёт MG64_15PL = ~(1 << 4); данные MG64_15PL. */ +#define MG64_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG64_15PL = 0xFFFF; данные MG64_15PL. */ +#define MG64_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G66PL >= G64PL) или (G66PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G66PL >= G64PL) || (G66PL == 0) +/* Задаёт MG64_16PL = ~(1 << 5); данные MG64_16PL. */ +#define MG64_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG64_16PL = 0xFFFF; данные MG64_16PL. */ +#define MG64_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G67PL >= G64PL) или (G67PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G67PL >= G64PL) || (G67PL == 0) +/* Задаёт MG64_17PL = ~(1 << 6); данные MG64_17PL. */ +#define MG64_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG64_17PL = 0xFFFF; данные MG64_17PL. */ +#define MG64_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G68PL >= G64PL) или (G68PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G68PL >= G64PL) || (G68PL == 0) +/* Задаёт MG64_18PL = ~(1 << 7); данные MG64_18PL. */ +#define MG64_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG64_18PL = 0xFFFF; данные MG64_18PL. */ +#define MG64_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG64_14PL = 0x00F7; данные MG64_14PL. */ +#define MG64_14PL 0x00F7 +/* Задаёт MG64 = (MG64_11PL & MG64_12PL & MG64_13PL & MG64_14PL &; маска разрешённых прерываний внутри группы PIE 64. */ +#define MG64 (MG64_11PL & MG64_12PL & MG64_13PL & MG64_14PL & \ + MG64_15PL & MG64_16PL & MG64_17PL & MG64_18PL) /* Продолжает список аргументов, полей или выражение MG64_15PL & MG64_16PL & MG64_17PL & MG64_18PL); порядок элементов сохраняется. */ +// End of MG64: + +// Beginning of MG65: +/* Условие компиляции (G61PL >= G65PL) или (G61PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G61PL >= G65PL) || (G61PL == 0) +/* Задаёт MG65_11PL = ~(1); данные MG65_11PL. */ +#define MG65_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG65_11PL = 0xFFFF; данные MG65_11PL. */ +#define MG65_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G62PL >= G65PL) или (G62PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G62PL >= G65PL) || (G62PL == 0) +/* Задаёт MG65_12PL = ~(1 << 1); данные MG65_12PL. */ +#define MG65_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG65_12PL = 0xFFFF; данные MG65_12PL. */ +#define MG65_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G63PL >= G65PL) или (G63PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G63PL >= G65PL) || (G63PL == 0) +/* Задаёт MG65_13PL = ~(1 << 2); данные MG65_13PL. */ +#define MG65_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG65_13PL = 0xFFFF; данные MG65_13PL. */ +#define MG65_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G64PL >= G65PL) или (G64PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G64PL >= G65PL) || (G64PL == 0) +/* Задаёт MG65_14PL = ~(1 << 3); данные MG65_14PL. */ +#define MG65_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG65_14PL = 0xFFFF; данные MG65_14PL. */ +#define MG65_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G66PL >= G65PL) или (G66PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G66PL >= G65PL) || (G66PL == 0) +/* Задаёт MG65_16PL = ~(1 << 5); данные MG65_16PL. */ +#define MG65_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG65_16PL = 0xFFFF; данные MG65_16PL. */ +#define MG65_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G67PL >= G65PL) или (G67PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G67PL >= G65PL) || (G67PL == 0) +/* Задаёт MG65_17PL = ~(1 << 6); данные MG65_17PL. */ +#define MG65_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG65_17PL = 0xFFFF; данные MG65_17PL. */ +#define MG65_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G68PL >= G65PL) или (G68PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G68PL >= G65PL) || (G68PL == 0) +/* Задаёт MG65_18PL = ~(1 << 7); данные MG65_18PL. */ +#define MG65_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG65_18PL = 0xFFFF; данные MG65_18PL. */ +#define MG65_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG65_15PL = 0x00EF; данные MG65_15PL. */ +#define MG65_15PL 0x00EF +/* Задаёт MG65 = (MG65_11PL & MG65_12PL & MG65_13PL & MG65_14PL &; маска разрешённых прерываний внутри группы PIE 65. */ +#define MG65 (MG65_11PL & MG65_12PL & MG65_13PL & MG65_14PL & \ + MG65_15PL & MG65_16PL & MG65_17PL & MG65_18PL) /* Продолжает список аргументов, полей или выражение MG65_15PL & MG65_16PL & MG65_17PL & MG65_18PL); порядок элементов сохраняется. */ +// End of MG65: + +// Beginning of MG66: +/* Условие компиляции (G61PL >= G66PL) или (G61PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G61PL >= G66PL) || (G61PL == 0) +/* Задаёт MG66_11PL = ~(1); данные MG66_11PL. */ +#define MG66_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG66_11PL = 0xFFFF; данные MG66_11PL. */ +#define MG66_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G62PL >= G66PL) или (G62PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G62PL >= G66PL) || (G62PL == 0) +/* Задаёт MG66_12PL = ~(1 << 1); данные MG66_12PL. */ +#define MG66_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG66_12PL = 0xFFFF; данные MG66_12PL. */ +#define MG66_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G63PL >= G66PL) или (G63PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G63PL >= G66PL) || (G63PL == 0) +/* Задаёт MG66_13PL = ~(1 << 2); данные MG66_13PL. */ +#define MG66_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG66_13PL = 0xFFFF; данные MG66_13PL. */ +#define MG66_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G64PL >= G66PL) или (G64PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G64PL >= G66PL) || (G64PL == 0) +/* Задаёт MG66_14PL = ~(1 << 3); данные MG66_14PL. */ +#define MG66_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG66_14PL = 0xFFFF; данные MG66_14PL. */ +#define MG66_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G65PL >= G66PL) или (G65PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G65PL >= G66PL) || (G65PL == 0) +/* Задаёт MG66_15PL = ~(1 << 4); данные MG66_15PL. */ +#define MG66_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG66_15PL = 0xFFFF; данные MG66_15PL. */ +#define MG66_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G67PL >= G66PL) или (G67PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G67PL >= G66PL) || (G67PL == 0) +/* Задаёт MG66_17PL = ~(1 << 6); данные MG66_17PL. */ +#define MG66_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG66_17PL = 0xFFFF; данные MG66_17PL. */ +#define MG66_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G68PL >= G66PL) или (G68PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G68PL >= G66PL) || (G68PL == 0) +/* Задаёт MG66_18PL = ~(1 << 7); данные MG66_18PL. */ +#define MG66_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG66_18PL = 0xFFFF; данные MG66_18PL. */ +#define MG66_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG66_16PL = 0x00DF; данные MG66_16PL. */ +#define MG66_16PL 0x00DF +/* Задаёт MG66 = (MG66_11PL & MG66_12PL & MG66_13PL & MG66_14PL &; маска разрешённых прерываний внутри группы PIE 66. */ +#define MG66 (MG66_11PL & MG66_12PL & MG66_13PL & MG66_14PL & \ + MG66_15PL & MG66_16PL & MG66_17PL & MG66_18PL) /* Продолжает список аргументов, полей или выражение MG66_15PL & MG66_16PL & MG66_17PL & MG66_18PL); порядок элементов сохраняется. */ +// End of MG66: + +// Beginning of MG67: +/* Условие компиляции (G61PL >= G67PL) или (G61PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G61PL >= G67PL) || (G61PL == 0) +/* Задаёт MG67_11PL = ~(1); данные MG67_11PL. */ +#define MG67_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG67_11PL = 0xFFFF; данные MG67_11PL. */ +#define MG67_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G62PL >= G67PL) или (G62PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G62PL >= G67PL) || (G62PL == 0) +/* Задаёт MG67_12PL = ~(1 << 1); данные MG67_12PL. */ +#define MG67_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG67_12PL = 0xFFFF; данные MG67_12PL. */ +#define MG67_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G63PL >= G67PL) или (G63PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G63PL >= G67PL) || (G63PL == 0) +/* Задаёт MG67_13PL = ~(1 << 2); данные MG67_13PL. */ +#define MG67_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG67_13PL = 0xFFFF; данные MG67_13PL. */ +#define MG67_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G64PL >= G67PL) или (G64PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G64PL >= G67PL) || (G64PL == 0) +/* Задаёт MG67_14PL = ~(1 << 3); данные MG67_14PL. */ +#define MG67_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG67_14PL = 0xFFFF; данные MG67_14PL. */ +#define MG67_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G65PL >= G67PL) или (G65PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G65PL >= G67PL) || (G65PL == 0) +/* Задаёт MG67_15PL = ~(1 << 4); данные MG67_15PL. */ +#define MG67_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG67_15PL = 0xFFFF; данные MG67_15PL. */ +#define MG67_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G66PL >= G67PL) или (G66PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G66PL >= G67PL) || (G66PL == 0) +/* Задаёт MG67_16PL = ~(1 << 5); данные MG67_16PL. */ +#define MG67_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG67_16PL = 0xFFFF; данные MG67_16PL. */ +#define MG67_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G68PL >= G67PL) или (G68PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G68PL >= G67PL) || (G68PL == 0) +/* Задаёт MG67_18PL = ~(1 << 7); данные MG67_18PL. */ +#define MG67_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG67_18PL = 0xFFFF; данные MG67_18PL. */ +#define MG67_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG67_17PL = 0x00BF; данные MG67_17PL. */ +#define MG67_17PL 0x00BF +/* Задаёт MG67 = (MG67_11PL & MG67_12PL & MG67_13PL & MG67_14PL &; маска разрешённых прерываний внутри группы PIE 67. */ +#define MG67 (MG67_11PL & MG67_12PL & MG67_13PL & MG67_14PL & \ + MG67_15PL & MG67_16PL & MG67_17PL & MG67_18PL) /* Продолжает список аргументов, полей или выражение MG67_15PL & MG67_16PL & MG67_17PL & MG67_18PL); порядок элементов сохраняется. */ +// End of MG67: + +// Beginning of MG68: +/* Условие компиляции (G61PL >= G68PL) или (G61PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G61PL >= G68PL) || (G61PL == 0) +/* Задаёт MG68_11PL = ~(1); данные MG68_11PL. */ +#define MG68_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG68_11PL = 0xFFFF; данные MG68_11PL. */ +#define MG68_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G62PL >= G68PL) или (G62PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G62PL >= G68PL) || (G62PL == 0) +/* Задаёт MG68_12PL = ~(1 << 1); данные MG68_12PL. */ +#define MG68_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG68_12PL = 0xFFFF; данные MG68_12PL. */ +#define MG68_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G63PL >= G68PL) или (G63PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G63PL >= G68PL) || (G63PL == 0) +/* Задаёт MG68_13PL = ~(1 << 2); данные MG68_13PL. */ +#define MG68_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG68_13PL = 0xFFFF; данные MG68_13PL. */ +#define MG68_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G64PL >= G68PL) или (G64PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G64PL >= G68PL) || (G64PL == 0) +/* Задаёт MG68_14PL = ~(1 << 3); данные MG68_14PL. */ +#define MG68_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG68_14PL = 0xFFFF; данные MG68_14PL. */ +#define MG68_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G65PL >= G68PL) или (G65PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G65PL >= G68PL) || (G65PL == 0) +/* Задаёт MG68_15PL = ~(1 << 4); данные MG68_15PL. */ +#define MG68_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG68_15PL = 0xFFFF; данные MG68_15PL. */ +#define MG68_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G66PL >= G68PL) или (G66PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G66PL >= G68PL) || (G66PL == 0) +/* Задаёт MG68_16PL = ~(1 << 5); данные MG68_16PL. */ +#define MG68_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG68_16PL = 0xFFFF; данные MG68_16PL. */ +#define MG68_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G67PL >= G68PL) или (G67PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G67PL >= G68PL) || (G67PL == 0) +/* Задаёт MG68_17PL = ~(1 << 6); данные MG68_17PL. */ +#define MG68_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG68_17PL = 0xFFFF; данные MG68_17PL. */ +#define MG68_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG68_18PL = 0x007F; данные MG68_18PL. */ +#define MG68_18PL 0x007F +/* Задаёт MG68 = (MG68_11PL & MG68_12PL & MG68_13PL & MG68_14PL &; маска разрешённых прерываний внутри группы PIE 68. */ +#define MG68 (MG68_11PL & MG68_12PL & MG68_13PL & MG68_14PL & \ + MG68_15PL & MG68_16PL & MG68_17PL & MG68_18PL) /* Продолжает список аргументов, полей или выражение MG68_15PL & MG68_16PL & MG68_17PL & MG68_18PL); порядок элементов сохраняется. */ +// End of MG68: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG71 to MG78: +// + +// Beginning of MG71: +/* Условие компиляции (G72PL >= G71PL) или (G72PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G72PL >= G71PL) || (G72PL == 0) +/* Задаёт MG71_12PL = ~(1 << 1); данные MG71_12PL. */ +#define MG71_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG71_12PL = 0xFFFF; данные MG71_12PL. */ +#define MG71_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G73PL >= G71PL) или (G73PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G73PL >= G71PL) || (G73PL == 0) +/* Задаёт MG71_13PL = ~(1 << 2); данные MG71_13PL. */ +#define MG71_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG71_13PL = 0xFFFF; данные MG71_13PL. */ +#define MG71_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G74PL >= G71PL) или (G74PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G74PL >= G71PL) || (G74PL == 0) +/* Задаёт MG71_14PL = ~(1 << 3); данные MG71_14PL. */ +#define MG71_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG71_14PL = 0xFFFF; данные MG71_14PL. */ +#define MG71_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G75PL >= G71PL) или (G75PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G75PL >= G71PL) || (G75PL == 0) +/* Задаёт MG71_15PL = ~(1 << 4); данные MG71_15PL. */ +#define MG71_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG71_15PL = 0xFFFF; данные MG71_15PL. */ +#define MG71_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G76PL >= G71PL) или (G76PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G76PL >= G71PL) || (G76PL == 0) +/* Задаёт MG71_16PL = ~(1 << 5); данные MG71_16PL. */ +#define MG71_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG71_16PL = 0xFFFF; данные MG71_16PL. */ +#define MG71_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G77PL >= G71PL) или (G77PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G77PL >= G71PL) || (G77PL == 0) +/* Задаёт MG71_17PL = ~(1 << 6); данные MG71_17PL. */ +#define MG71_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG71_17PL = 0xFFFF; данные MG71_17PL. */ +#define MG71_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G78PL >= G71PL) или (G78PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G78PL >= G71PL) || (G78PL == 0) +/* Задаёт MG71_18PL = ~(1 << 7); данные MG71_18PL. */ +#define MG71_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG71_18PL = 0xFFFF; данные MG71_18PL. */ +#define MG71_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG71_11PL = 0x00FE; данные MG71_11PL. */ +#define MG71_11PL 0x00FE +/* Задаёт MG71 = (MG71_11PL & MG71_12PL & MG71_13PL & MG71_14PL &; маска разрешённых прерываний внутри группы PIE 71. */ +#define MG71 (MG71_11PL & MG71_12PL & MG71_13PL & MG71_14PL & \ + MG71_15PL & MG71_16PL & MG71_17PL & MG71_18PL) /* Продолжает список аргументов, полей или выражение MG71_15PL & MG71_16PL & MG71_17PL & MG71_18PL); порядок элементов сохраняется. */ +// End of MG71: + +// Beginning of MG72: +/* Условие компиляции (G71PL >= G72PL) или (G71PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G71PL >= G72PL) || (G71PL == 0) +/* Задаёт MG72_11PL = ~(1); данные MG72_11PL. */ +#define MG72_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG72_11PL = 0xFFFF; данные MG72_11PL. */ +#define MG72_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G73PL >= G72PL) или (G73PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G73PL >= G72PL) || (G73PL == 0) +/* Задаёт MG72_13PL = ~(1 << 2); данные MG72_13PL. */ +#define MG72_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG72_13PL = 0xFFFF; данные MG72_13PL. */ +#define MG72_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G74PL >= G72PL) или (G74PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G74PL >= G72PL) || (G74PL == 0) +/* Задаёт MG72_14PL = ~(1 << 3); данные MG72_14PL. */ +#define MG72_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG72_14PL = 0xFFFF; данные MG72_14PL. */ +#define MG72_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G75PL >= G72PL) или (G75PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G75PL >= G72PL) || (G75PL == 0) +/* Задаёт MG72_15PL = ~(1 << 4); данные MG72_15PL. */ +#define MG72_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG72_15PL = 0xFFFF; данные MG72_15PL. */ +#define MG72_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G76PL >= G72PL) или (G76PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G76PL >= G72PL) || (G76PL == 0) +/* Задаёт MG72_16PL = ~(1 << 5); данные MG72_16PL. */ +#define MG72_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG72_16PL = 0xFFFF; данные MG72_16PL. */ +#define MG72_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G77PL >= G72PL) или (G77PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G77PL >= G72PL) || (G77PL == 0) +/* Задаёт MG72_17PL = ~(1 << 6); данные MG72_17PL. */ +#define MG72_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG72_17PL = 0xFFFF; данные MG72_17PL. */ +#define MG72_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G78PL >= G72PL) или (G78PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G78PL >= G72PL) || (G78PL == 0) +/* Задаёт MG72_18PL = ~(1 << 7); данные MG72_18PL. */ +#define MG72_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG72_18PL = 0xFFFF; данные MG72_18PL. */ +#define MG72_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG72_12PL = 0x00FD; данные MG72_12PL. */ +#define MG72_12PL 0x00FD +/* Задаёт MG72 = (MG72_11PL & MG72_12PL & MG72_13PL & MG72_14PL &; маска разрешённых прерываний внутри группы PIE 72. */ +#define MG72 (MG72_11PL & MG72_12PL & MG72_13PL & MG72_14PL & \ + MG72_15PL & MG72_16PL & MG72_17PL & MG72_18PL) /* Продолжает список аргументов, полей или выражение MG72_15PL & MG72_16PL & MG72_17PL & MG72_18PL); порядок элементов сохраняется. */ +// End of MG72: + +// Beginning of MG73: +/* Условие компиляции (G71PL >= G73PL) или (G71PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G71PL >= G73PL) || (G71PL == 0) +/* Задаёт MG73_11PL = ~(1); данные MG73_11PL. */ +#define MG73_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG73_11PL = 0xFFFF; данные MG73_11PL. */ +#define MG73_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G72PL >= G73PL) или (G72PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G72PL >= G73PL) || (G72PL == 0) +/* Задаёт MG73_12PL = ~(1 << 1); данные MG73_12PL. */ +#define MG73_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG73_12PL = 0xFFFF; данные MG73_12PL. */ +#define MG73_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G74PL >= G73PL) или (G74PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G74PL >= G73PL) || (G74PL == 0) +/* Задаёт MG73_14PL = ~(1 << 3); данные MG73_14PL. */ +#define MG73_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG73_14PL = 0xFFFF; данные MG73_14PL. */ +#define MG73_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G75PL >= G73PL) или (G75PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G75PL >= G73PL) || (G75PL == 0) +/* Задаёт MG73_15PL = ~(1 << 4); данные MG73_15PL. */ +#define MG73_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG73_15PL = 0xFFFF; данные MG73_15PL. */ +#define MG73_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G76PL >= G73PL) или (G76PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G76PL >= G73PL) || (G76PL == 0) +/* Задаёт MG73_16PL = ~(1 << 5); данные MG73_16PL. */ +#define MG73_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG73_16PL = 0xFFFF; данные MG73_16PL. */ +#define MG73_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G77PL >= G73PL) или (G77PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G77PL >= G73PL) || (G77PL == 0) +/* Задаёт MG73_17PL = ~(1 << 6); данные MG73_17PL. */ +#define MG73_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG73_17PL = 0xFFFF; данные MG73_17PL. */ +#define MG73_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G78PL >= G73PL) или (G78PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G78PL >= G73PL) || (G78PL == 0) +/* Задаёт MG73_18PL = ~(1 << 7); данные MG73_18PL. */ +#define MG73_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG73_18PL = 0xFFFF; данные MG73_18PL. */ +#define MG73_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG73_13PL = 0x00FB; данные MG73_13PL. */ +#define MG73_13PL 0x00FB +/* Задаёт MG73 = (MG73_11PL & MG73_12PL & MG73_13PL & MG73_14PL &; маска разрешённых прерываний внутри группы PIE 73. */ +#define MG73 (MG73_11PL & MG73_12PL & MG73_13PL & MG73_14PL & \ + MG73_15PL & MG73_16PL & MG73_17PL & MG73_18PL) /* Продолжает список аргументов, полей или выражение MG73_15PL & MG73_16PL & MG73_17PL & MG73_18PL); порядок элементов сохраняется. */ +// End of MG73: + +// Beginning of MG74: +/* Условие компиляции (G71PL >= G74PL) или (G71PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G71PL >= G74PL) || (G71PL == 0) +/* Задаёт MG74_11PL = ~(1); данные MG74_11PL. */ +#define MG74_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG74_11PL = 0xFFFF; данные MG74_11PL. */ +#define MG74_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G72PL >= G74PL) или (G72PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G72PL >= G74PL) || (G72PL == 0) +/* Задаёт MG74_12PL = ~(1 << 1); данные MG74_12PL. */ +#define MG74_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG74_12PL = 0xFFFF; данные MG74_12PL. */ +#define MG74_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G73PL >= G74PL) или (G73PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G73PL >= G74PL) || (G73PL == 0) +/* Задаёт MG74_13PL = ~(1 << 2); данные MG74_13PL. */ +#define MG74_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG74_13PL = 0xFFFF; данные MG74_13PL. */ +#define MG74_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G75PL >= G74PL) или (G75PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G75PL >= G74PL) || (G75PL == 0) +/* Задаёт MG74_15PL = ~(1 << 4); данные MG74_15PL. */ +#define MG74_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG74_15PL = 0xFFFF; данные MG74_15PL. */ +#define MG74_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G76PL >= G74PL) или (G76PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G76PL >= G74PL) || (G76PL == 0) +/* Задаёт MG74_16PL = ~(1 << 5); данные MG74_16PL. */ +#define MG74_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG74_16PL = 0xFFFF; данные MG74_16PL. */ +#define MG74_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G77PL >= G74PL) или (G77PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G77PL >= G74PL) || (G77PL == 0) +/* Задаёт MG74_17PL = ~(1 << 6); данные MG74_17PL. */ +#define MG74_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG74_17PL = 0xFFFF; данные MG74_17PL. */ +#define MG74_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G78PL >= G74PL) или (G78PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G78PL >= G74PL) || (G78PL == 0) +/* Задаёт MG74_18PL = ~(1 << 7); данные MG74_18PL. */ +#define MG74_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG74_18PL = 0xFFFF; данные MG74_18PL. */ +#define MG74_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG74_14PL = 0x00F7; данные MG74_14PL. */ +#define MG74_14PL 0x00F7 +/* Задаёт MG74 = (MG74_11PL & MG74_12PL & MG74_13PL & MG74_14PL &; маска разрешённых прерываний внутри группы PIE 74. */ +#define MG74 (MG74_11PL & MG74_12PL & MG74_13PL & MG74_14PL & \ + MG74_15PL & MG74_16PL & MG74_17PL & MG74_18PL) /* Продолжает список аргументов, полей или выражение MG74_15PL & MG74_16PL & MG74_17PL & MG74_18PL); порядок элементов сохраняется. */ +// End of MG74: + +// Beginning of MG75: +/* Условие компиляции (G71PL >= G75PL) или (G71PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G71PL >= G75PL) || (G71PL == 0) +/* Задаёт MG75_11PL = ~(1); данные MG75_11PL. */ +#define MG75_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG75_11PL = 0xFFFF; данные MG75_11PL. */ +#define MG75_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G72PL >= G75PL) или (G72PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G72PL >= G75PL) || (G72PL == 0) +/* Задаёт MG75_12PL = ~(1 << 1); данные MG75_12PL. */ +#define MG75_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG75_12PL = 0xFFFF; данные MG75_12PL. */ +#define MG75_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G73PL >= G75PL) или (G73PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G73PL >= G75PL) || (G73PL == 0) +/* Задаёт MG75_13PL = ~(1 << 2); данные MG75_13PL. */ +#define MG75_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG75_13PL = 0xFFFF; данные MG75_13PL. */ +#define MG75_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G74PL >= G75PL) или (G74PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G74PL >= G75PL) || (G74PL == 0) +/* Задаёт MG75_14PL = ~(1 << 3); данные MG75_14PL. */ +#define MG75_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG75_14PL = 0xFFFF; данные MG75_14PL. */ +#define MG75_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G76PL >= G75PL) или (G76PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G76PL >= G75PL) || (G76PL == 0) +/* Задаёт MG75_16PL = ~(1 << 5); данные MG75_16PL. */ +#define MG75_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG75_16PL = 0xFFFF; данные MG75_16PL. */ +#define MG75_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G77PL >= G75PL) или (G77PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G77PL >= G75PL) || (G77PL == 0) +/* Задаёт MG75_17PL = ~(1 << 6); данные MG75_17PL. */ +#define MG75_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG75_17PL = 0xFFFF; данные MG75_17PL. */ +#define MG75_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G78PL >= G75PL) или (G78PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G78PL >= G75PL) || (G78PL == 0) +/* Задаёт MG75_18PL = ~(1 << 7); данные MG75_18PL. */ +#define MG75_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG75_18PL = 0xFFFF; данные MG75_18PL. */ +#define MG75_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG75_15PL = 0x00EF; данные MG75_15PL. */ +#define MG75_15PL 0x00EF +/* Задаёт MG75 = (MG75_11PL & MG75_12PL & MG75_13PL & MG75_14PL &; маска разрешённых прерываний внутри группы PIE 75. */ +#define MG75 (MG75_11PL & MG75_12PL & MG75_13PL & MG75_14PL & \ + MG75_15PL & MG75_16PL & MG75_17PL & MG75_18PL) /* Продолжает список аргументов, полей или выражение MG75_15PL & MG75_16PL & MG75_17PL & MG75_18PL); порядок элементов сохраняется. */ +// End of MG75: + +// Beginning of MG76: +/* Условие компиляции (G71PL >= G76PL) или (G71PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G71PL >= G76PL) || (G71PL == 0) +/* Задаёт MG76_11PL = ~(1); данные MG76_11PL. */ +#define MG76_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG76_11PL = 0xFFFF; данные MG76_11PL. */ +#define MG76_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G72PL >= G76PL) или (G72PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G72PL >= G76PL) || (G72PL == 0) +/* Задаёт MG76_12PL = ~(1 << 1); данные MG76_12PL. */ +#define MG76_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG76_12PL = 0xFFFF; данные MG76_12PL. */ +#define MG76_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G73PL >= G76PL) или (G73PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G73PL >= G76PL) || (G73PL == 0) +/* Задаёт MG76_13PL = ~(1 << 2); данные MG76_13PL. */ +#define MG76_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG76_13PL = 0xFFFF; данные MG76_13PL. */ +#define MG76_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G74PL >= G76PL) или (G74PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G74PL >= G76PL) || (G74PL == 0) +/* Задаёт MG76_14PL = ~(1 << 3); данные MG76_14PL. */ +#define MG76_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG76_14PL = 0xFFFF; данные MG76_14PL. */ +#define MG76_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G75PL >= G76PL) или (G75PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G75PL >= G76PL) || (G75PL == 0) +/* Задаёт MG76_15PL = ~(1 << 4); данные MG76_15PL. */ +#define MG76_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG76_15PL = 0xFFFF; данные MG76_15PL. */ +#define MG76_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G77PL >= G76PL) или (G77PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G77PL >= G76PL) || (G77PL == 0) +/* Задаёт MG76_17PL = ~(1 << 6); данные MG76_17PL. */ +#define MG76_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG76_17PL = 0xFFFF; данные MG76_17PL. */ +#define MG76_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G78PL >= G76PL) или (G78PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G78PL >= G76PL) || (G78PL == 0) +/* Задаёт MG76_18PL = ~(1 << 7); данные MG76_18PL. */ +#define MG76_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG76_18PL = 0xFFFF; данные MG76_18PL. */ +#define MG76_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG76_16PL = 0x00DF; данные MG76_16PL. */ +#define MG76_16PL 0x00DF +/* Задаёт MG76 = (MG76_11PL & MG76_12PL & MG76_13PL & MG76_14PL &; маска разрешённых прерываний внутри группы PIE 76. */ +#define MG76 (MG76_11PL & MG76_12PL & MG76_13PL & MG76_14PL & \ + MG76_15PL & MG76_16PL & MG76_17PL & MG76_18PL) /* Продолжает список аргументов, полей или выражение MG76_15PL & MG76_16PL & MG76_17PL & MG76_18PL); порядок элементов сохраняется. */ +// End of MG76: + +// Beginning of MG77: +/* Условие компиляции (G71PL >= G77PL) или (G71PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G71PL >= G77PL) || (G71PL == 0) +/* Задаёт MG77_11PL = ~(1); данные MG77_11PL. */ +#define MG77_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG77_11PL = 0xFFFF; данные MG77_11PL. */ +#define MG77_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G72PL >= G77PL) или (G72PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G72PL >= G77PL) || (G72PL == 0) +/* Задаёт MG77_12PL = ~(1 << 1); данные MG77_12PL. */ +#define MG77_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG77_12PL = 0xFFFF; данные MG77_12PL. */ +#define MG77_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G73PL >= G77PL) или (G73PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G73PL >= G77PL) || (G73PL == 0) +/* Задаёт MG77_13PL = ~(1 << 2); данные MG77_13PL. */ +#define MG77_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG77_13PL = 0xFFFF; данные MG77_13PL. */ +#define MG77_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G74PL >= G77PL) или (G74PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G74PL >= G77PL) || (G74PL == 0) +/* Задаёт MG77_14PL = ~(1 << 3); данные MG77_14PL. */ +#define MG77_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG77_14PL = 0xFFFF; данные MG77_14PL. */ +#define MG77_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G75PL >= G77PL) или (G75PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G75PL >= G77PL) || (G75PL == 0) +/* Задаёт MG77_15PL = ~(1 << 4); данные MG77_15PL. */ +#define MG77_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG77_15PL = 0xFFFF; данные MG77_15PL. */ +#define MG77_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G76PL >= G77PL) или (G76PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G76PL >= G77PL) || (G76PL == 0) +/* Задаёт MG77_16PL = ~(1 << 5); данные MG77_16PL. */ +#define MG77_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG77_16PL = 0xFFFF; данные MG77_16PL. */ +#define MG77_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G78PL >= G77PL) или (G78PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G78PL >= G77PL) || (G78PL == 0) +/* Задаёт MG77_18PL = ~(1 << 7); данные MG77_18PL. */ +#define MG77_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG77_18PL = 0xFFFF; данные MG77_18PL. */ +#define MG77_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG77_17PL = 0x00BF; данные MG77_17PL. */ +#define MG77_17PL 0x00BF +/* Задаёт MG77 = (MG77_11PL & MG77_12PL & MG77_13PL & MG77_14PL &; маска разрешённых прерываний внутри группы PIE 77. */ +#define MG77 (MG77_11PL & MG77_12PL & MG77_13PL & MG77_14PL & \ + MG77_15PL & MG77_16PL & MG77_17PL & MG77_18PL) /* Продолжает список аргументов, полей или выражение MG77_15PL & MG77_16PL & MG77_17PL & MG77_18PL); порядок элементов сохраняется. */ +// End of MG77: + +// Beginning of MG78: +/* Условие компиляции (G71PL >= G78PL) или (G71PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G71PL >= G78PL) || (G71PL == 0) +/* Задаёт MG78_11PL = ~(1); данные MG78_11PL. */ +#define MG78_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG78_11PL = 0xFFFF; данные MG78_11PL. */ +#define MG78_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G72PL >= G78PL) или (G72PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G72PL >= G78PL) || (G72PL == 0) +/* Задаёт MG78_12PL = ~(1 << 1); данные MG78_12PL. */ +#define MG78_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG78_12PL = 0xFFFF; данные MG78_12PL. */ +#define MG78_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G73PL >= G78PL) или (G73PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G73PL >= G78PL) || (G73PL == 0) +/* Задаёт MG78_13PL = ~(1 << 2); данные MG78_13PL. */ +#define MG78_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG78_13PL = 0xFFFF; данные MG78_13PL. */ +#define MG78_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G74PL >= G78PL) или (G74PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G74PL >= G78PL) || (G74PL == 0) +/* Задаёт MG78_14PL = ~(1 << 3); данные MG78_14PL. */ +#define MG78_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG78_14PL = 0xFFFF; данные MG78_14PL. */ +#define MG78_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G75PL >= G78PL) или (G75PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G75PL >= G78PL) || (G75PL == 0) +/* Задаёт MG78_15PL = ~(1 << 4); данные MG78_15PL. */ +#define MG78_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG78_15PL = 0xFFFF; данные MG78_15PL. */ +#define MG78_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G76PL >= G78PL) или (G76PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G76PL >= G78PL) || (G76PL == 0) +/* Задаёт MG78_16PL = ~(1 << 5); данные MG78_16PL. */ +#define MG78_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG78_16PL = 0xFFFF; данные MG78_16PL. */ +#define MG78_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G77PL >= G78PL) или (G77PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G77PL >= G78PL) || (G77PL == 0) +/* Задаёт MG78_17PL = ~(1 << 6); данные MG78_17PL. */ +#define MG78_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG78_17PL = 0xFFFF; данные MG78_17PL. */ +#define MG78_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG78_18PL = 0x007F; данные MG78_18PL. */ +#define MG78_18PL 0x007F +/* Задаёт MG78 = (MG78_11PL & MG78_12PL & MG78_13PL & MG78_14PL &; маска разрешённых прерываний внутри группы PIE 78. */ +#define MG78 (MG78_11PL & MG78_12PL & MG78_13PL & MG78_14PL & \ + MG78_15PL & MG78_16PL & MG78_17PL & MG78_18PL) /* Продолжает список аргументов, полей или выражение MG78_15PL & MG78_16PL & MG78_17PL & MG78_18PL); порядок элементов сохраняется. */ +// End of MG78: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG81 to MG88: +// + +// Beginning of MG81: +/* Условие компиляции (G82PL >= G81PL) или (G82PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G82PL >= G81PL) || (G82PL == 0) +/* Задаёт MG81_12PL = ~(1 << 1); данные MG81_12PL. */ +#define MG81_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG81_12PL = 0xFFFF; данные MG81_12PL. */ +#define MG81_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G83PL >= G81PL) или (G83PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G83PL >= G81PL) || (G83PL == 0) +/* Задаёт MG81_13PL = ~(1 << 2); данные MG81_13PL. */ +#define MG81_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG81_13PL = 0xFFFF; данные MG81_13PL. */ +#define MG81_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G84PL >= G81PL) или (G84PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G84PL >= G81PL) || (G84PL == 0) +/* Задаёт MG81_14PL = ~(1 << 3); данные MG81_14PL. */ +#define MG81_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG81_14PL = 0xFFFF; данные MG81_14PL. */ +#define MG81_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G85PL >= G81PL) или (G85PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G85PL >= G81PL) || (G85PL == 0) +/* Задаёт MG81_15PL = ~(1 << 4); данные MG81_15PL. */ +#define MG81_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG81_15PL = 0xFFFF; данные MG81_15PL. */ +#define MG81_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G86PL >= G81PL) или (G86PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G86PL >= G81PL) || (G86PL == 0) +/* Задаёт MG81_16PL = ~(1 << 5); данные MG81_16PL. */ +#define MG81_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG81_16PL = 0xFFFF; данные MG81_16PL. */ +#define MG81_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G87PL >= G81PL) или (G87PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G87PL >= G81PL) || (G87PL == 0) +/* Задаёт MG81_17PL = ~(1 << 6); данные MG81_17PL. */ +#define MG81_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG81_17PL = 0xFFFF; данные MG81_17PL. */ +#define MG81_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G88PL >= G81PL) или (G88PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G88PL >= G81PL) || (G88PL == 0) +/* Задаёт MG81_18PL = ~(1 << 7); данные MG81_18PL. */ +#define MG81_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG81_18PL = 0xFFFF; данные MG81_18PL. */ +#define MG81_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG81_11PL = 0x00FE; данные MG81_11PL. */ +#define MG81_11PL 0x00FE +/* Задаёт MG81 = (MG81_11PL & MG81_12PL & MG81_13PL & MG81_14PL &; маска разрешённых прерываний внутри группы PIE 81. */ +#define MG81 (MG81_11PL & MG81_12PL & MG81_13PL & MG81_14PL & \ + MG81_15PL & MG81_16PL & MG81_17PL & MG81_18PL) /* Продолжает список аргументов, полей или выражение MG81_15PL & MG81_16PL & MG81_17PL & MG81_18PL); порядок элементов сохраняется. */ +// End of MG81: + +// Beginning of MG82: +/* Условие компиляции (G81PL >= G82PL) или (G81PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G81PL >= G82PL) || (G81PL == 0) +/* Задаёт MG82_11PL = ~(1); данные MG82_11PL. */ +#define MG82_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG82_11PL = 0xFFFF; данные MG82_11PL. */ +#define MG82_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G83PL >= G82PL) или (G83PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G83PL >= G82PL) || (G83PL == 0) +/* Задаёт MG82_13PL = ~(1 << 2); данные MG82_13PL. */ +#define MG82_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG82_13PL = 0xFFFF; данные MG82_13PL. */ +#define MG82_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G84PL >= G82PL) или (G84PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G84PL >= G82PL) || (G84PL == 0) +/* Задаёт MG82_14PL = ~(1 << 3); данные MG82_14PL. */ +#define MG82_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG82_14PL = 0xFFFF; данные MG82_14PL. */ +#define MG82_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G85PL >= G82PL) или (G85PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G85PL >= G82PL) || (G85PL == 0) +/* Задаёт MG82_15PL = ~(1 << 4); данные MG82_15PL. */ +#define MG82_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG82_15PL = 0xFFFF; данные MG82_15PL. */ +#define MG82_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G86PL >= G82PL) или (G86PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G86PL >= G82PL) || (G86PL == 0) +/* Задаёт MG82_16PL = ~(1 << 5); данные MG82_16PL. */ +#define MG82_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG82_16PL = 0xFFFF; данные MG82_16PL. */ +#define MG82_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G87PL >= G82PL) или (G87PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G87PL >= G82PL) || (G87PL == 0) +/* Задаёт MG82_17PL = ~(1 << 6); данные MG82_17PL. */ +#define MG82_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG82_17PL = 0xFFFF; данные MG82_17PL. */ +#define MG82_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G88PL >= G82PL) или (G88PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G88PL >= G82PL) || (G88PL == 0) +/* Задаёт MG82_18PL = ~(1 << 7); данные MG82_18PL. */ +#define MG82_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG82_18PL = 0xFFFF; данные MG82_18PL. */ +#define MG82_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG82_12PL = 0x00FD; данные MG82_12PL. */ +#define MG82_12PL 0x00FD +/* Задаёт MG82 = (MG82_11PL & MG82_12PL & MG82_13PL & MG82_14PL &; маска разрешённых прерываний внутри группы PIE 82. */ +#define MG82 (MG82_11PL & MG82_12PL & MG82_13PL & MG82_14PL & \ + MG82_15PL & MG82_16PL & MG82_17PL & MG82_18PL) /* Продолжает список аргументов, полей или выражение MG82_15PL & MG82_16PL & MG82_17PL & MG82_18PL); порядок элементов сохраняется. */ +// End of MG82: + +// Beginning of MG83: +/* Условие компиляции (G81PL >= G83PL) или (G81PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G81PL >= G83PL) || (G81PL == 0) +/* Задаёт MG83_11PL = ~(1); данные MG83_11PL. */ +#define MG83_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG83_11PL = 0xFFFF; данные MG83_11PL. */ +#define MG83_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G82PL >= G83PL) или (G82PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G82PL >= G83PL) || (G82PL == 0) +/* Задаёт MG83_12PL = ~(1 << 1); данные MG83_12PL. */ +#define MG83_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG83_12PL = 0xFFFF; данные MG83_12PL. */ +#define MG83_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G84PL >= G83PL) или (G84PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G84PL >= G83PL) || (G84PL == 0) +/* Задаёт MG83_14PL = ~(1 << 3); данные MG83_14PL. */ +#define MG83_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG83_14PL = 0xFFFF; данные MG83_14PL. */ +#define MG83_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G85PL >= G83PL) или (G85PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G85PL >= G83PL) || (G85PL == 0) +/* Задаёт MG83_15PL = ~(1 << 4); данные MG83_15PL. */ +#define MG83_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG83_15PL = 0xFFFF; данные MG83_15PL. */ +#define MG83_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G86PL >= G83PL) или (G86PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G86PL >= G83PL) || (G86PL == 0) +/* Задаёт MG83_16PL = ~(1 << 5); данные MG83_16PL. */ +#define MG83_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG83_16PL = 0xFFFF; данные MG83_16PL. */ +#define MG83_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G87PL >= G83PL) или (G87PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G87PL >= G83PL) || (G87PL == 0) +/* Задаёт MG83_17PL = ~(1 << 6); данные MG83_17PL. */ +#define MG83_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG83_17PL = 0xFFFF; данные MG83_17PL. */ +#define MG83_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G88PL >= G83PL) или (G88PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G88PL >= G83PL) || (G88PL == 0) +/* Задаёт MG83_18PL = ~(1 << 7); данные MG83_18PL. */ +#define MG83_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG83_18PL = 0xFFFF; данные MG83_18PL. */ +#define MG83_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG83_13PL = 0x00FB; данные MG83_13PL. */ +#define MG83_13PL 0x00FB +/* Задаёт MG83 = (MG83_11PL & MG83_12PL & MG83_13PL & MG83_14PL &; маска разрешённых прерываний внутри группы PIE 83. */ +#define MG83 (MG83_11PL & MG83_12PL & MG83_13PL & MG83_14PL & \ + MG83_15PL & MG83_16PL & MG83_17PL & MG83_18PL) /* Продолжает список аргументов, полей или выражение MG83_15PL & MG83_16PL & MG83_17PL & MG83_18PL); порядок элементов сохраняется. */ +// End of MG83: + +// Beginning of MG84: +/* Условие компиляции (G81PL >= G84PL) или (G81PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G81PL >= G84PL) || (G81PL == 0) +/* Задаёт MG84_11PL = ~(1); данные MG84_11PL. */ +#define MG84_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG84_11PL = 0xFFFF; данные MG84_11PL. */ +#define MG84_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G82PL >= G84PL) или (G82PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G82PL >= G84PL) || (G82PL == 0) +/* Задаёт MG84_12PL = ~(1 << 1); данные MG84_12PL. */ +#define MG84_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG84_12PL = 0xFFFF; данные MG84_12PL. */ +#define MG84_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G83PL >= G84PL) или (G83PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G83PL >= G84PL) || (G83PL == 0) +/* Задаёт MG84_13PL = ~(1 << 2); данные MG84_13PL. */ +#define MG84_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG84_13PL = 0xFFFF; данные MG84_13PL. */ +#define MG84_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G85PL >= G84PL) или (G85PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G85PL >= G84PL) || (G85PL == 0) +/* Задаёт MG84_15PL = ~(1 << 4); данные MG84_15PL. */ +#define MG84_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG84_15PL = 0xFFFF; данные MG84_15PL. */ +#define MG84_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G86PL >= G84PL) или (G86PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G86PL >= G84PL) || (G86PL == 0) +/* Задаёт MG84_16PL = ~(1 << 5); данные MG84_16PL. */ +#define MG84_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG84_16PL = 0xFFFF; данные MG84_16PL. */ +#define MG84_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G87PL >= G84PL) или (G87PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G87PL >= G84PL) || (G87PL == 0) +/* Задаёт MG84_17PL = ~(1 << 6); данные MG84_17PL. */ +#define MG84_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG84_17PL = 0xFFFF; данные MG84_17PL. */ +#define MG84_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G88PL >= G84PL) или (G88PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G88PL >= G84PL) || (G88PL == 0) +/* Задаёт MG84_18PL = ~(1 << 7); данные MG84_18PL. */ +#define MG84_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG84_18PL = 0xFFFF; данные MG84_18PL. */ +#define MG84_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG84_14PL = 0x00F7; данные MG84_14PL. */ +#define MG84_14PL 0x00F7 +/* Задаёт MG84 = (MG84_11PL & MG84_12PL & MG84_13PL & MG84_14PL &; маска разрешённых прерываний внутри группы PIE 84. */ +#define MG84 (MG84_11PL & MG84_12PL & MG84_13PL & MG84_14PL & \ + MG84_15PL & MG84_16PL & MG84_17PL & MG84_18PL) /* Продолжает список аргументов, полей или выражение MG84_15PL & MG84_16PL & MG84_17PL & MG84_18PL); порядок элементов сохраняется. */ +// End of MG84: + +// Beginning of MG85: +/* Условие компиляции (G81PL >= G85PL) или (G81PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G81PL >= G85PL) || (G81PL == 0) +/* Задаёт MG85_11PL = ~(1); данные MG85_11PL. */ +#define MG85_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG85_11PL = 0xFFFF; данные MG85_11PL. */ +#define MG85_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G82PL >= G85PL) или (G82PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G82PL >= G85PL) || (G82PL == 0) +/* Задаёт MG85_12PL = ~(1 << 1); данные MG85_12PL. */ +#define MG85_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG85_12PL = 0xFFFF; данные MG85_12PL. */ +#define MG85_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G83PL >= G85PL) или (G83PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G83PL >= G85PL) || (G83PL == 0) +/* Задаёт MG85_13PL = ~(1 << 2); данные MG85_13PL. */ +#define MG85_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG85_13PL = 0xFFFF; данные MG85_13PL. */ +#define MG85_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G84PL >= G85PL) или (G84PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G84PL >= G85PL) || (G84PL == 0) +/* Задаёт MG85_14PL = ~(1 << 3); данные MG85_14PL. */ +#define MG85_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG85_14PL = 0xFFFF; данные MG85_14PL. */ +#define MG85_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G86PL >= G85PL) или (G86PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G86PL >= G85PL) || (G86PL == 0) +/* Задаёт MG85_16PL = ~(1 << 5); данные MG85_16PL. */ +#define MG85_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG85_16PL = 0xFFFF; данные MG85_16PL. */ +#define MG85_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G87PL >= G85PL) или (G87PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G87PL >= G85PL) || (G87PL == 0) +/* Задаёт MG85_17PL = ~(1 << 6); данные MG85_17PL. */ +#define MG85_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG85_17PL = 0xFFFF; данные MG85_17PL. */ +#define MG85_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G88PL >= G85PL) или (G88PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G88PL >= G85PL) || (G88PL == 0) +/* Задаёт MG85_18PL = ~(1 << 7); данные MG85_18PL. */ +#define MG85_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG85_18PL = 0xFFFF; данные MG85_18PL. */ +#define MG85_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG85_15PL = 0x00EF; данные MG85_15PL. */ +#define MG85_15PL 0x00EF +/* Задаёт MG85 = (MG85_11PL & MG85_12PL & MG85_13PL & MG85_14PL &; маска разрешённых прерываний внутри группы PIE 85. */ +#define MG85 (MG85_11PL & MG85_12PL & MG85_13PL & MG85_14PL & \ + MG85_15PL & MG85_16PL & MG85_17PL & MG85_18PL) /* Продолжает список аргументов, полей или выражение MG85_15PL & MG85_16PL & MG85_17PL & MG85_18PL); порядок элементов сохраняется. */ +// End of MG85: + +// Beginning of MG86: +/* Условие компиляции (G81PL >= G86PL) или (G81PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G81PL >= G86PL) || (G81PL == 0) +/* Задаёт MG86_11PL = ~(1); данные MG86_11PL. */ +#define MG86_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG86_11PL = 0xFFFF; данные MG86_11PL. */ +#define MG86_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G82PL >= G86PL) или (G82PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G82PL >= G86PL) || (G82PL == 0) +/* Задаёт MG86_12PL = ~(1 << 1); данные MG86_12PL. */ +#define MG86_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG86_12PL = 0xFFFF; данные MG86_12PL. */ +#define MG86_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G83PL >= G86PL) или (G83PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G83PL >= G86PL) || (G83PL == 0) +/* Задаёт MG86_13PL = ~(1 << 2); данные MG86_13PL. */ +#define MG86_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG86_13PL = 0xFFFF; данные MG86_13PL. */ +#define MG86_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G84PL >= G86PL) или (G84PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G84PL >= G86PL) || (G84PL == 0) +/* Задаёт MG86_14PL = ~(1 << 3); данные MG86_14PL. */ +#define MG86_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG86_14PL = 0xFFFF; данные MG86_14PL. */ +#define MG86_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G85PL >= G86PL) или (G85PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G85PL >= G86PL) || (G85PL == 0) +/* Задаёт MG86_15PL = ~(1 << 4); данные MG86_15PL. */ +#define MG86_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG86_15PL = 0xFFFF; данные MG86_15PL. */ +#define MG86_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G87PL >= G86PL) или (G87PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G87PL >= G86PL) || (G87PL == 0) +/* Задаёт MG86_17PL = ~(1 << 6); данные MG86_17PL. */ +#define MG86_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG86_17PL = 0xFFFF; данные MG86_17PL. */ +#define MG86_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G88PL >= G86PL) или (G88PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G88PL >= G86PL) || (G88PL == 0) +/* Задаёт MG86_18PL = ~(1 << 7); данные MG86_18PL. */ +#define MG86_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG86_18PL = 0xFFFF; данные MG86_18PL. */ +#define MG86_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG86_16PL = 0x00DF; данные MG86_16PL. */ +#define MG86_16PL 0x00DF +/* Задаёт MG86 = (MG86_11PL & MG86_12PL & MG86_13PL & MG86_14PL &; маска разрешённых прерываний внутри группы PIE 86. */ +#define MG86 (MG86_11PL & MG86_12PL & MG86_13PL & MG86_14PL & \ + MG86_15PL & MG86_16PL & MG86_17PL & MG86_18PL) /* Продолжает список аргументов, полей или выражение MG86_15PL & MG86_16PL & MG86_17PL & MG86_18PL); порядок элементов сохраняется. */ +// End of MG86: + +// Beginning of MG87: +/* Условие компиляции (G81PL >= G87PL) или (G81PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G81PL >= G87PL) || (G81PL == 0) +/* Задаёт MG87_11PL = ~(1); данные MG87_11PL. */ +#define MG87_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG87_11PL = 0xFFFF; данные MG87_11PL. */ +#define MG87_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G82PL >= G87PL) или (G82PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G82PL >= G87PL) || (G82PL == 0) +/* Задаёт MG87_12PL = ~(1 << 1); данные MG87_12PL. */ +#define MG87_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG87_12PL = 0xFFFF; данные MG87_12PL. */ +#define MG87_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G83PL >= G87PL) или (G83PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G83PL >= G87PL) || (G83PL == 0) +/* Задаёт MG87_13PL = ~(1 << 2); данные MG87_13PL. */ +#define MG87_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG87_13PL = 0xFFFF; данные MG87_13PL. */ +#define MG87_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G84PL >= G87PL) или (G84PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G84PL >= G87PL) || (G84PL == 0) +/* Задаёт MG87_14PL = ~(1 << 3); данные MG87_14PL. */ +#define MG87_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG87_14PL = 0xFFFF; данные MG87_14PL. */ +#define MG87_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G85PL >= G87PL) или (G85PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G85PL >= G87PL) || (G85PL == 0) +/* Задаёт MG87_15PL = ~(1 << 4); данные MG87_15PL. */ +#define MG87_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG87_15PL = 0xFFFF; данные MG87_15PL. */ +#define MG87_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G86PL >= G87PL) или (G86PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G86PL >= G87PL) || (G86PL == 0) +/* Задаёт MG87_16PL = ~(1 << 5); данные MG87_16PL. */ +#define MG87_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG87_16PL = 0xFFFF; данные MG87_16PL. */ +#define MG87_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G88PL >= G87PL) или (G88PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G88PL >= G87PL) || (G88PL == 0) +/* Задаёт MG87_18PL = ~(1 << 7); данные MG87_18PL. */ +#define MG87_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG87_18PL = 0xFFFF; данные MG87_18PL. */ +#define MG87_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG87_17PL = 0x00BF; данные MG87_17PL. */ +#define MG87_17PL 0x00BF +/* Задаёт MG87 = (MG87_11PL & MG87_12PL & MG87_13PL & MG87_14PL &; маска разрешённых прерываний внутри группы PIE 87. */ +#define MG87 (MG87_11PL & MG87_12PL & MG87_13PL & MG87_14PL & \ + MG87_15PL & MG87_16PL & MG87_17PL & MG87_18PL) /* Продолжает список аргументов, полей или выражение MG87_15PL & MG87_16PL & MG87_17PL & MG87_18PL); порядок элементов сохраняется. */ +// End of MG87: + +// Beginning of MG88: +/* Условие компиляции (G81PL >= G88PL) или (G81PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G81PL >= G88PL) || (G81PL == 0) +/* Задаёт MG88_11PL = ~(1); данные MG88_11PL. */ +#define MG88_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG88_11PL = 0xFFFF; данные MG88_11PL. */ +#define MG88_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G82PL >= G88PL) или (G82PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G82PL >= G88PL) || (G82PL == 0) +/* Задаёт MG88_12PL = ~(1 << 1); данные MG88_12PL. */ +#define MG88_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG88_12PL = 0xFFFF; данные MG88_12PL. */ +#define MG88_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G83PL >= G88PL) или (G83PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G83PL >= G88PL) || (G83PL == 0) +/* Задаёт MG88_13PL = ~(1 << 2); данные MG88_13PL. */ +#define MG88_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG88_13PL = 0xFFFF; данные MG88_13PL. */ +#define MG88_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G84PL >= G88PL) или (G84PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G84PL >= G88PL) || (G84PL == 0) +/* Задаёт MG88_14PL = ~(1 << 3); данные MG88_14PL. */ +#define MG88_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG88_14PL = 0xFFFF; данные MG88_14PL. */ +#define MG88_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G85PL >= G88PL) или (G85PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G85PL >= G88PL) || (G85PL == 0) +/* Задаёт MG88_15PL = ~(1 << 4); данные MG88_15PL. */ +#define MG88_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG88_15PL = 0xFFFF; данные MG88_15PL. */ +#define MG88_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G86PL >= G88PL) или (G86PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G86PL >= G88PL) || (G86PL == 0) +/* Задаёт MG88_16PL = ~(1 << 5); данные MG88_16PL. */ +#define MG88_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG88_16PL = 0xFFFF; данные MG88_16PL. */ +#define MG88_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G87PL >= G88PL) или (G87PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G87PL >= G88PL) || (G87PL == 0) +/* Задаёт MG88_17PL = ~(1 << 6); данные MG88_17PL. */ +#define MG88_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG88_17PL = 0xFFFF; данные MG88_17PL. */ +#define MG88_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG88_18PL = 0x007F; данные MG88_18PL. */ +#define MG88_18PL 0x007F +/* Задаёт MG88 = (MG88_11PL & MG88_12PL & MG88_13PL & MG88_14PL &; маска разрешённых прерываний внутри группы PIE 88. */ +#define MG88 (MG88_11PL & MG88_12PL & MG88_13PL & MG88_14PL & \ + MG88_15PL & MG88_16PL & MG88_17PL & MG88_18PL) /* Продолжает список аргументов, полей или выражение MG88_15PL & MG88_16PL & MG88_17PL & MG88_18PL); порядок элементов сохраняется. */ +// End of MG88: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG91 to MG98: +// + +// Beginning of MG91: +/* Условие компиляции (G92PL >= G91PL) или (G92PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G92PL >= G91PL) || (G92PL == 0) +/* Задаёт MG91_12PL = ~(1 << 1); данные MG91_12PL. */ +#define MG91_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG91_12PL = 0xFFFF; данные MG91_12PL. */ +#define MG91_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G93PL >= G91PL) или (G93PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G93PL >= G91PL) || (G93PL == 0) +/* Задаёт MG91_13PL = ~(1 << 2); данные MG91_13PL. */ +#define MG91_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG91_13PL = 0xFFFF; данные MG91_13PL. */ +#define MG91_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G94PL >= G91PL) или (G94PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G94PL >= G91PL) || (G94PL == 0) +/* Задаёт MG91_14PL = ~(1 << 3); данные MG91_14PL. */ +#define MG91_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG91_14PL = 0xFFFF; данные MG91_14PL. */ +#define MG91_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G95PL >= G91PL) или (G95PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G95PL >= G91PL) || (G95PL == 0) +/* Задаёт MG91_15PL = ~(1 << 4); данные MG91_15PL. */ +#define MG91_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG91_15PL = 0xFFFF; данные MG91_15PL. */ +#define MG91_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G96PL >= G91PL) или (G96PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G96PL >= G91PL) || (G96PL == 0) +/* Задаёт MG91_16PL = ~(1 << 5); данные MG91_16PL. */ +#define MG91_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG91_16PL = 0xFFFF; данные MG91_16PL. */ +#define MG91_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G97PL >= G91PL) или (G97PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G97PL >= G91PL) || (G97PL == 0) +/* Задаёт MG91_17PL = ~(1 << 6); данные MG91_17PL. */ +#define MG91_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG91_17PL = 0xFFFF; данные MG91_17PL. */ +#define MG91_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G98PL >= G91PL) или (G98PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G98PL >= G91PL) || (G98PL == 0) +/* Задаёт MG91_18PL = ~(1 << 7); данные MG91_18PL. */ +#define MG91_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG91_18PL = 0xFFFF; данные MG91_18PL. */ +#define MG91_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG91_11PL = 0x00FE; данные MG91_11PL. */ +#define MG91_11PL 0x00FE +/* Задаёт MG91 = (MG91_11PL & MG91_12PL & MG91_13PL & MG91_14PL &; маска разрешённых прерываний внутри группы PIE 91. */ +#define MG91 (MG91_11PL & MG91_12PL & MG91_13PL & MG91_14PL & \ + MG91_15PL & MG91_16PL & MG91_17PL & MG91_18PL) /* Продолжает список аргументов, полей или выражение MG91_15PL & MG91_16PL & MG91_17PL & MG91_18PL); порядок элементов сохраняется. */ +// End of MG91: + +// Beginning of MG92: +/* Условие компиляции (G91PL >= G92PL) или (G91PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G91PL >= G92PL) || (G91PL == 0) +/* Задаёт MG92_11PL = ~(1); данные MG92_11PL. */ +#define MG92_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG92_11PL = 0xFFFF; данные MG92_11PL. */ +#define MG92_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G93PL >= G92PL) или (G93PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G93PL >= G92PL) || (G93PL == 0) +/* Задаёт MG92_13PL = ~(1 << 2); данные MG92_13PL. */ +#define MG92_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG92_13PL = 0xFFFF; данные MG92_13PL. */ +#define MG92_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G94PL >= G92PL) или (G94PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G94PL >= G92PL) || (G94PL == 0) +/* Задаёт MG92_14PL = ~(1 << 3); данные MG92_14PL. */ +#define MG92_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG92_14PL = 0xFFFF; данные MG92_14PL. */ +#define MG92_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G95PL >= G92PL) или (G95PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G95PL >= G92PL) || (G95PL == 0) +/* Задаёт MG92_15PL = ~(1 << 4); данные MG92_15PL. */ +#define MG92_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG92_15PL = 0xFFFF; данные MG92_15PL. */ +#define MG92_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G96PL >= G92PL) или (G96PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G96PL >= G92PL) || (G96PL == 0) +/* Задаёт MG92_16PL = ~(1 << 5); данные MG92_16PL. */ +#define MG92_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG92_16PL = 0xFFFF; данные MG92_16PL. */ +#define MG92_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G97PL >= G92PL) или (G97PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G97PL >= G92PL) || (G97PL == 0) +/* Задаёт MG92_17PL = ~(1 << 6); данные MG92_17PL. */ +#define MG92_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG92_17PL = 0xFFFF; данные MG92_17PL. */ +#define MG92_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G98PL >= G92PL) или (G98PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G98PL >= G92PL) || (G98PL == 0) +/* Задаёт MG92_18PL = ~(1 << 7); данные MG92_18PL. */ +#define MG92_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG92_18PL = 0xFFFF; данные MG92_18PL. */ +#define MG92_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG92_12PL = 0x00FD; данные MG92_12PL. */ +#define MG92_12PL 0x00FD +/* Задаёт MG92 = (MG92_11PL & MG92_12PL & MG92_13PL & MG92_14PL &; маска разрешённых прерываний внутри группы PIE 92. */ +#define MG92 (MG92_11PL & MG92_12PL & MG92_13PL & MG92_14PL & \ + MG92_15PL & MG92_16PL & MG92_17PL & MG92_18PL) /* Продолжает список аргументов, полей или выражение MG92_15PL & MG92_16PL & MG92_17PL & MG92_18PL); порядок элементов сохраняется. */ +// End of MG92: + +// Beginning of MG93: +/* Условие компиляции (G91PL >= G93PL) или (G91PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G91PL >= G93PL) || (G91PL == 0) +/* Задаёт MG93_11PL = ~(1); данные MG93_11PL. */ +#define MG93_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG93_11PL = 0xFFFF; данные MG93_11PL. */ +#define MG93_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G92PL >= G93PL) или (G92PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G92PL >= G93PL) || (G92PL == 0) +/* Задаёт MG93_12PL = ~(1 << 1); данные MG93_12PL. */ +#define MG93_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG93_12PL = 0xFFFF; данные MG93_12PL. */ +#define MG93_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G94PL >= G93PL) или (G94PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G94PL >= G93PL) || (G94PL == 0) +/* Задаёт MG93_14PL = ~(1 << 3); данные MG93_14PL. */ +#define MG93_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG93_14PL = 0xFFFF; данные MG93_14PL. */ +#define MG93_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G95PL >= G93PL) или (G95PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G95PL >= G93PL) || (G95PL == 0) +/* Задаёт MG93_15PL = ~(1 << 4); данные MG93_15PL. */ +#define MG93_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG93_15PL = 0xFFFF; данные MG93_15PL. */ +#define MG93_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G96PL >= G93PL) или (G96PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G96PL >= G93PL) || (G96PL == 0) +/* Задаёт MG93_16PL = ~(1 << 5); данные MG93_16PL. */ +#define MG93_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG93_16PL = 0xFFFF; данные MG93_16PL. */ +#define MG93_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G97PL >= G93PL) или (G97PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G97PL >= G93PL) || (G97PL == 0) +/* Задаёт MG93_17PL = ~(1 << 6); данные MG93_17PL. */ +#define MG93_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG93_17PL = 0xFFFF; данные MG93_17PL. */ +#define MG93_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G98PL >= G93PL) или (G98PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G98PL >= G93PL) || (G98PL == 0) +/* Задаёт MG93_18PL = ~(1 << 7); данные MG93_18PL. */ +#define MG93_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG93_18PL = 0xFFFF; данные MG93_18PL. */ +#define MG93_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG93_13PL = 0x00FB; данные MG93_13PL. */ +#define MG93_13PL 0x00FB +/* Задаёт MG93 = (MG93_11PL & MG93_12PL & MG93_13PL & MG93_14PL &; маска разрешённых прерываний внутри группы PIE 93. */ +#define MG93 (MG93_11PL & MG93_12PL & MG93_13PL & MG93_14PL & \ + MG93_15PL & MG93_16PL & MG93_17PL & MG93_18PL) /* Продолжает список аргументов, полей или выражение MG93_15PL & MG93_16PL & MG93_17PL & MG93_18PL); порядок элементов сохраняется. */ +// End of MG93: + +// Beginning of MG94: +/* Условие компиляции (G91PL >= G94PL) или (G91PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G91PL >= G94PL) || (G91PL == 0) +/* Задаёт MG94_11PL = ~(1); данные MG94_11PL. */ +#define MG94_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG94_11PL = 0xFFFF; данные MG94_11PL. */ +#define MG94_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G92PL >= G94PL) или (G92PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G92PL >= G94PL) || (G92PL == 0) +/* Задаёт MG94_12PL = ~(1 << 1); данные MG94_12PL. */ +#define MG94_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG94_12PL = 0xFFFF; данные MG94_12PL. */ +#define MG94_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G93PL >= G94PL) или (G93PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G93PL >= G94PL) || (G93PL == 0) +/* Задаёт MG94_13PL = ~(1 << 2); данные MG94_13PL. */ +#define MG94_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG94_13PL = 0xFFFF; данные MG94_13PL. */ +#define MG94_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G95PL >= G94PL) или (G95PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G95PL >= G94PL) || (G95PL == 0) +/* Задаёт MG94_15PL = ~(1 << 4); данные MG94_15PL. */ +#define MG94_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG94_15PL = 0xFFFF; данные MG94_15PL. */ +#define MG94_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G96PL >= G94PL) или (G96PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G96PL >= G94PL) || (G96PL == 0) +/* Задаёт MG94_16PL = ~(1 << 5); данные MG94_16PL. */ +#define MG94_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG94_16PL = 0xFFFF; данные MG94_16PL. */ +#define MG94_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G97PL >= G94PL) или (G97PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G97PL >= G94PL) || (G97PL == 0) +/* Задаёт MG94_17PL = ~(1 << 6); данные MG94_17PL. */ +#define MG94_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG94_17PL = 0xFFFF; данные MG94_17PL. */ +#define MG94_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G98PL >= G94PL) или (G98PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G98PL >= G94PL) || (G98PL == 0) +/* Задаёт MG94_18PL = ~(1 << 7); данные MG94_18PL. */ +#define MG94_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG94_18PL = 0xFFFF; данные MG94_18PL. */ +#define MG94_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG94_14PL = 0x00F7; данные MG94_14PL. */ +#define MG94_14PL 0x00F7 +/* Задаёт MG94 = (MG94_11PL & MG94_12PL & MG94_13PL & MG94_14PL &; маска разрешённых прерываний внутри группы PIE 94. */ +#define MG94 (MG94_11PL & MG94_12PL & MG94_13PL & MG94_14PL & \ + MG94_15PL & MG94_16PL & MG94_17PL & MG94_18PL) /* Продолжает список аргументов, полей или выражение MG94_15PL & MG94_16PL & MG94_17PL & MG94_18PL); порядок элементов сохраняется. */ +// End of MG94: + +// Beginning of MG95: +/* Условие компиляции (G91PL >= G95PL) или (G91PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G91PL >= G95PL) || (G91PL == 0) +/* Задаёт MG95_11PL = ~(1); данные MG95_11PL. */ +#define MG95_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG95_11PL = 0xFFFF; данные MG95_11PL. */ +#define MG95_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G92PL >= G95PL) или (G92PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G92PL >= G95PL) || (G92PL == 0) +/* Задаёт MG95_12PL = ~(1 << 1); данные MG95_12PL. */ +#define MG95_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG95_12PL = 0xFFFF; данные MG95_12PL. */ +#define MG95_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G93PL >= G95PL) или (G93PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G93PL >= G95PL) || (G93PL == 0) +/* Задаёт MG95_13PL = ~(1 << 2); данные MG95_13PL. */ +#define MG95_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG95_13PL = 0xFFFF; данные MG95_13PL. */ +#define MG95_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G94PL >= G95PL) или (G94PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G94PL >= G95PL) || (G94PL == 0) +/* Задаёт MG95_14PL = ~(1 << 3); данные MG95_14PL. */ +#define MG95_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG95_14PL = 0xFFFF; данные MG95_14PL. */ +#define MG95_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G96PL >= G95PL) или (G96PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G96PL >= G95PL) || (G96PL == 0) +/* Задаёт MG95_16PL = ~(1 << 5); данные MG95_16PL. */ +#define MG95_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG95_16PL = 0xFFFF; данные MG95_16PL. */ +#define MG95_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G97PL >= G95PL) или (G97PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G97PL >= G95PL) || (G97PL == 0) +/* Задаёт MG95_17PL = ~(1 << 6); данные MG95_17PL. */ +#define MG95_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG95_17PL = 0xFFFF; данные MG95_17PL. */ +#define MG95_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G98PL >= G95PL) или (G98PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G98PL >= G95PL) || (G98PL == 0) +/* Задаёт MG95_18PL = ~(1 << 7); данные MG95_18PL. */ +#define MG95_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG95_18PL = 0xFFFF; данные MG95_18PL. */ +#define MG95_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG95_15PL = 0x00EF; данные MG95_15PL. */ +#define MG95_15PL 0x00EF +/* Задаёт MG95 = (MG95_11PL & MG95_12PL & MG95_13PL & MG95_14PL &; маска разрешённых прерываний внутри группы PIE 95. */ +#define MG95 (MG95_11PL & MG95_12PL & MG95_13PL & MG95_14PL & \ + MG95_15PL & MG95_16PL & MG95_17PL & MG95_18PL) /* Продолжает список аргументов, полей или выражение MG95_15PL & MG95_16PL & MG95_17PL & MG95_18PL); порядок элементов сохраняется. */ +// End of MG95: + +// Beginning of MG96: +/* Условие компиляции (G91PL >= G96PL) или (G91PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G91PL >= G96PL) || (G91PL == 0) +/* Задаёт MG96_11PL = ~(1); данные MG96_11PL. */ +#define MG96_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG96_11PL = 0xFFFF; данные MG96_11PL. */ +#define MG96_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G92PL >= G96PL) или (G92PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G92PL >= G96PL) || (G92PL == 0) +/* Задаёт MG96_12PL = ~(1 << 1); данные MG96_12PL. */ +#define MG96_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG96_12PL = 0xFFFF; данные MG96_12PL. */ +#define MG96_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G93PL >= G96PL) или (G93PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G93PL >= G96PL) || (G93PL == 0) +/* Задаёт MG96_13PL = ~(1 << 2); данные MG96_13PL. */ +#define MG96_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG96_13PL = 0xFFFF; данные MG96_13PL. */ +#define MG96_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G94PL >= G96PL) или (G94PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G94PL >= G96PL) || (G94PL == 0) +/* Задаёт MG96_14PL = ~(1 << 3); данные MG96_14PL. */ +#define MG96_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG96_14PL = 0xFFFF; данные MG96_14PL. */ +#define MG96_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G95PL >= G96PL) или (G95PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G95PL >= G96PL) || (G95PL == 0) +/* Задаёт MG96_15PL = ~(1 << 4); данные MG96_15PL. */ +#define MG96_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG96_15PL = 0xFFFF; данные MG96_15PL. */ +#define MG96_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G97PL >= G96PL) или (G97PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G97PL >= G96PL) || (G97PL == 0) +/* Задаёт MG96_17PL = ~(1 << 6); данные MG96_17PL. */ +#define MG96_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG96_17PL = 0xFFFF; данные MG96_17PL. */ +#define MG96_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G98PL >= G96PL) или (G98PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G98PL >= G96PL) || (G98PL == 0) +/* Задаёт MG96_18PL = ~(1 << 7); данные MG96_18PL. */ +#define MG96_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG96_18PL = 0xFFFF; данные MG96_18PL. */ +#define MG96_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG96_16PL = 0x00DF; данные MG96_16PL. */ +#define MG96_16PL 0x00DF +/* Задаёт MG96 = (MG96_11PL & MG96_12PL & MG96_13PL & MG96_14PL &; маска разрешённых прерываний внутри группы PIE 96. */ +#define MG96 (MG96_11PL & MG96_12PL & MG96_13PL & MG96_14PL & \ + MG96_15PL & MG96_16PL & MG96_17PL & MG96_18PL) /* Продолжает список аргументов, полей или выражение MG96_15PL & MG96_16PL & MG96_17PL & MG96_18PL); порядок элементов сохраняется. */ +// End of MG96: + +// Beginning of MG97: +/* Условие компиляции (G91PL >= G97PL) или (G91PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G91PL >= G97PL) || (G91PL == 0) +/* Задаёт MG97_11PL = ~(1); данные MG97_11PL. */ +#define MG97_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG97_11PL = 0xFFFF; данные MG97_11PL. */ +#define MG97_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G92PL >= G97PL) или (G92PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G92PL >= G97PL) || (G92PL == 0) +/* Задаёт MG97_12PL = ~(1 << 1); данные MG97_12PL. */ +#define MG97_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG97_12PL = 0xFFFF; данные MG97_12PL. */ +#define MG97_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G93PL >= G97PL) или (G93PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G93PL >= G97PL) || (G93PL == 0) +/* Задаёт MG97_13PL = ~(1 << 2); данные MG97_13PL. */ +#define MG97_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG97_13PL = 0xFFFF; данные MG97_13PL. */ +#define MG97_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G94PL >= G97PL) или (G94PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G94PL >= G97PL) || (G94PL == 0) +/* Задаёт MG97_14PL = ~(1 << 3); данные MG97_14PL. */ +#define MG97_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG97_14PL = 0xFFFF; данные MG97_14PL. */ +#define MG97_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G95PL >= G97PL) или (G95PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G95PL >= G97PL) || (G95PL == 0) +/* Задаёт MG97_15PL = ~(1 << 4); данные MG97_15PL. */ +#define MG97_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG97_15PL = 0xFFFF; данные MG97_15PL. */ +#define MG97_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G96PL >= G97PL) или (G96PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G96PL >= G97PL) || (G96PL == 0) +/* Задаёт MG97_16PL = ~(1 << 5); данные MG97_16PL. */ +#define MG97_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG97_16PL = 0xFFFF; данные MG97_16PL. */ +#define MG97_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G98PL >= G97PL) или (G98PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G98PL >= G97PL) || (G98PL == 0) +/* Задаёт MG97_18PL = ~(1 << 7); данные MG97_18PL. */ +#define MG97_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG97_18PL = 0xFFFF; данные MG97_18PL. */ +#define MG97_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG97_17PL = 0x00BF; данные MG97_17PL. */ +#define MG97_17PL 0x00BF +/* Задаёт MG97 = (MG97_11PL & MG97_12PL & MG97_13PL & MG97_14PL &; маска разрешённых прерываний внутри группы PIE 97. */ +#define MG97 (MG97_11PL & MG97_12PL & MG97_13PL & MG97_14PL & \ + MG97_15PL & MG97_16PL & MG97_17PL & MG97_18PL) /* Продолжает список аргументов, полей или выражение MG97_15PL & MG97_16PL & MG97_17PL & MG97_18PL); порядок элементов сохраняется. */ +// End of MG97: + +// Beginning of MG98: +/* Условие компиляции (G91PL >= G98PL) или (G91PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G91PL >= G98PL) || (G91PL == 0) +/* Задаёт MG98_11PL = ~(1); данные MG98_11PL. */ +#define MG98_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG98_11PL = 0xFFFF; данные MG98_11PL. */ +#define MG98_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G92PL >= G98PL) или (G92PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G92PL >= G98PL) || (G92PL == 0) +/* Задаёт MG98_12PL = ~(1 << 1); данные MG98_12PL. */ +#define MG98_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG98_12PL = 0xFFFF; данные MG98_12PL. */ +#define MG98_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G93PL >= G98PL) или (G93PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G93PL >= G98PL) || (G93PL == 0) +/* Задаёт MG98_13PL = ~(1 << 2); данные MG98_13PL. */ +#define MG98_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG98_13PL = 0xFFFF; данные MG98_13PL. */ +#define MG98_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G94PL >= G98PL) или (G94PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G94PL >= G98PL) || (G94PL == 0) +/* Задаёт MG98_14PL = ~(1 << 3); данные MG98_14PL. */ +#define MG98_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG98_14PL = 0xFFFF; данные MG98_14PL. */ +#define MG98_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G95PL >= G98PL) или (G95PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G95PL >= G98PL) || (G95PL == 0) +/* Задаёт MG98_15PL = ~(1 << 4); данные MG98_15PL. */ +#define MG98_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG98_15PL = 0xFFFF; данные MG98_15PL. */ +#define MG98_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G96PL >= G98PL) или (G96PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G96PL >= G98PL) || (G96PL == 0) +/* Задаёт MG98_16PL = ~(1 << 5); данные MG98_16PL. */ +#define MG98_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG98_16PL = 0xFFFF; данные MG98_16PL. */ +#define MG98_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G97PL >= G98PL) или (G97PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G97PL >= G98PL) || (G97PL == 0) +/* Задаёт MG98_17PL = ~(1 << 6); данные MG98_17PL. */ +#define MG98_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG98_17PL = 0xFFFF; данные MG98_17PL. */ +#define MG98_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG98_18PL = 0x007F; данные MG98_18PL. */ +#define MG98_18PL 0x007F +/* Задаёт MG98 = (MG98_11PL & MG98_12PL & MG98_13PL & MG98_14PL &; маска разрешённых прерываний внутри группы PIE 98. */ +#define MG98 (MG98_11PL & MG98_12PL & MG98_13PL & MG98_14PL & \ + MG98_15PL & MG98_16PL & MG98_17PL & MG98_18PL) /* Продолжает список аргументов, полей или выражение MG98_15PL & MG98_16PL & MG98_17PL & MG98_18PL); порядок элементов сохраняется. */ +// End of MG98: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG101 to MG108: +// + +// Beginning of MG101: +/* Условие компиляции (G102PL >= G101PL) или (G102PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G102PL >= G101PL) || (G102PL == 0) +/* Задаёт MG101_12PL = ~(1 << 1); данные MG101_12PL. */ +#define MG101_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG101_12PL = 0xFFFF; данные MG101_12PL. */ +#define MG101_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G103PL >= G101PL) или (G103PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G103PL >= G101PL) || (G103PL == 0) +/* Задаёт MG101_13PL = ~(1 << 2); данные MG101_13PL. */ +#define MG101_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG101_13PL = 0xFFFF; данные MG101_13PL. */ +#define MG101_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G104PL >= G101PL) или (G104PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G104PL >= G101PL) || (G104PL == 0) +/* Задаёт MG101_14PL = ~(1 << 3); данные MG101_14PL. */ +#define MG101_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG101_14PL = 0xFFFF; данные MG101_14PL. */ +#define MG101_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G105PL >= G101PL) или (G105PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G105PL >= G101PL) || (G105PL == 0) +/* Задаёт MG101_15PL = ~(1 << 4); данные MG101_15PL. */ +#define MG101_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG101_15PL = 0xFFFF; данные MG101_15PL. */ +#define MG101_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G106PL >= G101PL) или (G106PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G106PL >= G101PL) || (G106PL == 0) +/* Задаёт MG101_16PL = ~(1 << 5); данные MG101_16PL. */ +#define MG101_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG101_16PL = 0xFFFF; данные MG101_16PL. */ +#define MG101_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G107PL >= G101PL) или (G107PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G107PL >= G101PL) || (G107PL == 0) +/* Задаёт MG101_17PL = ~(1 << 6); данные MG101_17PL. */ +#define MG101_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG101_17PL = 0xFFFF; данные MG101_17PL. */ +#define MG101_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G108PL >= G101PL) или (G108PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G108PL >= G101PL) || (G108PL == 0) +/* Задаёт MG101_18PL = ~(1 << 7); данные MG101_18PL. */ +#define MG101_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG101_18PL = 0xFFFF; данные MG101_18PL. */ +#define MG101_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG101_11PL = 0x00FE; данные MG101_11PL. */ +#define MG101_11PL 0x00FE +/* Задаёт MG101 = (MG101_11PL & MG101_12PL & MG101_13PL & MG101_14PL &; маска разрешённых прерываний внутри группы PIE 101. */ +#define MG101 (MG101_11PL & MG101_12PL & MG101_13PL & MG101_14PL & \ + MG101_15PL & MG101_16PL & MG101_17PL & MG101_18PL) /* Продолжает список аргументов, полей или выражение MG101_15PL & MG101_16PL & MG101_17PL & MG101_18PL); порядок элементов сохраняется. */ +// End of MG101: + +// Beginning of MG102: +/* Условие компиляции (G101PL >= G102PL) или (G101PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G101PL >= G102PL) || (G101PL == 0) +/* Задаёт MG102_11PL = ~(1); данные MG102_11PL. */ +#define MG102_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG102_11PL = 0xFFFF; данные MG102_11PL. */ +#define MG102_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G103PL >= G102PL) или (G103PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G103PL >= G102PL) || (G103PL == 0) +/* Задаёт MG102_13PL = ~(1 << 2); данные MG102_13PL. */ +#define MG102_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG102_13PL = 0xFFFF; данные MG102_13PL. */ +#define MG102_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G104PL >= G102PL) или (G104PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G104PL >= G102PL) || (G104PL == 0) +/* Задаёт MG102_14PL = ~(1 << 3); данные MG102_14PL. */ +#define MG102_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG102_14PL = 0xFFFF; данные MG102_14PL. */ +#define MG102_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G105PL >= G102PL) или (G105PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G105PL >= G102PL) || (G105PL == 0) +/* Задаёт MG102_15PL = ~(1 << 4); данные MG102_15PL. */ +#define MG102_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG102_15PL = 0xFFFF; данные MG102_15PL. */ +#define MG102_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G106PL >= G102PL) или (G106PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G106PL >= G102PL) || (G106PL == 0) +/* Задаёт MG102_16PL = ~(1 << 5); данные MG102_16PL. */ +#define MG102_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG102_16PL = 0xFFFF; данные MG102_16PL. */ +#define MG102_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G107PL >= G102PL) или (G107PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G107PL >= G102PL) || (G107PL == 0) +/* Задаёт MG102_17PL = ~(1 << 6); данные MG102_17PL. */ +#define MG102_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG102_17PL = 0xFFFF; данные MG102_17PL. */ +#define MG102_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G108PL >= G102PL) или (G108PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G108PL >= G102PL) || (G108PL == 0) +/* Задаёт MG102_18PL = ~(1 << 7); данные MG102_18PL. */ +#define MG102_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG102_18PL = 0xFFFF; данные MG102_18PL. */ +#define MG102_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG102_12PL = 0x00FD; данные MG102_12PL. */ +#define MG102_12PL 0x00FD +/* Задаёт MG102 = (MG102_11PL & MG102_12PL & MG102_13PL & MG102_14PL &; маска разрешённых прерываний внутри группы PIE 102. */ +#define MG102 (MG102_11PL & MG102_12PL & MG102_13PL & MG102_14PL & \ + MG102_15PL & MG102_16PL & MG102_17PL & MG102_18PL) /* Продолжает список аргументов, полей или выражение MG102_15PL & MG102_16PL & MG102_17PL & MG102_18PL); порядок элементов сохраняется. */ +// End of MG102: + +// Beginning of MG103: +/* Условие компиляции (G101PL >= G103PL) или (G101PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G101PL >= G103PL) || (G101PL == 0) +/* Задаёт MG103_11PL = ~(1); данные MG103_11PL. */ +#define MG103_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG103_11PL = 0xFFFF; данные MG103_11PL. */ +#define MG103_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G102PL >= G103PL) или (G102PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G102PL >= G103PL) || (G102PL == 0) +/* Задаёт MG103_12PL = ~(1 << 1); данные MG103_12PL. */ +#define MG103_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG103_12PL = 0xFFFF; данные MG103_12PL. */ +#define MG103_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G104PL >= G103PL) или (G104PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G104PL >= G103PL) || (G104PL == 0) +/* Задаёт MG103_14PL = ~(1 << 3); данные MG103_14PL. */ +#define MG103_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG103_14PL = 0xFFFF; данные MG103_14PL. */ +#define MG103_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G105PL >= G103PL) или (G105PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G105PL >= G103PL) || (G105PL == 0) +/* Задаёт MG103_15PL = ~(1 << 4); данные MG103_15PL. */ +#define MG103_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG103_15PL = 0xFFFF; данные MG103_15PL. */ +#define MG103_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G106PL >= G103PL) или (G106PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G106PL >= G103PL) || (G106PL == 0) +/* Задаёт MG103_16PL = ~(1 << 5); данные MG103_16PL. */ +#define MG103_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG103_16PL = 0xFFFF; данные MG103_16PL. */ +#define MG103_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G107PL >= G103PL) или (G107PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G107PL >= G103PL) || (G107PL == 0) +/* Задаёт MG103_17PL = ~(1 << 6); данные MG103_17PL. */ +#define MG103_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG103_17PL = 0xFFFF; данные MG103_17PL. */ +#define MG103_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G108PL >= G103PL) или (G108PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G108PL >= G103PL) || (G108PL == 0) +/* Задаёт MG103_18PL = ~(1 << 7); данные MG103_18PL. */ +#define MG103_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG103_18PL = 0xFFFF; данные MG103_18PL. */ +#define MG103_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG103_13PL = 0x00FB; данные MG103_13PL. */ +#define MG103_13PL 0x00FB +/* Задаёт MG103 = (MG103_11PL & MG103_12PL & MG103_13PL & MG103_14PL &; маска разрешённых прерываний внутри группы PIE 103. */ +#define MG103 (MG103_11PL & MG103_12PL & MG103_13PL & MG103_14PL & \ + MG103_15PL & MG103_16PL & MG103_17PL & MG103_18PL) /* Продолжает список аргументов, полей или выражение MG103_15PL & MG103_16PL & MG103_17PL & MG103_18PL); порядок элементов сохраняется. */ +// End of MG103: + +// Beginning of MG104: +/* Условие компиляции (G101PL >= G104PL) или (G101PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G101PL >= G104PL) || (G101PL == 0) +/* Задаёт MG104_11PL = ~(1); данные MG104_11PL. */ +#define MG104_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG104_11PL = 0xFFFF; данные MG104_11PL. */ +#define MG104_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G102PL >= G104PL) или (G102PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G102PL >= G104PL) || (G102PL == 0) +/* Задаёт MG104_12PL = ~(1 << 1); данные MG104_12PL. */ +#define MG104_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG104_12PL = 0xFFFF; данные MG104_12PL. */ +#define MG104_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G103PL >= G104PL) или (G103PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G103PL >= G104PL) || (G103PL == 0) +/* Задаёт MG104_13PL = ~(1 << 2); данные MG104_13PL. */ +#define MG104_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG104_13PL = 0xFFFF; данные MG104_13PL. */ +#define MG104_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G105PL >= G104PL) или (G105PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G105PL >= G104PL) || (G105PL == 0) +/* Задаёт MG104_15PL = ~(1 << 4); данные MG104_15PL. */ +#define MG104_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG104_15PL = 0xFFFF; данные MG104_15PL. */ +#define MG104_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G106PL >= G104PL) или (G106PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G106PL >= G104PL) || (G106PL == 0) +/* Задаёт MG104_16PL = ~(1 << 5); данные MG104_16PL. */ +#define MG104_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG104_16PL = 0xFFFF; данные MG104_16PL. */ +#define MG104_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G107PL >= G104PL) или (G107PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G107PL >= G104PL) || (G107PL == 0) +/* Задаёт MG104_17PL = ~(1 << 6); данные MG104_17PL. */ +#define MG104_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG104_17PL = 0xFFFF; данные MG104_17PL. */ +#define MG104_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G108PL >= G104PL) или (G108PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G108PL >= G104PL) || (G108PL == 0) +/* Задаёт MG104_18PL = ~(1 << 7); данные MG104_18PL. */ +#define MG104_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG104_18PL = 0xFFFF; данные MG104_18PL. */ +#define MG104_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG104_14PL = 0x00F7; данные MG104_14PL. */ +#define MG104_14PL 0x00F7 +/* Задаёт MG104 = (MG104_11PL & MG104_12PL & MG104_13PL & MG104_14PL &; маска разрешённых прерываний внутри группы PIE 104. */ +#define MG104 (MG104_11PL & MG104_12PL & MG104_13PL & MG104_14PL & \ + MG104_15PL & MG104_16PL & MG104_17PL & MG104_18PL) /* Продолжает список аргументов, полей или выражение MG104_15PL & MG104_16PL & MG104_17PL & MG104_18PL); порядок элементов сохраняется. */ +// End of MG104: + +// Beginning of MG105: +/* Условие компиляции (G101PL >= G105PL) или (G101PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G101PL >= G105PL) || (G101PL == 0) +/* Задаёт MG105_11PL = ~(1); данные MG105_11PL. */ +#define MG105_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG105_11PL = 0xFFFF; данные MG105_11PL. */ +#define MG105_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G102PL >= G105PL) или (G102PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G102PL >= G105PL) || (G102PL == 0) +/* Задаёт MG105_12PL = ~(1 << 1); данные MG105_12PL. */ +#define MG105_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG105_12PL = 0xFFFF; данные MG105_12PL. */ +#define MG105_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G103PL >= G105PL) или (G103PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G103PL >= G105PL) || (G103PL == 0) +/* Задаёт MG105_13PL = ~(1 << 2); данные MG105_13PL. */ +#define MG105_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG105_13PL = 0xFFFF; данные MG105_13PL. */ +#define MG105_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G104PL >= G105PL) или (G104PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G104PL >= G105PL) || (G104PL == 0) +/* Задаёт MG105_14PL = ~(1 << 3); данные MG105_14PL. */ +#define MG105_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG105_14PL = 0xFFFF; данные MG105_14PL. */ +#define MG105_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G106PL >= G105PL) или (G106PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G106PL >= G105PL) || (G106PL == 0) +/* Задаёт MG105_16PL = ~(1 << 5); данные MG105_16PL. */ +#define MG105_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG105_16PL = 0xFFFF; данные MG105_16PL. */ +#define MG105_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G107PL >= G105PL) или (G107PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G107PL >= G105PL) || (G107PL == 0) +/* Задаёт MG105_17PL = ~(1 << 6); данные MG105_17PL. */ +#define MG105_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG105_17PL = 0xFFFF; данные MG105_17PL. */ +#define MG105_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G108PL >= G105PL) или (G108PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G108PL >= G105PL) || (G108PL == 0) +/* Задаёт MG105_18PL = ~(1 << 7); данные MG105_18PL. */ +#define MG105_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG105_18PL = 0xFFFF; данные MG105_18PL. */ +#define MG105_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG105_15PL = 0x00EF; данные MG105_15PL. */ +#define MG105_15PL 0x00EF +/* Задаёт MG105 = (MG105_11PL & MG105_12PL & MG105_13PL & MG105_14PL &; маска разрешённых прерываний внутри группы PIE 105. */ +#define MG105 (MG105_11PL & MG105_12PL & MG105_13PL & MG105_14PL & \ + MG105_15PL & MG105_16PL & MG105_17PL & MG105_18PL) /* Продолжает список аргументов, полей или выражение MG105_15PL & MG105_16PL & MG105_17PL & MG105_18PL); порядок элементов сохраняется. */ +// End of MG105: + +// Beginning of MG106: +/* Условие компиляции (G101PL >= G106PL) или (G101PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G101PL >= G106PL) || (G101PL == 0) +/* Задаёт MG106_11PL = ~(1); данные MG106_11PL. */ +#define MG106_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG106_11PL = 0xFFFF; данные MG106_11PL. */ +#define MG106_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G102PL >= G106PL) или (G102PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G102PL >= G106PL) || (G102PL == 0) +/* Задаёт MG106_12PL = ~(1 << 1); данные MG106_12PL. */ +#define MG106_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG106_12PL = 0xFFFF; данные MG106_12PL. */ +#define MG106_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G103PL >= G106PL) или (G103PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G103PL >= G106PL) || (G103PL == 0) +/* Задаёт MG106_13PL = ~(1 << 2); данные MG106_13PL. */ +#define MG106_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG106_13PL = 0xFFFF; данные MG106_13PL. */ +#define MG106_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G104PL >= G106PL) или (G104PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G104PL >= G106PL) || (G104PL == 0) +/* Задаёт MG106_14PL = ~(1 << 3); данные MG106_14PL. */ +#define MG106_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG106_14PL = 0xFFFF; данные MG106_14PL. */ +#define MG106_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G105PL >= G106PL) или (G105PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G105PL >= G106PL) || (G105PL == 0) +/* Задаёт MG106_15PL = ~(1 << 4); данные MG106_15PL. */ +#define MG106_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG106_15PL = 0xFFFF; данные MG106_15PL. */ +#define MG106_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G107PL >= G106PL) или (G107PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G107PL >= G106PL) || (G107PL == 0) +/* Задаёт MG106_17PL = ~(1 << 6); данные MG106_17PL. */ +#define MG106_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG106_17PL = 0xFFFF; данные MG106_17PL. */ +#define MG106_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G108PL >= G106PL) или (G108PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G108PL >= G106PL) || (G108PL == 0) +/* Задаёт MG106_18PL = ~(1 << 7); данные MG106_18PL. */ +#define MG106_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG106_18PL = 0xFFFF; данные MG106_18PL. */ +#define MG106_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG106_16PL = 0x00DF; данные MG106_16PL. */ +#define MG106_16PL 0x00DF +/* Задаёт MG106 = (MG106_11PL & MG106_12PL & MG106_13PL & MG106_14PL &; маска разрешённых прерываний внутри группы PIE 106. */ +#define MG106 (MG106_11PL & MG106_12PL & MG106_13PL & MG106_14PL & \ + MG106_15PL & MG106_16PL & MG106_17PL & MG106_18PL) /* Продолжает список аргументов, полей или выражение MG106_15PL & MG106_16PL & MG106_17PL & MG106_18PL); порядок элементов сохраняется. */ +// End of MG106: + +// Beginning of MG107: +/* Условие компиляции (G101PL >= G107PL) или (G101PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G101PL >= G107PL) || (G101PL == 0) +/* Задаёт MG107_11PL = ~(1); данные MG107_11PL. */ +#define MG107_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG107_11PL = 0xFFFF; данные MG107_11PL. */ +#define MG107_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G102PL >= G107PL) или (G102PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G102PL >= G107PL) || (G102PL == 0) +/* Задаёт MG107_12PL = ~(1 << 1); данные MG107_12PL. */ +#define MG107_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG107_12PL = 0xFFFF; данные MG107_12PL. */ +#define MG107_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G103PL >= G107PL) или (G103PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G103PL >= G107PL) || (G103PL == 0) +/* Задаёт MG107_13PL = ~(1 << 2); данные MG107_13PL. */ +#define MG107_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG107_13PL = 0xFFFF; данные MG107_13PL. */ +#define MG107_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G104PL >= G107PL) или (G104PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G104PL >= G107PL) || (G104PL == 0) +/* Задаёт MG107_14PL = ~(1 << 3); данные MG107_14PL. */ +#define MG107_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG107_14PL = 0xFFFF; данные MG107_14PL. */ +#define MG107_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G105PL >= G107PL) или (G105PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G105PL >= G107PL) || (G105PL == 0) +/* Задаёт MG107_15PL = ~(1 << 4); данные MG107_15PL. */ +#define MG107_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG107_15PL = 0xFFFF; данные MG107_15PL. */ +#define MG107_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G106PL >= G107PL) или (G106PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G106PL >= G107PL) || (G106PL == 0) +/* Задаёт MG107_16PL = ~(1 << 5); данные MG107_16PL. */ +#define MG107_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG107_16PL = 0xFFFF; данные MG107_16PL. */ +#define MG107_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G108PL >= G107PL) или (G108PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G108PL >= G107PL) || (G108PL == 0) +/* Задаёт MG107_18PL = ~(1 << 7); данные MG107_18PL. */ +#define MG107_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG107_18PL = 0xFFFF; данные MG107_18PL. */ +#define MG107_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG107_17PL = 0x00BF; данные MG107_17PL. */ +#define MG107_17PL 0x00BF +/* Задаёт MG107 = (MG107_11PL & MG107_12PL & MG107_13PL & MG107_14PL &; маска разрешённых прерываний внутри группы PIE 107. */ +#define MG107 (MG107_11PL & MG107_12PL & MG107_13PL & MG107_14PL & \ + MG107_15PL & MG107_16PL & MG107_17PL & MG107_18PL) /* Продолжает список аргументов, полей или выражение MG107_15PL & MG107_16PL & MG107_17PL & MG107_18PL); порядок элементов сохраняется. */ +// End of MG107: + +// Beginning of MG108: +/* Условие компиляции (G101PL >= G108PL) или (G101PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G101PL >= G108PL) || (G101PL == 0) +/* Задаёт MG108_11PL = ~(1); данные MG108_11PL. */ +#define MG108_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG108_11PL = 0xFFFF; данные MG108_11PL. */ +#define MG108_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G102PL >= G108PL) или (G102PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G102PL >= G108PL) || (G102PL == 0) +/* Задаёт MG108_12PL = ~(1 << 1); данные MG108_12PL. */ +#define MG108_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG108_12PL = 0xFFFF; данные MG108_12PL. */ +#define MG108_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G103PL >= G108PL) или (G103PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G103PL >= G108PL) || (G103PL == 0) +/* Задаёт MG108_13PL = ~(1 << 2); данные MG108_13PL. */ +#define MG108_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG108_13PL = 0xFFFF; данные MG108_13PL. */ +#define MG108_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G104PL >= G108PL) или (G104PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G104PL >= G108PL) || (G104PL == 0) +/* Задаёт MG108_14PL = ~(1 << 3); данные MG108_14PL. */ +#define MG108_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG108_14PL = 0xFFFF; данные MG108_14PL. */ +#define MG108_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G105PL >= G108PL) или (G105PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G105PL >= G108PL) || (G105PL == 0) +/* Задаёт MG108_15PL = ~(1 << 4); данные MG108_15PL. */ +#define MG108_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG108_15PL = 0xFFFF; данные MG108_15PL. */ +#define MG108_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G106PL >= G108PL) или (G106PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G106PL >= G108PL) || (G106PL == 0) +/* Задаёт MG108_16PL = ~(1 << 5); данные MG108_16PL. */ +#define MG108_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG108_16PL = 0xFFFF; данные MG108_16PL. */ +#define MG108_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G107PL >= G108PL) или (G107PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G107PL >= G108PL) || (G107PL == 0) +/* Задаёт MG108_17PL = ~(1 << 6); данные MG108_17PL. */ +#define MG108_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG108_17PL = 0xFFFF; данные MG108_17PL. */ +#define MG108_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG108_18PL = 0x007F; данные MG108_18PL. */ +#define MG108_18PL 0x007F +/* Задаёт MG108 = (MG108_11PL & MG108_12PL & MG108_13PL & MG108_14PL &; маска разрешённых прерываний внутри группы PIE 108. */ +#define MG108 (MG108_11PL & MG108_12PL & MG108_13PL & MG108_14PL & \ + MG108_15PL & MG108_16PL & MG108_17PL & MG108_18PL) /* Продолжает список аргументов, полей или выражение MG108_15PL & MG108_16PL & MG108_17PL & MG108_18PL); порядок элементов сохраняется. */ +// End of MG108: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG111 to MG118: +// + +// Beginning of MG111: +/* Условие компиляции (G112PL >= G111PL) или (G112PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G112PL >= G111PL) || (G112PL == 0) +/* Задаёт MG111_12PL = ~(1 << 1); данные MG111_12PL. */ +#define MG111_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG111_12PL = 0xFFFF; данные MG111_12PL. */ +#define MG111_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G113PL >= G111PL) или (G113PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G113PL >= G111PL) || (G113PL == 0) +/* Задаёт MG111_13PL = ~(1 << 2); данные MG111_13PL. */ +#define MG111_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG111_13PL = 0xFFFF; данные MG111_13PL. */ +#define MG111_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G114PL >= G111PL) или (G114PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G114PL >= G111PL) || (G114PL == 0) +/* Задаёт MG111_14PL = ~(1 << 3); данные MG111_14PL. */ +#define MG111_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG111_14PL = 0xFFFF; данные MG111_14PL. */ +#define MG111_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G115PL >= G111PL) или (G115PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G115PL >= G111PL) || (G115PL == 0) +/* Задаёт MG111_15PL = ~(1 << 4); данные MG111_15PL. */ +#define MG111_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG111_15PL = 0xFFFF; данные MG111_15PL. */ +#define MG111_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G116PL >= G111PL) или (G116PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G116PL >= G111PL) || (G116PL == 0) +/* Задаёт MG111_16PL = ~(1 << 5); данные MG111_16PL. */ +#define MG111_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG111_16PL = 0xFFFF; данные MG111_16PL. */ +#define MG111_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G117PL >= G111PL) или (G117PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G117PL >= G111PL) || (G117PL == 0) +/* Задаёт MG111_17PL = ~(1 << 6); данные MG111_17PL. */ +#define MG111_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG111_17PL = 0xFFFF; данные MG111_17PL. */ +#define MG111_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G118PL >= G111PL) или (G118PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G118PL >= G111PL) || (G118PL == 0) +/* Задаёт MG111_18PL = ~(1 << 7); данные MG111_18PL. */ +#define MG111_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG111_18PL = 0xFFFF; данные MG111_18PL. */ +#define MG111_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG111_11PL = 0x00FE; данные MG111_11PL. */ +#define MG111_11PL 0x00FE +/* Задаёт MG111 = (MG111_11PL & MG111_12PL & MG111_13PL & MG111_14PL &; маска разрешённых прерываний внутри группы PIE 111. */ +#define MG111 (MG111_11PL & MG111_12PL & MG111_13PL & MG111_14PL & \ + MG111_15PL & MG111_16PL & MG111_17PL & MG111_18PL) /* Продолжает список аргументов, полей или выражение MG111_15PL & MG111_16PL & MG111_17PL & MG111_18PL); порядок элементов сохраняется. */ +// End of MG111: + +// Beginning of MG112: +/* Условие компиляции (G111PL >= G112PL) или (G111PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G111PL >= G112PL) || (G111PL == 0) +/* Задаёт MG112_11PL = ~(1); данные MG112_11PL. */ +#define MG112_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG112_11PL = 0xFFFF; данные MG112_11PL. */ +#define MG112_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G113PL >= G112PL) или (G113PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G113PL >= G112PL) || (G113PL == 0) +/* Задаёт MG112_13PL = ~(1 << 2); данные MG112_13PL. */ +#define MG112_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG112_13PL = 0xFFFF; данные MG112_13PL. */ +#define MG112_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G114PL >= G112PL) или (G114PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G114PL >= G112PL) || (G114PL == 0) +/* Задаёт MG112_14PL = ~(1 << 3); данные MG112_14PL. */ +#define MG112_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG112_14PL = 0xFFFF; данные MG112_14PL. */ +#define MG112_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G115PL >= G112PL) или (G115PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G115PL >= G112PL) || (G115PL == 0) +/* Задаёт MG112_15PL = ~(1 << 4); данные MG112_15PL. */ +#define MG112_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG112_15PL = 0xFFFF; данные MG112_15PL. */ +#define MG112_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G116PL >= G112PL) или (G116PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G116PL >= G112PL) || (G116PL == 0) +/* Задаёт MG112_16PL = ~(1 << 5); данные MG112_16PL. */ +#define MG112_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG112_16PL = 0xFFFF; данные MG112_16PL. */ +#define MG112_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G117PL >= G112PL) или (G117PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G117PL >= G112PL) || (G117PL == 0) +/* Задаёт MG112_17PL = ~(1 << 6); данные MG112_17PL. */ +#define MG112_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG112_17PL = 0xFFFF; данные MG112_17PL. */ +#define MG112_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G118PL >= G112PL) или (G118PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G118PL >= G112PL) || (G118PL == 0) +/* Задаёт MG112_18PL = ~(1 << 7); данные MG112_18PL. */ +#define MG112_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG112_18PL = 0xFFFF; данные MG112_18PL. */ +#define MG112_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG112_12PL = 0x00FD; данные MG112_12PL. */ +#define MG112_12PL 0x00FD +/* Задаёт MG112 = (MG112_11PL & MG112_12PL & MG112_13PL & MG112_14PL &; маска разрешённых прерываний внутри группы PIE 112. */ +#define MG112 (MG112_11PL & MG112_12PL & MG112_13PL & MG112_14PL & \ + MG112_15PL & MG112_16PL & MG112_17PL & MG112_18PL) /* Продолжает список аргументов, полей или выражение MG112_15PL & MG112_16PL & MG112_17PL & MG112_18PL); порядок элементов сохраняется. */ +// End of MG112: + +// Beginning of MG113: +/* Условие компиляции (G111PL >= G113PL) или (G111PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G111PL >= G113PL) || (G111PL == 0) +/* Задаёт MG113_11PL = ~(1); данные MG113_11PL. */ +#define MG113_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG113_11PL = 0xFFFF; данные MG113_11PL. */ +#define MG113_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G112PL >= G113PL) или (G112PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G112PL >= G113PL) || (G112PL == 0) +/* Задаёт MG113_12PL = ~(1 << 1); данные MG113_12PL. */ +#define MG113_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG113_12PL = 0xFFFF; данные MG113_12PL. */ +#define MG113_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G114PL >= G113PL) или (G114PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G114PL >= G113PL) || (G114PL == 0) +/* Задаёт MG113_14PL = ~(1 << 3); данные MG113_14PL. */ +#define MG113_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG113_14PL = 0xFFFF; данные MG113_14PL. */ +#define MG113_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G115PL >= G113PL) или (G115PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G115PL >= G113PL) || (G115PL == 0) +/* Задаёт MG113_15PL = ~(1 << 4); данные MG113_15PL. */ +#define MG113_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG113_15PL = 0xFFFF; данные MG113_15PL. */ +#define MG113_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G116PL >= G113PL) или (G116PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G116PL >= G113PL) || (G116PL == 0) +/* Задаёт MG113_16PL = ~(1 << 5); данные MG113_16PL. */ +#define MG113_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG113_16PL = 0xFFFF; данные MG113_16PL. */ +#define MG113_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G117PL >= G113PL) или (G117PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G117PL >= G113PL) || (G117PL == 0) +/* Задаёт MG113_17PL = ~(1 << 6); данные MG113_17PL. */ +#define MG113_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG113_17PL = 0xFFFF; данные MG113_17PL. */ +#define MG113_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G118PL >= G113PL) или (G118PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G118PL >= G113PL) || (G118PL == 0) +/* Задаёт MG113_18PL = ~(1 << 7); данные MG113_18PL. */ +#define MG113_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG113_18PL = 0xFFFF; данные MG113_18PL. */ +#define MG113_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG113_13PL = 0x00FB; данные MG113_13PL. */ +#define MG113_13PL 0x00FB +/* Задаёт MG113 = (MG113_11PL & MG113_12PL & MG113_13PL & MG113_14PL &; маска разрешённых прерываний внутри группы PIE 113. */ +#define MG113 (MG113_11PL & MG113_12PL & MG113_13PL & MG113_14PL & \ + MG113_15PL & MG113_16PL & MG113_17PL & MG113_18PL) /* Продолжает список аргументов, полей или выражение MG113_15PL & MG113_16PL & MG113_17PL & MG113_18PL); порядок элементов сохраняется. */ +// End of MG113: + +// Beginning of MG114: +/* Условие компиляции (G111PL >= G114PL) или (G111PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G111PL >= G114PL) || (G111PL == 0) +/* Задаёт MG114_11PL = ~(1); данные MG114_11PL. */ +#define MG114_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG114_11PL = 0xFFFF; данные MG114_11PL. */ +#define MG114_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G112PL >= G114PL) или (G112PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G112PL >= G114PL) || (G112PL == 0) +/* Задаёт MG114_12PL = ~(1 << 1); данные MG114_12PL. */ +#define MG114_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG114_12PL = 0xFFFF; данные MG114_12PL. */ +#define MG114_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G113PL >= G114PL) или (G113PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G113PL >= G114PL) || (G113PL == 0) +/* Задаёт MG114_13PL = ~(1 << 2); данные MG114_13PL. */ +#define MG114_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG114_13PL = 0xFFFF; данные MG114_13PL. */ +#define MG114_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G115PL >= G114PL) или (G115PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G115PL >= G114PL) || (G115PL == 0) +/* Задаёт MG114_15PL = ~(1 << 4); данные MG114_15PL. */ +#define MG114_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG114_15PL = 0xFFFF; данные MG114_15PL. */ +#define MG114_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G116PL >= G114PL) или (G116PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G116PL >= G114PL) || (G116PL == 0) +/* Задаёт MG114_16PL = ~(1 << 5); данные MG114_16PL. */ +#define MG114_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG114_16PL = 0xFFFF; данные MG114_16PL. */ +#define MG114_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G117PL >= G114PL) или (G117PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G117PL >= G114PL) || (G117PL == 0) +/* Задаёт MG114_17PL = ~(1 << 6); данные MG114_17PL. */ +#define MG114_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG114_17PL = 0xFFFF; данные MG114_17PL. */ +#define MG114_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G118PL >= G114PL) или (G118PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G118PL >= G114PL) || (G118PL == 0) +/* Задаёт MG114_18PL = ~(1 << 7); данные MG114_18PL. */ +#define MG114_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG114_18PL = 0xFFFF; данные MG114_18PL. */ +#define MG114_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG114_14PL = 0x00F7; данные MG114_14PL. */ +#define MG114_14PL 0x00F7 +/* Задаёт MG114 = (MG114_11PL & MG114_12PL & MG114_13PL & MG114_14PL &; маска разрешённых прерываний внутри группы PIE 114. */ +#define MG114 (MG114_11PL & MG114_12PL & MG114_13PL & MG114_14PL & \ + MG114_15PL & MG114_16PL & MG114_17PL & MG114_18PL) /* Продолжает список аргументов, полей или выражение MG114_15PL & MG114_16PL & MG114_17PL & MG114_18PL); порядок элементов сохраняется. */ +// End of MG114: + +// Beginning of MG115: +/* Условие компиляции (G111PL >= G115PL) или (G111PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G111PL >= G115PL) || (G111PL == 0) +/* Задаёт MG115_11PL = ~(1); данные MG115_11PL. */ +#define MG115_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG115_11PL = 0xFFFF; данные MG115_11PL. */ +#define MG115_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G112PL >= G115PL) или (G112PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G112PL >= G115PL) || (G112PL == 0) +/* Задаёт MG115_12PL = ~(1 << 1); данные MG115_12PL. */ +#define MG115_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG115_12PL = 0xFFFF; данные MG115_12PL. */ +#define MG115_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G113PL >= G115PL) или (G113PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G113PL >= G115PL) || (G113PL == 0) +/* Задаёт MG115_13PL = ~(1 << 2); данные MG115_13PL. */ +#define MG115_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG115_13PL = 0xFFFF; данные MG115_13PL. */ +#define MG115_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G114PL >= G115PL) или (G114PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G114PL >= G115PL) || (G114PL == 0) +/* Задаёт MG115_14PL = ~(1 << 3); данные MG115_14PL. */ +#define MG115_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG115_14PL = 0xFFFF; данные MG115_14PL. */ +#define MG115_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G116PL >= G115PL) или (G116PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G116PL >= G115PL) || (G116PL == 0) +/* Задаёт MG115_16PL = ~(1 << 5); данные MG115_16PL. */ +#define MG115_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG115_16PL = 0xFFFF; данные MG115_16PL. */ +#define MG115_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G117PL >= G115PL) или (G117PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G117PL >= G115PL) || (G117PL == 0) +/* Задаёт MG115_17PL = ~(1 << 6); данные MG115_17PL. */ +#define MG115_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG115_17PL = 0xFFFF; данные MG115_17PL. */ +#define MG115_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G118PL >= G115PL) или (G118PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G118PL >= G115PL) || (G118PL == 0) +/* Задаёт MG115_18PL = ~(1 << 7); данные MG115_18PL. */ +#define MG115_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG115_18PL = 0xFFFF; данные MG115_18PL. */ +#define MG115_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG115_15PL = 0x00EF; данные MG115_15PL. */ +#define MG115_15PL 0x00EF +/* Задаёт MG115 = (MG115_11PL & MG115_12PL & MG115_13PL & MG115_14PL &; маска разрешённых прерываний внутри группы PIE 115. */ +#define MG115 (MG115_11PL & MG115_12PL & MG115_13PL & MG115_14PL & \ + MG115_15PL & MG115_16PL & MG115_17PL & MG115_18PL) /* Продолжает список аргументов, полей или выражение MG115_15PL & MG115_16PL & MG115_17PL & MG115_18PL); порядок элементов сохраняется. */ +// End of MG115: + +// Beginning of MG116: +/* Условие компиляции (G111PL >= G116PL) или (G111PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G111PL >= G116PL) || (G111PL == 0) +/* Задаёт MG116_11PL = ~(1); данные MG116_11PL. */ +#define MG116_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG116_11PL = 0xFFFF; данные MG116_11PL. */ +#define MG116_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G112PL >= G116PL) или (G112PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G112PL >= G116PL) || (G112PL == 0) +/* Задаёт MG116_12PL = ~(1 << 1); данные MG116_12PL. */ +#define MG116_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG116_12PL = 0xFFFF; данные MG116_12PL. */ +#define MG116_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G113PL >= G116PL) или (G113PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G113PL >= G116PL) || (G113PL == 0) +/* Задаёт MG116_13PL = ~(1 << 2); данные MG116_13PL. */ +#define MG116_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG116_13PL = 0xFFFF; данные MG116_13PL. */ +#define MG116_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G114PL >= G116PL) или (G114PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G114PL >= G116PL) || (G114PL == 0) +/* Задаёт MG116_14PL = ~(1 << 3); данные MG116_14PL. */ +#define MG116_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG116_14PL = 0xFFFF; данные MG116_14PL. */ +#define MG116_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G115PL >= G116PL) или (G115PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G115PL >= G116PL) || (G115PL == 0) +/* Задаёт MG116_15PL = ~(1 << 4); данные MG116_15PL. */ +#define MG116_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG116_15PL = 0xFFFF; данные MG116_15PL. */ +#define MG116_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G117PL >= G116PL) или (G117PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G117PL >= G116PL) || (G117PL == 0) +/* Задаёт MG116_17PL = ~(1 << 6); данные MG116_17PL. */ +#define MG116_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG116_17PL = 0xFFFF; данные MG116_17PL. */ +#define MG116_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G118PL >= G116PL) или (G118PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G118PL >= G116PL) || (G118PL == 0) +/* Задаёт MG116_18PL = ~(1 << 7); данные MG116_18PL. */ +#define MG116_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG116_18PL = 0xFFFF; данные MG116_18PL. */ +#define MG116_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG116_16PL = 0x00DF; данные MG116_16PL. */ +#define MG116_16PL 0x00DF +/* Задаёт MG116 = (MG116_11PL & MG116_12PL & MG116_13PL & MG116_14PL &; маска разрешённых прерываний внутри группы PIE 116. */ +#define MG116 (MG116_11PL & MG116_12PL & MG116_13PL & MG116_14PL & \ + MG116_15PL & MG116_16PL & MG116_17PL & MG116_18PL) /* Продолжает список аргументов, полей или выражение MG116_15PL & MG116_16PL & MG116_17PL & MG116_18PL); порядок элементов сохраняется. */ +// End of MG116: + +// Beginning of MG117: +/* Условие компиляции (G111PL >= G117PL) или (G111PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G111PL >= G117PL) || (G111PL == 0) +/* Задаёт MG117_11PL = ~(1); данные MG117_11PL. */ +#define MG117_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG117_11PL = 0xFFFF; данные MG117_11PL. */ +#define MG117_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G112PL >= G117PL) или (G112PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G112PL >= G117PL) || (G112PL == 0) +/* Задаёт MG117_12PL = ~(1 << 1); данные MG117_12PL. */ +#define MG117_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG117_12PL = 0xFFFF; данные MG117_12PL. */ +#define MG117_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G113PL >= G117PL) или (G113PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G113PL >= G117PL) || (G113PL == 0) +/* Задаёт MG117_13PL = ~(1 << 2); данные MG117_13PL. */ +#define MG117_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG117_13PL = 0xFFFF; данные MG117_13PL. */ +#define MG117_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G114PL >= G117PL) или (G114PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G114PL >= G117PL) || (G114PL == 0) +/* Задаёт MG117_14PL = ~(1 << 3); данные MG117_14PL. */ +#define MG117_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG117_14PL = 0xFFFF; данные MG117_14PL. */ +#define MG117_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G115PL >= G117PL) или (G115PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G115PL >= G117PL) || (G115PL == 0) +/* Задаёт MG117_15PL = ~(1 << 4); данные MG117_15PL. */ +#define MG117_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG117_15PL = 0xFFFF; данные MG117_15PL. */ +#define MG117_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G116PL >= G117PL) или (G116PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G116PL >= G117PL) || (G116PL == 0) +/* Задаёт MG117_16PL = ~(1 << 5); данные MG117_16PL. */ +#define MG117_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG117_16PL = 0xFFFF; данные MG117_16PL. */ +#define MG117_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G118PL >= G117PL) или (G118PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G118PL >= G117PL) || (G118PL == 0) +/* Задаёт MG117_18PL = ~(1 << 7); данные MG117_18PL. */ +#define MG117_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG117_18PL = 0xFFFF; данные MG117_18PL. */ +#define MG117_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG117_17PL = 0x00BF; данные MG117_17PL. */ +#define MG117_17PL 0x00BF +/* Задаёт MG117 = (MG117_11PL & MG117_12PL & MG117_13PL & MG117_14PL &; маска разрешённых прерываний внутри группы PIE 117. */ +#define MG117 (MG117_11PL & MG117_12PL & MG117_13PL & MG117_14PL & \ + MG117_15PL & MG117_16PL & MG117_17PL & MG117_18PL) /* Продолжает список аргументов, полей или выражение MG117_15PL & MG117_16PL & MG117_17PL & MG117_18PL); порядок элементов сохраняется. */ +// End of MG117: + +// Beginning of MG118: +/* Условие компиляции (G111PL >= G118PL) или (G111PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G111PL >= G118PL) || (G111PL == 0) +/* Задаёт MG118_11PL = ~(1); данные MG118_11PL. */ +#define MG118_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG118_11PL = 0xFFFF; данные MG118_11PL. */ +#define MG118_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G112PL >= G118PL) или (G112PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G112PL >= G118PL) || (G112PL == 0) +/* Задаёт MG118_12PL = ~(1 << 1); данные MG118_12PL. */ +#define MG118_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG118_12PL = 0xFFFF; данные MG118_12PL. */ +#define MG118_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G113PL >= G118PL) или (G113PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G113PL >= G118PL) || (G113PL == 0) +/* Задаёт MG118_13PL = ~(1 << 2); данные MG118_13PL. */ +#define MG118_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG118_13PL = 0xFFFF; данные MG118_13PL. */ +#define MG118_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G114PL >= G118PL) или (G114PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G114PL >= G118PL) || (G114PL == 0) +/* Задаёт MG118_14PL = ~(1 << 3); данные MG118_14PL. */ +#define MG118_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG118_14PL = 0xFFFF; данные MG118_14PL. */ +#define MG118_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G115PL >= G118PL) или (G115PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G115PL >= G118PL) || (G115PL == 0) +/* Задаёт MG118_15PL = ~(1 << 4); данные MG118_15PL. */ +#define MG118_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG118_15PL = 0xFFFF; данные MG118_15PL. */ +#define MG118_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G116PL >= G118PL) или (G116PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G116PL >= G118PL) || (G116PL == 0) +/* Задаёт MG118_16PL = ~(1 << 5); данные MG118_16PL. */ +#define MG118_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG118_16PL = 0xFFFF; данные MG118_16PL. */ +#define MG118_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G117PL >= G118PL) или (G117PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G117PL >= G118PL) || (G117PL == 0) +/* Задаёт MG118_17PL = ~(1 << 6); данные MG118_17PL. */ +#define MG118_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG118_17PL = 0xFFFF; данные MG118_17PL. */ +#define MG118_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG118_18PL = 0x007F; данные MG118_18PL. */ +#define MG118_18PL 0x007F +/* Задаёт MG118 = (MG118_11PL & MG118_12PL & MG118_13PL & MG118_14PL &; маска разрешённых прерываний внутри группы PIE 118. */ +#define MG118 (MG118_11PL & MG118_12PL & MG118_13PL & MG118_14PL & \ + MG118_15PL & MG118_16PL & MG118_17PL & MG118_18PL) /* Продолжает список аргументов, полей или выражение MG118_15PL & MG118_16PL & MG118_17PL & MG118_18PL); порядок элементов сохраняется. */ +// End of MG118: + +//------------------------------------------------------------------------------- +// Automatically generate PIEIER1 interrupt masks MG121 to MG128: +// + +// Beginning of MG121: +/* Условие компиляции (G122PL >= G121PL) или (G122PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G122PL >= G121PL) || (G122PL == 0) +/* Задаёт MG121_12PL = ~(1 << 1); данные MG121_12PL. */ +#define MG121_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG121_12PL = 0xFFFF; данные MG121_12PL. */ +#define MG121_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G123PL >= G121PL) или (G123PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G123PL >= G121PL) || (G123PL == 0) +/* Задаёт MG121_13PL = ~(1 << 2); данные MG121_13PL. */ +#define MG121_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG121_13PL = 0xFFFF; данные MG121_13PL. */ +#define MG121_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G124PL >= G121PL) или (G124PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G124PL >= G121PL) || (G124PL == 0) +/* Задаёт MG121_14PL = ~(1 << 3); данные MG121_14PL. */ +#define MG121_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG121_14PL = 0xFFFF; данные MG121_14PL. */ +#define MG121_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G125PL >= G121PL) или (G125PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G125PL >= G121PL) || (G125PL == 0) +/* Задаёт MG121_15PL = ~(1 << 4); данные MG121_15PL. */ +#define MG121_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG121_15PL = 0xFFFF; данные MG121_15PL. */ +#define MG121_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G126PL >= G121PL) или (G126PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G126PL >= G121PL) || (G126PL == 0) +/* Задаёт MG121_16PL = ~(1 << 5); данные MG121_16PL. */ +#define MG121_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG121_16PL = 0xFFFF; данные MG121_16PL. */ +#define MG121_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G127PL >= G121PL) или (G127PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G127PL >= G121PL) || (G127PL == 0) +/* Задаёт MG121_17PL = ~(1 << 6); данные MG121_17PL. */ +#define MG121_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG121_17PL = 0xFFFF; данные MG121_17PL. */ +#define MG121_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G128PL >= G121PL) или (G128PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G128PL >= G121PL) || (G128PL == 0) +/* Задаёт MG121_18PL = ~(1 << 7); данные MG121_18PL. */ +#define MG121_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG121_18PL = 0xFFFF; данные MG121_18PL. */ +#define MG121_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG121_11PL = 0x00FE; данные MG121_11PL. */ +#define MG121_11PL 0x00FE +/* Задаёт MG121 = (MG121_11PL & MG121_12PL & MG121_13PL & MG121_14PL &; маска разрешённых прерываний внутри группы PIE 121. */ +#define MG121 (MG121_11PL & MG121_12PL & MG121_13PL & MG121_14PL & \ + MG121_15PL & MG121_16PL & MG121_17PL & MG121_18PL) /* Продолжает список аргументов, полей или выражение MG121_15PL & MG121_16PL & MG121_17PL & MG121_18PL); порядок элементов сохраняется. */ +// End of MG121: + +// Beginning of MG121: +/* Условие компиляции (G121PL >= G122PL) или (G121PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G121PL >= G122PL) || (G121PL == 0) +/* Задаёт MG122_11PL = ~(1); данные MG122_11PL. */ +#define MG122_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG122_11PL = 0xFFFF; данные MG122_11PL. */ +#define MG122_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G123PL >= G122PL) или (G123PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G123PL >= G122PL) || (G123PL == 0) +/* Задаёт MG122_13PL = ~(1 << 2); данные MG122_13PL. */ +#define MG122_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG122_13PL = 0xFFFF; данные MG122_13PL. */ +#define MG122_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G124PL >= G122PL) или (G124PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G124PL >= G122PL) || (G124PL == 0) +/* Задаёт MG122_14PL = ~(1 << 3); данные MG122_14PL. */ +#define MG122_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG122_14PL = 0xFFFF; данные MG122_14PL. */ +#define MG122_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G125PL >= G122PL) или (G125PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G125PL >= G122PL) || (G125PL == 0) +/* Задаёт MG122_15PL = ~(1 << 4); данные MG122_15PL. */ +#define MG122_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG122_15PL = 0xFFFF; данные MG122_15PL. */ +#define MG122_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G126PL >= G122PL) или (G126PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G126PL >= G122PL) || (G126PL == 0) +/* Задаёт MG122_16PL = ~(1 << 5); данные MG122_16PL. */ +#define MG122_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG122_16PL = 0xFFFF; данные MG122_16PL. */ +#define MG122_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G127PL >= G122PL) или (G127PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G127PL >= G122PL) || (G127PL == 0) +/* Задаёт MG122_17PL = ~(1 << 6); данные MG122_17PL. */ +#define MG122_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG122_17PL = 0xFFFF; данные MG122_17PL. */ +#define MG122_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G128PL >= G122PL) или (G128PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G128PL >= G122PL) || (G128PL == 0) +/* Задаёт MG122_18PL = ~(1 << 7); данные MG122_18PL. */ +#define MG122_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG122_18PL = 0xFFFF; данные MG122_18PL. */ +#define MG122_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG122_12PL = 0x00FD; данные MG122_12PL. */ +#define MG122_12PL 0x00FD +/* Задаёт MG122 = (MG122_11PL & MG122_12PL & MG122_13PL & MG122_14PL &; маска разрешённых прерываний внутри группы PIE 122. */ +#define MG122 (MG122_11PL & MG122_12PL & MG122_13PL & MG122_14PL & \ + MG122_15PL & MG122_16PL & MG122_17PL & MG122_18PL) /* Продолжает список аргументов, полей или выражение MG122_15PL & MG122_16PL & MG122_17PL & MG122_18PL); порядок элементов сохраняется. */ +// End of MG122: + +// Beginning of MG123: +/* Условие компиляции (G121PL >= G123PL) или (G121PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G121PL >= G123PL) || (G121PL == 0) +/* Задаёт MG123_11PL = ~(1); данные MG123_11PL. */ +#define MG123_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG123_11PL = 0xFFFF; данные MG123_11PL. */ +#define MG123_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G122PL >= G123PL) или (G122PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G122PL >= G123PL) || (G122PL == 0) +/* Задаёт MG123_12PL = ~(1 << 1); данные MG123_12PL. */ +#define MG123_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG123_12PL = 0xFFFF; данные MG123_12PL. */ +#define MG123_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G124PL >= G123PL) или (G124PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G124PL >= G123PL) || (G124PL == 0) +/* Задаёт MG123_14PL = ~(1 << 3); данные MG123_14PL. */ +#define MG123_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG123_14PL = 0xFFFF; данные MG123_14PL. */ +#define MG123_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G125PL >= G123PL) или (G125PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G125PL >= G123PL) || (G125PL == 0) +/* Задаёт MG123_15PL = ~(1 << 4); данные MG123_15PL. */ +#define MG123_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG123_15PL = 0xFFFF; данные MG123_15PL. */ +#define MG123_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G126PL >= G123PL) или (G126PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G126PL >= G123PL) || (G126PL == 0) +/* Задаёт MG123_16PL = ~(1 << 5); данные MG123_16PL. */ +#define MG123_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG123_16PL = 0xFFFF; данные MG123_16PL. */ +#define MG123_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G127PL >= G123PL) или (G127PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G127PL >= G123PL) || (G127PL == 0) +/* Задаёт MG123_17PL = ~(1 << 6); данные MG123_17PL. */ +#define MG123_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG123_17PL = 0xFFFF; данные MG123_17PL. */ +#define MG123_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G128PL >= G123PL) или (G128PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G128PL >= G123PL) || (G128PL == 0) +/* Задаёт MG123_18PL = ~(1 << 7); данные MG123_18PL. */ +#define MG123_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG123_18PL = 0xFFFF; данные MG123_18PL. */ +#define MG123_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG123_13PL = 0x00FB; данные MG123_13PL. */ +#define MG123_13PL 0x00FB +/* Задаёт MG123 = (MG123_11PL & MG123_12PL & MG123_13PL & MG123_14PL &; маска разрешённых прерываний внутри группы PIE 123. */ +#define MG123 (MG123_11PL & MG123_12PL & MG123_13PL & MG123_14PL & \ + MG123_15PL & MG123_16PL & MG123_17PL & MG123_18PL) /* Продолжает список аргументов, полей или выражение MG123_15PL & MG123_16PL & MG123_17PL & MG123_18PL); порядок элементов сохраняется. */ +// End of MG123: + +// Beginning of MG124: +/* Условие компиляции (G121PL >= G124PL) или (G121PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G121PL >= G124PL) || (G121PL == 0) +/* Задаёт MG124_11PL = ~(1); данные MG124_11PL. */ +#define MG124_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG124_11PL = 0xFFFF; данные MG124_11PL. */ +#define MG124_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G122PL >= G124PL) или (G122PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G122PL >= G124PL) || (G122PL == 0) +/* Задаёт MG124_12PL = ~(1 << 1); данные MG124_12PL. */ +#define MG124_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG124_12PL = 0xFFFF; данные MG124_12PL. */ +#define MG124_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G123PL >= G124PL) или (G123PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G123PL >= G124PL) || (G123PL == 0) +/* Задаёт MG124_13PL = ~(1 << 2); данные MG124_13PL. */ +#define MG124_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG124_13PL = 0xFFFF; данные MG124_13PL. */ +#define MG124_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G125PL >= G124PL) или (G125PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G125PL >= G124PL) || (G125PL == 0) +/* Задаёт MG124_15PL = ~(1 << 4); данные MG124_15PL. */ +#define MG124_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG124_15PL = 0xFFFF; данные MG124_15PL. */ +#define MG124_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G126PL >= G124PL) или (G126PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G126PL >= G124PL) || (G126PL == 0) +/* Задаёт MG124_16PL = ~(1 << 5); данные MG124_16PL. */ +#define MG124_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG124_16PL = 0xFFFF; данные MG124_16PL. */ +#define MG124_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G127PL >= G124PL) или (G127PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G127PL >= G124PL) || (G127PL == 0) +/* Задаёт MG124_17PL = ~(1 << 6); данные MG124_17PL. */ +#define MG124_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG124_17PL = 0xFFFF; данные MG124_17PL. */ +#define MG124_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G128PL >= G124PL) или (G128PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G128PL >= G124PL) || (G128PL == 0) +/* Задаёт MG124_18PL = ~(1 << 7); данные MG124_18PL. */ +#define MG124_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG124_18PL = 0xFFFF; данные MG124_18PL. */ +#define MG124_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG124_14PL = 0x00F7; данные MG124_14PL. */ +#define MG124_14PL 0x00F7 +/* Задаёт MG124 = (MG124_11PL & MG124_12PL & MG124_13PL & MG124_14PL &; маска разрешённых прерываний внутри группы PIE 124. */ +#define MG124 (MG124_11PL & MG124_12PL & MG124_13PL & MG124_14PL & \ + MG124_15PL & MG124_16PL & MG124_17PL & MG124_18PL) /* Продолжает список аргументов, полей или выражение MG124_15PL & MG124_16PL & MG124_17PL & MG124_18PL); порядок элементов сохраняется. */ +// End of MG124: + +// Beginning of MG125: +/* Условие компиляции (G121PL >= G125PL) или (G121PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G121PL >= G125PL) || (G121PL == 0) +/* Задаёт MG125_11PL = ~(1); данные MG125_11PL. */ +#define MG125_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG125_11PL = 0xFFFF; данные MG125_11PL. */ +#define MG125_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G122PL >= G125PL) или (G122PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G122PL >= G125PL) || (G122PL == 0) +/* Задаёт MG125_12PL = ~(1 << 1); данные MG125_12PL. */ +#define MG125_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG125_12PL = 0xFFFF; данные MG125_12PL. */ +#define MG125_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G123PL >= G125PL) или (G123PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G123PL >= G125PL) || (G123PL == 0) +/* Задаёт MG125_13PL = ~(1 << 2); данные MG125_13PL. */ +#define MG125_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG125_13PL = 0xFFFF; данные MG125_13PL. */ +#define MG125_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G124PL >= G125PL) или (G124PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G124PL >= G125PL) || (G124PL == 0) +/* Задаёт MG125_14PL = ~(1 << 3); данные MG125_14PL. */ +#define MG125_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG125_14PL = 0xFFFF; данные MG125_14PL. */ +#define MG125_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G126PL >= G125PL) или (G126PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G126PL >= G125PL) || (G126PL == 0) +/* Задаёт MG125_16PL = ~(1 << 5); данные MG125_16PL. */ +#define MG125_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG125_16PL = 0xFFFF; данные MG125_16PL. */ +#define MG125_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G127PL >= G125PL) или (G127PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G127PL >= G125PL) || (G127PL == 0) +/* Задаёт MG125_17PL = ~(1 << 6); данные MG125_17PL. */ +#define MG125_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG125_17PL = 0xFFFF; данные MG125_17PL. */ +#define MG125_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G128PL >= G125PL) или (G128PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G128PL >= G125PL) || (G128PL == 0) +/* Задаёт MG125_18PL = ~(1 << 7); данные MG125_18PL. */ +#define MG125_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG125_18PL = 0xFFFF; данные MG125_18PL. */ +#define MG125_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG125_15PL = 0x00EF; данные MG125_15PL. */ +#define MG125_15PL 0x00EF +/* Задаёт MG125 = (MG125_11PL & MG125_12PL & MG125_13PL & MG125_14PL &; маска разрешённых прерываний внутри группы PIE 125. */ +#define MG125 (MG125_11PL & MG125_12PL & MG125_13PL & MG125_14PL & \ + MG125_15PL & MG125_16PL & MG125_17PL & MG125_18PL) /* Продолжает список аргументов, полей или выражение MG125_15PL & MG125_16PL & MG125_17PL & MG125_18PL); порядок элементов сохраняется. */ +// End of MG125: + +// Beginning of MG126: +/* Условие компиляции (G121PL >= G126PL) или (G121PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G121PL >= G126PL) || (G121PL == 0) +/* Задаёт MG126_11PL = ~(1); данные MG126_11PL. */ +#define MG126_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG126_11PL = 0xFFFF; данные MG126_11PL. */ +#define MG126_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G122PL >= G126PL) или (G122PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G122PL >= G126PL) || (G122PL == 0) +/* Задаёт MG126_12PL = ~(1 << 1); данные MG126_12PL. */ +#define MG126_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG126_12PL = 0xFFFF; данные MG126_12PL. */ +#define MG126_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G123PL >= G126PL) или (G123PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G123PL >= G126PL) || (G123PL == 0) +/* Задаёт MG126_13PL = ~(1 << 2); данные MG126_13PL. */ +#define MG126_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG126_13PL = 0xFFFF; данные MG126_13PL. */ +#define MG126_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G124PL >= G126PL) или (G124PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G124PL >= G126PL) || (G124PL == 0) +/* Задаёт MG126_14PL = ~(1 << 3); данные MG126_14PL. */ +#define MG126_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG126_14PL = 0xFFFF; данные MG126_14PL. */ +#define MG126_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G125PL >= G126PL) или (G125PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G125PL >= G126PL) || (G125PL == 0) +/* Задаёт MG126_15PL = ~(1 << 4); данные MG126_15PL. */ +#define MG126_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG126_15PL = 0xFFFF; данные MG126_15PL. */ +#define MG126_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G127PL >= G126PL) или (G127PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G127PL >= G126PL) || (G127PL == 0) +/* Задаёт MG126_17PL = ~(1 << 6); данные MG126_17PL. */ +#define MG126_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG126_17PL = 0xFFFF; данные MG126_17PL. */ +#define MG126_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G128PL >= G126PL) или (G128PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G128PL >= G126PL) || (G128PL == 0) +/* Задаёт MG126_18PL = ~(1 << 7); данные MG126_18PL. */ +#define MG126_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG126_18PL = 0xFFFF; данные MG126_18PL. */ +#define MG126_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG126_16PL = 0x00DF; данные MG126_16PL. */ +#define MG126_16PL 0x00DF +/* Задаёт MG126 = (MG126_11PL & MG126_12PL & MG126_13PL & MG126_14PL &; маска разрешённых прерываний внутри группы PIE 126. */ +#define MG126 (MG126_11PL & MG126_12PL & MG126_13PL & MG126_14PL & \ + MG126_15PL & MG126_16PL & MG126_17PL & MG126_18PL) /* Продолжает список аргументов, полей или выражение MG126_15PL & MG126_16PL & MG126_17PL & MG126_18PL); порядок элементов сохраняется. */ +// End of MG126: + +// Beginning of MG127: +/* Условие компиляции (G121PL >= G127PL) или (G121PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G121PL >= G127PL) || (G121PL == 0) +/* Задаёт MG127_11PL = ~(1); данные MG127_11PL. */ +#define MG127_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG127_11PL = 0xFFFF; данные MG127_11PL. */ +#define MG127_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G122PL >= G127PL) или (G122PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G122PL >= G127PL) || (G122PL == 0) +/* Задаёт MG127_12PL = ~(1 << 1); данные MG127_12PL. */ +#define MG127_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG127_12PL = 0xFFFF; данные MG127_12PL. */ +#define MG127_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G123PL >= G127PL) или (G123PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G123PL >= G127PL) || (G123PL == 0) +/* Задаёт MG127_13PL = ~(1 << 2); данные MG127_13PL. */ +#define MG127_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG127_13PL = 0xFFFF; данные MG127_13PL. */ +#define MG127_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G124PL >= G127PL) или (G124PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G124PL >= G127PL) || (G124PL == 0) +/* Задаёт MG127_14PL = ~(1 << 3); данные MG127_14PL. */ +#define MG127_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG127_14PL = 0xFFFF; данные MG127_14PL. */ +#define MG127_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G125PL >= G127PL) или (G125PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G125PL >= G127PL) || (G125PL == 0) +/* Задаёт MG127_15PL = ~(1 << 4); данные MG127_15PL. */ +#define MG127_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG127_15PL = 0xFFFF; данные MG127_15PL. */ +#define MG127_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G126PL >= G127PL) или (G126PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G126PL >= G127PL) || (G126PL == 0) +/* Задаёт MG127_16PL = ~(1 << 5); данные MG127_16PL. */ +#define MG127_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG127_16PL = 0xFFFF; данные MG127_16PL. */ +#define MG127_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G128PL >= G127PL) или (G128PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G128PL >= G127PL) || (G128PL == 0) +/* Задаёт MG127_18PL = ~(1 << 7); данные MG127_18PL. */ +#define MG127_18PL ~(1 << 7) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG127_18PL = 0xFFFF; данные MG127_18PL. */ +#define MG127_18PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG127_17PL = 0x00BF; данные MG127_17PL. */ +#define MG127_17PL 0x00BF +/* Задаёт MG127 = (MG127_11PL & MG127_12PL & MG127_13PL & MG127_14PL &; маска разрешённых прерываний внутри группы PIE 127. */ +#define MG127 (MG127_11PL & MG127_12PL & MG127_13PL & MG127_14PL & \ + MG127_15PL & MG127_16PL & MG127_17PL & MG127_18PL) /* Продолжает список аргументов, полей или выражение MG127_15PL & MG127_16PL & MG127_17PL & MG127_18PL); порядок элементов сохраняется. */ +// End of MG127: + +// Beginning of MG128: +/* Условие компиляции (G121PL >= G128PL) или (G121PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G121PL >= G128PL) || (G121PL == 0) +/* Задаёт MG128_11PL = ~(1); данные MG128_11PL. */ +#define MG128_11PL ~(1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG128_11PL = 0xFFFF; данные MG128_11PL. */ +#define MG128_11PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G122PL >= G128PL) или (G122PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G122PL >= G128PL) || (G122PL == 0) +/* Задаёт MG128_12PL = ~(1 << 1); данные MG128_12PL. */ +#define MG128_12PL ~(1 << 1) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG128_12PL = 0xFFFF; данные MG128_12PL. */ +#define MG128_12PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G123PL >= G128PL) или (G123PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G123PL >= G128PL) || (G123PL == 0) +/* Задаёт MG128_13PL = ~(1 << 2); данные MG128_13PL. */ +#define MG128_13PL ~(1 << 2) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG128_13PL = 0xFFFF; данные MG128_13PL. */ +#define MG128_13PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G124PL >= G128PL) или (G124PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G124PL >= G128PL) || (G124PL == 0) +/* Задаёт MG128_14PL = ~(1 << 3); данные MG128_14PL. */ +#define MG128_14PL ~(1 << 3) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG128_14PL = 0xFFFF; данные MG128_14PL. */ +#define MG128_14PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G125PL >= G128PL) или (G125PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G125PL >= G128PL) || (G125PL == 0) +/* Задаёт MG128_15PL = ~(1 << 4); данные MG128_15PL. */ +#define MG128_15PL ~(1 << 4) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG128_15PL = 0xFFFF; данные MG128_15PL. */ +#define MG128_15PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G126PL >= G128PL) или (G126PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G126PL >= G128PL) || (G126PL == 0) +/* Задаёт MG128_16PL = ~(1 << 5); данные MG128_16PL. */ +#define MG128_16PL ~(1 << 5) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG128_16PL = 0xFFFF; данные MG128_16PL. */ +#define MG128_16PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции (G127PL >= G128PL) или (G127PL == 0): выбранный блок включается в текущий вариант прошивки. */ +#if (G127PL >= G128PL) || (G127PL == 0) +/* Задаёт MG128_17PL = ~(1 << 6); данные MG128_17PL. */ +#define MG128_17PL ~(1 << 6) +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Задаёт MG128_17PL = 0xFFFF; данные MG128_17PL. */ +#define MG128_17PL 0xFFFF +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Задаёт MG128_18PL = 0x007F; данные MG128_18PL. */ +#define MG128_18PL 0x007F +/* Задаёт MG128 = (MG128_11PL & MG128_12PL & MG128_13PL & MG128_14PL &; маска разрешённых прерываний внутри группы PIE 128. */ +#define MG128 (MG128_11PL & MG128_12PL & MG128_13PL & MG128_14PL & \ + MG128_15PL & MG128_16PL & MG128_17PL & MG128_18PL) /* Продолжает список аргументов, полей или выражение MG128_15PL & MG128_16PL & MG128_17PL & MG128_18PL); порядок элементов сохраняется. */ +// End of MG128: + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // eof + +//=========================================================================== +// No more. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/common/include/DSP28x_Project.h b/c/protocan-boot/vendor/ti/f28335/common/include/DSP28x_Project.h new file mode 100644 index 0000000..d94194a --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/common/include/DSP28x_Project.h @@ -0,0 +1,28 @@ +/* Настройки и интерфейс DSP28x_Project. Русские пояснения сохранены в UTF-8. */ + +// TI File $Revision: /main/1 $ +// Checkin $Date: April 22, 2008 14:35:56 $ +//########################################################################### +// +// FILE: DSP28x_Project.h +// +// TITLE: DSP28x Project Headerfile and Examples Include File +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP28x_PROJECT_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP28x_PROJECT_H +/* Определяет защитный символ или переключатель DSP28x_PROJECT_H для последующей компиляции. */ +#define DSP28x_PROJECT_H + +/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */ +#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File +/* Подключает "DSP2833x_Examples.h": поставляемое TI описание Examples для семейства C2833x. */ +#include "DSP2833x_Examples.h" // DSP2833x Examples Include File + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP28x_PROJECT_H definition + diff --git a/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_Adc.h b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_Adc.h new file mode 100644 index 0000000..289dea6 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_Adc.h @@ -0,0 +1,465 @@ +/* Поставляемое TI описание Adc для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/1 $ +// Checkin $Date: August 18, 2006 13:51:50 $ +//########################################################################### +// +// FILE: DSP2833x_Adc.h +// +// TITLE: DSP2833x Device ADC Register Definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_ADC_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_ADC_H +/* Определяет защитный символ или переключатель DSP2833x_ADC_H для последующей компиляции. */ +#define DSP2833x_ADC_H + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + + +//--------------------------------------------------------------------------- +// ADC Individual Register Bit Definitions: + +/* Описывает структуру ADCTRL1_BITS; порядок полей определяет расположение данных. */ +struct ADCTRL1_BITS { // bits description + /* Битовое поле rsvd1, ширина 4 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:4; // 3:0 reserved + /* Битовое поле SEQ_CASC, ширина 1 бит; данные SEQ_CASC. */ + Uint16 SEQ_CASC:1; // 4 Cascaded sequencer mode + /* Битовое поле SEQ_OVRD, ширина 1 бит; данные SEQ_OVRD. */ + Uint16 SEQ_OVRD:1; // 5 Sequencer override + /* Битовое поле CONT_RUN, ширина 1 бит; данные CONT_RUN. */ + Uint16 CONT_RUN:1; // 6 Continuous run + /* Битовое поле CPS, ширина 1 бит; данные CPS. */ + Uint16 CPS:1; // 7 ADC core clock pre-scalar + /* Битовое поле ACQ_PS, ширина 4 бит; данные ACQ_PS. */ + Uint16 ACQ_PS:4; // 11:8 Acquisition window size + /* Битовое поле SUSMOD, ширина 2 бит; данные SUSMOD. */ + Uint16 SUSMOD:2; // 13:12 Emulation suspend mode + /* Битовое поле RESET, ширина 1 бит; сброс. */ + Uint16 RESET:1; // 14 ADC reset + /* Битовое поле rsvd2, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:1; // 15 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Объединяет несколько представлений ADCTRL1_REG в одной области памяти. */ +union ADCTRL1_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру ADCTRL1_BITS bit;; порядок полей определяет расположение данных. */ + struct ADCTRL1_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Описывает структуру ADCTRL2_BITS; порядок полей определяет расположение данных. */ +struct ADCTRL2_BITS { // bits description + /* Битовое поле EPWM_SOCB_SEQ2, ширина 1 бит; данные EPWM_SOCB_SEQ2. */ + Uint16 EPWM_SOCB_SEQ2:1; // 0 EPWM compare B SOC mask for SEQ2 + /* Битовое поле rsvd1, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:1; // 1 reserved + /* Битовое поле INT_MOD_SEQ2, ширина 1 бит; данные INT_MOD_SEQ2. */ + Uint16 INT_MOD_SEQ2:1; // 2 SEQ2 Interrupt mode + /* Битовое поле INT_ENA_SEQ2, ширина 1 бит; данные INT_ENA_SEQ2. */ + Uint16 INT_ENA_SEQ2:1; // 3 SEQ2 Interrupt enable + /* Битовое поле rsvd2, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:1; // 4 reserved + /* Битовое поле SOC_SEQ2, ширина 1 бит; данные SOC_SEQ2. */ + Uint16 SOC_SEQ2:1; // 5 Start of conversion for SEQ2 + /* Битовое поле RST_SEQ2, ширина 1 бит; данные RST_SEQ2. */ + Uint16 RST_SEQ2:1; // 6 Reset SEQ2 + /* Битовое поле EXT_SOC_SEQ1, ширина 1 бит; данные EXT_SOC_SEQ1. */ + Uint16 EXT_SOC_SEQ1:1; // 7 External start of conversion for SEQ1 + /* Битовое поле EPWM_SOCA_SEQ1, ширина 1 бит; данные EPWM_SOCA_SEQ1. */ + Uint16 EPWM_SOCA_SEQ1:1; // 8 EPWM compare B SOC mask for SEQ1 + /* Битовое поле rsvd3, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd3:1; // 9 reserved + /* Битовое поле INT_MOD_SEQ1, ширина 1 бит; данные INT_MOD_SEQ1. */ + Uint16 INT_MOD_SEQ1:1; // 10 SEQ1 Interrupt mode + /* Битовое поле INT_ENA_SEQ1, ширина 1 бит; данные INT_ENA_SEQ1. */ + Uint16 INT_ENA_SEQ1:1; // 11 SEQ1 Interrupt enable + /* Битовое поле rsvd4, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd4:1; // 12 reserved + /* Битовое поле SOC_SEQ1, ширина 1 бит; данные SOC_SEQ1. */ + Uint16 SOC_SEQ1:1; // 13 Start of conversion trigger for SEQ1 + /* Битовое поле RST_SEQ1, ширина 1 бит; данные RST_SEQ1. */ + Uint16 RST_SEQ1:1; // 14 Restart sequencer 1 + /* Битовое поле EPWM_SOCB_SEQ, ширина 1 бит; данные EPWM_SOCB_SEQ. */ + Uint16 EPWM_SOCB_SEQ:1; // 15 EPWM compare B SOC enable +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Объединяет несколько представлений ADCTRL2_REG в одной области памяти. */ +union ADCTRL2_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру ADCTRL2_BITS bit;; порядок полей определяет расположение данных. */ + struct ADCTRL2_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Описывает структуру ADCASEQSR_BITS; порядок полей определяет расположение данных. */ +struct ADCASEQSR_BITS { // bits description + /* Битовое поле SEQ1_STATE, ширина 4 бит; данные SEQ1_STATE. */ + Uint16 SEQ1_STATE:4; // 3:0 SEQ1 state + /* Битовое поле SEQ2_STATE, ширина 3 бит; данные SEQ2_STATE. */ + Uint16 SEQ2_STATE:3; // 6:4 SEQ2 state + /* Битовое поле rsvd1, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:1; // 7 reserved + /* Битовое поле SEQ_CNTR, ширина 4 бит; данные SEQ_CNTR. */ + Uint16 SEQ_CNTR:4; // 11:8 Sequencing counter status + /* Битовое поле rsvd2, ширина 4 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:4; // 15:12 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений ADCASEQSR_REG в одной области памяти. */ +union ADCASEQSR_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру ADCASEQSR_BITS bit;; порядок полей определяет расположение данных. */ + struct ADCASEQSR_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Описывает структуру ADCMAXCONV_BITS; порядок полей определяет расположение данных. */ +struct ADCMAXCONV_BITS { // bits description + /* Битовое поле MAX_CONV1, ширина 4 бит; данные MAX_CONV1. */ + Uint16 MAX_CONV1:4; // 3:0 Max number of conversions + /* Битовое поле MAX_CONV2, ширина 3 бит; данные MAX_CONV2. */ + Uint16 MAX_CONV2:3; // 6:4 Max number of conversions + /* Битовое поле rsvd1, ширина 9 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:9; // 15:7 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений ADCMAXCONV_REG в одной области памяти. */ +union ADCMAXCONV_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру ADCMAXCONV_BITS bit;; порядок полей определяет расположение данных. */ + struct ADCMAXCONV_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Описывает структуру ADCCHSELSEQ1_BITS; порядок полей определяет расположение данных. */ +struct ADCCHSELSEQ1_BITS { // bits description + /* Битовое поле CONV00, ширина 4 бит; данные CONV00. */ + Uint16 CONV00:4; // 3:0 Conversion selection 00 + /* Битовое поле CONV01, ширина 4 бит; данные CONV01. */ + Uint16 CONV01:4; // 7:4 Conversion selection 01 + /* Битовое поле CONV02, ширина 4 бит; данные CONV02. */ + Uint16 CONV02:4; // 11:8 Conversion selection 02 + /* Битовое поле CONV03, ширина 4 бит; данные CONV03. */ + Uint16 CONV03:4; // 15:12 Conversion selection 03 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений ADCCHSELSEQ1_REG в одной области памяти. */ +union ADCCHSELSEQ1_REG{ + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру ADCCHSELSEQ1_BITS bit;; порядок полей определяет расположение данных. */ + struct ADCCHSELSEQ1_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Описывает структуру ADCCHSELSEQ2_BITS; порядок полей определяет расположение данных. */ +struct ADCCHSELSEQ2_BITS { // bits description + /* Битовое поле CONV04, ширина 4 бит; данные CONV04. */ + Uint16 CONV04:4; // 3:0 Conversion selection 04 + /* Битовое поле CONV05, ширина 4 бит; данные CONV05. */ + Uint16 CONV05:4; // 7:4 Conversion selection 05 + /* Битовое поле CONV06, ширина 4 бит; данные CONV06. */ + Uint16 CONV06:4; // 11:8 Conversion selection 06 + /* Битовое поле CONV07, ширина 4 бит; данные CONV07. */ + Uint16 CONV07:4; // 15:12 Conversion selection 07 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений ADCCHSELSEQ2_REG в одной области памяти. */ +union ADCCHSELSEQ2_REG{ + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру ADCCHSELSEQ2_BITS bit;; порядок полей определяет расположение данных. */ + struct ADCCHSELSEQ2_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Описывает структуру ADCCHSELSEQ3_BITS; порядок полей определяет расположение данных. */ +struct ADCCHSELSEQ3_BITS { // bits description + /* Битовое поле CONV08, ширина 4 бит; данные CONV08. */ + Uint16 CONV08:4; // 3:0 Conversion selection 08 + /* Битовое поле CONV09, ширина 4 бит; данные CONV09. */ + Uint16 CONV09:4; // 7:4 Conversion selection 09 + /* Битовое поле CONV10, ширина 4 бит; данные CONV10. */ + Uint16 CONV10:4; // 11:8 Conversion selection 10 + /* Битовое поле CONV11, ширина 4 бит; данные CONV11. */ + Uint16 CONV11:4; // 15:12 Conversion selection 11 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений ADCCHSELSEQ3_REG в одной области памяти. */ +union ADCCHSELSEQ3_REG{ + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру ADCCHSELSEQ3_BITS bit;; порядок полей определяет расположение данных. */ + struct ADCCHSELSEQ3_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Описывает структуру ADCCHSELSEQ4_BITS; порядок полей определяет расположение данных. */ +struct ADCCHSELSEQ4_BITS { // bits description + /* Битовое поле CONV12, ширина 4 бит; данные CONV12. */ + Uint16 CONV12:4; // 3:0 Conversion selection 12 + /* Битовое поле CONV13, ширина 4 бит; данные CONV13. */ + Uint16 CONV13:4; // 7:4 Conversion selection 13 + /* Битовое поле CONV14, ширина 4 бит; данные CONV14. */ + Uint16 CONV14:4; // 11:8 Conversion selection 14 + /* Битовое поле CONV15, ширина 4 бит; данные CONV15. */ + Uint16 CONV15:4; // 15:12 Conversion selection 15 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений ADCCHSELSEQ4_REG в одной области памяти. */ +union ADCCHSELSEQ4_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру ADCCHSELSEQ4_BITS bit;; порядок полей определяет расположение данных. */ + struct ADCCHSELSEQ4_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Описывает структуру ADCTRL3_BITS; порядок полей определяет расположение данных. */ +struct ADCTRL3_BITS { // bits description + /* Битовое поле SMODE_SEL, ширина 1 бит; данные SMODE_SEL. */ + Uint16 SMODE_SEL:1; // 0 Sampling mode select + /* Битовое поле ADCCLKPS, ширина 4 бит; данные ADCCLKPS. */ + Uint16 ADCCLKPS:4; // 4:1 ADC core clock divider + /* Битовое поле ADCPWDN, ширина 1 бит; данные ADCPWDN. */ + Uint16 ADCPWDN:1; // 5 ADC powerdown + /* Битовое поле ADCBGRFDN, ширина 2 бит; данные ADCBGRFDN. */ + Uint16 ADCBGRFDN:2; // 7:6 ADC bandgap/ref power down + /* Битовое поле rsvd1, ширина 8 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:8; // 15:8 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений ADCTRL3_REG в одной области памяти. */ +union ADCTRL3_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру ADCTRL3_BITS bit;; порядок полей определяет расположение данных. */ + struct ADCTRL3_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Описывает структуру ADCST_BITS; порядок полей определяет расположение данных. */ +struct ADCST_BITS { // bits description + /* Битовое поле INT_SEQ1, ширина 1 бит; данные INT_SEQ1. */ + Uint16 INT_SEQ1:1; // 0 SEQ1 Interrupt flag + /* Битовое поле INT_SEQ2, ширина 1 бит; данные INT_SEQ2. */ + Uint16 INT_SEQ2:1; // 1 SEQ2 Interrupt flag + /* Битовое поле SEQ1_BSY, ширина 1 бит; данные SEQ1_BSY. */ + Uint16 SEQ1_BSY:1; // 2 SEQ1 busy status + /* Битовое поле SEQ2_BSY, ширина 1 бит; данные SEQ2_BSY. */ + Uint16 SEQ2_BSY:1; // 3 SEQ2 busy status + /* Битовое поле INT_SEQ1_CLR, ширина 1 бит; данные INT_SEQ1_CLR. */ + Uint16 INT_SEQ1_CLR:1; // 4 SEQ1 Interrupt clear + /* Битовое поле INT_SEQ2_CLR, ширина 1 бит; данные INT_SEQ2_CLR. */ + Uint16 INT_SEQ2_CLR:1; // 5 SEQ2 Interrupt clear + /* Битовое поле EOS_BUF1, ширина 1 бит; данные EOS_BUF1. */ + Uint16 EOS_BUF1:1; // 6 End of sequence buffer1 + /* Битовое поле EOS_BUF2, ширина 1 бит; данные EOS_BUF2. */ + Uint16 EOS_BUF2:1; // 7 End of sequence buffer2 + /* Битовое поле rsvd1, ширина 8 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:8; // 15:8 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Объединяет несколько представлений ADCST_REG в одной области памяти. */ +union ADCST_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру ADCST_BITS bit;; порядок полей определяет расположение данных. */ + struct ADCST_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Описывает структуру ADCREFSEL_BITS; порядок полей определяет расположение данных. */ +struct ADCREFSEL_BITS { // bits description + /* Битовое поле rsvd1, ширина 14 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:14; // 13:0 reserved + /* Битовое поле REF_SEL, ширина 2 бит; данные REF_SEL. */ + Uint16 REF_SEL:2; // 15:14 Reference select +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; +/* Объединяет несколько представлений ADCREFSEL_REG в одной области памяти. */ +union ADCREFSEL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру ADCREFSEL_BITS bit;; порядок полей определяет расположение данных. */ + struct ADCREFSEL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Описывает структуру ADCOFFTRIM_BITS; порядок полей определяет расположение данных. */ +struct ADCOFFTRIM_BITS{ // bits description + /* Продолжает список аргументов, полей или выражение int16 OFFSET_TRIM:9;; порядок элементов сохраняется. */ + int16 OFFSET_TRIM:9; // 8:0 Offset Trim + /* Битовое поле rsvd1, ширина 7 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:7; // 15:9 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений ADCOFFTRIM_REG в одной области памяти. */ +union ADCOFFTRIM_REG{ + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру ADCOFFTRIM_BITS bit;; порядок полей определяет расположение данных. */ + struct ADCOFFTRIM_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; +/* Описывает структуру ADC_REGS; порядок полей определяет расположение данных. */ +struct ADC_REGS { + /* Объединяет несколько представлений ADCTRL1_REG ADCTRL1; в одной области памяти. */ + union ADCTRL1_REG ADCTRL1; // ADC Control 1 + /* Объединяет несколько представлений ADCTRL2_REG ADCTRL2; в одной области памяти. */ + union ADCTRL2_REG ADCTRL2; // ADC Control 2 + /* Объединяет несколько представлений ADCMAXCONV_REG ADCMAXCONV; в одной области памяти. */ + union ADCMAXCONV_REG ADCMAXCONV; // Max conversions + /* Объединяет несколько представлений ADCCHSELSEQ1_REG ADCCHSELSEQ1; в одной области памяти. */ + union ADCCHSELSEQ1_REG ADCCHSELSEQ1; // Channel select sequencing control 1 + /* Объединяет несколько представлений ADCCHSELSEQ2_REG ADCCHSELSEQ2; в одной области памяти. */ + union ADCCHSELSEQ2_REG ADCCHSELSEQ2; // Channel select sequencing control 2 + /* Объединяет несколько представлений ADCCHSELSEQ3_REG ADCCHSELSEQ3; в одной области памяти. */ + union ADCCHSELSEQ3_REG ADCCHSELSEQ3; // Channel select sequencing control 3 + /* Объединяет несколько представлений ADCCHSELSEQ4_REG ADCCHSELSEQ4; в одной области памяти. */ + union ADCCHSELSEQ4_REG ADCCHSELSEQ4; // Channel select sequencing control 4 + /* Объединяет несколько представлений ADCASEQSR_REG ADCASEQSR; в одной области памяти. */ + union ADCASEQSR_REG ADCASEQSR; // Autosequence status register + /* Объявляет ADCRESULT0 — данные ADCRESULT0. */ + Uint16 ADCRESULT0; // Conversion Result Buffer 0 + /* Объявляет ADCRESULT1 — данные ADCRESULT1. */ + Uint16 ADCRESULT1; // Conversion Result Buffer 1 + /* Объявляет ADCRESULT2 — данные ADCRESULT2. */ + Uint16 ADCRESULT2; // Conversion Result Buffer 2 + /* Объявляет ADCRESULT3 — данные ADCRESULT3. */ + Uint16 ADCRESULT3; // Conversion Result Buffer 3 + /* Объявляет ADCRESULT4 — данные ADCRESULT4. */ + Uint16 ADCRESULT4; // Conversion Result Buffer 4 + /* Объявляет ADCRESULT5 — данные ADCRESULT5. */ + Uint16 ADCRESULT5; // Conversion Result Buffer 5 + /* Объявляет ADCRESULT6 — данные ADCRESULT6. */ + Uint16 ADCRESULT6; // Conversion Result Buffer 6 + /* Объявляет ADCRESULT7 — данные ADCRESULT7. */ + Uint16 ADCRESULT7; // Conversion Result Buffer 7 + /* Объявляет ADCRESULT8 — данные ADCRESULT8. */ + Uint16 ADCRESULT8; // Conversion Result Buffer 8 + /* Объявляет ADCRESULT9 — данные ADCRESULT9. */ + Uint16 ADCRESULT9; // Conversion Result Buffer 9 + /* Объявляет ADCRESULT10 — данные ADCRESULT10. */ + Uint16 ADCRESULT10; // Conversion Result Buffer 10 + /* Объявляет ADCRESULT11 — данные ADCRESULT11. */ + Uint16 ADCRESULT11; // Conversion Result Buffer 11 + /* Объявляет ADCRESULT12 — данные ADCRESULT12. */ + Uint16 ADCRESULT12; // Conversion Result Buffer 12 + /* Объявляет ADCRESULT13 — данные ADCRESULT13. */ + Uint16 ADCRESULT13; // Conversion Result Buffer 13 + /* Объявляет ADCRESULT14 — данные ADCRESULT14. */ + Uint16 ADCRESULT14; // Conversion Result Buffer 14 + /* Объявляет ADCRESULT15 — данные ADCRESULT15. */ + Uint16 ADCRESULT15; // Conversion Result Buffer 15 + /* Объединяет несколько представлений ADCTRL3_REG ADCTRL3; в одной области памяти. */ + union ADCTRL3_REG ADCTRL3; // ADC Control 3 + /* Объединяет несколько представлений ADCST_REG ADCST; в одной области памяти. */ + union ADCST_REG ADCST; // ADC Status Register + /* Объявляет rsvd1 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1; + /* Объявляет rsvd2 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2; + /* Объединяет несколько представлений ADCREFSEL_REG ADCREFSEL; в одной области памяти. */ + union ADCREFSEL_REG ADCREFSEL; // Reference Select Register + /* Объединяет несколько представлений ADCOFFTRIM_REG ADCOFFTRIM; в одной области памяти. */ + union ADCOFFTRIM_REG ADCOFFTRIM; // Offset Trim Register +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Описывает структуру ADC_RESULT_MIRROR_REGS; порядок полей определяет расположение данных. */ +struct ADC_RESULT_MIRROR_REGS +/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ +{ + /* Объявляет ADCRESULT0 — данные ADCRESULT0. */ + Uint16 ADCRESULT0; // Conversion Result Buffer 0 + /* Объявляет ADCRESULT1 — данные ADCRESULT1. */ + Uint16 ADCRESULT1; // Conversion Result Buffer 1 + /* Объявляет ADCRESULT2 — данные ADCRESULT2. */ + Uint16 ADCRESULT2; // Conversion Result Buffer 2 + /* Объявляет ADCRESULT3 — данные ADCRESULT3. */ + Uint16 ADCRESULT3; // Conversion Result Buffer 3 + /* Объявляет ADCRESULT4 — данные ADCRESULT4. */ + Uint16 ADCRESULT4; // Conversion Result Buffer 4 + /* Объявляет ADCRESULT5 — данные ADCRESULT5. */ + Uint16 ADCRESULT5; // Conversion Result Buffer 5 + /* Объявляет ADCRESULT6 — данные ADCRESULT6. */ + Uint16 ADCRESULT6; // Conversion Result Buffer 6 + /* Объявляет ADCRESULT7 — данные ADCRESULT7. */ + Uint16 ADCRESULT7; // Conversion Result Buffer 7 + /* Объявляет ADCRESULT8 — данные ADCRESULT8. */ + Uint16 ADCRESULT8; // Conversion Result Buffer 8 + /* Объявляет ADCRESULT9 — данные ADCRESULT9. */ + Uint16 ADCRESULT9; // Conversion Result Buffer 9 + /* Объявляет ADCRESULT10 — данные ADCRESULT10. */ + Uint16 ADCRESULT10; // Conversion Result Buffer 10 + /* Объявляет ADCRESULT11 — данные ADCRESULT11. */ + Uint16 ADCRESULT11; // Conversion Result Buffer 11 + /* Объявляет ADCRESULT12 — данные ADCRESULT12. */ + Uint16 ADCRESULT12; // Conversion Result Buffer 12 + /* Объявляет ADCRESULT13 — данные ADCRESULT13. */ + Uint16 ADCRESULT13; // Conversion Result Buffer 13 + /* Объявляет ADCRESULT14 — данные ADCRESULT14. */ + Uint16 ADCRESULT14; // Conversion Result Buffer 14 + /* Объявляет ADCRESULT15 — данные ADCRESULT15. */ + Uint16 ADCRESULT15; // Conversion Result Buffer 15 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//--------------------------------------------------------------------------- +// ADC External References & Function Declarations: +// +/* Продолжает список аргументов, полей или выражение extern volatile struct ADC_REGS AdcRegs;; порядок элементов сохраняется. */ +extern volatile struct ADC_REGS AdcRegs; +/* Продолжает список аргументов, полей или выражение extern volatile struct ADC_RESULT_MIRROR_REGS AdcMirror;; порядок элементов сохраняется. */ +extern volatile struct ADC_RESULT_MIRROR_REGS AdcMirror; + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_ADC_H definition + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_CpuTimers.h b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_CpuTimers.h new file mode 100644 index 0000000..a3383fc --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_CpuTimers.h @@ -0,0 +1,283 @@ +/* Поставляемое TI описание CpuTimers для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/4 $ +// Checkin $Date: March 20, 2007 15:33:42 $ +//########################################################################### +// +// FILE: DSP2833x_CpuTimers.h +// +// TITLE: DSP2833x CPU 32-bit Timers Register Definitions. +// +// NOTES: CpuTimer1 and CpuTimer2 are reserved for use with DSP BIOS and +// other realtime operating systems. +// +// Do not use these two timers in your application if you ever plan +// on integrating DSP-BIOS or another realtime OS. +// +// For this reason, comment out the code to manipulate these two timers +// if using DSP-BIOS or another realtime OS. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_CPU_TIMERS_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_CPU_TIMERS_H +/* Определяет защитный символ или переключатель DSP2833x_CPU_TIMERS_H для последующей компиляции. */ +#define DSP2833x_CPU_TIMERS_H + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +//--------------------------------------------------------------------------- +// CPU Timer Register Bit Definitions: +// +// +// TCR: Control register bit definitions: +/* Описывает структуру TCR_BITS; порядок полей определяет расположение данных. */ +struct TCR_BITS { // bits description + /* Битовое поле rsvd1, ширина 4 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:4; // 3:0 reserved + /* Битовое поле TSS, ширина 1 бит; данные TSS. */ + Uint16 TSS:1; // 4 Timer Start/Stop + /* Битовое поле TRB, ширина 1 бит; данные TRB. */ + Uint16 TRB:1; // 5 Timer reload + /* Битовое поле rsvd2, ширина 4 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:4; // 9:6 reserved + /* Битовое поле SOFT, ширина 1 бит; данные SOFT. */ + Uint16 SOFT:1; // 10 Emulation modes + /* Битовое поле FREE, ширина 1 бит; данные FREE. */ + Uint16 FREE:1; // 11 + /* Битовое поле rsvd3, ширина 2 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd3:2; // 12:13 reserved + /* Битовое поле TIE, ширина 1 бит; данные TIE. */ + Uint16 TIE:1; // 14 Output enable + /* Битовое поле TIF, ширина 1 бит; данные TIF. */ + Uint16 TIF:1; // 15 Interrupt flag +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений TCR_REG в одной области памяти. */ +union TCR_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру TCR_BITS bit;; порядок полей определяет расположение данных. */ + struct TCR_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// TPR: Pre-scale low bit definitions: +/* Описывает структуру TPR_BITS; порядок полей определяет расположение данных. */ +struct TPR_BITS { // bits description + /* Битовое поле TDDR, ширина 8 бит; данные TDDR. */ + Uint16 TDDR:8; // 7:0 Divide-down low + /* Битовое поле PSC, ширина 8 бит; данные PSC. */ + Uint16 PSC:8; // 15:8 Prescale counter low +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений TPR_REG в одной области памяти. */ +union TPR_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру TPR_BITS bit;; порядок полей определяет расположение данных. */ + struct TPR_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// TPRH: Pre-scale high bit definitions: +/* Описывает структуру TPRH_BITS; порядок полей определяет расположение данных. */ +struct TPRH_BITS { // bits description + /* Битовое поле TDDRH, ширина 8 бит; данные TDDRH. */ + Uint16 TDDRH:8; // 7:0 Divide-down high + /* Битовое поле PSCH, ширина 8 бит; данные PSCH. */ + Uint16 PSCH:8; // 15:8 Prescale counter high +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений TPRH_REG в одной области памяти. */ +union TPRH_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру TPRH_BITS bit;; порядок полей определяет расположение данных. */ + struct TPRH_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// TIM, TIMH: Timer register definitions: +/* Описывает структуру TIM_REG; порядок полей определяет расположение данных. */ +struct TIM_REG { + /* Объявляет LSW — данные LSW. */ + Uint16 LSW; + /* Объявляет MSW — данные MSW. */ + Uint16 MSW; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений TIM_GROUP в одной области памяти. */ +union TIM_GROUP { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру TIM_REG half;; порядок полей определяет расположение данных. */ + struct TIM_REG half; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// PRD, PRDH: Period register definitions: +/* Описывает структуру PRD_REG; порядок полей определяет расположение данных. */ +struct PRD_REG { + /* Объявляет LSW — данные LSW. */ + Uint16 LSW; + /* Объявляет MSW — данные MSW. */ + Uint16 MSW; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений PRD_GROUP в одной области памяти. */ +union PRD_GROUP { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру PRD_REG half;; порядок полей определяет расположение данных. */ + struct PRD_REG half; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//--------------------------------------------------------------------------- +// CPU Timer Register File: +// +/* Описывает структуру CPUTIMER_REGS; порядок полей определяет расположение данных. */ +struct CPUTIMER_REGS { + /* Объединяет несколько представлений TIM_GROUP TIM; в одной области памяти. */ + union TIM_GROUP TIM; // Timer counter register + /* Объединяет несколько представлений PRD_GROUP PRD; в одной области памяти. */ + union PRD_GROUP PRD; // Period register + /* Объединяет несколько представлений TCR_REG TCR; в одной области памяти. */ + union TCR_REG TCR; // Timer control register + /* Объявляет rsvd1 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1; // reserved + /* Объединяет несколько представлений TPR_REG TPR; в одной области памяти. */ + union TPR_REG TPR; // Timer pre-scale low + /* Объединяет несколько представлений TPRH_REG TPRH; в одной области памяти. */ + union TPRH_REG TPRH; // Timer pre-scale high +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//--------------------------------------------------------------------------- +// CPU Timer Support Variables: +// +/* Описывает структуру CPUTIMER_VARS; порядок полей определяет расположение данных. */ +struct CPUTIMER_VARS { + /* Продолжает список аргументов, полей или выражение volatile struct CPUTIMER_REGS *RegsAddr;; порядок элементов сохраняется. */ + volatile struct CPUTIMER_REGS *RegsAddr; + /* Объявляет InterruptCount — прерывание число. */ + Uint32 InterruptCount; + /* Объявляет CPUFreqInMHz — данные CPUFreqInMHz. */ + float CPUFreqInMHz; + /* Объявляет PeriodInUSec — период In U Sec. */ + float PeriodInUSec; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//--------------------------------------------------------------------------- +// Function prototypes and external definitions: +// +/* Объявляет интерфейс функции InitCpuTimers; реализация вызывается через этот прототип. */ +void InitCpuTimers(void); +/* Объявляет интерфейс функции ConfigCpuTimer; реализация вызывается через этот прототип. */ +void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period); + +/* Продолжает список аргументов, полей или выражение extern volatile struct CPUTIMER_REGS CpuTimer0Regs;; порядок элементов сохраняется. */ +extern volatile struct CPUTIMER_REGS CpuTimer0Regs; +/* Продолжает список аргументов, полей или выражение extern struct CPUTIMER_VARS CpuTimer0;; порядок элементов сохраняется. */ +extern struct CPUTIMER_VARS CpuTimer0; + +// CpuTimer 1 and CpuTimer2 are reserved for DSP BIOS & other RTOS. Comment out CpuTimer1 and CpuTimer2 if using DSP BIOS or other RTOS +/* Продолжает список аргументов, полей или выражение extern volatile struct CPUTIMER_REGS CpuTimer1Regs;; порядок элементов сохраняется. */ +extern volatile struct CPUTIMER_REGS CpuTimer1Regs; +/* Продолжает список аргументов, полей или выражение extern volatile struct CPUTIMER_REGS CpuTimer2Regs;; порядок элементов сохраняется. */ +extern volatile struct CPUTIMER_REGS CpuTimer2Regs; + +/* Продолжает список аргументов, полей или выражение extern struct CPUTIMER_VARS CpuTimer1;; порядок элементов сохраняется. */ +extern struct CPUTIMER_VARS CpuTimer1; +/* Продолжает список аргументов, полей или выражение extern struct CPUTIMER_VARS CpuTimer2;; порядок элементов сохраняется. */ +extern struct CPUTIMER_VARS CpuTimer2; + +//--------------------------------------------------------------------------- +// Usefull Timer Operations: +// +// Start Timer: +/* Задаёт StartCpuTimer0 = CpuTimer0Regs.TCR.bit.TSS = 0; Start Cpu таймер 0. */ +#define StartCpuTimer0() CpuTimer0Regs.TCR.bit.TSS = 0 + +// Stop Timer: +/* Задаёт StopCpuTimer0 = CpuTimer0Regs.TCR.bit.TSS = 1; Stop Cpu таймер 0. */ +#define StopCpuTimer0() CpuTimer0Regs.TCR.bit.TSS = 1 + +// Reload Timer With period Value: +/* Задаёт ReloadCpuTimer0 = CpuTimer0Regs.TCR.bit.TRB = 1; Reload Cpu таймер 0. */ +#define ReloadCpuTimer0() CpuTimer0Regs.TCR.bit.TRB = 1 + +// Read 32-Bit Timer Value: +/* Задаёт ReadCpuTimer0Counter = CpuTimer0Regs.TIM.all; чтение Cpu таймер 0 счётчик. */ +#define ReadCpuTimer0Counter() CpuTimer0Regs.TIM.all + +// Read 32-Bit Period Value: +/* Задаёт ReadCpuTimer0Period = CpuTimer0Regs.PRD.all; чтение Cpu таймер 0 период. */ +#define ReadCpuTimer0Period() CpuTimer0Regs.PRD.all + +// CpuTimer 1 and CpuTimer2 are reserved for DSP BIOS & other RTOS +// Do not use these two timers if you ever plan on integrating +// DSP-BIOS or another realtime OS. +// +// For this reason, comment out the code to manipulate these two timers +// if using DSP-BIOS or another realtime OS. + +// Start Timer: +/* Задаёт StartCpuTimer1 = CpuTimer1Regs.TCR.bit.TSS = 0; Start Cpu таймер 1. */ +#define StartCpuTimer1() CpuTimer1Regs.TCR.bit.TSS = 0 +/* Задаёт StartCpuTimer2 = CpuTimer2Regs.TCR.bit.TSS = 0; Start Cpu таймер 2. */ +#define StartCpuTimer2() CpuTimer2Regs.TCR.bit.TSS = 0 + + +// Stop Timer: +/* Задаёт StopCpuTimer1 = CpuTimer1Regs.TCR.bit.TSS = 1; Stop Cpu таймер 1. */ +#define StopCpuTimer1() CpuTimer1Regs.TCR.bit.TSS = 1 +/* Задаёт StopCpuTimer2 = CpuTimer2Regs.TCR.bit.TSS = 1; Stop Cpu таймер 2. */ +#define StopCpuTimer2() CpuTimer2Regs.TCR.bit.TSS = 1 + +// Reload Timer With period Value: +/* Задаёт ReloadCpuTimer1 = CpuTimer1Regs.TCR.bit.TRB = 1; Reload Cpu таймер 1. */ +#define ReloadCpuTimer1() CpuTimer1Regs.TCR.bit.TRB = 1 +/* Задаёт ReloadCpuTimer2 = CpuTimer2Regs.TCR.bit.TRB = 1; Reload Cpu таймер 2. */ +#define ReloadCpuTimer2() CpuTimer2Regs.TCR.bit.TRB = 1 + +// Read 32-Bit Timer Value: +/* Задаёт ReadCpuTimer1Counter = CpuTimer1Regs.TIM.all; чтение Cpu таймер 1 счётчик. */ +#define ReadCpuTimer1Counter() CpuTimer1Regs.TIM.all +/* Задаёт ReadCpuTimer2Counter = CpuTimer2Regs.TIM.all; чтение Cpu таймер 2 счётчик. */ +#define ReadCpuTimer2Counter() CpuTimer2Regs.TIM.all + +// Read 32-Bit Period Value: +/* Задаёт ReadCpuTimer1Period = CpuTimer1Regs.PRD.all; чтение Cpu таймер 1 период. */ +#define ReadCpuTimer1Period() CpuTimer1Regs.PRD.all +/* Задаёт ReadCpuTimer2Period = CpuTimer2Regs.PRD.all; чтение Cpu таймер 2 период. */ +#define ReadCpuTimer2Period() CpuTimer2Regs.PRD.all + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_CPU_TIMERS_H definition + + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_DMA.h b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_DMA.h new file mode 100644 index 0000000..5508e70 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_DMA.h @@ -0,0 +1,437 @@ +/* Поставляемое TI описание DMA для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/11 $ +// Checkin $Date: June 23, 2008 11:34:15 $ +//########################################################################### +// +// FILE: DSP2833x_DMA.h +// +// TITLE: DSP2833x DMA Module Register Bit Definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_DMA_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_DMA_H +/* Определяет защитный символ или переключатель DSP2833x_DMA_H для последующей компиляции. */ +#define DSP2833x_DMA_H + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +//---------------------------------------------------- +// Channel MODE register bit definitions: +/* Описывает структуру MODE_BITS; порядок полей определяет расположение данных. */ +struct MODE_BITS { // bits description + /* Битовое поле PERINTSEL, ширина 5 бит; данные PERINTSEL. */ + Uint16 PERINTSEL:5; // 4:0 Peripheral Interrupt and Sync Select Bits (R/W): + // 0 no interrupt + // 1 SEQ1INT & ADCSYNC + // 2 SEQ2INT + // 3 XINT1 + // 4 XINT2 + // 5 XINT3 + // 6 XINT4 + // 7 XINT5 + // 8 XINT6 + // 9 XINT7 + // 10 XINT13 + // 11 TINT0 + // 12 TINT1 + // 13 TINT2 + // 14 MXEVTA & MXSYNCA + // 15 MREVTA & MRSYNCA + // 16 MXEVTB & MXSYNCB + // 17 MREVTB & MRSYNCB + // 18 ePWM1SOCA + // 19 ePWM1SOCB + // 20 ePWM2SOCA + // 21 ePWM2SOCB + // 22 ePWM3SOCA + // 23 ePWM3SOCB + // 24 ePWM4SOCA + // 25 ePWM4SOCB + // 26 ePWM5SOCA + // 27 ePWM5SOCB + // 28 ePWM6SOCA + // 29 ePWM6SOCB + // 30:31 no interrupt + /* Битовое поле rsvd1, ширина 2 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:2; // 6:5 (R=0:0) + /* Битовое поле OVRINTE, ширина 1 бит; данные OVRINTE. */ + Uint16 OVRINTE:1; // 7 Overflow Interrupt Enable (R/W): + // 0 overflow interrupt disabled + // 1 overflow interrupt enabled + /* Битовое поле PERINTE, ширина 1 бит; данные PERINTE. */ + Uint16 PERINTE:1; // 8 Peripheral Interrupt Enable Bit (R/W): + // 0 peripheral interrupt disabled + // 1 peripheral interrupt enabled + /* Битовое поле CHINTMODE, ширина 1 бит; данные CHINTMODE. */ + Uint16 CHINTMODE:1; // 9 Channel Interrupt Mode Bit (R/W): + // 0 generate interrupt at beginning of new transfer + // 1 generate interrupt at end of transfer + /* Битовое поле ONESHOT, ширина 1 бит; данные ONESHOT. */ + Uint16 ONESHOT:1; // 10 One Shot Mode Bit (R/W): + // 0 only interrupt event triggers single burst transfer + // 1 first interrupt triggers burst, continue until transfer count is zero + /* Битовое поле CONTINUOUS, ширина 1 бит; данные CONTINUOUS. */ + Uint16 CONTINUOUS:1; // 11 Continous Mode Bit (R/W): + // 0 stop when transfer count is zero + // 1 re-initialize when transfer count is zero + /* Битовое поле SYNCE, ширина 1 бит; данные SYNCE. */ + Uint16 SYNCE:1; // 12 Sync Enable Bit (R/W): + // 0 ignore selected interrupt sync signal + // 1 enable selected interrupt sync signal + /* Битовое поле SYNCSEL, ширина 1 бит; данные SYNCSEL. */ + Uint16 SYNCSEL:1; // 13 Sync Select Bit (R/W): + // 0 sync signal controls source wrap counter + // 1 sync signal controls destination wrap counter + /* Битовое поле DATASIZE, ширина 1 бит; данные DATASIZE. */ + Uint16 DATASIZE:1; // 14 Data Size Mode Bit (R/W): + // 0 16-bit data transfer size + // 1 32-bit data transfer size + /* Битовое поле CHINTE, ширина 1 бит; данные CHINTE. */ + Uint16 CHINTE:1; // 15 Channel Interrupt Enable Bit (R/W): + // 0 channel interrupt disabled + // 1 channel interrupt enabled +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений MODE_REG в одной области памяти. */ +union MODE_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру MODE_BITS bit;; порядок полей определяет расположение данных. */ + struct MODE_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// Channel CONTROL register bit definitions: +/* Описывает структуру CONTROL_BITS; порядок полей определяет расположение данных. */ +struct CONTROL_BITS { // bits description + /* Битовое поле RUN, ширина 1 бит; данные RUN. */ + Uint16 RUN:1; // 0 Run Bit (R=0/W=1) + /* Битовое поле HALT, ширина 1 бит; данные HALT. */ + Uint16 HALT:1; // 1 Halt Bit (R=0/W=1) + /* Битовое поле SOFTRESET, ширина 1 бит; данные SOFTRESET. */ + Uint16 SOFTRESET:1; // 2 Soft Reset Bit (R=0/W=1) + /* Битовое поле PERINTFRC, ширина 1 бит; данные PERINTFRC. */ + Uint16 PERINTFRC:1; // 3 Interrupt Force Bit (R=0/W=1) + /* Битовое поле PERINTCLR, ширина 1 бит; данные PERINTCLR. */ + Uint16 PERINTCLR:1; // 4 Interrupt Clear Bit (R=0/W=1) + /* Битовое поле SYNCFRC, ширина 1 бит; данные SYNCFRC. */ + Uint16 SYNCFRC:1; // 5 Sync Force Bit (R=0/W=1) + /* Битовое поле SYNCCLR, ширина 1 бит; данные SYNCCLR. */ + Uint16 SYNCCLR:1; // 6 Sync Clear Bit (R=0/W=1) + /* Битовое поле ERRCLR, ширина 1 бит; данные ERRCLR. */ + Uint16 ERRCLR:1; // 7 Error Clear Bit (R=0/W=1) + /* Битовое поле PERINTFLG, ширина 1 бит; данные PERINTFLG. */ + Uint16 PERINTFLG:1; // 8 Interrupt Flag Bit (R): + // 0 no interrupt pending + // 1 interrupt pending + /* Битовое поле SYNCFLG, ширина 1 бит; данные SYNCFLG. */ + Uint16 SYNCFLG:1; // 9 Sync Flag Bit (R): + // 0 no sync pending + // 1 sync pending + /* Битовое поле SYNCERR, ширина 1 бит; данные SYNCERR. */ + Uint16 SYNCERR:1; // 10 Sync Error Flag Bit (R): + // 0 no sync error + // 1 sync error detected + /* Битовое поле TRANSFERSTS, ширина 1 бит; данные TRANSFERSTS. */ + Uint16 TRANSFERSTS:1; // 11 Transfer Status Bit (R): + // 0 no transfer in progress or pending + // 1 transfer in progress or pending + /* Битовое поле BURSTSTS, ширина 1 бит; данные BURSTSTS. */ + Uint16 BURSTSTS:1; // 12 Burst Status Bit (R): + // 0 no burst in progress or pending + // 1 burst in progress or pending + /* Битовое поле RUNSTS, ширина 1 бит; данные RUNSTS. */ + Uint16 RUNSTS:1; // 13 Run Status Bit (R): + // 0 channel not running or halted + // 1 channel running + /* Битовое поле OVRFLG, ширина 1 бит; данные OVRFLG. */ + Uint16 OVRFLG:1; // 14 Overflow Flag Bit(R) + // 0 no overflow event + // 1 overflow event + /* Битовое поле rsvd1, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:1; // 15 (R=0) +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений CONTROL_REG в одной области памяти. */ +union CONTROL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру CONTROL_BITS bit;; порядок полей определяет расположение данных. */ + struct CONTROL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// DMACTRL register bit definitions: +/* Описывает структуру DMACTRL_BITS; порядок полей определяет расположение данных. */ +struct DMACTRL_BITS { // bits description + /* Битовое поле HARDRESET, ширина 1 бит; данные HARDRESET. */ + Uint16 HARDRESET:1; // 0 Hard Reset Bit (R=0/W=1) + /* Битовое поле PRIORITYRESET, ширина 1 бит; данные PRIORITYRESET. */ + Uint16 PRIORITYRESET:1; // 1 Priority Reset Bit (R=0/W=1) + /* Битовое поле rsvd1, ширина 14 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:14; // 15:2 (R=0:0) +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений DMACTRL_REG в одной области памяти. */ +union DMACTRL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру DMACTRL_BITS bit;; порядок полей определяет расположение данных. */ + struct DMACTRL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// DEBUGCTRL register bit definitions: +/* Описывает структуру DEBUGCTRL_BITS; порядок полей определяет расположение данных. */ +struct DEBUGCTRL_BITS { // bits description + /* Битовое поле rsvd1, ширина 15 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:15; // 14:0 (R=0:0) + /* Битовое поле FREE, ширина 1 бит; данные FREE. */ + Uint16 FREE:1; // 15 Debug Mode Bit (R/W): + // 0 halt after current read-write operation + // 1 continue running +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений DEBUGCTRL_REG в одной области памяти. */ +union DEBUGCTRL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру DEBUGCTRL_BITS bit;; порядок полей определяет расположение данных. */ + struct DEBUGCTRL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +//---------------------------------------------------- +// PRIORITYCTRL1 register bit definitions: +/* Описывает структуру PRIORITYCTRL1_BITS; порядок полей определяет расположение данных. */ +struct PRIORITYCTRL1_BITS { // bits description + /* Битовое поле CH1PRIORITY, ширина 1 бит; 1 приоритет. */ + Uint16 CH1PRIORITY:1; // 0 Ch1 Priority Bit (R/W): + // 0 same priority as all other channels + // 1 highest priority channel + /* Битовое поле rsvd1, ширина 15 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:15; // 15:1 (R=0:0) +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений PRIORITYCTRL1_REG в одной области памяти. */ +union PRIORITYCTRL1_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру PRIORITYCTRL1_BITS bit;; порядок полей определяет расположение данных. */ + struct PRIORITYCTRL1_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +//---------------------------------------------------- +// PRIORITYSTAT register bit definitions: +/* Описывает структуру PRIORITYSTAT_BITS; порядок полей определяет расположение данных. */ +struct PRIORITYSTAT_BITS { // bits description + /* Битовое поле ACTIVESTS, ширина 3 бит; данные ACTIVESTS. */ + Uint16 ACTIVESTS:3; // 2:0 Active Channel Status Bits (R): + // 0,0,0 no channel active + // 0,0,1 Ch1 channel active + // 0,1,0 Ch2 channel active + // 0,1,1 Ch3 channel active + // 1,0,0 Ch4 channel active + // 1,0,1 Ch5 channel active + // 1,1,0 Ch6 channel active + /* Битовое поле rsvd1, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:1; // 3 (R=0) + /* Битовое поле ACTIVESTS_SHADOW, ширина 3 бит; данные ACTIVESTS_SHADOW. */ + Uint16 ACTIVESTS_SHADOW:3; // 6:4 Active Channel Status Shadow Bits (R): + // 0,0,0 no channel active and interrupted by Ch1 + // 0,0,1 cannot occur + // 0,1,0 Ch2 was active and interrupted by Ch1 + // 0,1,1 Ch3 was active and interrupted by Ch1 + // 1,0,0 Ch4 was active and interrupted by Ch1 + // 1,0,1 Ch5 was active and interrupted by Ch1 + // 1,1,0 Ch6 was active and interrupted by Ch1 + /* Битовое поле rsvd2, ширина 9 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:9; // 15:7 (R=0:0) +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений PRIORITYSTAT_REG в одной области памяти. */ +union PRIORITYSTAT_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру PRIORITYSTAT_BITS bit;; порядок полей определяет расположение данных. */ + struct PRIORITYSTAT_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// Burst Size +/* Описывает структуру BURST_SIZE_BITS; порядок полей определяет расположение данных. */ +struct BURST_SIZE_BITS { // bits description + /* Битовое поле BURSTSIZE, ширина 5 бит; данные BURSTSIZE. */ + Uint16 BURSTSIZE:5; // 4:0 Burst transfer size + /* Битовое поле rsvd1, ширина 11 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:11; // 15:5 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений BURST_SIZE_REG в одной области памяти. */ +union BURST_SIZE_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру BURST_SIZE_BITS bit;; порядок полей определяет расположение данных. */ + struct BURST_SIZE_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// Burst Count +/* Описывает структуру BURST_COUNT_BITS; порядок полей определяет расположение данных. */ +struct BURST_COUNT_BITS { // bits description + /* Битовое поле BURSTCOUNT, ширина 5 бит; данные BURSTCOUNT. */ + Uint16 BURSTCOUNT:5; // 4:0 Burst transfer size + /* Битовое поле rsvd1, ширина 11 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:11; // 15:5 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений BURST_COUNT_REG в одной области памяти. */ +union BURST_COUNT_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру BURST_COUNT_BITS bit;; порядок полей определяет расположение данных. */ + struct BURST_COUNT_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + + +//---------------------------------------------------- +// DMA Channel Registers: +/* Описывает структуру CH_REGS; порядок полей определяет расположение данных. */ +struct CH_REGS { + /* Объединяет несколько представлений MODE_REG MODE; в одной области памяти. */ + union MODE_REG MODE; // Mode Register + /* Объединяет несколько представлений CONTROL_REG CONTROL; в одной области памяти. */ + union CONTROL_REG CONTROL; // Control Register + + /* Объединяет несколько представлений BURST_SIZE_REG BURST_SIZE; в одной области памяти. */ + union BURST_SIZE_REG BURST_SIZE; // Burst Size Register + /* Объединяет несколько представлений BURST_COUNT_REG BURST_COUNT; в одной области памяти. */ + union BURST_COUNT_REG BURST_COUNT; // Burst Count Register + /* Продолжает список аргументов, полей или выражение int16 SRC_BURST_STEP;; порядок элементов сохраняется. */ + int16 SRC_BURST_STEP; // Source Burst Step Register + /* Продолжает список аргументов, полей или выражение int16 DST_BURST_STEP;; порядок элементов сохраняется. */ + int16 DST_BURST_STEP; // Destination Burst Step Register + + /* Объявляет TRANSFER_SIZE — TRANSFER размер. */ + Uint16 TRANSFER_SIZE; // Transfer Size Register + /* Объявляет TRANSFER_COUNT — TRANSFER число. */ + Uint16 TRANSFER_COUNT; // Transfer Count Register + /* Продолжает список аргументов, полей или выражение int16 SRC_TRANSFER_STEP;; порядок элементов сохраняется. */ + int16 SRC_TRANSFER_STEP; // Source Transfer Step Register + /* Продолжает список аргументов, полей или выражение int16 DST_TRANSFER_STEP;; порядок элементов сохраняется. */ + int16 DST_TRANSFER_STEP; // Destination Transfer Step Register + + /* Объявляет SRC_WRAP_SIZE — SRC WRAP размер. */ + Uint16 SRC_WRAP_SIZE; // Source Wrap Size Register + /* Объявляет SRC_WRAP_COUNT — SRC WRAP число. */ + Uint16 SRC_WRAP_COUNT; // Source Wrap Count Register + /* Продолжает список аргументов, полей или выражение int16 SRC_WRAP_STEP;; порядок элементов сохраняется. */ + int16 SRC_WRAP_STEP; // Source Wrap Step Register + + /* Объявляет DST_WRAP_SIZE — DST WRAP размер. */ + Uint16 DST_WRAP_SIZE; // Destination Wrap Size Register + /* Объявляет DST_WRAP_COUNT — DST WRAP число. */ + Uint16 DST_WRAP_COUNT; // Destination Wrap Count Register + /* Продолжает список аргументов, полей или выражение int16 DST_WRAP_STEP;; порядок элементов сохраняется. */ + int16 DST_WRAP_STEP; // Destination Wrap Step Register + + /* Объявляет SRC_BEG_ADDR_SHADOW — данные SRC_BEG_ADDR_SHADOW. */ + Uint32 SRC_BEG_ADDR_SHADOW; // Source Begin Address Shadow Register + /* Объявляет SRC_ADDR_SHADOW — данные SRC_ADDR_SHADOW. */ + Uint32 SRC_ADDR_SHADOW; // Source Address Shadow Register + /* Объявляет SRC_BEG_ADDR_ACTIVE — данные SRC_BEG_ADDR_ACTIVE. */ + Uint32 SRC_BEG_ADDR_ACTIVE; // Source Begin Address Active Register + /* Объявляет SRC_ADDR_ACTIVE — данные SRC_ADDR_ACTIVE. */ + Uint32 SRC_ADDR_ACTIVE; // Source Address Active Register + + /* Объявляет DST_BEG_ADDR_SHADOW — данные DST_BEG_ADDR_SHADOW. */ + Uint32 DST_BEG_ADDR_SHADOW; // Destination Begin Address Shadow Register + /* Объявляет DST_ADDR_SHADOW — данные DST_ADDR_SHADOW. */ + Uint32 DST_ADDR_SHADOW; // Destination Address Shadow Register + /* Объявляет DST_BEG_ADDR_ACTIVE — данные DST_BEG_ADDR_ACTIVE. */ + Uint32 DST_BEG_ADDR_ACTIVE; // Destination Begin Address Active Register + /* Объявляет DST_ADDR_ACTIVE — данные DST_ADDR_ACTIVE. */ + Uint32 DST_ADDR_ACTIVE; // Destination Address Active Register +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// DMA Registers: +/* Описывает структуру DMA_REGS; порядок полей определяет расположение данных. */ +struct DMA_REGS { + /* Объединяет несколько представлений DMACTRL_REG DMACTRL; в одной области памяти. */ + union DMACTRL_REG DMACTRL; // DMA Control Register + /* Объединяет несколько представлений DEBUGCTRL_REG DEBUGCTRL; в одной области памяти. */ + union DEBUGCTRL_REG DEBUGCTRL; // Debug Control Register + /* Объявляет rsvd0 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd0; // reserved + /* Объявляет rsvd1 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1; // + /* Объединяет несколько представлений PRIORITYCTRL1_REG PRIORITYCTRL1; в одной области памяти. */ + union PRIORITYCTRL1_REG PRIORITYCTRL1; // Priority Control 1 Register + /* Объявляет rsvd2 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2; // + /* Объединяет несколько представлений PRIORITYSTAT_REG PRIORITYSTAT; в одной области памяти. */ + union PRIORITYSTAT_REG PRIORITYSTAT; // Priority Status Register + /* Объявляет rsvd3 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd3[25]; // + /* Описывает структуру CH_REGS CH1;; порядок полей определяет расположение данных. */ + struct CH_REGS CH1; // DMA Channel 1 Registers + /* Описывает структуру CH_REGS CH2;; порядок полей определяет расположение данных. */ + struct CH_REGS CH2; // DMA Channel 2 Registers + /* Описывает структуру CH_REGS CH3;; порядок полей определяет расположение данных. */ + struct CH_REGS CH3; // DMA Channel 3 Registers + /* Описывает структуру CH_REGS CH4;; порядок полей определяет расположение данных. */ + struct CH_REGS CH4; // DMA Channel 4 Registers + /* Описывает структуру CH_REGS CH5;; порядок полей определяет расположение данных. */ + struct CH_REGS CH5; // DMA Channel 5 Registers + /* Описывает структуру CH_REGS CH6;; порядок полей определяет расположение данных. */ + struct CH_REGS CH6; // DMA Channel 6 Registers +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +//--------------------------------------------------------------------------- +// External References & Function Declarations: +// +/* Продолжает список аргументов, полей или выражение extern volatile struct DMA_REGS DmaRegs;; порядок элементов сохраняется. */ +extern volatile struct DMA_REGS DmaRegs; + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_DMA_H definition + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_DevEmu.h b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_DevEmu.h new file mode 100644 index 0000000..b821aa7 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_DevEmu.h @@ -0,0 +1,154 @@ +/* Поставляемое TI описание DevEmu для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/3 $ +// Checkin $Date: June 2, 2008 11:12:30 $ +//########################################################################### +// +// FILE: DSP2833x_DevEmu.h +// +// TITLE: DSP2833x Device Emulation Register Definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_DEV_EMU_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_DEV_EMU_H +/* Определяет защитный символ или переключатель DSP2833x_DEV_EMU_H для последующей компиляции. */ +#define DSP2833x_DEV_EMU_H + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +//--------------------------------------------------------------------------- +// Device Emulation Register Bit Definitions: +// +// Device Configuration Register Bit Definitions +/* Описывает структуру DEVICECNF_BITS; порядок полей определяет расположение данных. */ +struct DEVICECNF_BITS { // bits description + /* Битовое поле rsvd1, ширина 3 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:3; // 2:0 reserved + /* Битовое поле VMAPS, ширина 1 бит; данные VMAPS. */ + Uint16 VMAPS:1; // 3 VMAP Status + /* Битовое поле rsvd2, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:1; // 4 reserved + /* Битовое поле XRSn, ширина 1 бит; данные XRSn. */ + Uint16 XRSn:1; // 5 XRSn Signal Status + /* Битовое поле rsvd3, ширина 10 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd3:10; // 15:6 + /* Битовое поле rsvd4, ширина 3 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd4:3; // 18:16 + /* Битовое поле ENPROT, ширина 1 бит; данные ENPROT. */ + Uint16 ENPROT:1; // 19 Enable/Disable pipeline protection + /* Битовое поле MONPRIV, ширина 1 бит; данные MONPRIV. */ + Uint16 MONPRIV:1; // 20 MONPRIV enable bit + /* Битовое поле rsvd5, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd5:1; // 21 reserved + /* Битовое поле EMU0SEL, ширина 2 бит; данные EMU0SEL. */ + Uint16 EMU0SEL:2; // 23,22 EMU0 Mux select + /* Битовое поле EMU1SEL, ширина 2 бит; данные EMU1SEL. */ + Uint16 EMU1SEL:2; // 25,24 EMU1 Mux select + /* Битовое поле MCBSPCON, ширина 1 бит; данные MCBSPCON. */ + Uint16 MCBSPCON:1; // 26 McBSP-B to EMU0/EMU1 pins control + /* Битовое поле rsvd6, ширина 5 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd6:5; // 31:27 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений DEVICECNF_REG в одной области памяти. */ +union DEVICECNF_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру DEVICECNF_BITS bit;; порядок полей определяет расположение данных. */ + struct DEVICECNF_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// CLASSID +/* Описывает структуру CLASSID_BITS; порядок полей определяет расположение данных. */ +struct CLASSID_BITS { // bits description + /* Битовое поле CLASSNO, ширина 8 бит; данные CLASSNO. */ + Uint16 CLASSNO:8; // 7:0 Class Number + /* Битовое поле PARTTYPE, ширина 8 бит; данные PARTTYPE. */ + Uint16 PARTTYPE:8; // 15:8 Part Type +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений CLASSID_REG в одной области памяти. */ +union CLASSID_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру CLASSID_BITS bit;; порядок полей определяет расположение данных. */ + struct CLASSID_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Описывает структуру DEV_EMU_REGS; порядок полей определяет расположение данных. */ +struct DEV_EMU_REGS { + /* Объединяет несколько представлений DEVICECNF_REG DEVICECNF; в одной области памяти. */ + union DEVICECNF_REG DEVICECNF; // device configuration + /* Объединяет несколько представлений CLASSID_REG CLASSID; в одной области памяти. */ + union CLASSID_REG CLASSID; // Class ID + /* Объявляет REVID — данные REVID. */ + Uint16 REVID; // Device ID + /* Объявляет PROTSTART — данные PROTSTART. */ + Uint16 PROTSTART; // Write-Read protection start + /* Объявляет PROTRANGE — данные PROTRANGE. */ + Uint16 PROTRANGE; // Write-Read protection range + /* Объявляет rsvd2 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2[202]; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// PARTID +/* Описывает структуру PARTID_BITS; порядок полей определяет расположение данных. */ +struct PARTID_BITS { // bits description + /* Битовое поле PARTNO, ширина 8 бит; данные PARTNO. */ + Uint16 PARTNO:8; // 7:0 Part Number + /* Битовое поле PARTTYPE, ширина 8 бит; данные PARTTYPE. */ + Uint16 PARTTYPE:8; // 15:8 Part Type +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений PARTID_REG в одной области памяти. */ +union PARTID_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру PARTID_BITS bit;; порядок полей определяет расположение данных. */ + struct PARTID_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Описывает структуру PARTID_REGS; порядок полей определяет расположение данных. */ +struct PARTID_REGS { + /* Объединяет несколько представлений PARTID_REG PARTID; в одной области памяти. */ + union PARTID_REG PARTID; // Part ID +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + + +//--------------------------------------------------------------------------- +// Device Emulation Register References & Function Declarations: +// +/* Продолжает список аргументов, полей или выражение extern volatile struct DEV_EMU_REGS DevEmuRegs;; порядок элементов сохраняется. */ +extern volatile struct DEV_EMU_REGS DevEmuRegs; +/* Продолжает список аргументов, полей или выражение extern volatile struct PARTID_REGS PartIdRegs;; порядок элементов сохраняется. */ +extern volatile struct PARTID_REGS PartIdRegs; + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_DEV_EMU_H definition + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_Device.h b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_Device.h new file mode 100644 index 0000000..138d251 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_Device.h @@ -0,0 +1,655 @@ +/* Поставляемое TI описание Device для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/5 $ +// Checkin $Date: January 22, 2008 16:55:35 $ +//########################################################################### +// +// FILE: DSP2833x_Device.h +// +// TITLE: DSP2833x Device Definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_DEVICE_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_DEVICE_H +/* Определяет защитный символ или переключатель DSP2833x_DEVICE_H для последующей компиляции. */ +#define DSP2833x_DEVICE_H + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + + +/* Задаёт TARGET = 1; данные TARGET. */ +#define TARGET 1 +//--------------------------------------------------------------------------- +// User To Select Target Device: + +/* Задаёт DSP28_28335 = TARGET; данные DSP28_28335. */ +#define DSP28_28335 TARGET // Selects '28335/'28235 +/* Задаёт DSP28_28334 = 0; данные DSP28_28334. */ +#define DSP28_28334 0 // Selects '28334/'28234 +/* Задаёт DSP28_28332 = 0; данные DSP28_28332. */ +#define DSP28_28332 0 // Selects '28332/'28232 + + +//--------------------------------------------------------------------------- +// Common CPU Definitions: +// + +/* Продолжает список аргументов, полей или выражение extern cregister volatile unsigned int IFR;; порядок элементов сохраняется. */ +extern cregister volatile unsigned int IFR; +/* Продолжает список аргументов, полей или выражение extern cregister volatile unsigned int IER;; порядок элементов сохраняется. */ +extern cregister volatile unsigned int IER; + +/* Задаёт EINT = asm(" clrc INTM"); разрешение маскируемых прерываний ядра. */ +#define EINT asm(" clrc INTM") +/* Задаёт DINT = asm(" setc INTM"); запрет маскируемых прерываний ядра. */ +#define DINT asm(" setc INTM") +/* Задаёт ERTM = asm(" clrc DBGM"); данные ERTM. */ +#define ERTM asm(" clrc DBGM") +/* Задаёт DRTM = asm(" setc DBGM"); данные DRTM. */ +#define DRTM asm(" setc DBGM") +/* Задаёт EALLOW = asm(" EALLOW"); разрешение записи в защищённые регистры периферии. */ +#define EALLOW asm(" EALLOW") +/* Задаёт EDIS = asm(" EDIS"); закрытие доступа к защищённым регистрам периферии. */ +#define EDIS asm(" EDIS") +/* Задаёт ESTOP0 = asm(" ESTOP0"); данные ESTOP0. */ +#define ESTOP0 asm(" ESTOP0") + +/* Задаёт M_INT1 = 0x0001; данные M_INT1. */ +#define M_INT1 0x0001 +/* Задаёт M_INT2 = 0x0002; данные M_INT2. */ +#define M_INT2 0x0002 +/* Задаёт M_INT3 = 0x0004; данные M_INT3. */ +#define M_INT3 0x0004 +/* Задаёт M_INT4 = 0x0008; данные M_INT4. */ +#define M_INT4 0x0008 +/* Задаёт M_INT5 = 0x0010; данные M_INT5. */ +#define M_INT5 0x0010 +/* Задаёт M_INT6 = 0x0020; данные M_INT6. */ +#define M_INT6 0x0020 +/* Задаёт M_INT7 = 0x0040; данные M_INT7. */ +#define M_INT7 0x0040 +/* Задаёт M_INT8 = 0x0080; данные M_INT8. */ +#define M_INT8 0x0080 +/* Задаёт M_INT9 = 0x0100; данные M_INT9. */ +#define M_INT9 0x0100 +/* Задаёт M_INT10 = 0x0200; данные M_INT10. */ +#define M_INT10 0x0200 +/* Задаёт M_INT11 = 0x0400; данные M_INT11. */ +#define M_INT11 0x0400 +/* Задаёт M_INT12 = 0x0800; данные M_INT12. */ +#define M_INT12 0x0800 +/* Задаёт M_INT13 = 0x1000; данные M_INT13. */ +#define M_INT13 0x1000 +/* Задаёт M_INT14 = 0x2000; данные M_INT14. */ +#define M_INT14 0x2000 +/* Задаёт M_DLOG = 0x4000; данные M_DLOG. */ +#define M_DLOG 0x4000 +/* Задаёт M_RTOS = 0x8000; данные M_RTOS. */ +#define M_RTOS 0x8000 + +/* Задаёт BIT0 = 0x0001; данные BIT0. */ +#define BIT0 0x0001 +/* Задаёт BIT1 = 0x0002; данные BIT1. */ +#define BIT1 0x0002 +/* Задаёт BIT2 = 0x0004; данные BIT2. */ +#define BIT2 0x0004 +/* Задаёт BIT3 = 0x0008; данные BIT3. */ +#define BIT3 0x0008 +/* Задаёт BIT4 = 0x0010; данные BIT4. */ +#define BIT4 0x0010 +/* Задаёт BIT5 = 0x0020; данные BIT5. */ +#define BIT5 0x0020 +/* Задаёт BIT6 = 0x0040; данные BIT6. */ +#define BIT6 0x0040 +/* Задаёт BIT7 = 0x0080; данные BIT7. */ +#define BIT7 0x0080 +/* Задаёт BIT8 = 0x0100; данные BIT8. */ +#define BIT8 0x0100 +/* Задаёт BIT9 = 0x0200; данные BIT9. */ +#define BIT9 0x0200 +/* Задаёт BIT10 = 0x0400; данные BIT10. */ +#define BIT10 0x0400 +/* Задаёт BIT11 = 0x0800; данные BIT11. */ +#define BIT11 0x0800 +/* Задаёт BIT12 = 0x1000; данные BIT12. */ +#define BIT12 0x1000 +/* Задаёт BIT13 = 0x2000; данные BIT13. */ +#define BIT13 0x2000 +/* Задаёт BIT14 = 0x4000; данные BIT14. */ +#define BIT14 0x4000 +/* Задаёт BIT15 = 0x8000; данные BIT15. */ +#define BIT15 0x8000 + + + +//--------------------------------------------------------------------------- +// For Portability, User Is Recommended To Use Following Data Type Size +// Definitions For 16-bit and 32-Bit Signed/Unsigned Integers: +// + +/* Начинает условие: DSP28_DATA_TYPES ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP28_DATA_TYPES +/* Определяет защитный символ или переключатель DSP28_DATA_TYPES для последующей компиляции. */ +#define DSP28_DATA_TYPES +/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */ +typedef int int16; +/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */ +typedef long int32; +/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */ +typedef long long int64; +/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */ +typedef unsigned int Uint16; +/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */ +typedef unsigned long Uint32; +/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */ +typedef unsigned long long Uint64; +/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */ +typedef float float32; +/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */ +typedef long double float64; +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */ +typedef union +/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ +{ + /* Продолжает список аргументов, полей или выражение struct; порядок элементов сохраняется. */ + struct + /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ + { + /* Битовое поле bit0, ширина 1 бит; бит 0. */ + unsigned int bit0: 1; + /* Битовое поле bit1, ширина 1 бит; бит 1. */ + unsigned int bit1: 1; + /* Битовое поле bit2, ширина 1 бит; бит 2. */ + unsigned int bit2: 1; + /* Битовое поле bit3, ширина 1 бит; бит 3. */ + unsigned int bit3: 1; + /* Битовое поле bit4, ширина 1 бит; бит 4. */ + unsigned int bit4: 1; + /* Битовое поле bit5, ширина 1 бит; бит 5. */ + unsigned int bit5: 1; + /* Битовое поле bit6, ширина 1 бит; бит 6. */ + unsigned int bit6: 1; + /* Битовое поле bit7, ширина 1 бит; бит 7. */ + unsigned int bit7: 1; + + /* Продолжает список аргументов, полей или выражение } bit;; порядок элементов сохраняется. */ + } bit; + + /* Продолжает список аргументов, полей или выражение struct; порядок элементов сохраняется. */ + struct + /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ + { + /* Битовое поле quad_0, ширина 4 бит; данные quad_0. */ + unsigned int quad_0 :4; + /* Битовое поле quad_1, ширина 4 бит; данные quad_1. */ + unsigned int quad_1 :4; + + /* Продолжает список аргументов, полей или выражение } qua;; порядок элементов сохраняется. */ + } qua; + + /* Продолжает список аргументов, полей или выражение unsigned short all;; порядок элементов сохраняется. */ + unsigned short all; + +/* Продолжает список аргументов, полей или выражение } BAITE;; порядок элементов сохраняется. */ +} BAITE; + +/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */ +typedef union +/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ +{ + /* Продолжает список аргументов, полей или выражение struct; порядок элементов сохраняется. */ + struct + /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ + { + /* Битовое поле bit0, ширина 1 бит; бит 0. */ + unsigned int bit0: 1; + /* Битовое поле bit1, ширина 1 бит; бит 1. */ + unsigned int bit1: 1; + /* Битовое поле bit2, ширина 1 бит; бит 2. */ + unsigned int bit2: 1; + /* Битовое поле bit3, ширина 1 бит; бит 3. */ + unsigned int bit3: 1; + /* Битовое поле bit4, ширина 1 бит; бит 4. */ + unsigned int bit4: 1; + /* Битовое поле bit5, ширина 1 бит; бит 5. */ + unsigned int bit5: 1; + /* Битовое поле bit6, ширина 1 бит; бит 6. */ + unsigned int bit6: 1; + /* Битовое поле bit7, ширина 1 бит; бит 7. */ + unsigned int bit7: 1; + /* Битовое поле bit8, ширина 1 бит; бит 8. */ + unsigned int bit8: 1; + /* Битовое поле bit9, ширина 1 бит; бит 9. */ + unsigned int bit9: 1; + /* Битовое поле bitA, ширина 1 бит; бит A. */ + unsigned int bitA: 1; + /* Битовое поле bitB, ширина 1 бит; бит B. */ + unsigned int bitB: 1; + /* Битовое поле bitC, ширина 1 бит; бит C. */ + unsigned int bitC: 1; + /* Битовое поле bitD, ширина 1 бит; бит D. */ + unsigned int bitD: 1; + /* Битовое поле bitE, ширина 1 бит; бит E. */ + unsigned int bitE: 1; + /* Битовое поле bitF, ширина 1 бит; бит F. */ + unsigned int bitF: 1; + + /* Продолжает список аргументов, полей или выражение } bit;; порядок элементов сохраняется. */ + } bit; + + /* Продолжает список аргументов, полей или выражение struct; порядок элементов сохраняется. */ + struct + /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ + { + /* Битовое поле quad_0, ширина 4 бит; данные quad_0. */ + unsigned int quad_0 :4; + /* Битовое поле quad_1, ширина 4 бит; данные quad_1. */ + unsigned int quad_1 :4; + /* Битовое поле quad_2, ширина 4 бит; данные quad_2. */ + unsigned int quad_2 :4; + /* Битовое поле quad_3, ширина 4 бит; данные quad_3. */ + unsigned int quad_3 :4; + + /* Продолжает список аргументов, полей или выражение } qua;; порядок элементов сохраняется. */ + } qua; + + /* Продолжает список аргументов, полей или выражение struct; порядок элементов сохраняется. */ + struct + /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ + { + /* Битовое поле byte_0, ширина 8 бит; данные byte_0. */ + unsigned int byte_0 :8; + /* Битовое поле byte_1, ширина 8 бит; данные byte_1. */ + unsigned int byte_1 :8; + + /* Продолжает список аргументов, полей или выражение } byt;; порядок элементов сохраняется. */ + } byt; + + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + int all; + +/* Продолжает список аргументов, полей или выражение } WORDE;; порядок элементов сохраняется. */ +} WORDE; + +/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */ +typedef union +/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ +{ + /* Продолжает список аргументов, полей или выражение struct; порядок элементов сохраняется. */ + struct + /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ + { + /* Битовое поле bit00, ширина 1 бит; бит 00. */ + unsigned int bit00: 1; + /* Битовое поле bit01, ширина 1 бит; бит 01. */ + unsigned int bit01: 1; + /* Битовое поле bit02, ширина 1 бит; бит 02. */ + unsigned int bit02: 1; + /* Битовое поле bit03, ширина 1 бит; бит 03. */ + unsigned int bit03: 1; + /* Битовое поле bit04, ширина 1 бит; бит 04. */ + unsigned int bit04: 1; + /* Битовое поле bit05, ширина 1 бит; бит 05. */ + unsigned int bit05: 1; + /* Битовое поле bit06, ширина 1 бит; бит 06. */ + unsigned int bit06: 1; + /* Битовое поле bit07, ширина 1 бит; бит 07. */ + unsigned int bit07: 1; + /* Битовое поле bit08, ширина 1 бит; бит 08. */ + unsigned int bit08: 1; + /* Битовое поле bit09, ширина 1 бит; бит 09. */ + unsigned int bit09: 1; + /* Битовое поле bit0A, ширина 1 бит; бит 0 A. */ + unsigned int bit0A: 1; + /* Битовое поле bit0B, ширина 1 бит; бит 0 B. */ + unsigned int bit0B: 1; + /* Битовое поле bit0C, ширина 1 бит; бит 0 C. */ + unsigned int bit0C: 1; + /* Битовое поле bit0D, ширина 1 бит; бит 0 D. */ + unsigned int bit0D: 1; + /* Битовое поле bit0E, ширина 1 бит; бит 0 E. */ + unsigned int bit0E: 1; + /* Битовое поле bit0F, ширина 1 бит; бит 0 F. */ + unsigned int bit0F: 1; + /* Битовое поле bit10, ширина 1 бит; бит 10. */ + unsigned int bit10: 1; + /* Битовое поле bit11, ширина 1 бит; бит 11. */ + unsigned int bit11: 1; + /* Битовое поле bit12, ширина 1 бит; бит 12. */ + unsigned int bit12: 1; + /* Битовое поле bit13, ширина 1 бит; бит 13. */ + unsigned int bit13: 1; + /* Битовое поле bit14, ширина 1 бит; бит 14. */ + unsigned int bit14: 1; + /* Битовое поле bit15, ширина 1 бит; бит 15. */ + unsigned int bit15: 1; + /* Битовое поле bit16, ширина 1 бит; бит 16. */ + unsigned int bit16: 1; + /* Битовое поле bit17, ширина 1 бит; бит 17. */ + unsigned int bit17: 1; + /* Битовое поле bit18, ширина 1 бит; бит 18. */ + unsigned int bit18: 1; + /* Битовое поле bit19, ширина 1 бит; бит 19. */ + unsigned int bit19: 1; + /* Битовое поле bit1A, ширина 1 бит; бит 1 A. */ + unsigned int bit1A: 1; + /* Битовое поле bit1B, ширина 1 бит; бит 1 B. */ + unsigned int bit1B: 1; + /* Битовое поле bit1C, ширина 1 бит; бит 1 C. */ + unsigned int bit1C: 1; + /* Битовое поле bit1D, ширина 1 бит; бит 1 D. */ + unsigned int bit1D: 1; + /* Битовое поле bit1E, ширина 1 бит; бит 1 E. */ + unsigned int bit1E: 1; + /* Битовое поле bit1F, ширина 1 бит; бит 1 F. */ + unsigned int bit1F: 1; + + /* Продолжает список аргументов, полей или выражение } bit;; порядок элементов сохраняется. */ + } bit; + + /* Продолжает список аргументов, полей или выражение struct; порядок элементов сохраняется. */ + struct + /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ + { + /* Битовое поле quad_0, ширина 4 бит; данные quad_0. */ + unsigned int quad_0 :4; + /* Битовое поле quad_1, ширина 4 бит; данные quad_1. */ + unsigned int quad_1 :4; + /* Битовое поле quad_2, ширина 4 бит; данные quad_2. */ + unsigned int quad_2 :4; + /* Битовое поле quad_3, ширина 4 бит; данные quad_3. */ + unsigned int quad_3 :4; + /* Битовое поле quad_4, ширина 4 бит; данные quad_4. */ + unsigned int quad_4 :4; + /* Битовое поле quad_5, ширина 4 бит; данные quad_5. */ + unsigned int quad_5 :4; + /* Битовое поле quad_6, ширина 4 бит; данные quad_6. */ + unsigned int quad_6 :4; + /* Битовое поле quad_7, ширина 4 бит; данные quad_7. */ + unsigned int quad_7 :4; + + /* Продолжает список аргументов, полей или выражение } qua;; порядок элементов сохраняется. */ + } qua; + + /* Продолжает список аргументов, полей или выражение struct; порядок элементов сохраняется. */ + struct + /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ + { + /* Битовое поле byte_0, ширина 8 бит; данные byte_0. */ + unsigned int byte_0 :8; + /* Битовое поле byte_1, ширина 8 бит; данные byte_1. */ + unsigned int byte_1 :8; + /* Битовое поле byte_2, ширина 8 бит; данные byte_2. */ + unsigned int byte_2 :8; + /* Битовое поле byte_3, ширина 8 бит; данные byte_3. */ + unsigned int byte_3 :8; + + /* Продолжает список аргументов, полей или выражение } byt;; порядок элементов сохраняется. */ + } byt; + + /* Продолжает список аргументов, полей или выражение struct; порядок элементов сохраняется. */ + struct + /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ + { + /* Битовое поле word_0, ширина 16 бит; слово 0. */ + unsigned int word_0 :16; + /* Битовое поле word_1, ширина 16 бит; слово 1. */ + unsigned int word_1 :16; + + /* Продолжает список аргументов, полей или выражение } wrd;; порядок элементов сохраняется. */ + } wrd; + + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + unsigned long all; + +/* Продолжает список аргументов, полей или выражение } LONGE;; порядок элементов сохраняется. */ +} LONGE; + +/* Задаёт XCLKIN = 30000000; данные XCLKIN. */ +#define XCLKIN 30000000 // external oscillator frequency +/* Объявляет SYSCLKOUT — данные SYSCLKOUT; LSPCLK — данные LSPCLK; HSPCLK — данные HSPCLK. Память определена в другом модуле. */ +extern long SYSCLKOUT, LSPCLK, HSPCLK; + +/* Задаёт CLKMULT = 2L; данные CLKMULT. */ +#define CLKMULT 2L // 1 to 5 + +/* Задаёт LOWORD = int)( (long int)(l) &0xFFFF)); данные LOWORD. */ +#define LOWORD(l)((short int)( (long int)(l) &0xFFFF)) +/* Задаёт HIWORD = int)(((long int)(l)>>16)&0xFFFF)); данные HIWORD. */ +#define HIWORD(l)((short int)(((long int)(l)>>16)&0xFFFF)) + +/* Задаёт LOBYTE = (short int)(w) &0xFF)); данные LOBYTE. */ +#define LOBYTE(w)((char)( (short int)(w) &0xFF)) +/* Задаёт HIBYTE = int)(w)>>8)&0xFF)); данные HIBYTE. */ +#define HIBYTE(w)((char)(((short int)(w)>>8)&0xFF)) + +/* Задаёт BYTE3 = int)(l)>>24)&0xFF)); данные BYTE3. */ +#define BYTE3(l)((char)(((long int)(l)>>24)&0xFF)) +/* Задаёт BYTE2 = int)(l)>>16)&0xFF)); данные BYTE2. */ +#define BYTE2(l)((char)(((long int)(l)>>16)&0xFF)) +/* Задаёт BYTE1 = int)(l)>> 8)&0xFF)); данные BYTE1. */ +#define BYTE1(l)((char)(((long int)(l)>> 8)&0xFF)) +/* Задаёт BYTE0 = (long int)(l) &0xFF)); данные BYTE0. */ +#define BYTE0(l)((char)( (long int)(l) &0xFF)) + +//--------------------------------------------------------------------------- +// Include All Peripheral Header Files: +// +/* Подключает "DSP2833x_Adc.h": поставляемое TI описание Adc для семейства C2833x. */ +#include "DSP2833x_Adc.h" // ADC Registers +/* Подключает "DSP2833x_DevEmu.h": поставляемое TI описание DevEmu для семейства C2833x. */ +#include "DSP2833x_DevEmu.h" // Device Emulation Registers +/* Подключает "DSP2833x_CpuTimers.h": поставляемое TI описание CpuTimers для семейства C2833x. */ +#include "DSP2833x_CpuTimers.h" // 32-bit CPU Timers +/* Подключает "DSP2833x_ECan.h": поставляемое TI описание ECan для семейства C2833x. */ +#include "DSP2833x_ECan.h" // Enhanced eCAN Registers +/* Подключает "DSP2833x_ECap.h": поставляемое TI описание ECap для семейства C2833x. */ +#include "DSP2833x_ECap.h" // Enhanced Capture +/* Подключает "DSP2833x_DMA.h": поставляемое TI описание DMA для семейства C2833x. */ +#include "DSP2833x_DMA.h" // DMA Registers +/* Подключает "DSP2833x_EPwm.h": поставляемое TI описание EPwm для семейства C2833x. */ +#include "DSP2833x_EPwm.h" // Enhanced PWM +/* Подключает "DSP2833x_EQep.h": поставляемое TI описание EQep для семейства C2833x. */ +#include "DSP2833x_EQep.h" // Enhanced QEP +/* Подключает "DSP2833x_Gpio.h": поставляемое TI описание Gpio для семейства C2833x. */ +#include "DSP2833x_Gpio.h" // General Purpose I/O Registers +/* Подключает "DSP2833x_I2c.h": поставляемое TI описание I2c для семейства C2833x. */ +#include "DSP2833x_I2c.h" // I2C Registers +/* Подключает "DSP2833x_McBSP.h": поставляемое TI описание McBSP для семейства C2833x. */ +#include "DSP2833x_McBSP.h" // McBSP +/* Подключает "DSP2833x_PieCtrl.h": поставляемое TI описание PieCtrl для семейства C2833x. */ +#include "DSP2833x_PieCtrl.h" // PIE Control Registers +/* Подключает "DSP2833x_PieVect.h": поставляемое TI описание PieVect для семейства C2833x. */ +#include "DSP2833x_PieVect.h" // PIE Vector Table +/* Подключает "DSP2833x_Spi.h": поставляемое TI описание Spi для семейства C2833x. */ +#include "DSP2833x_Spi.h" // SPI Registers +/* Подключает "DSP2833x_Sci.h": поставляемое TI описание Sci для семейства C2833x. */ +#include "DSP2833x_Sci.h" // SCI Registers +/* Подключает "DSP2833x_SysCtrl.h": поставляемое TI описание SysCtrl для семейства C2833x. */ +#include "DSP2833x_SysCtrl.h" // System Control/Power Modes +/* Подключает "DSP2833x_XIntrupt.h": поставляемое TI описание XIntrupt для семейства C2833x. */ +#include "DSP2833x_XIntrupt.h" // External Interrupts +/* Подключает "DSP2833x_Xintf.h": поставляемое TI описание Xintf для семейства C2833x. */ +#include "DSP2833x_Xintf.h" // XINTF External Interface + +/* Подключает "DSP2833x_GlobalPrototypes.h": поставляемое TI описание GlobalPrototypes для семейства C2833x. */ +#include "DSP2833x_GlobalPrototypes.h" // Prototypes for global functions within the + +/* Условие компиляции DSP28_28335: выбранный блок включается в текущий вариант прошивки. */ +#if DSP28_28335 +/* Задаёт DSP28_EPWM1 = 1; данные DSP28_EPWM1. */ +#define DSP28_EPWM1 1 +/* Задаёт DSP28_EPWM2 = 1; данные DSP28_EPWM2. */ +#define DSP28_EPWM2 1 +/* Задаёт DSP28_EPWM3 = 1; данные DSP28_EPWM3. */ +#define DSP28_EPWM3 1 +/* Задаёт DSP28_EPWM4 = 1; данные DSP28_EPWM4. */ +#define DSP28_EPWM4 1 +/* Задаёт DSP28_EPWM5 = 1; данные DSP28_EPWM5. */ +#define DSP28_EPWM5 1 +/* Задаёт DSP28_EPWM6 = 1; данные DSP28_EPWM6. */ +#define DSP28_EPWM6 1 +/* Задаёт DSP28_ECAP1 = 1; данные DSP28_ECAP1. */ +#define DSP28_ECAP1 1 +/* Задаёт DSP28_ECAP2 = 1; данные DSP28_ECAP2. */ +#define DSP28_ECAP2 1 +/* Задаёт DSP28_ECAP3 = 1; данные DSP28_ECAP3. */ +#define DSP28_ECAP3 1 +/* Задаёт DSP28_ECAP4 = 1; данные DSP28_ECAP4. */ +#define DSP28_ECAP4 1 +/* Задаёт DSP28_ECAP5 = 1; данные DSP28_ECAP5. */ +#define DSP28_ECAP5 1 +/* Задаёт DSP28_ECAP6 = 1; данные DSP28_ECAP6. */ +#define DSP28_ECAP6 1 +/* Задаёт DSP28_EQEP1 = 1; данные DSP28_EQEP1. */ +#define DSP28_EQEP1 1 +/* Задаёт DSP28_EQEP2 = 1; данные DSP28_EQEP2. */ +#define DSP28_EQEP2 1 +/* Задаёт DSP28_ECANA = 1; данные DSP28_ECANA. */ +#define DSP28_ECANA 1 +/* Задаёт DSP28_ECANB = 1; данные DSP28_ECANB. */ +#define DSP28_ECANB 1 +/* Задаёт DSP28_MCBSPA = 1; данные DSP28_MCBSPA. */ +#define DSP28_MCBSPA 1 +/* Задаёт DSP28_MCBSPB = 1; данные DSP28_MCBSPB. */ +#define DSP28_MCBSPB 1 +/* Задаёт DSP28_SPIA = 1; данные DSP28_SPIA. */ +#define DSP28_SPIA 1 +/* Задаёт DSP28_SCIA = 1; данные DSP28_SCIA. */ +#define DSP28_SCIA 1 +/* Задаёт DSP28_SCIB = 1; данные DSP28_SCIB. */ +#define DSP28_SCIB 1 +/* Задаёт DSP28_SCIC = 1; данные DSP28_SCIC. */ +#define DSP28_SCIC 1 +/* Задаёт DSP28_I2CA = 1; данные DSP28_I2CA. */ +#define DSP28_I2CA 1 +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end DSP28_28335 + +/* Условие компиляции DSP28_28334: выбранный блок включается в текущий вариант прошивки. */ +#if DSP28_28334 +/* Задаёт DSP28_EPWM1 = 1; данные DSP28_EPWM1. */ +#define DSP28_EPWM1 1 +/* Задаёт DSP28_EPWM2 = 1; данные DSP28_EPWM2. */ +#define DSP28_EPWM2 1 +/* Задаёт DSP28_EPWM3 = 1; данные DSP28_EPWM3. */ +#define DSP28_EPWM3 1 +/* Задаёт DSP28_EPWM4 = 1; данные DSP28_EPWM4. */ +#define DSP28_EPWM4 1 +/* Задаёт DSP28_EPWM5 = 1; данные DSP28_EPWM5. */ +#define DSP28_EPWM5 1 +/* Задаёт DSP28_EPWM6 = 1; данные DSP28_EPWM6. */ +#define DSP28_EPWM6 1 +/* Задаёт DSP28_ECAP1 = 1; данные DSP28_ECAP1. */ +#define DSP28_ECAP1 1 +/* Задаёт DSP28_ECAP2 = 1; данные DSP28_ECAP2. */ +#define DSP28_ECAP2 1 +/* Задаёт DSP28_ECAP3 = 1; данные DSP28_ECAP3. */ +#define DSP28_ECAP3 1 +/* Задаёт DSP28_ECAP4 = 1; данные DSP28_ECAP4. */ +#define DSP28_ECAP4 1 +/* Задаёт DSP28_ECAP5 = 0; данные DSP28_ECAP5. */ +#define DSP28_ECAP5 0 +/* Задаёт DSP28_ECAP6 = 0; данные DSP28_ECAP6. */ +#define DSP28_ECAP6 0 +/* Задаёт DSP28_EQEP1 = 1; данные DSP28_EQEP1. */ +#define DSP28_EQEP1 1 +/* Задаёт DSP28_EQEP2 = 1; данные DSP28_EQEP2. */ +#define DSP28_EQEP2 1 +/* Задаёт DSP28_ECANA = 1; данные DSP28_ECANA. */ +#define DSP28_ECANA 1 +/* Задаёт DSP28_ECANB = 1; данные DSP28_ECANB. */ +#define DSP28_ECANB 1 +/* Задаёт DSP28_MCBSPA = 1; данные DSP28_MCBSPA. */ +#define DSP28_MCBSPA 1 +/* Задаёт DSP28_MCBSPB = 1; данные DSP28_MCBSPB. */ +#define DSP28_MCBSPB 1 +/* Задаёт DSP28_SPIA = 1; данные DSP28_SPIA. */ +#define DSP28_SPIA 1 +/* Задаёт DSP28_SCIA = 1; данные DSP28_SCIA. */ +#define DSP28_SCIA 1 +/* Задаёт DSP28_SCIB = 1; данные DSP28_SCIB. */ +#define DSP28_SCIB 1 +/* Задаёт DSP28_SCIC = 1; данные DSP28_SCIC. */ +#define DSP28_SCIC 1 +/* Задаёт DSP28_I2CA = 1; данные DSP28_I2CA. */ +#define DSP28_I2CA 1 +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end DSP28_28334 + +/* Условие компиляции DSP28_28332: выбранный блок включается в текущий вариант прошивки. */ +#if DSP28_28332 +/* Задаёт DSP28_EPWM1 = 1; данные DSP28_EPWM1. */ +#define DSP28_EPWM1 1 +/* Задаёт DSP28_EPWM2 = 1; данные DSP28_EPWM2. */ +#define DSP28_EPWM2 1 +/* Задаёт DSP28_EPWM3 = 1; данные DSP28_EPWM3. */ +#define DSP28_EPWM3 1 +/* Задаёт DSP28_EPWM4 = 1; данные DSP28_EPWM4. */ +#define DSP28_EPWM4 1 +/* Задаёт DSP28_EPWM5 = 1; данные DSP28_EPWM5. */ +#define DSP28_EPWM5 1 +/* Задаёт DSP28_EPWM6 = 1; данные DSP28_EPWM6. */ +#define DSP28_EPWM6 1 +/* Задаёт DSP28_ECAP1 = 1; данные DSP28_ECAP1. */ +#define DSP28_ECAP1 1 +/* Задаёт DSP28_ECAP2 = 1; данные DSP28_ECAP2. */ +#define DSP28_ECAP2 1 +/* Задаёт DSP28_ECAP3 = 1; данные DSP28_ECAP3. */ +#define DSP28_ECAP3 1 +/* Задаёт DSP28_ECAP4 = 1; данные DSP28_ECAP4. */ +#define DSP28_ECAP4 1 +/* Задаёт DSP28_ECAP5 = 0; данные DSP28_ECAP5. */ +#define DSP28_ECAP5 0 +/* Задаёт DSP28_ECAP6 = 0; данные DSP28_ECAP6. */ +#define DSP28_ECAP6 0 +/* Задаёт DSP28_EQEP1 = 1; данные DSP28_EQEP1. */ +#define DSP28_EQEP1 1 +/* Задаёт DSP28_EQEP2 = 1; данные DSP28_EQEP2. */ +#define DSP28_EQEP2 1 +/* Задаёт DSP28_ECANA = 1; данные DSP28_ECANA. */ +#define DSP28_ECANA 1 +/* Задаёт DSP28_ECANB = 1; данные DSP28_ECANB. */ +#define DSP28_ECANB 1 +/* Задаёт DSP28_MCBSPA = 1; данные DSP28_MCBSPA. */ +#define DSP28_MCBSPA 1 +/* Задаёт DSP28_MCBSPB = 0; данные DSP28_MCBSPB. */ +#define DSP28_MCBSPB 0 +/* Задаёт DSP28_SPIA = 1; данные DSP28_SPIA. */ +#define DSP28_SPIA 1 +/* Задаёт DSP28_SCIA = 1; данные DSP28_SCIA. */ +#define DSP28_SCIA 1 +/* Задаёт DSP28_SCIB = 1; данные DSP28_SCIB. */ +#define DSP28_SCIB 1 +/* Задаёт DSP28_SCIC = 0; данные DSP28_SCIC. */ +#define DSP28_SCIC 0 +/* Задаёт DSP28_I2CA = 1; данные DSP28_I2CA. */ +#define DSP28_I2CA 1 +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end DSP28_28332 + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_DEVICE_H definition + + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_ECan.h b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_ECan.h new file mode 100644 index 0000000..965ee77 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_ECan.h @@ -0,0 +1,2109 @@ +/* Поставляемое TI описание ECan для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/2 $ +// Checkin $Date: May 7, 2007 16:05:39 $ +//########################################################################### +// +// FILE: DSP2833x_ECan.h +// +// TITLE: DSP2833x Device eCAN Register Definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_ECAN_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_ECAN_H +/* Определяет защитный символ или переключатель DSP2833x_ECAN_H для последующей компиляции. */ +#define DSP2833x_ECAN_H + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + + +/* --------------------------------------------------- */ +/* eCAN Control & Status Registers */ +/* ----------------------------------------------------*/ + +/* eCAN Mailbox enable register (CANME) bit definitions */ +/* Описывает структуру CANME_BITS; порядок полей определяет расположение данных. */ +struct CANME_BITS { // bit description + /* Битовое поле ME0, ширина 1 бит; данные ME0. */ + Uint16 ME0:1; // 0 Enable Mailbox 0 + /* Битовое поле ME1, ширина 1 бит; данные ME1. */ + Uint16 ME1:1; // 1 Enable Mailbox 1 + /* Битовое поле ME2, ширина 1 бит; данные ME2. */ + Uint16 ME2:1; // 2 Enable Mailbox 2 + /* Битовое поле ME3, ширина 1 бит; данные ME3. */ + Uint16 ME3:1; // 3 Enable Mailbox 3 + /* Битовое поле ME4, ширина 1 бит; данные ME4. */ + Uint16 ME4:1; // 4 Enable Mailbox 4 + /* Битовое поле ME5, ширина 1 бит; данные ME5. */ + Uint16 ME5:1; // 5 Enable Mailbox 5 + /* Битовое поле ME6, ширина 1 бит; данные ME6. */ + Uint16 ME6:1; // 6 Enable Mailbox 6 + /* Битовое поле ME7, ширина 1 бит; данные ME7. */ + Uint16 ME7:1; // 7 Enable Mailbox 7 + /* Битовое поле ME8, ширина 1 бит; данные ME8. */ + Uint16 ME8:1; // 8 Enable Mailbox 8 + /* Битовое поле ME9, ширина 1 бит; данные ME9. */ + Uint16 ME9:1; // 9 Enable Mailbox 9 + /* Битовое поле ME10, ширина 1 бит; данные ME10. */ + Uint16 ME10:1; // 10 Enable Mailbox 10 + /* Битовое поле ME11, ширина 1 бит; данные ME11. */ + Uint16 ME11:1; // 11 Enable Mailbox 11 + /* Битовое поле ME12, ширина 1 бит; данные ME12. */ + Uint16 ME12:1; // 12 Enable Mailbox 12 + /* Битовое поле ME13, ширина 1 бит; данные ME13. */ + Uint16 ME13:1; // 13 Enable Mailbox 13 + /* Битовое поле ME14, ширина 1 бит; данные ME14. */ + Uint16 ME14:1; // 14 Enable Mailbox 14 + /* Битовое поле ME15, ширина 1 бит; данные ME15. */ + Uint16 ME15:1; // 15 Enable Mailbox 15 + /* Битовое поле ME16, ширина 1 бит; данные ME16. */ + Uint16 ME16:1; // 16 Enable Mailbox 16 + /* Битовое поле ME17, ширина 1 бит; данные ME17. */ + Uint16 ME17:1; // 17 Enable Mailbox 17 + /* Битовое поле ME18, ширина 1 бит; данные ME18. */ + Uint16 ME18:1; // 18 Enable Mailbox 18 + /* Битовое поле ME19, ширина 1 бит; данные ME19. */ + Uint16 ME19:1; // 19 Enable Mailbox 19 + /* Битовое поле ME20, ширина 1 бит; данные ME20. */ + Uint16 ME20:1; // 20 Enable Mailbox 20 + /* Битовое поле ME21, ширина 1 бит; данные ME21. */ + Uint16 ME21:1; // 21 Enable Mailbox 21 + /* Битовое поле ME22, ширина 1 бит; данные ME22. */ + Uint16 ME22:1; // 22 Enable Mailbox 22 + /* Битовое поле ME23, ширина 1 бит; данные ME23. */ + Uint16 ME23:1; // 23 Enable Mailbox 23 + /* Битовое поле ME24, ширина 1 бит; данные ME24. */ + Uint16 ME24:1; // 24 Enable Mailbox 24 + /* Битовое поле ME25, ширина 1 бит; данные ME25. */ + Uint16 ME25:1; // 25 Enable Mailbox 25 + /* Битовое поле ME26, ширина 1 бит; данные ME26. */ + Uint16 ME26:1; // 26 Enable Mailbox 26 + /* Битовое поле ME27, ширина 1 бит; данные ME27. */ + Uint16 ME27:1; // 27 Enable Mailbox 27 + /* Битовое поле ME28, ширина 1 бит; данные ME28. */ + Uint16 ME28:1; // 28 Enable Mailbox 28 + /* Битовое поле ME29, ширина 1 бит; данные ME29. */ + Uint16 ME29:1; // 29 Enable Mailbox 29 + /* Битовое поле ME30, ширина 1 бит; данные ME30. */ + Uint16 ME30:1; // 30 Enable Mailbox 30 + /* Битовое поле ME31, ширина 1 бит; данные ME31. */ + Uint16 ME31:1; // 31 Enable Mailbox 31 + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANME_REG в одной области памяти. */ +union CANME_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANME_BITS bit;; порядок полей определяет расположение данных. */ + struct CANME_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* eCAN Mailbox direction register (CANMD) bit definitions */ +/* Описывает структуру CANMD_BITS; порядок полей определяет расположение данных. */ +struct CANMD_BITS { // bit description + /* Битовое поле MD0, ширина 1 бит; данные MD0. */ + Uint16 MD0:1; // 0 0 -> Tx 1 -> Rx + /* Битовое поле MD1, ширина 1 бит; данные MD1. */ + Uint16 MD1:1; // 1 0 -> Tx 1 -> Rx + /* Битовое поле MD2, ширина 1 бит; данные MD2. */ + Uint16 MD2:1; // 2 0 -> Tx 1 -> Rx + /* Битовое поле MD3, ширина 1 бит; данные MD3. */ + Uint16 MD3:1; // 3 0 -> Tx 1 -> Rx + /* Битовое поле MD4, ширина 1 бит; данные MD4. */ + Uint16 MD4:1; // 4 0 -> Tx 1 -> Rx + /* Битовое поле MD5, ширина 1 бит; данные MD5. */ + Uint16 MD5:1; // 5 0 -> Tx 1 -> Rx + /* Битовое поле MD6, ширина 1 бит; данные MD6. */ + Uint16 MD6:1; // 6 0 -> Tx 1 -> Rx + /* Битовое поле MD7, ширина 1 бит; данные MD7. */ + Uint16 MD7:1; // 7 0 -> Tx 1 -> Rx + /* Битовое поле MD8, ширина 1 бит; данные MD8. */ + Uint16 MD8:1; // 8 0 -> Tx 1 -> Rx + /* Битовое поле MD9, ширина 1 бит; данные MD9. */ + Uint16 MD9:1; // 9 0 -> Tx 1 -> Rx + /* Битовое поле MD10, ширина 1 бит; данные MD10. */ + Uint16 MD10:1; // 10 0 -> Tx 1 -> Rx + /* Битовое поле MD11, ширина 1 бит; данные MD11. */ + Uint16 MD11:1; // 11 0 -> Tx 1 -> Rx + /* Битовое поле MD12, ширина 1 бит; данные MD12. */ + Uint16 MD12:1; // 12 0 -> Tx 1 -> Rx + /* Битовое поле MD13, ширина 1 бит; данные MD13. */ + Uint16 MD13:1; // 13 0 -> Tx 1 -> Rx + /* Битовое поле MD14, ширина 1 бит; данные MD14. */ + Uint16 MD14:1; // 14 0 -> Tx 1 -> Rx + /* Битовое поле MD15, ширина 1 бит; данные MD15. */ + Uint16 MD15:1; // 15 0 -> Tx 1 -> Rx + /* Битовое поле MD16, ширина 1 бит; данные MD16. */ + Uint16 MD16:1; // 16 0 -> Tx 1 -> Rx + /* Битовое поле MD17, ширина 1 бит; данные MD17. */ + Uint16 MD17:1; // 17 0 -> Tx 1 -> Rx + /* Битовое поле MD18, ширина 1 бит; данные MD18. */ + Uint16 MD18:1; // 18 0 -> Tx 1 -> Rx + /* Битовое поле MD19, ширина 1 бит; данные MD19. */ + Uint16 MD19:1; // 19 0 -> Tx 1 -> Rx + /* Битовое поле MD20, ширина 1 бит; данные MD20. */ + Uint16 MD20:1; // 20 0 -> Tx 1 -> Rx + /* Битовое поле MD21, ширина 1 бит; данные MD21. */ + Uint16 MD21:1; // 21 0 -> Tx 1 -> Rx + /* Битовое поле MD22, ширина 1 бит; данные MD22. */ + Uint16 MD22:1; // 22 0 -> Tx 1 -> Rx + /* Битовое поле MD23, ширина 1 бит; данные MD23. */ + Uint16 MD23:1; // 23 0 -> Tx 1 -> Rx + /* Битовое поле MD24, ширина 1 бит; данные MD24. */ + Uint16 MD24:1; // 24 0 -> Tx 1 -> Rx + /* Битовое поле MD25, ширина 1 бит; данные MD25. */ + Uint16 MD25:1; // 25 0 -> Tx 1 -> Rx + /* Битовое поле MD26, ширина 1 бит; данные MD26. */ + Uint16 MD26:1; // 26 0 -> Tx 1 -> Rx + /* Битовое поле MD27, ширина 1 бит; данные MD27. */ + Uint16 MD27:1; // 27 0 -> Tx 1 -> Rx + /* Битовое поле MD28, ширина 1 бит; данные MD28. */ + Uint16 MD28:1; // 28 0 -> Tx 1 -> Rx + /* Битовое поле MD29, ширина 1 бит; данные MD29. */ + Uint16 MD29:1; // 29 0 -> Tx 1 -> Rx + /* Битовое поле MD30, ширина 1 бит; данные MD30. */ + Uint16 MD30:1; // 30 0 -> Tx 1 -> Rx + /* Битовое поле MD31, ширина 1 бит; данные MD31. */ + Uint16 MD31:1; // 31 0 -> Tx 1 -> Rx + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANMD_REG в одной области памяти. */ +union CANMD_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANMD_BITS bit;; порядок полей определяет расположение данных. */ + struct CANMD_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* eCAN Transmit Request Set register (CANTRS) bit definitions */ +/* Описывает структуру CANTRS_BITS; порядок полей определяет расположение данных. */ +struct CANTRS_BITS { // bit description + /* Битовое поле TRS0, ширина 1 бит; данные TRS0. */ + Uint16 TRS0:1; // 0 TRS for Mailbox 0 + /* Битовое поле TRS1, ширина 1 бит; данные TRS1. */ + Uint16 TRS1:1; // 1 TRS for Mailbox 1 + /* Битовое поле TRS2, ширина 1 бит; данные TRS2. */ + Uint16 TRS2:1; // 2 TRS for Mailbox 2 + /* Битовое поле TRS3, ширина 1 бит; данные TRS3. */ + Uint16 TRS3:1; // 3 TRS for Mailbox 3 + /* Битовое поле TRS4, ширина 1 бит; данные TRS4. */ + Uint16 TRS4:1; // 4 TRS for Mailbox 4 + /* Битовое поле TRS5, ширина 1 бит; данные TRS5. */ + Uint16 TRS5:1; // 5 TRS for Mailbox 5 + /* Битовое поле TRS6, ширина 1 бит; данные TRS6. */ + Uint16 TRS6:1; // 6 TRS for Mailbox 6 + /* Битовое поле TRS7, ширина 1 бит; данные TRS7. */ + Uint16 TRS7:1; // 7 TRS for Mailbox 7 + /* Битовое поле TRS8, ширина 1 бит; данные TRS8. */ + Uint16 TRS8:1; // 8 TRS for Mailbox 8 + /* Битовое поле TRS9, ширина 1 бит; данные TRS9. */ + Uint16 TRS9:1; // 9 TRS for Mailbox 9 + /* Битовое поле TRS10, ширина 1 бит; данные TRS10. */ + Uint16 TRS10:1; // 10 TRS for Mailbox 10 + /* Битовое поле TRS11, ширина 1 бит; данные TRS11. */ + Uint16 TRS11:1; // 11 TRS for Mailbox 11 + /* Битовое поле TRS12, ширина 1 бит; данные TRS12. */ + Uint16 TRS12:1; // 12 TRS for Mailbox 12 + /* Битовое поле TRS13, ширина 1 бит; данные TRS13. */ + Uint16 TRS13:1; // 13 TRS for Mailbox 13 + /* Битовое поле TRS14, ширина 1 бит; данные TRS14. */ + Uint16 TRS14:1; // 14 TRS for Mailbox 14 + /* Битовое поле TRS15, ширина 1 бит; данные TRS15. */ + Uint16 TRS15:1; // 15 TRS for Mailbox 15 + /* Битовое поле TRS16, ширина 1 бит; данные TRS16. */ + Uint16 TRS16:1; // 16 TRS for Mailbox 16 + /* Битовое поле TRS17, ширина 1 бит; данные TRS17. */ + Uint16 TRS17:1; // 17 TRS for Mailbox 17 + /* Битовое поле TRS18, ширина 1 бит; данные TRS18. */ + Uint16 TRS18:1; // 18 TRS for Mailbox 18 + /* Битовое поле TRS19, ширина 1 бит; данные TRS19. */ + Uint16 TRS19:1; // 19 TRS for Mailbox 19 + /* Битовое поле TRS20, ширина 1 бит; данные TRS20. */ + Uint16 TRS20:1; // 20 TRS for Mailbox 20 + /* Битовое поле TRS21, ширина 1 бит; данные TRS21. */ + Uint16 TRS21:1; // 21 TRS for Mailbox 21 + /* Битовое поле TRS22, ширина 1 бит; данные TRS22. */ + Uint16 TRS22:1; // 22 TRS for Mailbox 22 + /* Битовое поле TRS23, ширина 1 бит; данные TRS23. */ + Uint16 TRS23:1; // 23 TRS for Mailbox 23 + /* Битовое поле TRS24, ширина 1 бит; данные TRS24. */ + Uint16 TRS24:1; // 24 TRS for Mailbox 24 + /* Битовое поле TRS25, ширина 1 бит; данные TRS25. */ + Uint16 TRS25:1; // 25 TRS for Mailbox 25 + /* Битовое поле TRS26, ширина 1 бит; данные TRS26. */ + Uint16 TRS26:1; // 26 TRS for Mailbox 26 + /* Битовое поле TRS27, ширина 1 бит; данные TRS27. */ + Uint16 TRS27:1; // 27 TRS for Mailbox 27 + /* Битовое поле TRS28, ширина 1 бит; данные TRS28. */ + Uint16 TRS28:1; // 28 TRS for Mailbox 28 + /* Битовое поле TRS29, ширина 1 бит; данные TRS29. */ + Uint16 TRS29:1; // 29 TRS for Mailbox 29 + /* Битовое поле TRS30, ширина 1 бит; данные TRS30. */ + Uint16 TRS30:1; // 30 TRS for Mailbox 30 + /* Битовое поле TRS31, ширина 1 бит; данные TRS31. */ + Uint16 TRS31:1; // 31 TRS for Mailbox 31 + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANTRS_REG в одной области памяти. */ +union CANTRS_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANTRS_BITS bit;; порядок полей определяет расположение данных. */ + struct CANTRS_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* eCAN Transmit Request Reset register (CANTRR) bit definitions */ +/* Описывает структуру CANTRR_BITS; порядок полей определяет расположение данных. */ +struct CANTRR_BITS { // bit description + /* Битовое поле TRR0, ширина 1 бит; данные TRR0. */ + Uint16 TRR0:1; // 0 TRR for Mailbox 0 + /* Битовое поле TRR1, ширина 1 бит; данные TRR1. */ + Uint16 TRR1:1; // 1 TRR for Mailbox 1 + /* Битовое поле TRR2, ширина 1 бит; данные TRR2. */ + Uint16 TRR2:1; // 2 TRR for Mailbox 2 + /* Битовое поле TRR3, ширина 1 бит; данные TRR3. */ + Uint16 TRR3:1; // 3 TRR for Mailbox 3 + /* Битовое поле TRR4, ширина 1 бит; данные TRR4. */ + Uint16 TRR4:1; // 4 TRR for Mailbox 4 + /* Битовое поле TRR5, ширина 1 бит; данные TRR5. */ + Uint16 TRR5:1; // 5 TRR for Mailbox 5 + /* Битовое поле TRR6, ширина 1 бит; данные TRR6. */ + Uint16 TRR6:1; // 6 TRR for Mailbox 6 + /* Битовое поле TRR7, ширина 1 бит; данные TRR7. */ + Uint16 TRR7:1; // 7 TRR for Mailbox 7 + /* Битовое поле TRR8, ширина 1 бит; данные TRR8. */ + Uint16 TRR8:1; // 8 TRR for Mailbox 8 + /* Битовое поле TRR9, ширина 1 бит; данные TRR9. */ + Uint16 TRR9:1; // 9 TRR for Mailbox 9 + /* Битовое поле TRR10, ширина 1 бит; данные TRR10. */ + Uint16 TRR10:1; // 10 TRR for Mailbox 10 + /* Битовое поле TRR11, ширина 1 бит; данные TRR11. */ + Uint16 TRR11:1; // 11 TRR for Mailbox 11 + /* Битовое поле TRR12, ширина 1 бит; данные TRR12. */ + Uint16 TRR12:1; // 12 TRR for Mailbox 12 + /* Битовое поле TRR13, ширина 1 бит; данные TRR13. */ + Uint16 TRR13:1; // 13 TRR for Mailbox 13 + /* Битовое поле TRR14, ширина 1 бит; данные TRR14. */ + Uint16 TRR14:1; // 14 TRR for Mailbox 14 + /* Битовое поле TRR15, ширина 1 бит; данные TRR15. */ + Uint16 TRR15:1; // 15 TRR for Mailbox 15 + /* Битовое поле TRR16, ширина 1 бит; данные TRR16. */ + Uint16 TRR16:1; // 16 TRR for Mailbox 16 + /* Битовое поле TRR17, ширина 1 бит; данные TRR17. */ + Uint16 TRR17:1; // 17 TRR for Mailbox 17 + /* Битовое поле TRR18, ширина 1 бит; данные TRR18. */ + Uint16 TRR18:1; // 18 TRR for Mailbox 18 + /* Битовое поле TRR19, ширина 1 бит; данные TRR19. */ + Uint16 TRR19:1; // 19 TRR for Mailbox 19 + /* Битовое поле TRR20, ширина 1 бит; данные TRR20. */ + Uint16 TRR20:1; // 20 TRR for Mailbox 20 + /* Битовое поле TRR21, ширина 1 бит; данные TRR21. */ + Uint16 TRR21:1; // 21 TRR for Mailbox 21 + /* Битовое поле TRR22, ширина 1 бит; данные TRR22. */ + Uint16 TRR22:1; // 22 TRR for Mailbox 22 + /* Битовое поле TRR23, ширина 1 бит; данные TRR23. */ + Uint16 TRR23:1; // 23 TRR for Mailbox 23 + /* Битовое поле TRR24, ширина 1 бит; данные TRR24. */ + Uint16 TRR24:1; // 24 TRR for Mailbox 24 + /* Битовое поле TRR25, ширина 1 бит; данные TRR25. */ + Uint16 TRR25:1; // 25 TRR for Mailbox 25 + /* Битовое поле TRR26, ширина 1 бит; данные TRR26. */ + Uint16 TRR26:1; // 26 TRR for Mailbox 26 + /* Битовое поле TRR27, ширина 1 бит; данные TRR27. */ + Uint16 TRR27:1; // 27 TRR for Mailbox 27 + /* Битовое поле TRR28, ширина 1 бит; данные TRR28. */ + Uint16 TRR28:1; // 28 TRR for Mailbox 28 + /* Битовое поле TRR29, ширина 1 бит; данные TRR29. */ + Uint16 TRR29:1; // 29 TRR for Mailbox 29 + /* Битовое поле TRR30, ширина 1 бит; данные TRR30. */ + Uint16 TRR30:1; // 30 TRR for Mailbox 30 + /* Битовое поле TRR31, ширина 1 бит; данные TRR31. */ + Uint16 TRR31:1; // 31 TRR for Mailbox 31 + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANTRR_REG в одной области памяти. */ +union CANTRR_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANTRR_BITS bit;; порядок полей определяет расположение данных. */ + struct CANTRR_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* eCAN Transmit Acknowledge register (CANTA) bit definitions */ +/* Описывает структуру CANTA_BITS; порядок полей определяет расположение данных. */ +struct CANTA_BITS { // bit description + /* Битовое поле TA0, ширина 1 бит; данные TA0. */ + Uint16 TA0:1; // 0 TA for Mailbox 0 + /* Битовое поле TA1, ширина 1 бит; данные TA1. */ + Uint16 TA1:1; // 1 TA for Mailbox 1 + /* Битовое поле TA2, ширина 1 бит; данные TA2. */ + Uint16 TA2:1; // 2 TA for Mailbox 2 + /* Битовое поле TA3, ширина 1 бит; данные TA3. */ + Uint16 TA3:1; // 3 TA for Mailbox 3 + /* Битовое поле TA4, ширина 1 бит; данные TA4. */ + Uint16 TA4:1; // 4 TA for Mailbox 4 + /* Битовое поле TA5, ширина 1 бит; данные TA5. */ + Uint16 TA5:1; // 5 TA for Mailbox 5 + /* Битовое поле TA6, ширина 1 бит; данные TA6. */ + Uint16 TA6:1; // 6 TA for Mailbox 6 + /* Битовое поле TA7, ширина 1 бит; данные TA7. */ + Uint16 TA7:1; // 7 TA for Mailbox 7 + /* Битовое поле TA8, ширина 1 бит; данные TA8. */ + Uint16 TA8:1; // 8 TA for Mailbox 8 + /* Битовое поле TA9, ширина 1 бит; данные TA9. */ + Uint16 TA9:1; // 9 TA for Mailbox 9 + /* Битовое поле TA10, ширина 1 бит; данные TA10. */ + Uint16 TA10:1; // 10 TA for Mailbox 10 + /* Битовое поле TA11, ширина 1 бит; данные TA11. */ + Uint16 TA11:1; // 11 TA for Mailbox 11 + /* Битовое поле TA12, ширина 1 бит; данные TA12. */ + Uint16 TA12:1; // 12 TA for Mailbox 12 + /* Битовое поле TA13, ширина 1 бит; данные TA13. */ + Uint16 TA13:1; // 13 TA for Mailbox 13 + /* Битовое поле TA14, ширина 1 бит; данные TA14. */ + Uint16 TA14:1; // 14 TA for Mailbox 14 + /* Битовое поле TA15, ширина 1 бит; данные TA15. */ + Uint16 TA15:1; // 15 TA for Mailbox 15 + /* Битовое поле TA16, ширина 1 бит; данные TA16. */ + Uint16 TA16:1; // 16 TA for Mailbox 16 + /* Битовое поле TA17, ширина 1 бит; данные TA17. */ + Uint16 TA17:1; // 17 TA for Mailbox 17 + /* Битовое поле TA18, ширина 1 бит; данные TA18. */ + Uint16 TA18:1; // 18 TA for Mailbox 18 + /* Битовое поле TA19, ширина 1 бит; данные TA19. */ + Uint16 TA19:1; // 19 TA for Mailbox 19 + /* Битовое поле TA20, ширина 1 бит; данные TA20. */ + Uint16 TA20:1; // 20 TA for Mailbox 20 + /* Битовое поле TA21, ширина 1 бит; данные TA21. */ + Uint16 TA21:1; // 21 TA for Mailbox 21 + /* Битовое поле TA22, ширина 1 бит; данные TA22. */ + Uint16 TA22:1; // 22 TA for Mailbox 22 + /* Битовое поле TA23, ширина 1 бит; данные TA23. */ + Uint16 TA23:1; // 23 TA for Mailbox 23 + /* Битовое поле TA24, ширина 1 бит; данные TA24. */ + Uint16 TA24:1; // 24 TA for Mailbox 24 + /* Битовое поле TA25, ширина 1 бит; данные TA25. */ + Uint16 TA25:1; // 25 TA for Mailbox 25 + /* Битовое поле TA26, ширина 1 бит; данные TA26. */ + Uint16 TA26:1; // 26 TA for Mailbox 26 + /* Битовое поле TA27, ширина 1 бит; данные TA27. */ + Uint16 TA27:1; // 27 TA for Mailbox 27 + /* Битовое поле TA28, ширина 1 бит; данные TA28. */ + Uint16 TA28:1; // 28 TA for Mailbox 28 + /* Битовое поле TA29, ширина 1 бит; данные TA29. */ + Uint16 TA29:1; // 29 TA for Mailbox 29 + /* Битовое поле TA30, ширина 1 бит; данные TA30. */ + Uint16 TA30:1; // 30 TA for Mailbox 30 + /* Битовое поле TA31, ширина 1 бит; данные TA31. */ + Uint16 TA31:1; // 31 TA for Mailbox 31 + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANTA_REG в одной области памяти. */ +union CANTA_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANTA_BITS bit;; порядок полей определяет расположение данных. */ + struct CANTA_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* eCAN Transmit Abort Acknowledge register (CANAA) bit definitions */ +/* Описывает структуру CANAA_BITS; порядок полей определяет расположение данных. */ +struct CANAA_BITS { // bit description + /* Битовое поле AA0, ширина 1 бит; данные AA0. */ + Uint16 AA0:1; // 0 AA for Mailbox 0 + /* Битовое поле AA1, ширина 1 бит; данные AA1. */ + Uint16 AA1:1; // 1 AA for Mailbox 1 + /* Битовое поле AA2, ширина 1 бит; данные AA2. */ + Uint16 AA2:1; // 2 AA for Mailbox 2 + /* Битовое поле AA3, ширина 1 бит; данные AA3. */ + Uint16 AA3:1; // 3 AA for Mailbox 3 + /* Битовое поле AA4, ширина 1 бит; данные AA4. */ + Uint16 AA4:1; // 4 AA for Mailbox 4 + /* Битовое поле AA5, ширина 1 бит; данные AA5. */ + Uint16 AA5:1; // 5 AA for Mailbox 5 + /* Битовое поле AA6, ширина 1 бит; данные AA6. */ + Uint16 AA6:1; // 6 AA for Mailbox 6 + /* Битовое поле AA7, ширина 1 бит; данные AA7. */ + Uint16 AA7:1; // 7 AA for Mailbox 7 + /* Битовое поле AA8, ширина 1 бит; данные AA8. */ + Uint16 AA8:1; // 8 AA for Mailbox 8 + /* Битовое поле AA9, ширина 1 бит; данные AA9. */ + Uint16 AA9:1; // 9 AA for Mailbox 9 + /* Битовое поле AA10, ширина 1 бит; данные AA10. */ + Uint16 AA10:1; // 10 AA for Mailbox 10 + /* Битовое поле AA11, ширина 1 бит; данные AA11. */ + Uint16 AA11:1; // 11 AA for Mailbox 11 + /* Битовое поле AA12, ширина 1 бит; данные AA12. */ + Uint16 AA12:1; // 12 AA for Mailbox 12 + /* Битовое поле AA13, ширина 1 бит; данные AA13. */ + Uint16 AA13:1; // 13 AA for Mailbox 13 + /* Битовое поле AA14, ширина 1 бит; данные AA14. */ + Uint16 AA14:1; // 14 AA for Mailbox 14 + /* Битовое поле AA15, ширина 1 бит; данные AA15. */ + Uint16 AA15:1; // 15 AA for Mailbox 15 + /* Битовое поле AA16, ширина 1 бит; данные AA16. */ + Uint16 AA16:1; // 16 AA for Mailbox 16 + /* Битовое поле AA17, ширина 1 бит; данные AA17. */ + Uint16 AA17:1; // 17 AA for Mailbox 17 + /* Битовое поле AA18, ширина 1 бит; данные AA18. */ + Uint16 AA18:1; // 18 AA for Mailbox 18 + /* Битовое поле AA19, ширина 1 бит; данные AA19. */ + Uint16 AA19:1; // 19 AA for Mailbox 19 + /* Битовое поле AA20, ширина 1 бит; данные AA20. */ + Uint16 AA20:1; // 20 AA for Mailbox 20 + /* Битовое поле AA21, ширина 1 бит; данные AA21. */ + Uint16 AA21:1; // 21 AA for Mailbox 21 + /* Битовое поле AA22, ширина 1 бит; данные AA22. */ + Uint16 AA22:1; // 22 AA for Mailbox 22 + /* Битовое поле AA23, ширина 1 бит; данные AA23. */ + Uint16 AA23:1; // 23 AA for Mailbox 23 + /* Битовое поле AA24, ширина 1 бит; данные AA24. */ + Uint16 AA24:1; // 24 AA for Mailbox 24 + /* Битовое поле AA25, ширина 1 бит; данные AA25. */ + Uint16 AA25:1; // 25 AA for Mailbox 25 + /* Битовое поле AA26, ширина 1 бит; данные AA26. */ + Uint16 AA26:1; // 26 AA for Mailbox 26 + /* Битовое поле AA27, ширина 1 бит; данные AA27. */ + Uint16 AA27:1; // 27 AA for Mailbox 27 + /* Битовое поле AA28, ширина 1 бит; данные AA28. */ + Uint16 AA28:1; // 28 AA for Mailbox 28 + /* Битовое поле AA29, ширина 1 бит; данные AA29. */ + Uint16 AA29:1; // 29 AA for Mailbox 29 + /* Битовое поле AA30, ширина 1 бит; данные AA30. */ + Uint16 AA30:1; // 30 AA for Mailbox 30 + /* Битовое поле AA31, ширина 1 бит; данные AA31. */ + Uint16 AA31:1; // 31 AA for Mailbox 31 + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANAA_REG в одной области памяти. */ +union CANAA_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANAA_BITS bit;; порядок полей определяет расположение данных. */ + struct CANAA_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* eCAN Received Message Pending register (CANRMP) bit definitions */ +/* Описывает структуру CANRMP_BITS; порядок полей определяет расположение данных. */ +struct CANRMP_BITS { // bit description + /* Битовое поле RMP0, ширина 1 бит; данные RMP0. */ + Uint16 RMP0:1; // 0 RMP for Mailbox 0 + /* Битовое поле RMP1, ширина 1 бит; данные RMP1. */ + Uint16 RMP1:1; // 1 RMP for Mailbox 1 + /* Битовое поле RMP2, ширина 1 бит; данные RMP2. */ + Uint16 RMP2:1; // 2 RMP for Mailbox 2 + /* Битовое поле RMP3, ширина 1 бит; данные RMP3. */ + Uint16 RMP3:1; // 3 RMP for Mailbox 3 + /* Битовое поле RMP4, ширина 1 бит; данные RMP4. */ + Uint16 RMP4:1; // 4 RMP for Mailbox 4 + /* Битовое поле RMP5, ширина 1 бит; данные RMP5. */ + Uint16 RMP5:1; // 5 RMP for Mailbox 5 + /* Битовое поле RMP6, ширина 1 бит; данные RMP6. */ + Uint16 RMP6:1; // 6 RMP for Mailbox 6 + /* Битовое поле RMP7, ширина 1 бит; данные RMP7. */ + Uint16 RMP7:1; // 7 RMP for Mailbox 7 + /* Битовое поле RMP8, ширина 1 бит; данные RMP8. */ + Uint16 RMP8:1; // 8 RMP for Mailbox 8 + /* Битовое поле RMP9, ширина 1 бит; данные RMP9. */ + Uint16 RMP9:1; // 9 RMP for Mailbox 9 + /* Битовое поле RMP10, ширина 1 бит; данные RMP10. */ + Uint16 RMP10:1; // 10 RMP for Mailbox 10 + /* Битовое поле RMP11, ширина 1 бит; данные RMP11. */ + Uint16 RMP11:1; // 11 RMP for Mailbox 11 + /* Битовое поле RMP12, ширина 1 бит; данные RMP12. */ + Uint16 RMP12:1; // 12 RMP for Mailbox 12 + /* Битовое поле RMP13, ширина 1 бит; данные RMP13. */ + Uint16 RMP13:1; // 13 RMP for Mailbox 13 + /* Битовое поле RMP14, ширина 1 бит; данные RMP14. */ + Uint16 RMP14:1; // 14 RMP for Mailbox 14 + /* Битовое поле RMP15, ширина 1 бит; данные RMP15. */ + Uint16 RMP15:1; // 15 RMP for Mailbox 15 + /* Битовое поле RMP16, ширина 1 бит; данные RMP16. */ + Uint16 RMP16:1; // 16 RMP for Mailbox 16 + /* Битовое поле RMP17, ширина 1 бит; данные RMP17. */ + Uint16 RMP17:1; // 17 RMP for Mailbox 17 + /* Битовое поле RMP18, ширина 1 бит; данные RMP18. */ + Uint16 RMP18:1; // 18 RMP for Mailbox 18 + /* Битовое поле RMP19, ширина 1 бит; данные RMP19. */ + Uint16 RMP19:1; // 19 RMP for Mailbox 19 + /* Битовое поле RMP20, ширина 1 бит; данные RMP20. */ + Uint16 RMP20:1; // 20 RMP for Mailbox 20 + /* Битовое поле RMP21, ширина 1 бит; данные RMP21. */ + Uint16 RMP21:1; // 21 RMP for Mailbox 21 + /* Битовое поле RMP22, ширина 1 бит; данные RMP22. */ + Uint16 RMP22:1; // 22 RMP for Mailbox 22 + /* Битовое поле RMP23, ширина 1 бит; данные RMP23. */ + Uint16 RMP23:1; // 23 RMP for Mailbox 23 + /* Битовое поле RMP24, ширина 1 бит; данные RMP24. */ + Uint16 RMP24:1; // 24 RMP for Mailbox 24 + /* Битовое поле RMP25, ширина 1 бит; данные RMP25. */ + Uint16 RMP25:1; // 25 RMP for Mailbox 25 + /* Битовое поле RMP26, ширина 1 бит; данные RMP26. */ + Uint16 RMP26:1; // 26 RMP for Mailbox 26 + /* Битовое поле RMP27, ширина 1 бит; данные RMP27. */ + Uint16 RMP27:1; // 27 RMP for Mailbox 27 + /* Битовое поле RMP28, ширина 1 бит; данные RMP28. */ + Uint16 RMP28:1; // 28 RMP for Mailbox 28 + /* Битовое поле RMP29, ширина 1 бит; данные RMP29. */ + Uint16 RMP29:1; // 29 RMP for Mailbox 29 + /* Битовое поле RMP30, ширина 1 бит; данные RMP30. */ + Uint16 RMP30:1; // 30 RMP for Mailbox 30 + /* Битовое поле RMP31, ширина 1 бит; данные RMP31. */ + Uint16 RMP31:1; // 31 RMP for Mailbox 31 + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANRMP_REG в одной области памяти. */ +union CANRMP_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANRMP_BITS bit;; порядок полей определяет расположение данных. */ + struct CANRMP_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* eCAN Received Message Lost register (CANRML) bit definitions */ +/* Описывает структуру CANRML_BITS; порядок полей определяет расположение данных. */ +struct CANRML_BITS { // bit description + /* Битовое поле RML0, ширина 1 бит; данные RML0. */ + Uint16 RML0:1; // 0 RML for Mailbox 0 + /* Битовое поле RML1, ширина 1 бит; данные RML1. */ + Uint16 RML1:1; // 1 RML for Mailbox 1 + /* Битовое поле RML2, ширина 1 бит; данные RML2. */ + Uint16 RML2:1; // 2 RML for Mailbox 2 + /* Битовое поле RML3, ширина 1 бит; данные RML3. */ + Uint16 RML3:1; // 3 RML for Mailbox 3 + /* Битовое поле RML4, ширина 1 бит; данные RML4. */ + Uint16 RML4:1; // 4 RML for Mailbox 4 + /* Битовое поле RML5, ширина 1 бит; данные RML5. */ + Uint16 RML5:1; // 5 RML for Mailbox 5 + /* Битовое поле RML6, ширина 1 бит; данные RML6. */ + Uint16 RML6:1; // 6 RML for Mailbox 6 + /* Битовое поле RML7, ширина 1 бит; данные RML7. */ + Uint16 RML7:1; // 7 RML for Mailbox 7 + /* Битовое поле RML8, ширина 1 бит; данные RML8. */ + Uint16 RML8:1; // 8 RML for Mailbox 8 + /* Битовое поле RML9, ширина 1 бит; данные RML9. */ + Uint16 RML9:1; // 9 RML for Mailbox 9 + /* Битовое поле RML10, ширина 1 бит; данные RML10. */ + Uint16 RML10:1; // 10 RML for Mailbox 10 + /* Битовое поле RML11, ширина 1 бит; данные RML11. */ + Uint16 RML11:1; // 11 RML for Mailbox 11 + /* Битовое поле RML12, ширина 1 бит; данные RML12. */ + Uint16 RML12:1; // 12 RML for Mailbox 12 + /* Битовое поле RML13, ширина 1 бит; данные RML13. */ + Uint16 RML13:1; // 13 RML for Mailbox 13 + /* Битовое поле RML14, ширина 1 бит; данные RML14. */ + Uint16 RML14:1; // 14 RML for Mailbox 14 + /* Битовое поле RML15, ширина 1 бит; данные RML15. */ + Uint16 RML15:1; // 15 RML for Mailbox 15 + /* Битовое поле RML16, ширина 1 бит; данные RML16. */ + Uint16 RML16:1; // 16 RML for Mailbox 16 + /* Битовое поле RML17, ширина 1 бит; данные RML17. */ + Uint16 RML17:1; // 17 RML for Mailbox 17 + /* Битовое поле RML18, ширина 1 бит; данные RML18. */ + Uint16 RML18:1; // 18 RML for Mailbox 18 + /* Битовое поле RML19, ширина 1 бит; данные RML19. */ + Uint16 RML19:1; // 19 RML for Mailbox 19 + /* Битовое поле RML20, ширина 1 бит; данные RML20. */ + Uint16 RML20:1; // 20 RML for Mailbox 20 + /* Битовое поле RML21, ширина 1 бит; данные RML21. */ + Uint16 RML21:1; // 21 RML for Mailbox 21 + /* Битовое поле RML22, ширина 1 бит; данные RML22. */ + Uint16 RML22:1; // 22 RML for Mailbox 22 + /* Битовое поле RML23, ширина 1 бит; данные RML23. */ + Uint16 RML23:1; // 23 RML for Mailbox 23 + /* Битовое поле RML24, ширина 1 бит; данные RML24. */ + Uint16 RML24:1; // 24 RML for Mailbox 24 + /* Битовое поле RML25, ширина 1 бит; данные RML25. */ + Uint16 RML25:1; // 25 RML for Mailbox 25 + /* Битовое поле RML26, ширина 1 бит; данные RML26. */ + Uint16 RML26:1; // 26 RML for Mailbox 26 + /* Битовое поле RML27, ширина 1 бит; данные RML27. */ + Uint16 RML27:1; // 27 RML for Mailbox 27 + /* Битовое поле RML28, ширина 1 бит; данные RML28. */ + Uint16 RML28:1; // 28 RML for Mailbox 28 + /* Битовое поле RML29, ширина 1 бит; данные RML29. */ + Uint16 RML29:1; // 29 RML for Mailbox 29 + /* Битовое поле RML30, ширина 1 бит; данные RML30. */ + Uint16 RML30:1; // 30 RML for Mailbox 30 + /* Битовое поле RML31, ширина 1 бит; данные RML31. */ + Uint16 RML31:1; // 31 RML for Mailbox 31 + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANRML_REG в одной области памяти. */ +union CANRML_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANRML_BITS bit;; порядок полей определяет расположение данных. */ + struct CANRML_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* eCAN Remote Frame Pending register (CANRFP) bit definitions */ +/* Описывает структуру CANRFP_BITS; порядок полей определяет расположение данных. */ +struct CANRFP_BITS { // bit description + /* Битовое поле RFP0, ширина 1 бит; данные RFP0. */ + Uint16 RFP0:1; // 0 RFP for Mailbox 0 + /* Битовое поле RFP1, ширина 1 бит; данные RFP1. */ + Uint16 RFP1:1; // 1 RFP for Mailbox 1 + /* Битовое поле RFP2, ширина 1 бит; данные RFP2. */ + Uint16 RFP2:1; // 2 RFP for Mailbox 2 + /* Битовое поле RFP3, ширина 1 бит; данные RFP3. */ + Uint16 RFP3:1; // 3 RFP for Mailbox 3 + /* Битовое поле RFP4, ширина 1 бит; данные RFP4. */ + Uint16 RFP4:1; // 4 RFP for Mailbox 4 + /* Битовое поле RFP5, ширина 1 бит; данные RFP5. */ + Uint16 RFP5:1; // 5 RFP for Mailbox 5 + /* Битовое поле RFP6, ширина 1 бит; данные RFP6. */ + Uint16 RFP6:1; // 6 RFP for Mailbox 6 + /* Битовое поле RFP7, ширина 1 бит; данные RFP7. */ + Uint16 RFP7:1; // 7 RFP for Mailbox 7 + /* Битовое поле RFP8, ширина 1 бит; данные RFP8. */ + Uint16 RFP8:1; // 8 RFP for Mailbox 8 + /* Битовое поле RFP9, ширина 1 бит; данные RFP9. */ + Uint16 RFP9:1; // 9 RFP for Mailbox 9 + /* Битовое поле RFP10, ширина 1 бит; данные RFP10. */ + Uint16 RFP10:1; // 10 RFP for Mailbox 10 + /* Битовое поле RFP11, ширина 1 бит; данные RFP11. */ + Uint16 RFP11:1; // 11 RFP for Mailbox 11 + /* Битовое поле RFP12, ширина 1 бит; данные RFP12. */ + Uint16 RFP12:1; // 12 RFP for Mailbox 12 + /* Битовое поле RFP13, ширина 1 бит; данные RFP13. */ + Uint16 RFP13:1; // 13 RFP for Mailbox 13 + /* Битовое поле RFP14, ширина 1 бит; данные RFP14. */ + Uint16 RFP14:1; // 14 RFP for Mailbox 14 + /* Битовое поле RFP15, ширина 1 бит; данные RFP15. */ + Uint16 RFP15:1; // 15 RFP for Mailbox 15 + /* Битовое поле RFP16, ширина 1 бит; данные RFP16. */ + Uint16 RFP16:1; // 16 RFP for Mailbox 16 + /* Битовое поле RFP17, ширина 1 бит; данные RFP17. */ + Uint16 RFP17:1; // 17 RFP for Mailbox 17 + /* Битовое поле RFP18, ширина 1 бит; данные RFP18. */ + Uint16 RFP18:1; // 18 RFP for Mailbox 18 + /* Битовое поле RFP19, ширина 1 бит; данные RFP19. */ + Uint16 RFP19:1; // 19 RFP for Mailbox 19 + /* Битовое поле RFP20, ширина 1 бит; данные RFP20. */ + Uint16 RFP20:1; // 20 RFP for Mailbox 20 + /* Битовое поле RFP21, ширина 1 бит; данные RFP21. */ + Uint16 RFP21:1; // 21 RFP for Mailbox 21 + /* Битовое поле RFP22, ширина 1 бит; данные RFP22. */ + Uint16 RFP22:1; // 22 RFP for Mailbox 22 + /* Битовое поле RFP23, ширина 1 бит; данные RFP23. */ + Uint16 RFP23:1; // 23 RFP for Mailbox 23 + /* Битовое поле RFP24, ширина 1 бит; данные RFP24. */ + Uint16 RFP24:1; // 24 RFP for Mailbox 24 + /* Битовое поле RFP25, ширина 1 бит; данные RFP25. */ + Uint16 RFP25:1; // 25 RFP for Mailbox 25 + /* Битовое поле RFP26, ширина 1 бит; данные RFP26. */ + Uint16 RFP26:1; // 26 RFP for Mailbox 26 + /* Битовое поле RFP27, ширина 1 бит; данные RFP27. */ + Uint16 RFP27:1; // 27 RFP for Mailbox 27 + /* Битовое поле RFP28, ширина 1 бит; данные RFP28. */ + Uint16 RFP28:1; // 28 RFP for Mailbox 28 + /* Битовое поле RFP29, ширина 1 бит; данные RFP29. */ + Uint16 RFP29:1; // 29 RFP for Mailbox 29 + /* Битовое поле RFP30, ширина 1 бит; данные RFP30. */ + Uint16 RFP30:1; // 30 RFP for Mailbox 30 + /* Битовое поле RFP31, ширина 1 бит; данные RFP31. */ + Uint16 RFP31:1; // 31 RFP for Mailbox 31 + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANRFP_REG в одной области памяти. */ +union CANRFP_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANRFP_BITS bit;; порядок полей определяет расположение данных. */ + struct CANRFP_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* eCAN Global Acceptance Mask register (CANGAM) bit definitions */ +/* Описывает структуру CANGAM_BITS; порядок полей определяет расположение данных. */ +struct CANGAM_BITS { // bits description + /* Битовое поле GAM150, ширина 16 бит; данные GAM150. */ + Uint16 GAM150:16; // 15:0 Global acceptance mask bits 0-15 + /* Битовое поле GAM2816, ширина 13 бит; данные GAM2816. */ + Uint16 GAM2816:13; // 28:16 Global acceptance mask bits 16-28 + /* Битовое поле rsvd, ширина 2 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:2; // 30:29 reserved + /* Битовое поле AMI, ширина 1 бит; данные AMI. */ + Uint16 AMI:1; // 31 AMI bit +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANGAM_REG в одной области памяти. */ +union CANGAM_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANGAM_BITS bit;; порядок полей определяет расположение данных. */ + struct CANGAM_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* eCAN Master Control register (CANMC) bit definitions */ +/* Описывает структуру CANMC_BITS; порядок полей определяет расположение данных. */ +struct CANMC_BITS { // bits description + /* Битовое поле MBNR, ширина 5 бит; данные MBNR. */ + Uint16 MBNR:5; // 4:0 MBX # for CDR bit + /* Битовое поле SRES, ширина 1 бит; данные SRES. */ + Uint16 SRES:1; // 5 Soft reset + /* Битовое поле STM, ширина 1 бит; данные STM. */ + Uint16 STM:1; // 6 Self-test mode + /* Битовое поле ABO, ширина 1 бит; данные ABO. */ + Uint16 ABO:1; // 7 Auto bus-on + /* Битовое поле CDR, ширина 1 бит; данные CDR. */ + Uint16 CDR:1; // 8 Change data request + /* Битовое поле WUBA, ширина 1 бит; данные WUBA. */ + Uint16 WUBA:1; // 9 Wake-up on bus activity + /* Битовое поле DBO, ширина 1 бит; данные DBO. */ + Uint16 DBO:1; // 10 Data-byte order + /* Битовое поле PDR, ширина 1 бит; данные PDR. */ + Uint16 PDR:1; // 11 Power-down mode request + /* Битовое поле CCR, ширина 1 бит; данные CCR. */ + Uint16 CCR:1; // 12 Change configuration request + /* Битовое поле SCB, ширина 1 бит; данные SCB. */ + Uint16 SCB:1; // 13 SCC compatibility bit + /* Битовое поле TCC, ширина 1 бит; данные TCC. */ + Uint16 TCC:1; // 14 TSC MSB clear bit + /* Битовое поле MBCC, ширина 1 бит; данные MBCC. */ + Uint16 MBCC:1; // 15 TSC clear bit thru mailbox 16 + /* Битовое поле SUSP, ширина 1 бит; данные SUSP. */ + Uint16 SUSP:1; // 16 SUSPEND free/soft bit + /* Битовое поле rsvd, ширина 15 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:15; // 31:17 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANMC_REG в одной области памяти. */ +union CANMC_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANMC_BITS bit;; порядок полей определяет расположение данных. */ + struct CANMC_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* eCAN Bit -timing configuration register (CANBTC) bit definitions */ +/* Описывает структуру CANBTC_BITS; порядок полей определяет расположение данных. */ +struct CANBTC_BITS { // bits description + /* Битовое поле TSEG2REG, ширина 3 бит; данные TSEG2REG. */ + Uint16 TSEG2REG:3; // 2:0 TSEG2 register value + /* Битовое поле TSEG1REG, ширина 4 бит; данные TSEG1REG. */ + Uint16 TSEG1REG:4; // 6:3 TSEG1 register value + /* Битовое поле SAM, ширина 1 бит; данные SAM. */ + Uint16 SAM:1; // 7 Sample-point setting + /* Битовое поле SJWREG, ширина 2 бит; данные SJWREG. */ + Uint16 SJWREG:2; // 9:8 Synchroniztion Jump Width register value + /* Битовое поле rsvd1, ширина 6 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:6; // 15:10 reserved + /* Битовое поле BRPREG, ширина 8 бит; данные BRPREG. */ + Uint16 BRPREG:8; // 23:16 Baudrate prescaler register value + /* Битовое поле rsvd2, ширина 8 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:8; // 31:24 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANBTC_REG в одной области памяти. */ +union CANBTC_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANBTC_BITS bit;; порядок полей определяет расположение данных. */ + struct CANBTC_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* eCAN Error & Status register (CANES) bit definitions */ +/* Описывает структуру CANES_BITS; порядок полей определяет расположение данных. */ +struct CANES_BITS { // bits description + /* Битовое поле TM, ширина 1 бит; данные TM. */ + Uint16 TM:1; // 0 Transmit Mode + /* Битовое поле RM, ширина 1 бит; данные RM. */ + Uint16 RM:1; // 1 Receive Mode + /* Битовое поле rsvd1, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:1; // 2 reserved + /* Битовое поле PDA, ширина 1 бит; данные PDA. */ + Uint16 PDA:1; // 3 Power-down acknowledge + /* Битовое поле CCE, ширина 1 бит; данные CCE. */ + Uint16 CCE:1; // 4 Change Configuration Enable + /* Битовое поле SMA, ширина 1 бит; данные SMA. */ + Uint16 SMA:1; // 5 Suspend Mode Acknowledge + /* Битовое поле rsvd2, ширина 10 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:10; // 15:6 reserved + /* Битовое поле EW, ширина 1 бит; данные EW. */ + Uint16 EW:1; // 16 Warning status + /* Битовое поле EP, ширина 1 бит; данные EP. */ + Uint16 EP:1; // 17 Error Passive status + /* Битовое поле BO, ширина 1 бит; данные BO. */ + Uint16 BO:1; // 18 Bus-off status + /* Битовое поле ACKE, ширина 1 бит; данные ACKE. */ + Uint16 ACKE:1; // 19 Acknowledge error + /* Битовое поле SE, ширина 1 бит; данные SE. */ + Uint16 SE:1; // 20 Stuff error + /* Битовое поле CRCE, ширина 1 бит; данные CRCE. */ + Uint16 CRCE:1; // 21 CRC error + /* Битовое поле SA1, ширина 1 бит; данные SA1. */ + Uint16 SA1:1; // 22 Stuck at Dominant error + /* Битовое поле BE, ширина 1 бит; данные BE. */ + Uint16 BE:1; // 23 Bit error + /* Битовое поле FE, ширина 1 бит; данные FE. */ + Uint16 FE:1; // 24 Framing error + /* Битовое поле rsvd3, ширина 7 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd3:7; // 31:25 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANES_REG в одной области памяти. */ +union CANES_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANES_BITS bit;; порядок полей определяет расположение данных. */ + struct CANES_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* eCAN Transmit Error Counter register (CANTEC) bit definitions */ +/* Описывает структуру CANTEC_BITS; порядок полей определяет расположение данных. */ +struct CANTEC_BITS { // bits description + /* Битовое поле TEC, ширина 8 бит; данные TEC. */ + Uint16 TEC:8; // 7:0 TEC + /* Битовое поле rsvd1, ширина 8 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:8; // 15:8 reserved + /* Битовое поле rsvd2, ширина 16 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:16; // 31:16 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANTEC_REG в одной области памяти. */ +union CANTEC_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANTEC_BITS bit;; порядок полей определяет расположение данных. */ + struct CANTEC_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* eCAN Receive Error Counter register (CANREC) bit definitions */ +/* Описывает структуру CANREC_BITS; порядок полей определяет расположение данных. */ +struct CANREC_BITS { // bits description + /* Битовое поле REC, ширина 8 бит; данные REC. */ + Uint16 REC:8; // 7:0 REC + /* Битовое поле rsvd1, ширина 8 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:8; // 15:8 reserved + /* Битовое поле rsvd2, ширина 16 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:16; // 31:16 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANREC_REG в одной области памяти. */ +union CANREC_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANREC_BITS bit;; порядок полей определяет расположение данных. */ + struct CANREC_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* eCAN Global Interrupt Flag 0 (CANGIF0) bit definitions */ +/* Описывает структуру CANGIF0_BITS; порядок полей определяет расположение данных. */ +struct CANGIF0_BITS { // bits description + /* Битовое поле MIV0, ширина 5 бит; данные MIV0. */ + Uint16 MIV0:5; // 4:0 Mailbox Interrupt Vector + /* Битовое поле rsvd1, ширина 3 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:3; // 7:5 reserved + /* Битовое поле WLIF0, ширина 1 бит; данные WLIF0. */ + Uint16 WLIF0:1; // 8 Warning level interrupt flag + /* Битовое поле EPIF0, ширина 1 бит; данные EPIF0. */ + Uint16 EPIF0:1; // 9 Error-passive interrupt flag + /* Битовое поле BOIF0, ширина 1 бит; данные BOIF0. */ + Uint16 BOIF0:1; // 10 Bus-off interrupt flag + /* Битовое поле RMLIF0, ширина 1 бит; данные RMLIF0. */ + Uint16 RMLIF0:1; // 11 Received message lost interrupt flag + /* Битовое поле WUIF0, ширина 1 бит; данные WUIF0. */ + Uint16 WUIF0:1; // 12 Wakeup interrupt flag + /* Битовое поле WDIF0, ширина 1 бит; данные WDIF0. */ + Uint16 WDIF0:1; // 13 Write denied interrupt flag + /* Битовое поле AAIF0, ширина 1 бит; данные AAIF0. */ + Uint16 AAIF0:1; // 14 Abort Ack interrupt flag + /* Битовое поле GMIF0, ширина 1 бит; данные GMIF0. */ + Uint16 GMIF0:1; // 15 Global MBX interrupt flag + /* Битовое поле TCOF0, ширина 1 бит; данные TCOF0. */ + Uint16 TCOF0:1; // 16 TSC Overflow flag + /* Битовое поле MTOF0, ширина 1 бит; данные MTOF0. */ + Uint16 MTOF0:1; // 17 Mailbox Timeout flag + /* Битовое поле rsvd2, ширина 14 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:14; // 31:18 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANGIF0_REG в одной области памяти. */ +union CANGIF0_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANGIF0_BITS bit;; порядок полей определяет расположение данных. */ + struct CANGIF0_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* eCAN Global Interrupt Mask register (CANGIM) bit definitions */ +/* Описывает структуру CANGIM_BITS; порядок полей определяет расположение данных. */ +struct CANGIM_BITS { // bits description + /* Битовое поле I0EN, ширина 1 бит; данные I0EN. */ + Uint16 I0EN:1; // 0 Interrupt 0 enable + /* Битовое поле I1EN, ширина 1 бит; данные I1EN. */ + Uint16 I1EN:1; // 1 Interrupt 1 enable + /* Битовое поле GIL, ширина 1 бит; данные GIL. */ + Uint16 GIL:1; // 2 Global Interrupt Level + /* Битовое поле rsvd1, ширина 5 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:5; // 7:3 reserved + /* Битовое поле WLIM, ширина 1 бит; данные WLIM. */ + Uint16 WLIM:1; // 8 Warning level interrupt mask + /* Битовое поле EPIM, ширина 1 бит; данные EPIM. */ + Uint16 EPIM:1; // 9 Error-passive interrupt mask + /* Битовое поле BOIM, ширина 1 бит; данные BOIM. */ + Uint16 BOIM:1; // 10 Bus-off interrupt mask + /* Битовое поле RMLIM, ширина 1 бит; данные RMLIM. */ + Uint16 RMLIM:1; // 11 Received message lost interrupt mask + /* Битовое поле WUIM, ширина 1 бит; данные WUIM. */ + Uint16 WUIM:1; // 12 Wakeup interrupt mask + /* Битовое поле WDIM, ширина 1 бит; данные WDIM. */ + Uint16 WDIM:1; // 13 Write denied interrupt mask + /* Битовое поле AAIM, ширина 1 бит; данные AAIM. */ + Uint16 AAIM:1; // 14 Abort Ack interrupt mask + /* Битовое поле rsvd2, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:1; // 15 reserved + /* Битовое поле TCOM, ширина 1 бит; данные TCOM. */ + Uint16 TCOM:1; // 16 TSC overflow interrupt mask + /* Битовое поле MTOM, ширина 1 бит; данные MTOM. */ + Uint16 MTOM:1; // 17 MBX Timeout interrupt mask + /* Битовое поле rsvd3, ширина 14 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd3:14; // 31:18 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANGIM_REG в одной области памяти. */ +union CANGIM_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANGIM_BITS bit;; порядок полей определяет расположение данных. */ + struct CANGIM_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* eCAN Global Interrupt Flag 1 (eCANGIF1) bit definitions */ +/* Описывает структуру CANGIF1_BITS; порядок полей определяет расположение данных. */ +struct CANGIF1_BITS { // bits description + /* Битовое поле MIV1, ширина 5 бит; данные MIV1. */ + Uint16 MIV1:5; // 4:0 Mailbox Interrupt Vector + /* Битовое поле rsvd1, ширина 3 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:3; // 7:5 reserved + /* Битовое поле WLIF1, ширина 1 бит; данные WLIF1. */ + Uint16 WLIF1:1; // 8 Warning level interrupt flag + /* Битовое поле EPIF1, ширина 1 бит; данные EPIF1. */ + Uint16 EPIF1:1; // 9 Error-passive interrupt flag + /* Битовое поле BOIF1, ширина 1 бит; данные BOIF1. */ + Uint16 BOIF1:1; // 10 Bus-off interrupt flag + /* Битовое поле RMLIF1, ширина 1 бит; данные RMLIF1. */ + Uint16 RMLIF1:1; // 11 Received message lost interrupt flag + /* Битовое поле WUIF1, ширина 1 бит; данные WUIF1. */ + Uint16 WUIF1:1; // 12 Wakeup interrupt flag + /* Битовое поле WDIF1, ширина 1 бит; данные WDIF1. */ + Uint16 WDIF1:1; // 13 Write denied interrupt flag + /* Битовое поле AAIF1, ширина 1 бит; данные AAIF1. */ + Uint16 AAIF1:1; // 14 Abort Ack interrupt flag + /* Битовое поле GMIF1, ширина 1 бит; данные GMIF1. */ + Uint16 GMIF1:1; // 15 Global MBX interrupt flag + /* Битовое поле TCOF1, ширина 1 бит; данные TCOF1. */ + Uint16 TCOF1:1; // 16 TSC Overflow flag + /* Битовое поле MTOF1, ширина 1 бит; данные MTOF1. */ + Uint16 MTOF1:1; // 17 Mailbox Timeout flag + /* Битовое поле rsvd2, ширина 14 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:14; // 31:18 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANGIF1_REG в одной области памяти. */ +union CANGIF1_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANGIF1_BITS bit;; порядок полей определяет расположение данных. */ + struct CANGIF1_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* eCAN Mailbox Interrupt Mask register (CANMIM) bit definitions */ +/* Описывает структуру CANMIM_BITS; порядок полей определяет расположение данных. */ +struct CANMIM_BITS { // bit description + /* Битовое поле MIM0, ширина 1 бит; данные MIM0. */ + Uint16 MIM0:1; // 0 MIM for Mailbox 0 + /* Битовое поле MIM1, ширина 1 бит; данные MIM1. */ + Uint16 MIM1:1; // 1 MIM for Mailbox 1 + /* Битовое поле MIM2, ширина 1 бит; данные MIM2. */ + Uint16 MIM2:1; // 2 MIM for Mailbox 2 + /* Битовое поле MIM3, ширина 1 бит; данные MIM3. */ + Uint16 MIM3:1; // 3 MIM for Mailbox 3 + /* Битовое поле MIM4, ширина 1 бит; данные MIM4. */ + Uint16 MIM4:1; // 4 MIM for Mailbox 4 + /* Битовое поле MIM5, ширина 1 бит; данные MIM5. */ + Uint16 MIM5:1; // 5 MIM for Mailbox 5 + /* Битовое поле MIM6, ширина 1 бит; данные MIM6. */ + Uint16 MIM6:1; // 6 MIM for Mailbox 6 + /* Битовое поле MIM7, ширина 1 бит; данные MIM7. */ + Uint16 MIM7:1; // 7 MIM for Mailbox 7 + /* Битовое поле MIM8, ширина 1 бит; данные MIM8. */ + Uint16 MIM8:1; // 8 MIM for Mailbox 8 + /* Битовое поле MIM9, ширина 1 бит; данные MIM9. */ + Uint16 MIM9:1; // 9 MIM for Mailbox 9 + /* Битовое поле MIM10, ширина 1 бит; данные MIM10. */ + Uint16 MIM10:1; // 10 MIM for Mailbox 10 + /* Битовое поле MIM11, ширина 1 бит; данные MIM11. */ + Uint16 MIM11:1; // 11 MIM for Mailbox 11 + /* Битовое поле MIM12, ширина 1 бит; данные MIM12. */ + Uint16 MIM12:1; // 12 MIM for Mailbox 12 + /* Битовое поле MIM13, ширина 1 бит; данные MIM13. */ + Uint16 MIM13:1; // 13 MIM for Mailbox 13 + /* Битовое поле MIM14, ширина 1 бит; данные MIM14. */ + Uint16 MIM14:1; // 14 MIM for Mailbox 14 + /* Битовое поле MIM15, ширина 1 бит; данные MIM15. */ + Uint16 MIM15:1; // 15 MIM for Mailbox 15 + /* Битовое поле MIM16, ширина 1 бит; данные MIM16. */ + Uint16 MIM16:1; // 16 MIM for Mailbox 16 + /* Битовое поле MIM17, ширина 1 бит; данные MIM17. */ + Uint16 MIM17:1; // 17 MIM for Mailbox 17 + /* Битовое поле MIM18, ширина 1 бит; данные MIM18. */ + Uint16 MIM18:1; // 18 MIM for Mailbox 18 + /* Битовое поле MIM19, ширина 1 бит; данные MIM19. */ + Uint16 MIM19:1; // 19 MIM for Mailbox 19 + /* Битовое поле MIM20, ширина 1 бит; данные MIM20. */ + Uint16 MIM20:1; // 20 MIM for Mailbox 20 + /* Битовое поле MIM21, ширина 1 бит; данные MIM21. */ + Uint16 MIM21:1; // 21 MIM for Mailbox 21 + /* Битовое поле MIM22, ширина 1 бит; данные MIM22. */ + Uint16 MIM22:1; // 22 MIM for Mailbox 22 + /* Битовое поле MIM23, ширина 1 бит; данные MIM23. */ + Uint16 MIM23:1; // 23 MIM for Mailbox 23 + /* Битовое поле MIM24, ширина 1 бит; данные MIM24. */ + Uint16 MIM24:1; // 24 MIM for Mailbox 24 + /* Битовое поле MIM25, ширина 1 бит; данные MIM25. */ + Uint16 MIM25:1; // 25 MIM for Mailbox 25 + /* Битовое поле MIM26, ширина 1 бит; данные MIM26. */ + Uint16 MIM26:1; // 26 MIM for Mailbox 26 + /* Битовое поле MIM27, ширина 1 бит; данные MIM27. */ + Uint16 MIM27:1; // 27 MIM for Mailbox 27 + /* Битовое поле MIM28, ширина 1 бит; данные MIM28. */ + Uint16 MIM28:1; // 28 MIM for Mailbox 28 + /* Битовое поле MIM29, ширина 1 бит; данные MIM29. */ + Uint16 MIM29:1; // 29 MIM for Mailbox 29 + /* Битовое поле MIM30, ширина 1 бит; данные MIM30. */ + Uint16 MIM30:1; // 30 MIM for Mailbox 30 + /* Битовое поле MIM31, ширина 1 бит; данные MIM31. */ + Uint16 MIM31:1; // 31 MIM for Mailbox 31 + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANMIM_REG в одной области памяти. */ +union CANMIM_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANMIM_BITS bit;; порядок полей определяет расположение данных. */ + struct CANMIM_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* eCAN Mailbox Interrupt Level register (CANMIL) bit definitions */ +/* Описывает структуру CANMIL_BITS; порядок полей определяет расположение данных. */ +struct CANMIL_BITS { // bit description + /* Битовое поле MIL0, ширина 1 бит; данные MIL0. */ + Uint16 MIL0:1; // 0 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL1, ширина 1 бит; данные MIL1. */ + Uint16 MIL1:1; // 1 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL2, ширина 1 бит; данные MIL2. */ + Uint16 MIL2:1; // 2 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL3, ширина 1 бит; данные MIL3. */ + Uint16 MIL3:1; // 3 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL4, ширина 1 бит; данные MIL4. */ + Uint16 MIL4:1; // 4 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL5, ширина 1 бит; данные MIL5. */ + Uint16 MIL5:1; // 5 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL6, ширина 1 бит; данные MIL6. */ + Uint16 MIL6:1; // 6 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL7, ширина 1 бит; данные MIL7. */ + Uint16 MIL7:1; // 7 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL8, ширина 1 бит; данные MIL8. */ + Uint16 MIL8:1; // 8 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL9, ширина 1 бит; данные MIL9. */ + Uint16 MIL9:1; // 9 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL10, ширина 1 бит; данные MIL10. */ + Uint16 MIL10:1; // 10 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL11, ширина 1 бит; данные MIL11. */ + Uint16 MIL11:1; // 11 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL12, ширина 1 бит; данные MIL12. */ + Uint16 MIL12:1; // 12 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL13, ширина 1 бит; данные MIL13. */ + Uint16 MIL13:1; // 13 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL14, ширина 1 бит; данные MIL14. */ + Uint16 MIL14:1; // 14 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL15, ширина 1 бит; данные MIL15. */ + Uint16 MIL15:1; // 15 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL16, ширина 1 бит; данные MIL16. */ + Uint16 MIL16:1; // 16 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL17, ширина 1 бит; данные MIL17. */ + Uint16 MIL17:1; // 17 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL18, ширина 1 бит; данные MIL18. */ + Uint16 MIL18:1; // 18 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL19, ширина 1 бит; данные MIL19. */ + Uint16 MIL19:1; // 19 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL20, ширина 1 бит; данные MIL20. */ + Uint16 MIL20:1; // 20 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL21, ширина 1 бит; данные MIL21. */ + Uint16 MIL21:1; // 21 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL22, ширина 1 бит; данные MIL22. */ + Uint16 MIL22:1; // 22 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL23, ширина 1 бит; данные MIL23. */ + Uint16 MIL23:1; // 23 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL24, ширина 1 бит; данные MIL24. */ + Uint16 MIL24:1; // 24 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL25, ширина 1 бит; данные MIL25. */ + Uint16 MIL25:1; // 25 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL26, ширина 1 бит; данные MIL26. */ + Uint16 MIL26:1; // 26 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL27, ширина 1 бит; данные MIL27. */ + Uint16 MIL27:1; // 27 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL28, ширина 1 бит; данные MIL28. */ + Uint16 MIL28:1; // 28 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL29, ширина 1 бит; данные MIL29. */ + Uint16 MIL29:1; // 29 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL30, ширина 1 бит; данные MIL30. */ + Uint16 MIL30:1; // 30 0 -> Int 9.5 1 -> Int 9.6 + /* Битовое поле MIL31, ширина 1 бит; данные MIL31. */ + Uint16 MIL31:1; // 31 0 -> Int 9.5 1 -> Int 9.6 + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANMIL_REG в одной области памяти. */ +union CANMIL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANMIL_BITS bit;; порядок полей определяет расположение данных. */ + struct CANMIL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* eCAN Overwrite Protection Control register (CANOPC) bit definitions */ +/* Описывает структуру CANOPC_BITS; порядок полей определяет расположение данных. */ +struct CANOPC_BITS { // bit description + /* Битовое поле OPC0, ширина 1 бит; данные OPC0. */ + Uint16 OPC0:1; // 0 OPC for Mailbox 0 + /* Битовое поле OPC1, ширина 1 бит; данные OPC1. */ + Uint16 OPC1:1; // 1 OPC for Mailbox 1 + /* Битовое поле OPC2, ширина 1 бит; данные OPC2. */ + Uint16 OPC2:1; // 2 OPC for Mailbox 2 + /* Битовое поле OPC3, ширина 1 бит; данные OPC3. */ + Uint16 OPC3:1; // 3 OPC for Mailbox 3 + /* Битовое поле OPC4, ширина 1 бит; данные OPC4. */ + Uint16 OPC4:1; // 4 OPC for Mailbox 4 + /* Битовое поле OPC5, ширина 1 бит; данные OPC5. */ + Uint16 OPC5:1; // 5 OPC for Mailbox 5 + /* Битовое поле OPC6, ширина 1 бит; данные OPC6. */ + Uint16 OPC6:1; // 6 OPC for Mailbox 6 + /* Битовое поле OPC7, ширина 1 бит; данные OPC7. */ + Uint16 OPC7:1; // 7 OPC for Mailbox 7 + /* Битовое поле OPC8, ширина 1 бит; данные OPC8. */ + Uint16 OPC8:1; // 8 OPC for Mailbox 8 + /* Битовое поле OPC9, ширина 1 бит; данные OPC9. */ + Uint16 OPC9:1; // 9 OPC for Mailbox 9 + /* Битовое поле OPC10, ширина 1 бит; данные OPC10. */ + Uint16 OPC10:1; // 10 OPC for Mailbox 10 + /* Битовое поле OPC11, ширина 1 бит; данные OPC11. */ + Uint16 OPC11:1; // 11 OPC for Mailbox 11 + /* Битовое поле OPC12, ширина 1 бит; данные OPC12. */ + Uint16 OPC12:1; // 12 OPC for Mailbox 12 + /* Битовое поле OPC13, ширина 1 бит; данные OPC13. */ + Uint16 OPC13:1; // 13 OPC for Mailbox 13 + /* Битовое поле OPC14, ширина 1 бит; данные OPC14. */ + Uint16 OPC14:1; // 14 OPC for Mailbox 14 + /* Битовое поле OPC15, ширина 1 бит; данные OPC15. */ + Uint16 OPC15:1; // 15 OPC for Mailbox 15 + /* Битовое поле OPC16, ширина 1 бит; данные OPC16. */ + Uint16 OPC16:1; // 16 OPC for Mailbox 16 + /* Битовое поле OPC17, ширина 1 бит; данные OPC17. */ + Uint16 OPC17:1; // 17 OPC for Mailbox 17 + /* Битовое поле OPC18, ширина 1 бит; данные OPC18. */ + Uint16 OPC18:1; // 18 OPC for Mailbox 18 + /* Битовое поле OPC19, ширина 1 бит; данные OPC19. */ + Uint16 OPC19:1; // 19 OPC for Mailbox 19 + /* Битовое поле OPC20, ширина 1 бит; данные OPC20. */ + Uint16 OPC20:1; // 20 OPC for Mailbox 20 + /* Битовое поле OPC21, ширина 1 бит; данные OPC21. */ + Uint16 OPC21:1; // 21 OPC for Mailbox 21 + /* Битовое поле OPC22, ширина 1 бит; данные OPC22. */ + Uint16 OPC22:1; // 22 OPC for Mailbox 22 + /* Битовое поле OPC23, ширина 1 бит; данные OPC23. */ + Uint16 OPC23:1; // 23 OPC for Mailbox 23 + /* Битовое поле OPC24, ширина 1 бит; данные OPC24. */ + Uint16 OPC24:1; // 24 OPC for Mailbox 24 + /* Битовое поле OPC25, ширина 1 бит; данные OPC25. */ + Uint16 OPC25:1; // 25 OPC for Mailbox 25 + /* Битовое поле OPC26, ширина 1 бит; данные OPC26. */ + Uint16 OPC26:1; // 26 OPC for Mailbox 26 + /* Битовое поле OPC27, ширина 1 бит; данные OPC27. */ + Uint16 OPC27:1; // 27 OPC for Mailbox 27 + /* Битовое поле OPC28, ширина 1 бит; данные OPC28. */ + Uint16 OPC28:1; // 28 OPC for Mailbox 28 + /* Битовое поле OPC29, ширина 1 бит; данные OPC29. */ + Uint16 OPC29:1; // 29 OPC for Mailbox 29 + /* Битовое поле OPC30, ширина 1 бит; данные OPC30. */ + Uint16 OPC30:1; // 30 OPC for Mailbox 30 + /* Битовое поле OPC31, ширина 1 бит; данные OPC31. */ + Uint16 OPC31:1; // 31 OPC for Mailbox 31 + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANOPC_REG в одной области памяти. */ +union CANOPC_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANOPC_BITS bit;; порядок полей определяет расположение данных. */ + struct CANOPC_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* eCAN TX I/O Control Register (CANTIOC) bit definitions */ +/* Описывает структуру CANTIOC_BITS; порядок полей определяет расположение данных. */ +struct CANTIOC_BITS { // bits description + /* Битовое поле rsvd1, ширина 3 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:3; // 2:0 reserved + /* Битовое поле TXFUNC, ширина 1 бит; данные TXFUNC. */ + Uint16 TXFUNC:1; // 3 TXFUNC + /* Битовое поле rsvd2, ширина 12 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:12; // 15:4 reserved + /* Битовое поле rsvd3, ширина 16 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd3:16; // 31:16 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANTIOC_REG в одной области памяти. */ +union CANTIOC_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANTIOC_BITS bit;; порядок полей определяет расположение данных. */ + struct CANTIOC_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* eCAN RX I/O Control Register (CANRIOC) bit definitions */ +/* Описывает структуру CANRIOC_BITS; порядок полей определяет расположение данных. */ +struct CANRIOC_BITS { // bits description + /* Битовое поле rsvd1, ширина 3 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:3; // 2:0 reserved + /* Битовое поле RXFUNC, ширина 1 бит; данные RXFUNC. */ + Uint16 RXFUNC:1; // 3 RXFUNC + /* Битовое поле rsvd2, ширина 12 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:12; // 15:4 reserved + /* Битовое поле rsvd3, ширина 16 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd3:16; // 31:16 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANRIOC_REG в одной области памяти. */ +union CANRIOC_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANRIOC_BITS bit;; порядок полей определяет расположение данных. */ + struct CANRIOC_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* eCAN Time-out Control register (CANTOC) bit definitions */ +/* Описывает структуру CANTOC_BITS; порядок полей определяет расположение данных. */ +struct CANTOC_BITS { // bit description + /* Битовое поле TOC0, ширина 1 бит; данные TOC0. */ + Uint16 TOC0:1; // 0 TOC for Mailbox 0 + /* Битовое поле TOC1, ширина 1 бит; данные TOC1. */ + Uint16 TOC1:1; // 1 TOC for Mailbox 1 + /* Битовое поле TOC2, ширина 1 бит; данные TOC2. */ + Uint16 TOC2:1; // 2 TOC for Mailbox 2 + /* Битовое поле TOC3, ширина 1 бит; данные TOC3. */ + Uint16 TOC3:1; // 3 TOC for Mailbox 3 + /* Битовое поле TOC4, ширина 1 бит; данные TOC4. */ + Uint16 TOC4:1; // 4 TOC for Mailbox 4 + /* Битовое поле TOC5, ширина 1 бит; данные TOC5. */ + Uint16 TOC5:1; // 5 TOC for Mailbox 5 + /* Битовое поле TOC6, ширина 1 бит; данные TOC6. */ + Uint16 TOC6:1; // 6 TOC for Mailbox 6 + /* Битовое поле TOC7, ширина 1 бит; данные TOC7. */ + Uint16 TOC7:1; // 7 TOC for Mailbox 7 + /* Битовое поле TOC8, ширина 1 бит; данные TOC8. */ + Uint16 TOC8:1; // 8 TOC for Mailbox 8 + /* Битовое поле TOC9, ширина 1 бит; данные TOC9. */ + Uint16 TOC9:1; // 9 TOC for Mailbox 9 + /* Битовое поле TOC10, ширина 1 бит; данные TOC10. */ + Uint16 TOC10:1; // 10 TOC for Mailbox 10 + /* Битовое поле TOC11, ширина 1 бит; данные TOC11. */ + Uint16 TOC11:1; // 11 TOC for Mailbox 11 + /* Битовое поле TOC12, ширина 1 бит; данные TOC12. */ + Uint16 TOC12:1; // 12 TOC for Mailbox 12 + /* Битовое поле TOC13, ширина 1 бит; данные TOC13. */ + Uint16 TOC13:1; // 13 TOC for Mailbox 13 + /* Битовое поле TOC14, ширина 1 бит; данные TOC14. */ + Uint16 TOC14:1; // 14 TOC for Mailbox 14 + /* Битовое поле TOC15, ширина 1 бит; данные TOC15. */ + Uint16 TOC15:1; // 15 TOC for Mailbox 15 + /* Битовое поле TOC16, ширина 1 бит; данные TOC16. */ + Uint16 TOC16:1; // 16 TOC for Mailbox 16 + /* Битовое поле TOC17, ширина 1 бит; данные TOC17. */ + Uint16 TOC17:1; // 17 TOC for Mailbox 17 + /* Битовое поле TOC18, ширина 1 бит; данные TOC18. */ + Uint16 TOC18:1; // 18 TOC for Mailbox 18 + /* Битовое поле TOC19, ширина 1 бит; данные TOC19. */ + Uint16 TOC19:1; // 19 TOC for Mailbox 19 + /* Битовое поле TOC20, ширина 1 бит; данные TOC20. */ + Uint16 TOC20:1; // 20 TOC for Mailbox 20 + /* Битовое поле TOC21, ширина 1 бит; данные TOC21. */ + Uint16 TOC21:1; // 21 TOC for Mailbox 21 + /* Битовое поле TOC22, ширина 1 бит; данные TOC22. */ + Uint16 TOC22:1; // 22 TOC for Mailbox 22 + /* Битовое поле TOC23, ширина 1 бит; данные TOC23. */ + Uint16 TOC23:1; // 23 TOC for Mailbox 23 + /* Битовое поле TOC24, ширина 1 бит; данные TOC24. */ + Uint16 TOC24:1; // 24 TOC for Mailbox 24 + /* Битовое поле TOC25, ширина 1 бит; данные TOC25. */ + Uint16 TOC25:1; // 25 TOC for Mailbox 25 + /* Битовое поле TOC26, ширина 1 бит; данные TOC26. */ + Uint16 TOC26:1; // 26 TOC for Mailbox 26 + /* Битовое поле TOC27, ширина 1 бит; данные TOC27. */ + Uint16 TOC27:1; // 27 TOC for Mailbox 27 + /* Битовое поле TOC28, ширина 1 бит; данные TOC28. */ + Uint16 TOC28:1; // 28 TOC for Mailbox 28 + /* Битовое поле TOC29, ширина 1 бит; данные TOC29. */ + Uint16 TOC29:1; // 29 TOC for Mailbox 29 + /* Битовое поле TOC30, ширина 1 бит; данные TOC30. */ + Uint16 TOC30:1; // 30 TOC for Mailbox 30 + /* Битовое поле TOC31, ширина 1 бит; данные TOC31. */ + Uint16 TOC31:1; // 31 TOC for Mailbox 31 + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANTOC_REG в одной области памяти. */ +union CANTOC_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANTOC_BITS bit;; порядок полей определяет расположение данных. */ + struct CANTOC_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* eCAN Time-out Status register (CANTOS) bit definitions */ +/* Описывает структуру CANTOS_BITS; порядок полей определяет расположение данных. */ +struct CANTOS_BITS { // bit description + /* Битовое поле TOS0, ширина 1 бит; данные TOS0. */ + Uint16 TOS0:1; // 0 TOS for Mailbox 0 + /* Битовое поле TOS1, ширина 1 бит; данные TOS1. */ + Uint16 TOS1:1; // 1 TOS for Mailbox 1 + /* Битовое поле TOS2, ширина 1 бит; данные TOS2. */ + Uint16 TOS2:1; // 2 TOS for Mailbox 2 + /* Битовое поле TOS3, ширина 1 бит; данные TOS3. */ + Uint16 TOS3:1; // 3 TOS for Mailbox 3 + /* Битовое поле TOS4, ширина 1 бит; данные TOS4. */ + Uint16 TOS4:1; // 4 TOS for Mailbox 4 + /* Битовое поле TOS5, ширина 1 бит; данные TOS5. */ + Uint16 TOS5:1; // 5 TOS for Mailbox 5 + /* Битовое поле TOS6, ширина 1 бит; данные TOS6. */ + Uint16 TOS6:1; // 6 TOS for Mailbox 6 + /* Битовое поле TOS7, ширина 1 бит; данные TOS7. */ + Uint16 TOS7:1; // 7 TOS for Mailbox 7 + /* Битовое поле TOS8, ширина 1 бит; данные TOS8. */ + Uint16 TOS8:1; // 8 TOS for Mailbox 8 + /* Битовое поле TOS9, ширина 1 бит; данные TOS9. */ + Uint16 TOS9:1; // 9 TOS for Mailbox 9 + /* Битовое поле TOS10, ширина 1 бит; данные TOS10. */ + Uint16 TOS10:1; // 10 TOS for Mailbox 10 + /* Битовое поле TOS11, ширина 1 бит; данные TOS11. */ + Uint16 TOS11:1; // 11 TOS for Mailbox 11 + /* Битовое поле TOS12, ширина 1 бит; данные TOS12. */ + Uint16 TOS12:1; // 12 TOS for Mailbox 12 + /* Битовое поле TOS13, ширина 1 бит; данные TOS13. */ + Uint16 TOS13:1; // 13 TOS for Mailbox 13 + /* Битовое поле TOS14, ширина 1 бит; данные TOS14. */ + Uint16 TOS14:1; // 14 TOS for Mailbox 14 + /* Битовое поле TOS15, ширина 1 бит; данные TOS15. */ + Uint16 TOS15:1; // 15 TOS for Mailbox 15 + /* Битовое поле TOS16, ширина 1 бит; данные TOS16. */ + Uint16 TOS16:1; // 16 TOS for Mailbox 16 + /* Битовое поле TOS17, ширина 1 бит; данные TOS17. */ + Uint16 TOS17:1; // 17 TOS for Mailbox 17 + /* Битовое поле TOS18, ширина 1 бит; данные TOS18. */ + Uint16 TOS18:1; // 18 TOS for Mailbox 18 + /* Битовое поле TOS19, ширина 1 бит; данные TOS19. */ + Uint16 TOS19:1; // 19 TOS for Mailbox 19 + /* Битовое поле TOS20, ширина 1 бит; данные TOS20. */ + Uint16 TOS20:1; // 20 TOS for Mailbox 20 + /* Битовое поле TOS21, ширина 1 бит; данные TOS21. */ + Uint16 TOS21:1; // 21 TOS for Mailbox 21 + /* Битовое поле TOS22, ширина 1 бит; данные TOS22. */ + Uint16 TOS22:1; // 22 TOS for Mailbox 22 + /* Битовое поле TOS23, ширина 1 бит; данные TOS23. */ + Uint16 TOS23:1; // 23 TOS for Mailbox 23 + /* Битовое поле TOS24, ширина 1 бит; данные TOS24. */ + Uint16 TOS24:1; // 24 TOS for Mailbox 24 + /* Битовое поле TOS25, ширина 1 бит; данные TOS25. */ + Uint16 TOS25:1; // 25 TOS for Mailbox 25 + /* Битовое поле TOS26, ширина 1 бит; данные TOS26. */ + Uint16 TOS26:1; // 26 TOS for Mailbox 26 + /* Битовое поле TOS27, ширина 1 бит; данные TOS27. */ + Uint16 TOS27:1; // 27 TOS for Mailbox 27 + /* Битовое поле TOS28, ширина 1 бит; данные TOS28. */ + Uint16 TOS28:1; // 28 TOS for Mailbox 28 + /* Битовое поле TOS29, ширина 1 бит; данные TOS29. */ + Uint16 TOS29:1; // 29 TOS for Mailbox 29 + /* Битовое поле TOS30, ширина 1 бит; данные TOS30. */ + Uint16 TOS30:1; // 30 TOS for Mailbox 30 + /* Битовое поле TOS31, ширина 1 бит; данные TOS31. */ + Uint16 TOS31:1; // 31 TOS for Mailbox 31 + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANTOS_REG в одной области памяти. */ +union CANTOS_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANTOS_BITS bit;; порядок полей определяет расположение данных. */ + struct CANTOS_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/**************************************/ +/* eCAN Control & Status register file */ +/**************************************/ + +/* Описывает структуру ECAN_REGS; порядок полей определяет расположение данных. */ +struct ECAN_REGS { + /* Объединяет несколько представлений CANME_REG CANME; в одной области памяти. */ + union CANME_REG CANME; // Mailbox Enable + /* Объединяет несколько представлений CANMD_REG CANMD; в одной области памяти. */ + union CANMD_REG CANMD; // Mailbox Direction + /* Объединяет несколько представлений CANTRS_REG CANTRS; в одной области памяти. */ + union CANTRS_REG CANTRS; // Transmit Request Set + /* Объединяет несколько представлений CANTRR_REG CANTRR; в одной области памяти. */ + union CANTRR_REG CANTRR; // Transmit Request Reset + /* Объединяет несколько представлений CANTA_REG CANTA; в одной области памяти. */ + union CANTA_REG CANTA; // Transmit Acknowledge + /* Объединяет несколько представлений CANAA_REG CANAA; в одной области памяти. */ + union CANAA_REG CANAA; // Abort Acknowledge + /* Объединяет несколько представлений CANRMP_REG CANRMP; в одной области памяти. */ + union CANRMP_REG CANRMP; // Received Message Pending + /* Объединяет несколько представлений CANRML_REG CANRML; в одной области памяти. */ + union CANRML_REG CANRML; // Received Message Lost + /* Объединяет несколько представлений CANRFP_REG CANRFP; в одной области памяти. */ + union CANRFP_REG CANRFP; // Remote Frame Pending + /* Объединяет несколько представлений CANGAM_REG CANGAM; в одной области памяти. */ + union CANGAM_REG CANGAM; // Global Acceptance Mask + /* Объединяет несколько представлений CANMC_REG CANMC; в одной области памяти. */ + union CANMC_REG CANMC; // Master Control + /* Объединяет несколько представлений CANBTC_REG CANBTC; в одной области памяти. */ + union CANBTC_REG CANBTC; // Bit Timing + /* Объединяет несколько представлений CANES_REG CANES; в одной области памяти. */ + union CANES_REG CANES; // Error Status + /* Объединяет несколько представлений CANTEC_REG CANTEC; в одной области памяти. */ + union CANTEC_REG CANTEC; // Transmit Error Counter + /* Объединяет несколько представлений CANREC_REG CANREC; в одной области памяти. */ + union CANREC_REG CANREC; // Receive Error Counter + /* Объединяет несколько представлений CANGIF0_REG CANGIF0; в одной области памяти. */ + union CANGIF0_REG CANGIF0; // Global Interrupt Flag 0 + /* Объединяет несколько представлений CANGIM_REG CANGIM; в одной области памяти. */ + union CANGIM_REG CANGIM; // Global Interrupt Mask 0 + /* Объединяет несколько представлений CANGIF1_REG CANGIF1; в одной области памяти. */ + union CANGIF1_REG CANGIF1; // Global Interrupt Flag 1 + /* Объединяет несколько представлений CANMIM_REG CANMIM; в одной области памяти. */ + union CANMIM_REG CANMIM; // Mailbox Interrupt Mask + /* Объединяет несколько представлений CANMIL_REG CANMIL; в одной области памяти. */ + union CANMIL_REG CANMIL; // Mailbox Interrupt Level + /* Объединяет несколько представлений CANOPC_REG CANOPC; в одной области памяти. */ + union CANOPC_REG CANOPC; // Overwrite Protection Control + /* Объединяет несколько представлений CANTIOC_REG CANTIOC; в одной области памяти. */ + union CANTIOC_REG CANTIOC; // TX I/O Control + /* Объединяет несколько представлений CANRIOC_REG CANRIOC; в одной области памяти. */ + union CANRIOC_REG CANRIOC; // RX I/O Control + /* Объявляет CANTSC — данные CANTSC. */ + Uint32 CANTSC; // Time-stamp counter + /* Объединяет несколько представлений CANTOC_REG CANTOC; в одной области памяти. */ + union CANTOC_REG CANTOC; // Time-out Control + /* Объединяет несколько представлений CANTOS_REG CANTOS; в одной области памяти. */ + union CANTOS_REG CANTOS; // Time-out Status + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* --------------------------------------------------- */ +/* eCAN Mailbox Registers */ +/* ----------------------------------------------------*/ + +/* eCAN Message ID (MSGID) bit definitions */ +/* Описывает структуру CANMSGID_BITS; порядок полей определяет расположение данных. */ +struct CANMSGID_BITS { // bits description + /* Битовое поле EXTMSGID_L, ширина 16 бит; данные EXTMSGID_L. */ + Uint16 EXTMSGID_L:16; // 0:15 + /* Битовое поле EXTMSGID_H, ширина 2 бит; данные EXTMSGID_H. */ + Uint16 EXTMSGID_H:2; // 16:17 + /* Битовое поле STDMSGID, ширина 11 бит; данные STDMSGID. */ + Uint16 STDMSGID:11; // 18:28 + /* Битовое поле AAM, ширина 1 бит; данные AAM. */ + Uint16 AAM:1; // 29 + /* Битовое поле AME, ширина 1 бит; данные AME. */ + Uint16 AME:1; // 30 + /* Битовое поле IDE, ширина 1 бит; данные IDE. */ + Uint16 IDE:1; // 31 + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANMSGID_REG в одной области памяти. */ +union CANMSGID_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANMSGID_BITS bit;; порядок полей определяет расположение данных. */ + struct CANMSGID_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* eCAN Message Control Register (MSGCTRL) bit definitions */ +/* Описывает структуру CANMSGCTRL_BITS; порядок полей определяет расположение данных. */ +struct CANMSGCTRL_BITS { // bits description + /* Битовое поле DLC, ширина 4 бит; данные DLC. */ + Uint16 DLC:4; // 0:3 + /* Битовое поле RTR, ширина 1 бит; данные RTR. */ + Uint16 RTR:1; // 4 + /* Битовое поле rsvd1, ширина 3 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:3; // 7:5 reserved + /* Битовое поле TPL, ширина 5 бит; данные TPL. */ + Uint16 TPL:5; // 12:8 + /* Битовое поле rsvd2, ширина 3 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:3; // 15:13 reserved + /* Битовое поле rsvd3, ширина 16 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd3:16; // 31:16 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANMSGCTRL_REG в одной области памяти. */ +union CANMSGCTRL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANMSGCTRL_BITS bit;; порядок полей определяет расположение данных. */ + struct CANMSGCTRL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* eCAN Message Data Register low (MDR_L) word definitions */ +/* Описывает структуру CANMDL_WORDS; порядок полей определяет расположение данных. */ +struct CANMDL_WORDS { // bits description + /* Битовое поле LOW_WORD, ширина 16 бит; LOW слово. */ + Uint16 LOW_WORD:16; // 0:15 + /* Битовое поле HI_WORD, ширина 16 бит; HI слово. */ + Uint16 HI_WORD:16; // 31:16 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* eCAN Message Data Register low (MDR_L) byte definitions */ +/* Описывает структуру CANMDL_BYTES; порядок полей определяет расположение данных. */ +struct CANMDL_BYTES { // bits description + /* Битовое поле BYTE3, ширина 8 бит; данные BYTE3. */ + Uint16 BYTE3:8; // 31:24 + /* Битовое поле BYTE2, ширина 8 бит; данные BYTE2. */ + Uint16 BYTE2:8; // 23:16 + /* Битовое поле BYTE1, ширина 8 бит; данные BYTE1. */ + Uint16 BYTE1:8; // 15:8 + /* Битовое поле BYTE0, ширина 8 бит; данные BYTE0. */ + Uint16 BYTE0:8; // 7:0 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Allow access to the bit fields or entire register */ + +/* Объединяет несколько представлений CANMDL_REG в одной области памяти. */ +union CANMDL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANMDL_WORDS word;; порядок полей определяет расположение данных. */ + struct CANMDL_WORDS word; + /* Описывает структуру CANMDL_BYTES byte;; порядок полей определяет расположение данных. */ + struct CANMDL_BYTES byte; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + + +/* eCAN Message Data Register high (MDR_H) word definitions */ +/* Описывает структуру CANMDH_WORDS; порядок полей определяет расположение данных. */ +struct CANMDH_WORDS { // bits description + /* Битовое поле LOW_WORD, ширина 16 бит; LOW слово. */ + Uint16 LOW_WORD:16; // 0:15 + /* Битовое поле HI_WORD, ширина 16 бит; HI слово. */ + Uint16 HI_WORD:16; // 31:16 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* eCAN Message Data Register low (MDR_H) byte definitions */ +/* Описывает структуру CANMDH_BYTES; порядок полей определяет расположение данных. */ +struct CANMDH_BYTES { // bits description + /* Битовое поле BYTE7, ширина 8 бит; данные BYTE7. */ + Uint16 BYTE7:8; // 63:56 + /* Битовое поле BYTE6, ширина 8 бит; данные BYTE6. */ + Uint16 BYTE6:8; // 55:48 + /* Битовое поле BYTE5, ширина 8 бит; данные BYTE5. */ + Uint16 BYTE5:8; // 47:40 + /* Битовое поле BYTE4, ширина 8 бит; данные BYTE4. */ + Uint16 BYTE4:8; // 39:32 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANMDH_REG в одной области памяти. */ +union CANMDH_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANMDH_WORDS word;; порядок полей определяет расположение данных. */ + struct CANMDH_WORDS word; + /* Описывает структуру CANMDH_BYTES byte;; порядок полей определяет расположение данных. */ + struct CANMDH_BYTES byte; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Описывает структуру MBOX; порядок полей определяет расположение данных. */ +struct MBOX { + /* Объединяет несколько представлений CANMSGID_REG MSGID; в одной области памяти. */ + union CANMSGID_REG MSGID; + /* Объединяет несколько представлений CANMSGCTRL_REG MSGCTRL; в одной области памяти. */ + union CANMSGCTRL_REG MSGCTRL; + /* Объединяет несколько представлений CANMDL_REG MDL; в одной области памяти. */ + union CANMDL_REG MDL; + /* Объединяет несколько представлений CANMDH_REG MDH; в одной области памяти. */ + union CANMDH_REG MDH; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/**************************************/ +/* eCAN Mailboxes */ +/**************************************/ + +/* Описывает структуру ECAN_MBOXES; порядок полей определяет расположение данных. */ +struct ECAN_MBOXES { + /* Описывает структуру MBOX MBOX0;; порядок полей определяет расположение данных. */ + struct MBOX MBOX0; + /* Описывает структуру MBOX MBOX1;; порядок полей определяет расположение данных. */ + struct MBOX MBOX1; + /* Описывает структуру MBOX MBOX2;; порядок полей определяет расположение данных. */ + struct MBOX MBOX2; + /* Описывает структуру MBOX MBOX3;; порядок полей определяет расположение данных. */ + struct MBOX MBOX3; + /* Описывает структуру MBOX MBOX4;; порядок полей определяет расположение данных. */ + struct MBOX MBOX4; + /* Описывает структуру MBOX MBOX5;; порядок полей определяет расположение данных. */ + struct MBOX MBOX5; + /* Описывает структуру MBOX MBOX6;; порядок полей определяет расположение данных. */ + struct MBOX MBOX6; + /* Описывает структуру MBOX MBOX7;; порядок полей определяет расположение данных. */ + struct MBOX MBOX7; + /* Описывает структуру MBOX MBOX8;; порядок полей определяет расположение данных. */ + struct MBOX MBOX8; + /* Описывает структуру MBOX MBOX9;; порядок полей определяет расположение данных. */ + struct MBOX MBOX9; + /* Описывает структуру MBOX MBOX10;; порядок полей определяет расположение данных. */ + struct MBOX MBOX10; + /* Описывает структуру MBOX MBOX11;; порядок полей определяет расположение данных. */ + struct MBOX MBOX11; + /* Описывает структуру MBOX MBOX12;; порядок полей определяет расположение данных. */ + struct MBOX MBOX12; + /* Описывает структуру MBOX MBOX13;; порядок полей определяет расположение данных. */ + struct MBOX MBOX13; + /* Описывает структуру MBOX MBOX14;; порядок полей определяет расположение данных. */ + struct MBOX MBOX14; + /* Описывает структуру MBOX MBOX15;; порядок полей определяет расположение данных. */ + struct MBOX MBOX15; + /* Описывает структуру MBOX MBOX16;; порядок полей определяет расположение данных. */ + struct MBOX MBOX16; + /* Описывает структуру MBOX MBOX17;; порядок полей определяет расположение данных. */ + struct MBOX MBOX17; + /* Описывает структуру MBOX MBOX18;; порядок полей определяет расположение данных. */ + struct MBOX MBOX18; + /* Описывает структуру MBOX MBOX19;; порядок полей определяет расположение данных. */ + struct MBOX MBOX19; + /* Описывает структуру MBOX MBOX20;; порядок полей определяет расположение данных. */ + struct MBOX MBOX20; + /* Описывает структуру MBOX MBOX21;; порядок полей определяет расположение данных. */ + struct MBOX MBOX21; + /* Описывает структуру MBOX MBOX22;; порядок полей определяет расположение данных. */ + struct MBOX MBOX22; + /* Описывает структуру MBOX MBOX23;; порядок полей определяет расположение данных. */ + struct MBOX MBOX23; + /* Описывает структуру MBOX MBOX24;; порядок полей определяет расположение данных. */ + struct MBOX MBOX24; + /* Описывает структуру MBOX MBOX25;; порядок полей определяет расположение данных. */ + struct MBOX MBOX25; + /* Описывает структуру MBOX MBOX26;; порядок полей определяет расположение данных. */ + struct MBOX MBOX26; + /* Описывает структуру MBOX MBOX27;; порядок полей определяет расположение данных. */ + struct MBOX MBOX27; + /* Описывает структуру MBOX MBOX28;; порядок полей определяет расположение данных. */ + struct MBOX MBOX28; + /* Описывает структуру MBOX MBOX29;; порядок полей определяет расположение данных. */ + struct MBOX MBOX29; + /* Описывает структуру MBOX MBOX30;; порядок полей определяет расположение данных. */ + struct MBOX MBOX30; + /* Описывает структуру MBOX MBOX31;; порядок полей определяет расположение данных. */ + struct MBOX MBOX31; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* eCAN Local Acceptance Mask (LAM) bit definitions */ +/* Описывает структуру CANLAM_BITS; порядок полей определяет расположение данных. */ +struct CANLAM_BITS { // bits description + /* Битовое поле LAM_L, ширина 16 бит; данные LAM_L. */ + Uint16 LAM_L:16; // 0:15 + /* Битовое поле LAM_H, ширина 13 бит; данные LAM_H. */ + Uint16 LAM_H:13; // 16:28 + /* Битовое поле rsvd1, ширина 2 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:2; // 29:30 reserved + /* Битовое поле LAMI, ширина 1 бит; данные LAMI. */ + Uint16 LAMI:1; // 31 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CANLAM_REG в одной области памяти. */ +union CANLAM_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CANLAM_BITS bit;; порядок полей определяет расположение данных. */ + struct CANLAM_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/**************************************/ +/* eCAN Local Acceptance Masks */ +/**************************************/ + +/* eCAN LAM File */ +/* Описывает структуру LAM_REGS; порядок полей определяет расположение данных. */ +struct LAM_REGS { + /* Объединяет несколько представлений CANLAM_REG LAM0; в одной области памяти. */ + union CANLAM_REG LAM0; + /* Объединяет несколько представлений CANLAM_REG LAM1; в одной области памяти. */ + union CANLAM_REG LAM1; + /* Объединяет несколько представлений CANLAM_REG LAM2; в одной области памяти. */ + union CANLAM_REG LAM2; + /* Объединяет несколько представлений CANLAM_REG LAM3; в одной области памяти. */ + union CANLAM_REG LAM3; + /* Объединяет несколько представлений CANLAM_REG LAM4; в одной области памяти. */ + union CANLAM_REG LAM4; + /* Объединяет несколько представлений CANLAM_REG LAM5; в одной области памяти. */ + union CANLAM_REG LAM5; + /* Объединяет несколько представлений CANLAM_REG LAM6; в одной области памяти. */ + union CANLAM_REG LAM6; + /* Объединяет несколько представлений CANLAM_REG LAM7; в одной области памяти. */ + union CANLAM_REG LAM7; + /* Объединяет несколько представлений CANLAM_REG LAM8; в одной области памяти. */ + union CANLAM_REG LAM8; + /* Объединяет несколько представлений CANLAM_REG LAM9; в одной области памяти. */ + union CANLAM_REG LAM9; + /* Объединяет несколько представлений CANLAM_REG LAM10; в одной области памяти. */ + union CANLAM_REG LAM10; + /* Объединяет несколько представлений CANLAM_REG LAM11; в одной области памяти. */ + union CANLAM_REG LAM11; + /* Объединяет несколько представлений CANLAM_REG LAM12; в одной области памяти. */ + union CANLAM_REG LAM12; + /* Объединяет несколько представлений CANLAM_REG LAM13; в одной области памяти. */ + union CANLAM_REG LAM13; + /* Объединяет несколько представлений CANLAM_REG LAM14; в одной области памяти. */ + union CANLAM_REG LAM14; + /* Объединяет несколько представлений CANLAM_REG LAM15; в одной области памяти. */ + union CANLAM_REG LAM15; + /* Объединяет несколько представлений CANLAM_REG LAM16; в одной области памяти. */ + union CANLAM_REG LAM16; + /* Объединяет несколько представлений CANLAM_REG LAM17; в одной области памяти. */ + union CANLAM_REG LAM17; + /* Объединяет несколько представлений CANLAM_REG LAM18; в одной области памяти. */ + union CANLAM_REG LAM18; + /* Объединяет несколько представлений CANLAM_REG LAM19; в одной области памяти. */ + union CANLAM_REG LAM19; + /* Объединяет несколько представлений CANLAM_REG LAM20; в одной области памяти. */ + union CANLAM_REG LAM20; + /* Объединяет несколько представлений CANLAM_REG LAM21; в одной области памяти. */ + union CANLAM_REG LAM21; + /* Объединяет несколько представлений CANLAM_REG LAM22; в одной области памяти. */ + union CANLAM_REG LAM22; + /* Объединяет несколько представлений CANLAM_REG LAM23; в одной области памяти. */ + union CANLAM_REG LAM23; + /* Объединяет несколько представлений CANLAM_REG LAM24; в одной области памяти. */ + union CANLAM_REG LAM24; + /* Объединяет несколько представлений CANLAM_REG LAM25; в одной области памяти. */ + union CANLAM_REG LAM25; + /* Объединяет несколько представлений CANLAM_REG LAM26; в одной области памяти. */ + union CANLAM_REG LAM26; + /* Объединяет несколько представлений CANLAM_REG LAM27; в одной области памяти. */ + union CANLAM_REG LAM27; + /* Объединяет несколько представлений CANLAM_REG LAM28; в одной области памяти. */ + union CANLAM_REG LAM28; + /* Объединяет несколько представлений CANLAM_REG LAM29; в одной области памяти. */ + union CANLAM_REG LAM29; + /* Объединяет несколько представлений CANLAM_REG LAM30; в одной области памяти. */ + union CANLAM_REG LAM30; + /* Объединяет несколько представлений CANLAM_REG LAM31; в одной области памяти. */ + union CANLAM_REG LAM31; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Mailbox MOTS File */ + +/* Описывает структуру MOTS_REGS; порядок полей определяет расположение данных. */ +struct MOTS_REGS { + /* Объявляет MOTS0 — данные MOTS0. */ + Uint32 MOTS0; + /* Объявляет MOTS1 — данные MOTS1. */ + Uint32 MOTS1; + /* Объявляет MOTS2 — данные MOTS2. */ + Uint32 MOTS2; + /* Объявляет MOTS3 — данные MOTS3. */ + Uint32 MOTS3; + /* Объявляет MOTS4 — данные MOTS4. */ + Uint32 MOTS4; + /* Объявляет MOTS5 — данные MOTS5. */ + Uint32 MOTS5; + /* Объявляет MOTS6 — данные MOTS6. */ + Uint32 MOTS6; + /* Объявляет MOTS7 — данные MOTS7. */ + Uint32 MOTS7; + /* Объявляет MOTS8 — данные MOTS8. */ + Uint32 MOTS8; + /* Объявляет MOTS9 — данные MOTS9. */ + Uint32 MOTS9; + /* Объявляет MOTS10 — данные MOTS10. */ + Uint32 MOTS10; + /* Объявляет MOTS11 — данные MOTS11. */ + Uint32 MOTS11; + /* Объявляет MOTS12 — данные MOTS12. */ + Uint32 MOTS12; + /* Объявляет MOTS13 — данные MOTS13. */ + Uint32 MOTS13; + /* Объявляет MOTS14 — данные MOTS14. */ + Uint32 MOTS14; + /* Объявляет MOTS15 — данные MOTS15. */ + Uint32 MOTS15; + /* Объявляет MOTS16 — данные MOTS16. */ + Uint32 MOTS16; + /* Объявляет MOTS17 — данные MOTS17. */ + Uint32 MOTS17; + /* Объявляет MOTS18 — данные MOTS18. */ + Uint32 MOTS18; + /* Объявляет MOTS19 — данные MOTS19. */ + Uint32 MOTS19; + /* Объявляет MOTS20 — данные MOTS20. */ + Uint32 MOTS20; + /* Объявляет MOTS21 — данные MOTS21. */ + Uint32 MOTS21; + /* Объявляет MOTS22 — данные MOTS22. */ + Uint32 MOTS22; + /* Объявляет MOTS23 — данные MOTS23. */ + Uint32 MOTS23; + /* Объявляет MOTS24 — данные MOTS24. */ + Uint32 MOTS24; + /* Объявляет MOTS25 — данные MOTS25. */ + Uint32 MOTS25; + /* Объявляет MOTS26 — данные MOTS26. */ + Uint32 MOTS26; + /* Объявляет MOTS27 — данные MOTS27. */ + Uint32 MOTS27; + /* Объявляет MOTS28 — данные MOTS28. */ + Uint32 MOTS28; + /* Объявляет MOTS29 — данные MOTS29. */ + Uint32 MOTS29; + /* Объявляет MOTS30 — данные MOTS30. */ + Uint32 MOTS30; + /* Объявляет MOTS31 — данные MOTS31. */ + Uint32 MOTS31; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Mailbox MOTO File */ + +/* Описывает структуру MOTO_REGS; порядок полей определяет расположение данных. */ +struct MOTO_REGS { + /* Объявляет MOTO0 — данные MOTO0. */ + Uint32 MOTO0; + /* Объявляет MOTO1 — данные MOTO1. */ + Uint32 MOTO1; + /* Объявляет MOTO2 — данные MOTO2. */ + Uint32 MOTO2; + /* Объявляет MOTO3 — данные MOTO3. */ + Uint32 MOTO3; + /* Объявляет MOTO4 — данные MOTO4. */ + Uint32 MOTO4; + /* Объявляет MOTO5 — данные MOTO5. */ + Uint32 MOTO5; + /* Объявляет MOTO6 — данные MOTO6. */ + Uint32 MOTO6; + /* Объявляет MOTO7 — данные MOTO7. */ + Uint32 MOTO7; + /* Объявляет MOTO8 — данные MOTO8. */ + Uint32 MOTO8; + /* Объявляет MOTO9 — данные MOTO9. */ + Uint32 MOTO9; + /* Объявляет MOTO10 — данные MOTO10. */ + Uint32 MOTO10; + /* Объявляет MOTO11 — данные MOTO11. */ + Uint32 MOTO11; + /* Объявляет MOTO12 — данные MOTO12. */ + Uint32 MOTO12; + /* Объявляет MOTO13 — данные MOTO13. */ + Uint32 MOTO13; + /* Объявляет MOTO14 — данные MOTO14. */ + Uint32 MOTO14; + /* Объявляет MOTO15 — данные MOTO15. */ + Uint32 MOTO15; + /* Объявляет MOTO16 — данные MOTO16. */ + Uint32 MOTO16; + /* Объявляет MOTO17 — данные MOTO17. */ + Uint32 MOTO17; + /* Объявляет MOTO18 — данные MOTO18. */ + Uint32 MOTO18; + /* Объявляет MOTO19 — данные MOTO19. */ + Uint32 MOTO19; + /* Объявляет MOTO20 — данные MOTO20. */ + Uint32 MOTO20; + /* Объявляет MOTO21 — данные MOTO21. */ + Uint32 MOTO21; + /* Объявляет MOTO22 — данные MOTO22. */ + Uint32 MOTO22; + /* Объявляет MOTO23 — данные MOTO23. */ + Uint32 MOTO23; + /* Объявляет MOTO24 — данные MOTO24. */ + Uint32 MOTO24; + /* Объявляет MOTO25 — данные MOTO25. */ + Uint32 MOTO25; + /* Объявляет MOTO26 — данные MOTO26. */ + Uint32 MOTO26; + /* Объявляет MOTO27 — данные MOTO27. */ + Uint32 MOTO27; + /* Объявляет MOTO28 — данные MOTO28. */ + Uint32 MOTO28; + /* Объявляет MOTO29 — данные MOTO29. */ + Uint32 MOTO29; + /* Объявляет MOTO30 — данные MOTO30. */ + Uint32 MOTO30; + /* Объявляет MOTO31 — данные MOTO31. */ + Uint32 MOTO31; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +//--------------------------------------------------------------------------- +// eCAN External References & Function Declarations: +// +/* Продолжает список аргументов, полей или выражение extern volatile struct ECAN_REGS ECanaRegs;; порядок элементов сохраняется. */ +extern volatile struct ECAN_REGS ECanaRegs; +/* Продолжает список аргументов, полей или выражение extern volatile struct ECAN_MBOXES ECanaMboxes;; порядок элементов сохраняется. */ +extern volatile struct ECAN_MBOXES ECanaMboxes; +/* Продолжает список аргументов, полей или выражение extern volatile struct LAM_REGS ECanaLAMRegs;; порядок элементов сохраняется. */ +extern volatile struct LAM_REGS ECanaLAMRegs; +/* Продолжает список аргументов, полей или выражение extern volatile struct MOTO_REGS ECanaMOTORegs;; порядок элементов сохраняется. */ +extern volatile struct MOTO_REGS ECanaMOTORegs; +/* Продолжает список аргументов, полей или выражение extern volatile struct MOTS_REGS ECanaMOTSRegs;; порядок элементов сохраняется. */ +extern volatile struct MOTS_REGS ECanaMOTSRegs; + +/* Продолжает список аргументов, полей или выражение extern volatile struct ECAN_REGS ECanbRegs;; порядок элементов сохраняется. */ +extern volatile struct ECAN_REGS ECanbRegs; +/* Продолжает список аргументов, полей или выражение extern volatile struct ECAN_MBOXES ECanbMboxes;; порядок элементов сохраняется. */ +extern volatile struct ECAN_MBOXES ECanbMboxes; +/* Продолжает список аргументов, полей или выражение extern volatile struct LAM_REGS ECanbLAMRegs;; порядок элементов сохраняется. */ +extern volatile struct LAM_REGS ECanbLAMRegs; +/* Продолжает список аргументов, полей или выражение extern volatile struct MOTO_REGS ECanbMOTORegs;; порядок элементов сохраняется. */ +extern volatile struct MOTO_REGS ECanbMOTORegs; +/* Продолжает список аргументов, полей или выражение extern volatile struct MOTS_REGS ECanbMOTSRegs;; порядок элементов сохраняется. */ +extern volatile struct MOTS_REGS ECanbMOTSRegs; + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_ECAN.H definition + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_ECap.h b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_ECap.h new file mode 100644 index 0000000..6ff4cea --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_ECap.h @@ -0,0 +1,245 @@ +/* Поставляемое TI описание ECap для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/1 $ +// Checkin $Date: August 18, 2006 13:52:07 $ +//########################################################################### +// +// FILE: DSP2833x_ECap.h +// +// TITLE: DSP2833x Enhanced Capture Module Register Bit Definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_ECAP_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_ECAP_H +/* Определяет защитный символ или переключатель DSP2833x_ECAP_H для последующей компиляции. */ +#define DSP2833x_ECAP_H + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +//---------------------------------------------------- +// Capture control register 1 bit definitions */ +/* Описывает структуру ECCTL1_BITS; порядок полей определяет расположение данных. */ +struct ECCTL1_BITS { // bits description + /* Битовое поле CAP1POL, ширина 1 бит; данные CAP1POL. */ + Uint16 CAP1POL:1; // 0 Capture Event 1 Polarity select + /* Битовое поле CTRRST1, ширина 1 бит; данные CTRRST1. */ + Uint16 CTRRST1:1; // 1 Counter Reset on Capture Event 1 + /* Битовое поле CAP2POL, ширина 1 бит; данные CAP2POL. */ + Uint16 CAP2POL:1; // 2 Capture Event 2 Polarity select + /* Битовое поле CTRRST2, ширина 1 бит; данные CTRRST2. */ + Uint16 CTRRST2:1; // 3 Counter Reset on Capture Event 2 + /* Битовое поле CAP3POL, ширина 1 бит; данные CAP3POL. */ + Uint16 CAP3POL:1; // 4 Capture Event 3 Polarity select + /* Битовое поле CTRRST3, ширина 1 бит; данные CTRRST3. */ + Uint16 CTRRST3:1; // 5 Counter Reset on Capture Event 3 + /* Битовое поле CAP4POL, ширина 1 бит; данные CAP4POL. */ + Uint16 CAP4POL:1; // 6 Capture Event 4 Polarity select + /* Битовое поле CTRRST4, ширина 1 бит; данные CTRRST4. */ + Uint16 CTRRST4:1; // 7 Counter Reset on Capture Event 4 + /* Битовое поле CAPLDEN, ширина 1 бит; данные CAPLDEN. */ + Uint16 CAPLDEN:1; // 8 Enable Loading CAP1-4 regs on a Cap Event + /* Битовое поле PRESCALE, ширина 5 бит; предделитель. */ + Uint16 PRESCALE:5; // 13:9 Event Filter prescale select + /* Битовое поле FREE_SOFT, ширина 2 бит; данные FREE_SOFT. */ + Uint16 FREE_SOFT:2; // 15:14 Emulation mode +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений ECCTL1_REG в одной области памяти. */ +union ECCTL1_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру ECCTL1_BITS bit;; порядок полей определяет расположение данных. */ + struct ECCTL1_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +// In V1.1 the STOPVALUE bit field was changed to +// STOP_WRAP. This correlated to a silicon change from +// F2833x Rev 0 to Rev A. +//---------------------------------------------------- +// Capture control register 2 bit definitions */ +/* Описывает структуру ECCTL2_BITS; порядок полей определяет расположение данных. */ +struct ECCTL2_BITS { // bits description + /* Битовое поле CONT_ONESHT, ширина 1 бит; данные CONT_ONESHT. */ + Uint16 CONT_ONESHT:1; // 0 Continuous or one-shot + /* Битовое поле STOP_WRAP, ширина 2 бит; данные STOP_WRAP. */ + Uint16 STOP_WRAP:2; // 2:1 Stop value for one-shot, Wrap for continuous + /* Битовое поле REARM, ширина 1 бит; данные REARM. */ + Uint16 REARM:1; // 3 One-shot re-arm + /* Битовое поле TSCTRSTOP, ширина 1 бит; данные TSCTRSTOP. */ + Uint16 TSCTRSTOP:1; // 4 TSCNT counter stop + /* Битовое поле SYNCI_EN, ширина 1 бит; данные SYNCI_EN. */ + Uint16 SYNCI_EN:1; // 5 Counter sync-in select + /* Битовое поле SYNCO_SEL, ширина 2 бит; данные SYNCO_SEL. */ + Uint16 SYNCO_SEL:2; // 7:6 Sync-out mode + /* Битовое поле SWSYNC, ширина 1 бит; данные SWSYNC. */ + Uint16 SWSYNC:1; // 8 SW forced counter sync + /* Битовое поле CAP_APWM, ширина 1 бит; данные CAP_APWM. */ + Uint16 CAP_APWM:1; // 9 CAP/APWM operating mode select + /* Битовое поле APWMPOL, ширина 1 бит; данные APWMPOL. */ + Uint16 APWMPOL:1; // 10 APWM output polarity select + /* Битовое поле rsvd1, ширина 5 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:5; // 15:11 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Объединяет несколько представлений ECCTL2_REG в одной области памяти. */ +union ECCTL2_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру ECCTL2_BITS bit;; порядок полей определяет расположение данных. */ + struct ECCTL2_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +//---------------------------------------------------- +// ECAP interrupt enable register bit definitions */ +/* Описывает структуру ECEINT_BITS; порядок полей определяет расположение данных. */ +struct ECEINT_BITS { // bits description + /* Битовое поле rsvd1, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:1; // 0 reserved + /* Битовое поле CEVT1, ширина 1 бит; данные CEVT1. */ + Uint16 CEVT1:1; // 1 Capture Event 1 Interrupt Enable + /* Битовое поле CEVT2, ширина 1 бит; данные CEVT2. */ + Uint16 CEVT2:1; // 2 Capture Event 2 Interrupt Enable + /* Битовое поле CEVT3, ширина 1 бит; данные CEVT3. */ + Uint16 CEVT3:1; // 3 Capture Event 3 Interrupt Enable + /* Битовое поле CEVT4, ширина 1 бит; данные CEVT4. */ + Uint16 CEVT4:1; // 4 Capture Event 4 Interrupt Enable + /* Битовое поле CTROVF, ширина 1 бит; данные CTROVF. */ + Uint16 CTROVF:1; // 5 Counter Overflow Interrupt Enable + /* Битовое поле CTR_EQ_PRD, ширина 1 бит; данные CTR_EQ_PRD. */ + Uint16 CTR_EQ_PRD:1; // 6 Period Equal Interrupt Enable + /* Битовое поле CTR_EQ_CMP, ширина 1 бит; данные CTR_EQ_CMP. */ + Uint16 CTR_EQ_CMP:1; // 7 Compare Equal Interrupt Enable + /* Битовое поле rsvd2, ширина 8 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:8; // 15:8 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Объединяет несколько представлений ECEINT_REG в одной области памяти. */ +union ECEINT_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру ECEINT_BITS bit;; порядок полей определяет расположение данных. */ + struct ECEINT_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// ECAP interrupt flag register bit definitions */ +/* Описывает структуру ECFLG_BITS; порядок полей определяет расположение данных. */ +struct ECFLG_BITS { // bits description + /* Битовое поле INT, ширина 1 бит; данные INT. */ + Uint16 INT:1; // 0 Global Flag + /* Битовое поле CEVT1, ширина 1 бит; данные CEVT1. */ + Uint16 CEVT1:1; // 1 Capture Event 1 Interrupt Flag + /* Битовое поле CEVT2, ширина 1 бит; данные CEVT2. */ + Uint16 CEVT2:1; // 2 Capture Event 2 Interrupt Flag + /* Битовое поле CEVT3, ширина 1 бит; данные CEVT3. */ + Uint16 CEVT3:1; // 3 Capture Event 3 Interrupt Flag + /* Битовое поле CEVT4, ширина 1 бит; данные CEVT4. */ + Uint16 CEVT4:1; // 4 Capture Event 4 Interrupt Flag + /* Битовое поле CTROVF, ширина 1 бит; данные CTROVF. */ + Uint16 CTROVF:1; // 5 Counter Overflow Interrupt Flag + /* Битовое поле CTR_EQ_PRD, ширина 1 бит; данные CTR_EQ_PRD. */ + Uint16 CTR_EQ_PRD:1; // 6 Period Equal Interrupt Flag + /* Битовое поле CTR_EQ_CMP, ширина 1 бит; данные CTR_EQ_CMP. */ + Uint16 CTR_EQ_CMP:1; // 7 Compare Equal Interrupt Flag + /* Битовое поле rsvd2, ширина 8 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:8; // 15:8 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Объединяет несколько представлений ECFLG_REG в одной области памяти. */ +union ECFLG_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру ECFLG_BITS bit;; порядок полей определяет расположение данных. */ + struct ECFLG_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +//---------------------------------------------------- + +/* Описывает структуру ECAP_REGS; порядок полей определяет расположение данных. */ +struct ECAP_REGS { + /* Объявляет TSCTR — данные TSCTR. */ + Uint32 TSCTR; // Time stamp counter + /* Объявляет CTRPHS — данные CTRPHS. */ + Uint32 CTRPHS; // Counter phase + /* Объявляет CAP1 — данные CAP1. */ + Uint32 CAP1; // Capture 1 + /* Объявляет CAP2 — данные CAP2. */ + Uint32 CAP2; // Capture 2 + /* Объявляет CAP3 — данные CAP3. */ + Uint32 CAP3; // Capture 3 + /* Объявляет CAP4 — данные CAP4. */ + Uint32 CAP4; // Capture 4 + /* Объявляет rsvd1 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1[8]; // reserved + /* Объединяет несколько представлений ECCTL1_REG ECCTL1; в одной области памяти. */ + union ECCTL1_REG ECCTL1; // Capture Control Reg 1 + /* Объединяет несколько представлений ECCTL2_REG ECCTL2; в одной области памяти. */ + union ECCTL2_REG ECCTL2; // Capture Control Reg 2 + /* Объединяет несколько представлений ECEINT_REG ECEINT; в одной области памяти. */ + union ECEINT_REG ECEINT; // ECAP interrupt enable + /* Объединяет несколько представлений ECFLG_REG ECFLG; в одной области памяти. */ + union ECFLG_REG ECFLG; // ECAP interrupt flags + /* Объединяет несколько представлений ECFLG_REG ECCLR; в одной области памяти. */ + union ECFLG_REG ECCLR; // ECAP interrupt clear + /* Объединяет несколько представлений ECEINT_REG ECFRC; в одной области памяти. */ + union ECEINT_REG ECFRC; // ECAP interrupt force + /* Объявляет rsvd2 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2[6]; // reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + + + +//--------------------------------------------------------------------------- +// GPI/O External References & Function Declarations: +// +/* Продолжает список аргументов, полей или выражение extern volatile struct ECAP_REGS ECap1Regs;; порядок элементов сохраняется. */ +extern volatile struct ECAP_REGS ECap1Regs; +/* Продолжает список аргументов, полей или выражение extern volatile struct ECAP_REGS ECap2Regs;; порядок элементов сохраняется. */ +extern volatile struct ECAP_REGS ECap2Regs; +/* Продолжает список аргументов, полей или выражение extern volatile struct ECAP_REGS ECap3Regs;; порядок элементов сохраняется. */ +extern volatile struct ECAP_REGS ECap3Regs; +/* Продолжает список аргументов, полей или выражение extern volatile struct ECAP_REGS ECap4Regs;; порядок элементов сохраняется. */ +extern volatile struct ECAP_REGS ECap4Regs; +/* Продолжает список аргументов, полей или выражение extern volatile struct ECAP_REGS ECap5Regs;; порядок элементов сохраняется. */ +extern volatile struct ECAP_REGS ECap5Regs; +/* Продолжает список аргументов, полей или выражение extern volatile struct ECAP_REGS ECap6Regs;; порядок элементов сохраняется. */ +extern volatile struct ECAP_REGS ECap6Regs; + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_ECAP_H definition + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_EPwm.h b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_EPwm.h new file mode 100644 index 0000000..b6ed86c --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_EPwm.h @@ -0,0 +1,720 @@ +/* Поставляемое TI описание EPwm для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/1 $ +// Checkin $Date: August 18, 2006 13:52:10 $ +//########################################################################### +// +// FILE: DSP2833x_EPwm.h +// +// TITLE: DSP2833x Enhanced PWM Module Register Bit Definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_EPWM_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_EPWM_H +/* Определяет защитный символ или переключатель DSP2833x_EPWM_H для последующей компиляции. */ +#define DSP2833x_EPWM_H + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +//---------------------------------------------------- +// Time base control register bit definitions */ +/* Описывает структуру TBCTL_BITS; порядок полей определяет расположение данных. */ +struct TBCTL_BITS { // bits description + /* Битовое поле CTRMODE, ширина 2 бит; данные CTRMODE. */ + Uint16 CTRMODE:2; // 1:0 Counter Mode + /* Битовое поле PHSEN, ширина 1 бит; данные PHSEN. */ + Uint16 PHSEN:1; // 2 Phase load enable + /* Битовое поле PRDLD, ширина 1 бит; данные PRDLD. */ + Uint16 PRDLD:1; // 3 Active period load + /* Битовое поле SYNCOSEL, ширина 2 бит; данные SYNCOSEL. */ + Uint16 SYNCOSEL:2; // 5:4 Sync output select + /* Битовое поле SWFSYNC, ширина 1 бит; данные SWFSYNC. */ + Uint16 SWFSYNC:1; // 6 Software force sync pulse + /* Битовое поле HSPCLKDIV, ширина 3 бит; данные HSPCLKDIV. */ + Uint16 HSPCLKDIV:3; // 9:7 High speed time pre-scale + /* Битовое поле CLKDIV, ширина 3 бит; данные CLKDIV. */ + Uint16 CLKDIV:3; // 12:10 Timebase clock pre-scale + /* Битовое поле PHSDIR, ширина 1 бит; данные PHSDIR. */ + Uint16 PHSDIR:1; // 13 Phase Direction + /* Битовое поле FREE_SOFT, ширина 2 бит; данные FREE_SOFT. */ + Uint16 FREE_SOFT:2; // 15:14 Emulation mode +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений TBCTL_REG в одной области памяти. */ +union TBCTL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру TBCTL_BITS bit;; порядок полей определяет расположение данных. */ + struct TBCTL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// Time base status register bit definitions */ +/* Описывает структуру TBSTS_BITS; порядок полей определяет расположение данных. */ +struct TBSTS_BITS { // bits description + /* Битовое поле CTRDIR, ширина 1 бит; данные CTRDIR. */ + Uint16 CTRDIR:1; // 0 Counter direction status + /* Битовое поле SYNCI, ширина 1 бит; данные SYNCI. */ + Uint16 SYNCI:1; // 1 External input sync status + /* Битовое поле CTRMAX, ширина 1 бит; данные CTRMAX. */ + Uint16 CTRMAX:1; // 2 Counter max latched status + /* Битовое поле rsvd1, ширина 13 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:13; // 15:3 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений TBSTS_REG в одной области памяти. */ +union TBSTS_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру TBSTS_BITS bit;; порядок полей определяет расположение данных. */ + struct TBSTS_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// Compare control register bit definitions */ +/* Описывает структуру CMPCTL_BITS; порядок полей определяет расположение данных. */ +struct CMPCTL_BITS { // bits description + /* Битовое поле LOADAMODE, ширина 2 бит; данные LOADAMODE. */ + Uint16 LOADAMODE:2; // 0:1 Active compare A + /* Битовое поле LOADBMODE, ширина 2 бит; данные LOADBMODE. */ + Uint16 LOADBMODE:2; // 3:2 Active compare B + /* Битовое поле SHDWAMODE, ширина 1 бит; данные SHDWAMODE. */ + Uint16 SHDWAMODE:1; // 4 Compare A block operating mode + /* Битовое поле rsvd1, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:1; // 5 reserved + /* Битовое поле SHDWBMODE, ширина 1 бит; данные SHDWBMODE. */ + Uint16 SHDWBMODE:1; // 6 Compare B block operating mode + /* Битовое поле rsvd2, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:1; // 7 reserved + /* Битовое поле SHDWAFULL, ширина 1 бит; данные SHDWAFULL. */ + Uint16 SHDWAFULL:1; // 8 Compare A Shadow registers full Status + /* Битовое поле SHDWBFULL, ширина 1 бит; данные SHDWBFULL. */ + Uint16 SHDWBFULL:1; // 9 Compare B Shadow registers full Status + /* Битовое поле rsvd3, ширина 6 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd3:6; // 15:10 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Объединяет несколько представлений CMPCTL_REG в одной области памяти. */ +union CMPCTL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру CMPCTL_BITS bit;; порядок полей определяет расположение данных. */ + struct CMPCTL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// Action qualifier register bit definitions */ +/* Описывает структуру AQCTL_BITS; порядок полей определяет расположение данных. */ +struct AQCTL_BITS { // bits description + /* Битовое поле ZRO, ширина 2 бит; данные ZRO. */ + Uint16 ZRO:2; // 1:0 Action Counter = Zero + /* Битовое поле PRD, ширина 2 бит; данные PRD. */ + Uint16 PRD:2; // 3:2 Action Counter = Period + /* Битовое поле CAU, ширина 2 бит; данные CAU. */ + Uint16 CAU:2; // 5:4 Action Counter = Compare A up + /* Битовое поле CAD, ширина 2 бит; данные CAD. */ + Uint16 CAD:2; // 7:6 Action Counter = Compare A down + /* Битовое поле CBU, ширина 2 бит; данные CBU. */ + Uint16 CBU:2; // 9:8 Action Counter = Compare B up + /* Битовое поле CBD, ширина 2 бит; данные CBD. */ + Uint16 CBD:2; // 11:10 Action Counter = Compare B down + /* Битовое поле rsvd, ширина 4 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:4; // 15:12 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений AQCTL_REG в одной области памяти. */ +union AQCTL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру AQCTL_BITS bit;; порядок полей определяет расположение данных. */ + struct AQCTL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// Action qualifier SW force register bit definitions */ +/* Описывает структуру AQSFRC_BITS; порядок полей определяет расположение данных. */ +struct AQSFRC_BITS { // bits description + /* Битовое поле ACTSFA, ширина 2 бит; данные ACTSFA. */ + Uint16 ACTSFA:2; // 1:0 Action when One-time SW Force A invoked + /* Битовое поле OTSFA, ширина 1 бит; данные OTSFA. */ + Uint16 OTSFA:1; // 2 One-time SW Force A output + /* Битовое поле ACTSFB, ширина 2 бит; данные ACTSFB. */ + Uint16 ACTSFB:2; // 4:3 Action when One-time SW Force B invoked + /* Битовое поле OTSFB, ширина 1 бит; данные OTSFB. */ + Uint16 OTSFB:1; // 5 One-time SW Force A output + /* Битовое поле RLDCSF, ширина 2 бит; данные RLDCSF. */ + Uint16 RLDCSF:2; // 7:6 Reload from Shadow options + /* Битовое поле rsvd1, ширина 8 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:8; // 15:8 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений AQSFRC_REG в одной области памяти. */ +union AQSFRC_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру AQSFRC_BITS bit;; порядок полей определяет расположение данных. */ + struct AQSFRC_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// Action qualifier continuous SW force register bit definitions */ +/* Описывает структуру AQCSFRC_BITS; порядок полей определяет расположение данных. */ +struct AQCSFRC_BITS { // bits description + /* Битовое поле CSFA, ширина 2 бит; данные CSFA. */ + Uint16 CSFA:2; // 1:0 Continuous Software Force on output A + /* Битовое поле CSFB, ширина 2 бит; данные CSFB. */ + Uint16 CSFB:2; // 3:2 Continuous Software Force on output B + /* Битовое поле rsvd1, ширина 12 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:12; // 15:4 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений AQCSFRC_REG в одной области памяти. */ +union AQCSFRC_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру AQCSFRC_BITS bit;; порядок полей определяет расположение данных. */ + struct AQCSFRC_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +// As of version 1.1 +// Changed the MODE bit-field to OUT_MODE +// Added the bit-field IN_MODE +// This corresponds to changes in silicon as of F2833x devices +// Rev A silicon. +//---------------------------------------------------- +// Dead-band generator control register bit definitions +/* Описывает структуру DBCTL_BITS; порядок полей определяет расположение данных. */ +struct DBCTL_BITS { // bits description + /* Битовое поле OUT_MODE, ширина 2 бит; OUT режим. */ + Uint16 OUT_MODE:2; // 1:0 Dead Band Output Mode Control + /* Битовое поле POLSEL, ширина 2 бит; данные POLSEL. */ + Uint16 POLSEL:2; // 3:2 Polarity Select Control + /* Битовое поле IN_MODE, ширина 2 бит; IN режим. */ + Uint16 IN_MODE:2; // 5:4 Dead Band Input Select Mode Control + /* Битовое поле rsvd1, ширина 10 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:10; // 15:4 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений DBCTL_REG в одной области памяти. */ +union DBCTL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру DBCTL_BITS bit;; порядок полей определяет расположение данных. */ + struct DBCTL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +//---------------------------------------------------- +// Trip zone select register bit definitions +/* Описывает структуру TZSEL_BITS; порядок полей определяет расположение данных. */ +struct TZSEL_BITS { // bits description + /* Битовое поле CBC1, ширина 1 бит; данные CBC1. */ + Uint16 CBC1:1; // 0 TZ1 CBC select + /* Битовое поле CBC2, ширина 1 бит; данные CBC2. */ + Uint16 CBC2:1; // 1 TZ2 CBC select + /* Битовое поле CBC3, ширина 1 бит; данные CBC3. */ + Uint16 CBC3:1; // 2 TZ3 CBC select + /* Битовое поле CBC4, ширина 1 бит; данные CBC4. */ + Uint16 CBC4:1; // 3 TZ4 CBC select + /* Битовое поле CBC5, ширина 1 бит; данные CBC5. */ + Uint16 CBC5:1; // 4 TZ5 CBC select + /* Битовое поле CBC6, ширина 1 бит; данные CBC6. */ + Uint16 CBC6:1; // 5 TZ6 CBC select + /* Битовое поле rsvd1, ширина 2 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:2; // 7:6 reserved + /* Битовое поле OSHT1, ширина 1 бит; данные OSHT1. */ + Uint16 OSHT1:1; // 8 One-shot TZ1 select + /* Битовое поле OSHT2, ширина 1 бит; данные OSHT2. */ + Uint16 OSHT2:1; // 9 One-shot TZ2 select + /* Битовое поле OSHT3, ширина 1 бит; данные OSHT3. */ + Uint16 OSHT3:1; // 10 One-shot TZ3 select + /* Битовое поле OSHT4, ширина 1 бит; данные OSHT4. */ + Uint16 OSHT4:1; // 11 One-shot TZ4 select + /* Битовое поле OSHT5, ширина 1 бит; данные OSHT5. */ + Uint16 OSHT5:1; // 12 One-shot TZ5 select + /* Битовое поле OSHT6, ширина 1 бит; данные OSHT6. */ + Uint16 OSHT6:1; // 13 One-shot TZ6 select + /* Битовое поле rsvd2, ширина 2 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:2; // 15:14 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений TZSEL_REG в одной области памяти. */ +union TZSEL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру TZSEL_BITS bit;; порядок полей определяет расположение данных. */ + struct TZSEL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +//---------------------------------------------------- +// Trip zone control register bit definitions */ +/* Описывает структуру TZCTL_BITS; порядок полей определяет расположение данных. */ +struct TZCTL_BITS { // bits description + /* Битовое поле TZA, ширина 2 бит; данные TZA. */ + Uint16 TZA:2; // 1:0 TZ1 to TZ6 Trip Action On EPWMxA + /* Битовое поле TZB, ширина 2 бит; данные TZB. */ + Uint16 TZB:2; // 3:2 TZ1 to TZ6 Trip Action On EPWMxB + /* Битовое поле rsvd, ширина 12 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:12; // 15:4 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений TZCTL_REG в одной области памяти. */ +union TZCTL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру TZCTL_BITS bit;; порядок полей определяет расположение данных. */ + struct TZCTL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +//---------------------------------------------------- +// Trip zone control register bit definitions */ +/* Описывает структуру TZEINT_BITS; порядок полей определяет расположение данных. */ +struct TZEINT_BITS { // bits description + /* Битовое поле rsvd1, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:1; // 0 reserved + /* Битовое поле CBC, ширина 1 бит; данные CBC. */ + Uint16 CBC:1; // 1 Trip Zones Cycle By Cycle Int Enable + /* Битовое поле OST, ширина 1 бит; данные OST. */ + Uint16 OST:1; // 2 Trip Zones One Shot Int Enable + /* Битовое поле rsvd2, ширина 13 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:13; // 15:3 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Объединяет несколько представлений TZEINT_REG в одной области памяти. */ +union TZEINT_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру TZEINT_BITS bit;; порядок полей определяет расположение данных. */ + struct TZEINT_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +//---------------------------------------------------- +// Trip zone flag register bit definitions */ +/* Описывает структуру TZFLG_BITS; порядок полей определяет расположение данных. */ +struct TZFLG_BITS { // bits description + /* Битовое поле INT, ширина 1 бит; данные INT. */ + Uint16 INT:1; // 0 Global status + /* Битовое поле CBC, ширина 1 бит; данные CBC. */ + Uint16 CBC:1; // 1 Trip Zones Cycle By Cycle Int + /* Битовое поле OST, ширина 1 бит; данные OST. */ + Uint16 OST:1; // 2 Trip Zones One Shot Int + /* Битовое поле rsvd2, ширина 13 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:13; // 15:3 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений TZFLG_REG в одной области памяти. */ +union TZFLG_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру TZFLG_BITS bit;; порядок полей определяет расположение данных. */ + struct TZFLG_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// Trip zone flag clear register bit definitions */ +/* Описывает структуру TZCLR_BITS; порядок полей определяет расположение данных. */ +struct TZCLR_BITS { // bits description + /* Битовое поле INT, ширина 1 бит; данные INT. */ + Uint16 INT:1; // 0 Global status + /* Битовое поле CBC, ширина 1 бит; данные CBC. */ + Uint16 CBC:1; // 1 Trip Zones Cycle By Cycle Int + /* Битовое поле OST, ширина 1 бит; данные OST. */ + Uint16 OST:1; // 2 Trip Zones One Shot Int + /* Битовое поле rsvd2, ширина 13 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:13; // 15:3 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений TZCLR_REG в одной области памяти. */ +union TZCLR_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру TZCLR_BITS bit;; порядок полей определяет расположение данных. */ + struct TZCLR_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// Trip zone flag force register bit definitions */ +/* Описывает структуру TZFRC_BITS; порядок полей определяет расположение данных. */ +struct TZFRC_BITS { // bits description + /* Битовое поле rsvd1, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:1; // 0 reserved + /* Битовое поле CBC, ширина 1 бит; данные CBC. */ + Uint16 CBC:1; // 1 Trip Zones Cycle By Cycle Int + /* Битовое поле OST, ширина 1 бит; данные OST. */ + Uint16 OST:1; // 2 Trip Zones One Shot Int + /* Битовое поле rsvd2, ширина 13 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:13; // 15:3 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений TZFRC_REG в одной области памяти. */ +union TZFRC_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру TZFRC_BITS bit;; порядок полей определяет расположение данных. */ + struct TZFRC_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// Event trigger select register bit definitions */ +/* Описывает структуру ETSEL_BITS; порядок полей определяет расположение данных. */ +struct ETSEL_BITS { // bits description + /* Битовое поле INTSEL, ширина 3 бит; данные INTSEL. */ + Uint16 INTSEL:3; // 2:0 EPWMxINTn Select + /* Битовое поле INTEN, ширина 1 бит; данные INTEN. */ + Uint16 INTEN:1; // 3 EPWMxINTn Enable + /* Битовое поле rsvd1, ширина 4 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:4; // 7:4 reserved + /* Битовое поле SOCASEL, ширина 3 бит; данные SOCASEL. */ + Uint16 SOCASEL:3; // 10:8 Start of conversion A Select + /* Битовое поле SOCAEN, ширина 1 бит; данные SOCAEN. */ + Uint16 SOCAEN:1; // 11 Start of conversion A Enable + /* Битовое поле SOCBSEL, ширина 3 бит; данные SOCBSEL. */ + Uint16 SOCBSEL:3; // 14:12 Start of conversion B Select + /* Битовое поле SOCBEN, ширина 1 бит; данные SOCBEN. */ + Uint16 SOCBEN:1; // 15 Start of conversion B Enable +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений ETSEL_REG в одной области памяти. */ +union ETSEL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру ETSEL_BITS bit;; порядок полей определяет расположение данных. */ + struct ETSEL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +//---------------------------------------------------- +// Event trigger pre-scale register bit definitions */ +/* Описывает структуру ETPS_BITS; порядок полей определяет расположение данных. */ +struct ETPS_BITS { // bits description + /* Битовое поле INTPRD, ширина 2 бит; данные INTPRD. */ + Uint16 INTPRD:2; // 1:0 EPWMxINTn Period Select + /* Битовое поле INTCNT, ширина 2 бит; данные INTCNT. */ + Uint16 INTCNT:2; // 3:2 EPWMxINTn Counter Register + /* Битовое поле rsvd1, ширина 4 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:4; // 7:4 reserved + /* Битовое поле SOCAPRD, ширина 2 бит; данные SOCAPRD. */ + Uint16 SOCAPRD:2; // 9:8 EPWMxSOCA Period Select + /* Битовое поле SOCACNT, ширина 2 бит; данные SOCACNT. */ + Uint16 SOCACNT:2; // 11:10 EPWMxSOCA Counter Register + /* Битовое поле SOCBPRD, ширина 2 бит; данные SOCBPRD. */ + Uint16 SOCBPRD:2; // 13:12 EPWMxSOCB Period Select + /* Битовое поле SOCBCNT, ширина 2 бит; данные SOCBCNT. */ + Uint16 SOCBCNT:2; // 15:14 EPWMxSOCB Counter Register +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений ETPS_REG в одной области памяти. */ +union ETPS_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру ETPS_BITS bit;; порядок полей определяет расположение данных. */ + struct ETPS_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// Event trigger Flag register bit definitions */ +/* Описывает структуру ETFLG_BITS; порядок полей определяет расположение данных. */ +struct ETFLG_BITS { // bits description + /* Битовое поле INT, ширина 1 бит; данные INT. */ + Uint16 INT:1; // 0 EPWMxINTn Flag + /* Битовое поле rsvd1, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:1; // 1 reserved + /* Битовое поле SOCA, ширина 1 бит; данные SOCA. */ + Uint16 SOCA:1; // 2 EPWMxSOCA Flag + /* Битовое поле SOCB, ширина 1 бит; данные SOCB. */ + Uint16 SOCB:1; // 3 EPWMxSOCB Flag + /* Битовое поле rsvd2, ширина 12 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:12; // 15:4 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений ETFLG_REG в одной области памяти. */ +union ETFLG_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру ETFLG_BITS bit;; порядок полей определяет расположение данных. */ + struct ETFLG_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +//---------------------------------------------------- +// Event trigger Clear register bit definitions */ +/* Описывает структуру ETCLR_BITS; порядок полей определяет расположение данных. */ +struct ETCLR_BITS { // bits description + /* Битовое поле INT, ширина 1 бит; данные INT. */ + Uint16 INT:1; // 0 EPWMxINTn Clear + /* Битовое поле rsvd1, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:1; // 1 reserved + /* Битовое поле SOCA, ширина 1 бит; данные SOCA. */ + Uint16 SOCA:1; // 2 EPWMxSOCA Clear + /* Битовое поле SOCB, ширина 1 бит; данные SOCB. */ + Uint16 SOCB:1; // 3 EPWMxSOCB Clear + /* Битовое поле rsvd2, ширина 12 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:12; // 15:4 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений ETCLR_REG в одной области памяти. */ +union ETCLR_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру ETCLR_BITS bit;; порядок полей определяет расположение данных. */ + struct ETCLR_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// Event trigger Force register bit definitions */ +/* Описывает структуру ETFRC_BITS; порядок полей определяет расположение данных. */ +struct ETFRC_BITS { // bits description + /* Битовое поле INT, ширина 1 бит; данные INT. */ + Uint16 INT:1; // 0 EPWMxINTn Force + /* Битовое поле rsvd1, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:1; // 1 reserved + /* Битовое поле SOCA, ширина 1 бит; данные SOCA. */ + Uint16 SOCA:1; // 2 EPWMxSOCA Force + /* Битовое поле SOCB, ширина 1 бит; данные SOCB. */ + Uint16 SOCB:1; // 3 EPWMxSOCB Force + /* Битовое поле rsvd2, ширина 12 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:12; // 15:4 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений ETFRC_REG в одной области памяти. */ +union ETFRC_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру ETFRC_BITS bit;; порядок полей определяет расположение данных. */ + struct ETFRC_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; +//---------------------------------------------------- +// PWM chopper control register bit definitions */ +/* Описывает структуру PCCTL_BITS; порядок полей определяет расположение данных. */ +struct PCCTL_BITS { // bits description + /* Битовое поле CHPEN, ширина 1 бит; данные CHPEN. */ + Uint16 CHPEN:1; // 0 PWM chopping enable + /* Битовое поле OSHTWTH, ширина 4 бит; данные OSHTWTH. */ + Uint16 OSHTWTH:4; // 4:1 One-shot pulse width + /* Битовое поле CHPFREQ, ширина 3 бит; данные CHPFREQ. */ + Uint16 CHPFREQ:3; // 7:5 Chopping clock frequency + /* Битовое поле CHPDUTY, ширина 3 бит; данные CHPDUTY. */ + Uint16 CHPDUTY:3; // 10:8 Chopping clock Duty cycle + /* Битовое поле rsvd1, ширина 5 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:5; // 15:11 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Объединяет несколько представлений PCCTL_REG в одной области памяти. */ +union PCCTL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру PCCTL_BITS bit;; порядок полей определяет расположение данных. */ + struct PCCTL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Описывает структуру HRCNFG_BITS; порядок полей определяет расположение данных. */ +struct HRCNFG_BITS { // bits description + /* Битовое поле EDGMODE, ширина 2 бит; данные EDGMODE. */ + Uint16 EDGMODE:2; // 1:0 Edge Mode select Bits + /* Битовое поле CTLMODE, ширина 1 бит; данные CTLMODE. */ + Uint16 CTLMODE:1; // 2 Control mode Select Bit + /* Битовое поле HRLOAD, ширина 1 бит; данные HRLOAD. */ + Uint16 HRLOAD:1; // 3 Shadow mode Select Bit + /* Битовое поле rsvd1, ширина 12 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:12; // 15:4 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений HRCNFG_REG в одной области памяти. */ +union HRCNFG_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру HRCNFG_BITS bit;; порядок полей определяет расположение данных. */ + struct HRCNFG_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Описывает структуру TBPHS_HRPWM_REG; порядок полей определяет расположение данных. */ +struct TBPHS_HRPWM_REG { // bits description + /* Объявляет TBPHSHR — данные TBPHSHR. */ + Uint16 TBPHSHR; // 15:0 Extension register for HRPWM Phase (8 bits) + /* Объявляет TBPHS — данные TBPHS. */ + Uint16 TBPHS; // 31:16 Phase offset register +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений TBPHS_HRPWM_GROUP в одной области памяти. */ +union TBPHS_HRPWM_GROUP { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру TBPHS_HRPWM_REG half;; порядок полей определяет расположение данных. */ + struct TBPHS_HRPWM_REG half; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Описывает структуру CMPA_HRPWM_REG; порядок полей определяет расположение данных. */ +struct CMPA_HRPWM_REG { // bits description + /* Объявляет CMPAHR — данные CMPAHR. */ + Uint16 CMPAHR; // 15:0 Extension register for HRPWM compare (8 bits) + /* Объявляет CMPA — данные CMPA. */ + Uint16 CMPA; // 31:16 Compare A reg +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений CMPA_HRPWM_GROUP в одной области памяти. */ +union CMPA_HRPWM_GROUP { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру CMPA_HRPWM_REG half;; порядок полей определяет расположение данных. */ + struct CMPA_HRPWM_REG half; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Описывает структуру EPWM_REGS; порядок полей определяет расположение данных. */ +struct EPWM_REGS { + /* Объединяет несколько представлений TBCTL_REG TBCTL; в одной области памяти. */ + union TBCTL_REG TBCTL; // + /* Объединяет несколько представлений TBSTS_REG TBSTS; в одной области памяти. */ + union TBSTS_REG TBSTS; // + /* Объединяет несколько представлений TBPHS_HRPWM_GROUP TBPHS; в одной области памяти. */ + union TBPHS_HRPWM_GROUP TBPHS; // Union of TBPHS:TBPHSHR + /* Объявляет TBCTR — данные TBCTR. */ + Uint16 TBCTR; // Counter + /* Объявляет TBPRD — данные TBPRD. */ + Uint16 TBPRD; // Period register set + /* Объявляет rsvd1 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1; // + /* Объединяет несколько представлений CMPCTL_REG CMPCTL; в одной области памяти. */ + union CMPCTL_REG CMPCTL; // Compare control + /* Объединяет несколько представлений CMPA_HRPWM_GROUP CMPA; в одной области памяти. */ + union CMPA_HRPWM_GROUP CMPA; // Union of CMPA:CMPAHR + /* Объявляет CMPB — данные CMPB. */ + Uint16 CMPB; // Compare B reg + /* Объединяет несколько представлений AQCTL_REG AQCTLA; в одной области памяти. */ + union AQCTL_REG AQCTLA; // Action qual output A + /* Объединяет несколько представлений AQCTL_REG AQCTLB; в одной области памяти. */ + union AQCTL_REG AQCTLB; // Action qual output B + /* Объединяет несколько представлений AQSFRC_REG AQSFRC; в одной области памяти. */ + union AQSFRC_REG AQSFRC; // Action qual SW force + /* Объединяет несколько представлений AQCSFRC_REG AQCSFRC; в одной области памяти. */ + union AQCSFRC_REG AQCSFRC; // Action qualifier continuous SW force + /* Объединяет несколько представлений DBCTL_REG DBCTL; в одной области памяти. */ + union DBCTL_REG DBCTL; // Dead-band control + /* Объявляет DBRED — данные DBRED. */ + Uint16 DBRED; // Dead-band rising edge delay + /* Объявляет DBFED — данные DBFED. */ + Uint16 DBFED; // Dead-band falling edge delay + /* Объединяет несколько представлений TZSEL_REG TZSEL; в одной области памяти. */ + union TZSEL_REG TZSEL; // Trip zone select + /* Объявляет rsvd2 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2; + /* Объединяет несколько представлений TZCTL_REG TZCTL; в одной области памяти. */ + union TZCTL_REG TZCTL; // Trip zone control + /* Объединяет несколько представлений TZEINT_REG TZEINT; в одной области памяти. */ + union TZEINT_REG TZEINT; // Trip zone interrupt enable + /* Объединяет несколько представлений TZFLG_REG TZFLG; в одной области памяти. */ + union TZFLG_REG TZFLG; // Trip zone interrupt flags + /* Объединяет несколько представлений TZCLR_REG TZCLR; в одной области памяти. */ + union TZCLR_REG TZCLR; // Trip zone clear + /* Объединяет несколько представлений TZFRC_REG TZFRC; в одной области памяти. */ + union TZFRC_REG TZFRC; // Trip zone force interrupt + /* Объединяет несколько представлений ETSEL_REG ETSEL; в одной области памяти. */ + union ETSEL_REG ETSEL; // Event trigger selection + /* Объединяет несколько представлений ETPS_REG ETPS; в одной области памяти. */ + union ETPS_REG ETPS; // Event trigger pre-scaler + /* Объединяет несколько представлений ETFLG_REG ETFLG; в одной области памяти. */ + union ETFLG_REG ETFLG; // Event trigger flags + /* Объединяет несколько представлений ETCLR_REG ETCLR; в одной области памяти. */ + union ETCLR_REG ETCLR; // Event trigger clear + /* Объединяет несколько представлений ETFRC_REG ETFRC; в одной области памяти. */ + union ETFRC_REG ETFRC; // Event trigger force + /* Объединяет несколько представлений PCCTL_REG PCCTL; в одной области памяти. */ + union PCCTL_REG PCCTL; // PWM chopper control + /* Объявляет rsvd3 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd3; // + /* Объединяет несколько представлений HRCNFG_REG HRCNFG; в одной области памяти. */ + union HRCNFG_REG HRCNFG; // HRPWM Config Reg +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + + +//--------------------------------------------------------------------------- +// External References & Function Declarations: +// +/* Продолжает список аргументов, полей или выражение extern volatile struct EPWM_REGS EPwm1Regs;; порядок элементов сохраняется. */ +extern volatile struct EPWM_REGS EPwm1Regs; +/* Продолжает список аргументов, полей или выражение extern volatile struct EPWM_REGS EPwm2Regs;; порядок элементов сохраняется. */ +extern volatile struct EPWM_REGS EPwm2Regs; +/* Продолжает список аргументов, полей или выражение extern volatile struct EPWM_REGS EPwm3Regs;; порядок элементов сохраняется. */ +extern volatile struct EPWM_REGS EPwm3Regs; +/* Продолжает список аргументов, полей или выражение extern volatile struct EPWM_REGS EPwm4Regs;; порядок элементов сохраняется. */ +extern volatile struct EPWM_REGS EPwm4Regs; +/* Продолжает список аргументов, полей или выражение extern volatile struct EPWM_REGS EPwm5Regs;; порядок элементов сохраняется. */ +extern volatile struct EPWM_REGS EPwm5Regs; +/* Продолжает список аргументов, полей или выражение extern volatile struct EPWM_REGS EPwm6Regs;; порядок элементов сохраняется. */ +extern volatile struct EPWM_REGS EPwm6Regs; + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_EPWM_H definition + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_EQep.h b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_EQep.h new file mode 100644 index 0000000..455839e --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_EQep.h @@ -0,0 +1,407 @@ +/* Поставляемое TI описание EQep для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/1 $ +// Checkin $Date: August 18, 2006 13:52:13 $ +//########################################################################### +// +// FILE: DSP2833x_EQep.h +// +// TITLE: DSP2833x Enhanced Quadrature Encoder Pulse Module +// Register Bit Definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_EQEP_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_EQEP_H +/* Определяет защитный символ или переключатель DSP2833x_EQEP_H для последующей компиляции. */ +#define DSP2833x_EQEP_H + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +//---------------------------------------------------- +// Capture decoder control register bit definitions */ +/* Описывает структуру QDECCTL_BITS; порядок полей определяет расположение данных. */ +struct QDECCTL_BITS { // bits description + /* Битовое поле rsvd1, ширина 5 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:5; // 4:0 reserved + /* Битовое поле QSP, ширина 1 бит; данные QSP. */ + Uint16 QSP:1; // 5 QEPS input polarity + /* Битовое поле QIP, ширина 1 бит; данные QIP. */ + Uint16 QIP:1; // 6 QEPI input polarity + /* Битовое поле QBP, ширина 1 бит; данные QBP. */ + Uint16 QBP:1; // 7 QEPB input polarity + /* Битовое поле QAP, ширина 1 бит; данные QAP. */ + Uint16 QAP:1; // 8 QEPA input polarity + /* Битовое поле IGATE, ширина 1 бит; данные IGATE. */ + Uint16 IGATE:1; // 9 Index pulse gating option + /* Битовое поле SWAP, ширина 1 бит; данные SWAP. */ + Uint16 SWAP:1; // 10 CLK/DIR signal source for Position Counter + /* Битовое поле XCR, ширина 1 бит; данные XCR. */ + Uint16 XCR:1; // 11 External clock rate + /* Битовое поле SPSEL, ширина 1 бит; данные SPSEL. */ + Uint16 SPSEL:1; // 12 Sync output pin select + /* Битовое поле SOEN, ширина 1 бит; данные SOEN. */ + Uint16 SOEN:1; // 13 Enable position compare sync + /* Битовое поле QSRC, ширина 2 бит; данные QSRC. */ + Uint16 QSRC:2; // 15:14 Position counter source +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений QDECCTL_REG в одной области памяти. */ +union QDECCTL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру QDECCTL_BITS bit;; порядок полей определяет расположение данных. */ + struct QDECCTL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +//---------------------------------------------------- +// QEP control register bit definitions */ +/* Описывает структуру QEPCTL_BITS; порядок полей определяет расположение данных. */ +struct QEPCTL_BITS { // bits description + /* Битовое поле WDE, ширина 1 бит; данные WDE. */ + Uint16 WDE:1; // 0 QEP watchdog enable + /* Битовое поле UTE, ширина 1 бит; данные UTE. */ + Uint16 UTE:1; // 1 QEP unit timer enable + /* Битовое поле QCLM, ширина 1 бит; данные QCLM. */ + Uint16 QCLM:1; // 2 QEP capture latch mode + /* Битовое поле QPEN, ширина 1 бит; данные QPEN. */ + Uint16 QPEN:1; // 3 Quadrature position counter enable + /* Битовое поле IEL, ширина 2 бит; данные IEL. */ + Uint16 IEL:2; // 5:4 Index event latch + /* Битовое поле SEL, ширина 1 бит; данные SEL. */ + Uint16 SEL:1; // 6 Strobe event latch + /* Битовое поле SWI, ширина 1 бит; данные SWI. */ + Uint16 SWI:1; // 7 Software init position counter + /* Битовое поле IEI, ширина 2 бит; данные IEI. */ + Uint16 IEI:2; // 9:8 Index event init of position count + /* Битовое поле SEI, ширина 2 бит; данные SEI. */ + Uint16 SEI:2; // 11:10 Strobe event init + /* Битовое поле PCRM, ширина 2 бит; данные PCRM. */ + Uint16 PCRM:2; // 13:12 Position counter reset + /* Битовое поле FREE_SOFT, ширина 2 бит; данные FREE_SOFT. */ + Uint16 FREE_SOFT:2; // 15:14 Emulation mode +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений QEPCTL_REG в одной области памяти. */ +union QEPCTL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру QEPCTL_BITS bit;; порядок полей определяет расположение данных. */ + struct QEPCTL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +//---------------------------------------------------- +// Quadrature capture control register bit definitions */ +/* Описывает структуру QCAPCTL_BITS; порядок полей определяет расположение данных. */ +struct QCAPCTL_BITS { // bits description + /* Битовое поле UPPS, ширина 4 бит; данные UPPS. */ + Uint16 UPPS:4; // 3:0 Unit position pre-scale + /* Битовое поле CCPS, ширина 3 бит; данные CCPS. */ + Uint16 CCPS:3; // 6:4 QEP capture timer pre-scale + /* Битовое поле rsvd1, ширина 8 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:8; // 14:7 reserved + /* Битовое поле CEN, ширина 1 бит; данные CEN. */ + Uint16 CEN:1; // 15 Enable QEP capture +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Объединяет несколько представлений QCAPCTL_REG в одной области памяти. */ +union QCAPCTL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру QCAPCTL_BITS bit;; порядок полей определяет расположение данных. */ + struct QCAPCTL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + + +//---------------------------------------------------- +// Position compare control register bit definitions */ +/* Описывает структуру QPOSCTL_BITS; порядок полей определяет расположение данных. */ +struct QPOSCTL_BITS { // bits description + /* Битовое поле PCSPW, ширина 12 бит; данные PCSPW. */ + Uint16 PCSPW:12; // 11:0 Position compare sync pulse width + /* Битовое поле PCE, ширина 1 бит; данные PCE. */ + Uint16 PCE:1; // 12 Position compare enable/disable + /* Битовое поле PCPOL, ширина 1 бит; данные PCPOL. */ + Uint16 PCPOL:1; // 13 Polarity of sync output + /* Битовое поле PCLOAD, ширина 1 бит; данные PCLOAD. */ + Uint16 PCLOAD:1; // 14 Position compare of shadow load + /* Битовое поле PCSHDW, ширина 1 бит; данные PCSHDW. */ + Uint16 PCSHDW:1; // 15 Position compare shadow enable +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений QPOSCTL_REG в одной области памяти. */ +union QPOSCTL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру QPOSCTL_BITS bit;; порядок полей определяет расположение данных. */ + struct QPOSCTL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// QEP interrupt control register bit definitions */ +/* Описывает структуру QEINT_BITS; порядок полей определяет расположение данных. */ +struct QEINT_BITS { // bits description + /* Битовое поле rsvd1, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:1; // 0 reserved + /* Битовое поле PCE, ширина 1 бит; данные PCE. */ + Uint16 PCE:1; // 1 Position counter error + /* Битовое поле QPE, ширина 1 бит; данные QPE. */ + Uint16 QPE:1; // 2 Quadrature phase error + /* Битовое поле QDC, ширина 1 бит; данные QDC. */ + Uint16 QDC:1; // 3 Quadrature dir change + /* Битовое поле WTO, ширина 1 бит; данные WTO. */ + Uint16 WTO:1; // 4 Watchdog timeout + /* Битовое поле PCU, ширина 1 бит; данные PCU. */ + Uint16 PCU:1; // 5 Position counter underflow + /* Битовое поле PCO, ширина 1 бит; данные PCO. */ + Uint16 PCO:1; // 6 Position counter overflow + /* Битовое поле PCR, ширина 1 бит; данные PCR. */ + Uint16 PCR:1; // 7 Position compare ready + /* Битовое поле PCM, ширина 1 бит; данные PCM. */ + Uint16 PCM:1; // 8 Position compare match + /* Битовое поле SEL, ширина 1 бит; данные SEL. */ + Uint16 SEL:1; // 9 Strobe event latch + /* Битовое поле IEL, ширина 1 бит; данные IEL. */ + Uint16 IEL:1; // 10 Event latch + /* Битовое поле UTO, ширина 1 бит; данные UTO. */ + Uint16 UTO:1; // 11 Unit timeout + /* Битовое поле rsvd2, ширина 4 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:4; // 15:12 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Объединяет несколько представлений QEINT_REG в одной области памяти. */ +union QEINT_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру QEINT_BITS bit;; порядок полей определяет расположение данных. */ + struct QEINT_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +//---------------------------------------------------- +// QEP interrupt status register bit definitions */ +/* Описывает структуру QFLG_BITS; порядок полей определяет расположение данных. */ +struct QFLG_BITS { // bits description + /* Битовое поле INT, ширина 1 бит; данные INT. */ + Uint16 INT:1; // 0 Global interrupt + /* Битовое поле PCE, ширина 1 бит; данные PCE. */ + Uint16 PCE:1; // 1 Position counter error + /* Битовое поле PHE, ширина 1 бит; данные PHE. */ + Uint16 PHE:1; // 2 Quadrature phase error + /* Битовое поле QDC, ширина 1 бит; данные QDC. */ + Uint16 QDC:1; // 3 Quadrature dir change + /* Битовое поле WTO, ширина 1 бит; данные WTO. */ + Uint16 WTO:1; // 4 Watchdog timeout + /* Битовое поле PCU, ширина 1 бит; данные PCU. */ + Uint16 PCU:1; // 5 Position counter underflow + /* Битовое поле PCO, ширина 1 бит; данные PCO. */ + Uint16 PCO:1; // 6 Position counter overflow + /* Битовое поле PCR, ширина 1 бит; данные PCR. */ + Uint16 PCR:1; // 7 Position compare ready + /* Битовое поле PCM, ширина 1 бит; данные PCM. */ + Uint16 PCM:1; // 8 Position compare match + /* Битовое поле SEL, ширина 1 бит; данные SEL. */ + Uint16 SEL:1; // 9 Strobe event latch + /* Битовое поле IEL, ширина 1 бит; данные IEL. */ + Uint16 IEL:1; // 10 Event latch + /* Битовое поле UTO, ширина 1 бит; данные UTO. */ + Uint16 UTO:1; // 11 Unit timeout + /* Битовое поле rsvd2, ширина 4 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:4; // 15:12 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Объединяет несколько представлений QFLG_REG в одной области памяти. */ +union QFLG_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру QFLG_BITS bit;; порядок полей определяет расположение данных. */ + struct QFLG_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// QEP interrupt force register bit definitions */ +/* Описывает структуру QFRC_BITS; порядок полей определяет расположение данных. */ +struct QFRC_BITS { // bits description + /* Битовое поле reserved, ширина 1 бит; Зарезервировано; сохраняет положение следующих полей в аппаратном регистре. */ + Uint16 reserved:1; // 0 Reserved + /* Битовое поле PCE, ширина 1 бит; данные PCE. */ + Uint16 PCE:1; // 1 Position counter error + /* Битовое поле PHE, ширина 1 бит; данные PHE. */ + Uint16 PHE:1; // 2 Quadrature phase error + /* Битовое поле QDC, ширина 1 бит; данные QDC. */ + Uint16 QDC:1; // 3 Quadrature dir change + /* Битовое поле WTO, ширина 1 бит; данные WTO. */ + Uint16 WTO:1; // 4 Watchdog timeout + /* Битовое поле PCU, ширина 1 бит; данные PCU. */ + Uint16 PCU:1; // 5 Position counter underflow + /* Битовое поле PCO, ширина 1 бит; данные PCO. */ + Uint16 PCO:1; // 6 Position counter overflow + /* Битовое поле PCR, ширина 1 бит; данные PCR. */ + Uint16 PCR:1; // 7 Position compare ready + /* Битовое поле PCM, ширина 1 бит; данные PCM. */ + Uint16 PCM:1; // 8 Position compare match + /* Битовое поле SEL, ширина 1 бит; данные SEL. */ + Uint16 SEL:1; // 9 Strobe event latch + /* Битовое поле IEL, ширина 1 бит; данные IEL. */ + Uint16 IEL:1; // 10 Event latch + /* Битовое поле UTO, ширина 1 бит; данные UTO. */ + Uint16 UTO:1; // 11 Unit timeout + /* Битовое поле rsvd2, ширина 4 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:4; // 15:12 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Объединяет несколько представлений QFRC_REG в одной области памяти. */ +union QFRC_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру QFRC_BITS bit;; порядок полей определяет расположение данных. */ + struct QFRC_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// V1.1 Added UPEVNT (bit 7) This reflects changes +// made as of F2833x Rev A devices +//---------------------------------------------------- +// QEP status register bit definitions */ +/* Описывает структуру QEPSTS_BITS; порядок полей определяет расположение данных. */ +struct QEPSTS_BITS { // bits description + /* Битовое поле PCEF, ширина 1 бит; данные PCEF. */ + Uint16 PCEF:1; // 0 Position counter error + /* Битовое поле FIMF, ширина 1 бит; данные FIMF. */ + Uint16 FIMF:1; // 1 First index marker + /* Битовое поле CDEF, ширина 1 бит; данные CDEF. */ + Uint16 CDEF:1; // 2 Capture direction error + /* Битовое поле COEF, ширина 1 бит; данные COEF. */ + Uint16 COEF:1; // 3 Capture overflow error + /* Битовое поле QDLF, ширина 1 бит; данные QDLF. */ + Uint16 QDLF:1; // 4 QEP direction latch + /* Битовое поле QDF, ширина 1 бит; данные QDF. */ + Uint16 QDF:1; // 5 Quadrature direction + /* Битовое поле FIDF, ширина 1 бит; данные FIDF. */ + Uint16 FIDF:1; // 6 Direction on first index marker + /* Битовое поле UPEVNT, ширина 1 бит; данные UPEVNT. */ + Uint16 UPEVNT:1; // 7 Unit position event flag + /* Битовое поле rsvd1, ширина 8 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:8; // 15:8 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений QEPSTS_REG в одной области памяти. */ +union QEPSTS_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру QEPSTS_BITS bit;; порядок полей определяет расположение данных. */ + struct QEPSTS_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- + +/* Описывает структуру EQEP_REGS; порядок полей определяет расположение данных. */ +struct EQEP_REGS { + /* Объявляет QPOSCNT — данные QPOSCNT. */ + Uint32 QPOSCNT; // Position counter + /* Объявляет QPOSINIT — данные QPOSINIT. */ + Uint32 QPOSINIT; // Position counter init + /* Объявляет QPOSMAX — данные QPOSMAX. */ + Uint32 QPOSMAX; // Maximum position count + /* Объявляет QPOSCMP — данные QPOSCMP. */ + Uint32 QPOSCMP; // Position compare + /* Объявляет QPOSILAT — данные QPOSILAT. */ + Uint32 QPOSILAT; // Index position latch + /* Объявляет QPOSSLAT — данные QPOSSLAT. */ + Uint32 QPOSSLAT; // Strobe position latch + /* Объявляет QPOSLAT — данные QPOSLAT. */ + Uint32 QPOSLAT; // Position latch + /* Объявляет QUTMR — данные QUTMR. */ + Uint32 QUTMR; // Unit timer + /* Объявляет QUPRD — данные QUPRD. */ + Uint32 QUPRD; // Unit period + /* Объявляет QWDTMR — данные QWDTMR. */ + Uint16 QWDTMR; // QEP watchdog timer + /* Объявляет QWDPRD — данные QWDPRD. */ + Uint16 QWDPRD; // QEP watchdog period + /* Объединяет несколько представлений QDECCTL_REG QDECCTL; в одной области памяти. */ + union QDECCTL_REG QDECCTL; // Quadrature decoder control + /* Объединяет несколько представлений QEPCTL_REG QEPCTL; в одной области памяти. */ + union QEPCTL_REG QEPCTL; // QEP control + /* Объединяет несколько представлений QCAPCTL_REG QCAPCTL; в одной области памяти. */ + union QCAPCTL_REG QCAPCTL; // Quadrature capture control + /* Объединяет несколько представлений QPOSCTL_REG QPOSCTL; в одной области памяти. */ + union QPOSCTL_REG QPOSCTL; // Position compare control + /* Объединяет несколько представлений QEINT_REG QEINT; в одной области памяти. */ + union QEINT_REG QEINT; // QEP interrupt control + /* Объединяет несколько представлений QFLG_REG QFLG; в одной области памяти. */ + union QFLG_REG QFLG; // QEP interrupt flag + /* Объединяет несколько представлений QFLG_REG QCLR; в одной области памяти. */ + union QFLG_REG QCLR; // QEP interrupt clear + /* Объединяет несколько представлений QFRC_REG QFRC; в одной области памяти. */ + union QFRC_REG QFRC; // QEP interrupt force + /* Объединяет несколько представлений QEPSTS_REG QEPSTS; в одной области памяти. */ + union QEPSTS_REG QEPSTS; // QEP status + /* Объявляет QCTMR — данные QCTMR. */ + Uint16 QCTMR; // QEP capture timer + /* Объявляет QCPRD — данные QCPRD. */ + Uint16 QCPRD; // QEP capture period + /* Объявляет QCTMRLAT — данные QCTMRLAT. */ + Uint16 QCTMRLAT; // QEP capture latch + /* Объявляет QCPRDLAT — данные QCPRDLAT. */ + Uint16 QCPRDLAT; // QEP capture period latch + /* Объявляет rsvd1 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1[30]; // reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + + + +//--------------------------------------------------------------------------- +// GPI/O External References & Function Declarations: +// +/* Продолжает список аргументов, полей или выражение extern volatile struct EQEP_REGS EQep1Regs;; порядок элементов сохраняется. */ +extern volatile struct EQEP_REGS EQep1Regs; +/* Продолжает список аргументов, полей или выражение extern volatile struct EQEP_REGS EQep2Regs;; порядок элементов сохраняется. */ +extern volatile struct EQEP_REGS EQep2Regs; + + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_EQEP_H definition + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_Gpio.h b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_Gpio.h new file mode 100644 index 0000000..772b340 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_Gpio.h @@ -0,0 +1,711 @@ +/* Поставляемое TI описание Gpio для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/4 $ +// Checkin $Date: November 15, 2007 09:58:53 $ +//########################################################################### +// +// FILE: DSP2833x_Gpio.h +// +// TITLE: DSP2833x General Purpose I/O Definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_GPIO_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_GPIO_H +/* Определяет защитный символ или переключатель DSP2833x_GPIO_H для последующей компиляции. */ +#define DSP2833x_GPIO_H + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +//---------------------------------------------------- +// GPIO A control register bit definitions */ +/* Описывает структуру GPACTRL_BITS; порядок полей определяет расположение данных. */ +struct GPACTRL_BITS { // bits description + /* Битовое поле QUALPRD0, ширина 8 бит; данные QUALPRD0. */ + Uint16 QUALPRD0:8; // 7:0 Qual period + /* Битовое поле QUALPRD1, ширина 8 бит; данные QUALPRD1. */ + Uint16 QUALPRD1:8; // 15:8 Qual period + /* Битовое поле QUALPRD2, ширина 8 бит; данные QUALPRD2. */ + Uint16 QUALPRD2:8; // 23:16 Qual period + /* Битовое поле QUALPRD3, ширина 8 бит; данные QUALPRD3. */ + Uint16 QUALPRD3:8; // 31:24 Qual period +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений GPACTRL_REG в одной области памяти. */ +union GPACTRL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру GPACTRL_BITS bit;; порядок полей определяет расположение данных. */ + struct GPACTRL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// GPIO B control register bit definitions */ +/* Описывает структуру GPBCTRL_BITS; порядок полей определяет расположение данных. */ +struct GPBCTRL_BITS { // bits description + /* Битовое поле QUALPRD0, ширина 8 бит; данные QUALPRD0. */ + Uint16 QUALPRD0:8; // 7:0 Qual period + /* Битовое поле QUALPRD1, ширина 8 бит; данные QUALPRD1. */ + Uint16 QUALPRD1:8; // 15:8 Qual period + /* Битовое поле QUALPRD2, ширина 8 бит; данные QUALPRD2. */ + Uint16 QUALPRD2:8; // 23:16 Qual period + /* Битовое поле QUALPRD3, ширина 8 бит; данные QUALPRD3. */ + Uint16 QUALPRD3:8; // 31:24 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений GPBCTRL_REG в одной области памяти. */ +union GPBCTRL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру GPBCTRL_BITS bit;; порядок полей определяет расположение данных. */ + struct GPBCTRL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// GPIO A Qual/MUX select register bit definitions */ +/* Описывает структуру GPA1_BITS; порядок полей определяет расположение данных. */ +struct GPA1_BITS { // bits description + /* Битовое поле GPIO0, ширина 2 бит; аппаратная линия ввода/вывода GPIO0. */ + Uint16 GPIO0:2; // 1:0 GPIO0 + /* Битовое поле GPIO1, ширина 2 бит; аппаратная линия ввода/вывода GPIO1. */ + Uint16 GPIO1:2; // 3:2 GPIO1 + /* Битовое поле GPIO2, ширина 2 бит; аппаратная линия ввода/вывода GPIO2. */ + Uint16 GPIO2:2; // 5:4 GPIO2 + /* Битовое поле GPIO3, ширина 2 бит; аппаратная линия ввода/вывода GPIO3. */ + Uint16 GPIO3:2; // 7:6 GPIO3 + /* Битовое поле GPIO4, ширина 2 бит; аппаратная линия ввода/вывода GPIO4. */ + Uint16 GPIO4:2; // 9:8 GPIO4 + /* Битовое поле GPIO5, ширина 2 бит; аппаратная линия ввода/вывода GPIO5. */ + Uint16 GPIO5:2; // 11:10 GPIO5 + /* Битовое поле GPIO6, ширина 2 бит; аппаратная линия ввода/вывода GPIO6. */ + Uint16 GPIO6:2; // 13:12 GPIO6 + /* Битовое поле GPIO7, ширина 2 бит; аппаратная линия ввода/вывода GPIO7. */ + Uint16 GPIO7:2; // 15:14 GPIO7 + /* Битовое поле GPIO8, ширина 2 бит; аппаратная линия ввода/вывода GPIO8. */ + Uint16 GPIO8:2; // 17:16 GPIO8 + /* Битовое поле GPIO9, ширина 2 бит; аппаратная линия ввода/вывода GPIO9. */ + Uint16 GPIO9:2; // 19:18 GPIO9 + /* Битовое поле GPIO10, ширина 2 бит; аппаратная линия ввода/вывода GPIO10. */ + Uint16 GPIO10:2; // 21:20 GPIO10 + /* Битовое поле GPIO11, ширина 2 бит; аппаратная линия ввода/вывода GPIO11. */ + Uint16 GPIO11:2; // 23:22 GPIO11 + /* Битовое поле GPIO12, ширина 2 бит; аппаратная линия ввода/вывода GPIO12. */ + Uint16 GPIO12:2; // 25:24 GPIO12 + /* Битовое поле GPIO13, ширина 2 бит; аппаратная линия ввода/вывода GPIO13. */ + Uint16 GPIO13:2; // 27:26 GPIO13 + /* Битовое поле GPIO14, ширина 2 бит; аппаратная линия ввода/вывода GPIO14. */ + Uint16 GPIO14:2; // 29:28 GPIO14 + /* Битовое поле GPIO15, ширина 2 бит; аппаратная линия ввода/вывода GPIO15. */ + Uint16 GPIO15:2; // 31:30 GPIO15 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Описывает структуру GPA2_BITS; порядок полей определяет расположение данных. */ +struct GPA2_BITS { // bits description + /* Битовое поле GPIO16, ширина 2 бит; аппаратная линия ввода/вывода GPIO16. */ + Uint16 GPIO16:2; // 1:0 GPIO16 + /* Битовое поле GPIO17, ширина 2 бит; аппаратная линия ввода/вывода GPIO17. */ + Uint16 GPIO17:2; // 3:2 GPIO17 + /* Битовое поле GPIO18, ширина 2 бит; аппаратная линия ввода/вывода GPIO18. */ + Uint16 GPIO18:2; // 5:4 GPIO18 + /* Битовое поле GPIO19, ширина 2 бит; аппаратная линия ввода/вывода GPIO19. */ + Uint16 GPIO19:2; // 7:6 GPIO19 + /* Битовое поле GPIO20, ширина 2 бит; аппаратная линия ввода/вывода GPIO20. */ + Uint16 GPIO20:2; // 9:8 GPIO20 + /* Битовое поле GPIO21, ширина 2 бит; аппаратная линия ввода/вывода GPIO21. */ + Uint16 GPIO21:2; // 11:10 GPIO21 + /* Битовое поле GPIO22, ширина 2 бит; аппаратная линия ввода/вывода GPIO22. */ + Uint16 GPIO22:2; // 13:12 GPIO22 + /* Битовое поле GPIO23, ширина 2 бит; аппаратная линия ввода/вывода GPIO23. */ + Uint16 GPIO23:2; // 15:14 GPIO23 + /* Битовое поле GPIO24, ширина 2 бит; аппаратная линия ввода/вывода GPIO24. */ + Uint16 GPIO24:2; // 17:16 GPIO24 + /* Битовое поле GPIO25, ширина 2 бит; аппаратная линия ввода/вывода GPIO25. */ + Uint16 GPIO25:2; // 19:18 GPIO25 + /* Битовое поле GPIO26, ширина 2 бит; аппаратная линия ввода/вывода GPIO26. */ + Uint16 GPIO26:2; // 21:20 GPIO26 + /* Битовое поле GPIO27, ширина 2 бит; аппаратная линия ввода/вывода GPIO27. */ + Uint16 GPIO27:2; // 23:22 GPIO27 + /* Битовое поле GPIO28, ширина 2 бит; аппаратная линия ввода/вывода GPIO28. */ + Uint16 GPIO28:2; // 25:24 GPIO28 + /* Битовое поле GPIO29, ширина 2 бит; аппаратная линия ввода/вывода GPIO29. */ + Uint16 GPIO29:2; // 27:26 GPIO29 + /* Битовое поле GPIO30, ширина 2 бит; аппаратная линия ввода/вывода GPIO30. */ + Uint16 GPIO30:2; // 29:28 GPIO30 + /* Битовое поле GPIO31, ширина 2 бит; аппаратная линия ввода/вывода GPIO31. */ + Uint16 GPIO31:2; // 31:30 GPIO31 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Описывает структуру GPB1_BITS; порядок полей определяет расположение данных. */ +struct GPB1_BITS { // bits description + /* Битовое поле GPIO32, ширина 2 бит; аппаратная линия ввода/вывода GPIO32. */ + Uint16 GPIO32:2; // 1:0 GPIO32 + /* Битовое поле GPIO33, ширина 2 бит; аппаратная линия ввода/вывода GPIO33. */ + Uint16 GPIO33:2; // 3:2 GPIO33 + /* Битовое поле GPIO34, ширина 2 бит; аппаратная линия ввода/вывода GPIO34. */ + Uint16 GPIO34:2; // 5:4 GPIO34 + /* Битовое поле GPIO35, ширина 2 бит; аппаратная линия ввода/вывода GPIO35. */ + Uint16 GPIO35:2; // 7:6 GPIO35 + /* Битовое поле GPIO36, ширина 2 бит; аппаратная линия ввода/вывода GPIO36. */ + Uint16 GPIO36:2; // 9:8 GPIO36 + /* Битовое поле GPIO37, ширина 2 бит; аппаратная линия ввода/вывода GPIO37. */ + Uint16 GPIO37:2; // 11:10 GPIO37 + /* Битовое поле GPIO38, ширина 2 бит; аппаратная линия ввода/вывода GPIO38. */ + Uint16 GPIO38:2; // 13:12 GPIO38 + /* Битовое поле GPIO39, ширина 2 бит; аппаратная линия ввода/вывода GPIO39. */ + Uint16 GPIO39:2; // 15:14 GPIO39 + /* Битовое поле GPIO40, ширина 2 бит; аппаратная линия ввода/вывода GPIO40. */ + Uint16 GPIO40:2; // 17:16 GPIO40 + /* Битовое поле GPIO41, ширина 2 бит; аппаратная линия ввода/вывода GPIO41. */ + Uint16 GPIO41:2; // 19:16 GPIO41 + /* Битовое поле GPIO42, ширина 2 бит; аппаратная линия ввода/вывода GPIO42. */ + Uint16 GPIO42:2; // 21:20 GPIO42 + /* Битовое поле GPIO43, ширина 2 бит; аппаратная линия ввода/вывода GPIO43. */ + Uint16 GPIO43:2; // 23:22 GPIO43 + /* Битовое поле GPIO44, ширина 2 бит; аппаратная линия ввода/вывода GPIO44. */ + Uint16 GPIO44:2; // 25:24 GPIO44 + /* Битовое поле GPIO45, ширина 2 бит; аппаратная линия ввода/вывода GPIO45. */ + Uint16 GPIO45:2; // 27:26 GPIO45 + /* Битовое поле GPIO46, ширина 2 бит; аппаратная линия ввода/вывода GPIO46. */ + Uint16 GPIO46:2; // 29:28 GPIO46 + /* Битовое поле GPIO47, ширина 2 бит; аппаратная линия ввода/вывода GPIO47. */ + Uint16 GPIO47:2; // 31:30 GPIO47 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Описывает структуру GPB2_BITS; порядок полей определяет расположение данных. */ +struct GPB2_BITS { // bits description + /* Битовое поле GPIO48, ширина 2 бит; аппаратная линия ввода/вывода GPIO48. */ + Uint16 GPIO48:2; // 1:0 GPIO48 + /* Битовое поле GPIO49, ширина 2 бит; аппаратная линия ввода/вывода GPIO49. */ + Uint16 GPIO49:2; // 3:2 GPIO49 + /* Битовое поле GPIO50, ширина 2 бит; аппаратная линия ввода/вывода GPIO50. */ + Uint16 GPIO50:2; // 5:4 GPIO50 + /* Битовое поле GPIO51, ширина 2 бит; аппаратная линия ввода/вывода GPIO51. */ + Uint16 GPIO51:2; // 7:6 GPIO51 + /* Битовое поле GPIO52, ширина 2 бит; аппаратная линия ввода/вывода GPIO52. */ + Uint16 GPIO52:2; // 9:8 GPIO52 + /* Битовое поле GPIO53, ширина 2 бит; аппаратная линия ввода/вывода GPIO53. */ + Uint16 GPIO53:2; // 11:10 GPIO53 + /* Битовое поле GPIO54, ширина 2 бит; аппаратная линия ввода/вывода GPIO54. */ + Uint16 GPIO54:2; // 13:12 GPIO54 + /* Битовое поле GPIO55, ширина 2 бит; аппаратная линия ввода/вывода GPIO55. */ + Uint16 GPIO55:2; // 15:14 GPIO55 + /* Битовое поле GPIO56, ширина 2 бит; аппаратная линия ввода/вывода GPIO56. */ + Uint16 GPIO56:2; // 17:16 GPIO56 + /* Битовое поле GPIO57, ширина 2 бит; аппаратная линия ввода/вывода GPIO57. */ + Uint16 GPIO57:2; // 19:18 GPIO57 + /* Битовое поле GPIO58, ширина 2 бит; аппаратная линия ввода/вывода GPIO58. */ + Uint16 GPIO58:2; // 21:20 GPIO58 + /* Битовое поле GPIO59, ширина 2 бит; аппаратная линия ввода/вывода GPIO59. */ + Uint16 GPIO59:2; // 23:22 GPIO59 + /* Битовое поле GPIO60, ширина 2 бит; аппаратная линия ввода/вывода GPIO60. */ + Uint16 GPIO60:2; // 25:24 GPIO60 + /* Битовое поле GPIO61, ширина 2 бит; аппаратная линия ввода/вывода GPIO61. */ + Uint16 GPIO61:2; // 27:26 GPIO61 + /* Битовое поле GPIO62, ширина 2 бит; аппаратная линия ввода/вывода GPIO62. */ + Uint16 GPIO62:2; // 29:28 GPIO62 + /* Битовое поле GPIO63, ширина 2 бит; аппаратная линия ввода/вывода GPIO63. */ + Uint16 GPIO63:2; // 31:30 GPIO63 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Описывает структуру GPC1_BITS; порядок полей определяет расположение данных. */ +struct GPC1_BITS { // bits description + /* Битовое поле GPIO64, ширина 2 бит; аппаратная линия ввода/вывода GPIO64. */ + Uint16 GPIO64:2; // 1:0 GPIO64 + /* Битовое поле GPIO65, ширина 2 бит; аппаратная линия ввода/вывода GPIO65. */ + Uint16 GPIO65:2; // 3:2 GPIO65 + /* Битовое поле GPIO66, ширина 2 бит; аппаратная линия ввода/вывода GPIO66. */ + Uint16 GPIO66:2; // 5:4 GPIO66 + /* Битовое поле GPIO67, ширина 2 бит; аппаратная линия ввода/вывода GPIO67. */ + Uint16 GPIO67:2; // 7:6 GPIO67 + /* Битовое поле GPIO68, ширина 2 бит; аппаратная линия ввода/вывода GPIO68. */ + Uint16 GPIO68:2; // 9:8 GPIO68 + /* Битовое поле GPIO69, ширина 2 бит; аппаратная линия ввода/вывода GPIO69. */ + Uint16 GPIO69:2; // 11:10 GPIO69 + /* Битовое поле GPIO70, ширина 2 бит; аппаратная линия ввода/вывода GPIO70. */ + Uint16 GPIO70:2; // 13:12 GPIO70 + /* Битовое поле GPIO71, ширина 2 бит; аппаратная линия ввода/вывода GPIO71. */ + Uint16 GPIO71:2; // 15:14 GPIO71 + /* Битовое поле GPIO72, ширина 2 бит; аппаратная линия ввода/вывода GPIO72. */ + Uint16 GPIO72:2; // 17:16 GPIO72 + /* Битовое поле GPIO73, ширина 2 бит; аппаратная линия ввода/вывода GPIO73. */ + Uint16 GPIO73:2; // 19:18 GPIO73 + /* Битовое поле GPIO74, ширина 2 бит; аппаратная линия ввода/вывода GPIO74. */ + Uint16 GPIO74:2; // 21:20 GPIO74 + /* Битовое поле GPIO75, ширина 2 бит; аппаратная линия ввода/вывода GPIO75. */ + Uint16 GPIO75:2; // 23:22 GPIO75 + /* Битовое поле GPIO76, ширина 2 бит; аппаратная линия ввода/вывода GPIO76. */ + Uint16 GPIO76:2; // 25:24 GPIO76 + /* Битовое поле GPIO77, ширина 2 бит; аппаратная линия ввода/вывода GPIO77. */ + Uint16 GPIO77:2; // 27:26 GPIO77 + /* Битовое поле GPIO78, ширина 2 бит; аппаратная линия ввода/вывода GPIO78. */ + Uint16 GPIO78:2; // 29:28 GPIO78 + /* Битовое поле GPIO79, ширина 2 бит; аппаратная линия ввода/вывода GPIO79. */ + Uint16 GPIO79:2; // 31:30 GPIO79 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Описывает структуру GPC2_BITS; порядок полей определяет расположение данных. */ +struct GPC2_BITS { // bits description + /* Битовое поле GPIO80, ширина 2 бит; аппаратная линия ввода/вывода GPIO80. */ + Uint16 GPIO80:2; // 1:0 GPIO80 + /* Битовое поле GPIO81, ширина 2 бит; аппаратная линия ввода/вывода GPIO81. */ + Uint16 GPIO81:2; // 3:2 GPIO81 + /* Битовое поле GPIO82, ширина 2 бит; аппаратная линия ввода/вывода GPIO82. */ + Uint16 GPIO82:2; // 5:4 GPIO82 + /* Битовое поле GPIO83, ширина 2 бит; аппаратная линия ввода/вывода GPIO83. */ + Uint16 GPIO83:2; // 7:6 GPIO83 + /* Битовое поле GPIO84, ширина 2 бит; аппаратная линия ввода/вывода GPIO84. */ + Uint16 GPIO84:2; // 9:8 GPIO84 + /* Битовое поле GPIO85, ширина 2 бит; аппаратная линия ввода/вывода GPIO85. */ + Uint16 GPIO85:2; // 11:10 GPIO85 + /* Битовое поле GPIO86, ширина 2 бит; аппаратная линия ввода/вывода GPIO86. */ + Uint16 GPIO86:2; // 13:12 GPIO86 + /* Битовое поле GPIO87, ширина 2 бит; аппаратная линия ввода/вывода GPIO87. */ + Uint16 GPIO87:2; // 15:14 GPIO87 + /* Битовое поле rsvd, ширина 16 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:16; // 31:16 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Объединяет несколько представлений GPA1_REG в одной области памяти. */ +union GPA1_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру GPA1_BITS bit;; порядок полей определяет расположение данных. */ + struct GPA1_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений GPA2_REG в одной области памяти. */ +union GPA2_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру GPA2_BITS bit;; порядок полей определяет расположение данных. */ + struct GPA2_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений GPB1_REG в одной области памяти. */ +union GPB1_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру GPB1_BITS bit;; порядок полей определяет расположение данных. */ + struct GPB1_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений GPB2_REG в одной области памяти. */ +union GPB2_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру GPB2_BITS bit;; порядок полей определяет расположение данных. */ + struct GPB2_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений GPC1_REG в одной области памяти. */ +union GPC1_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру GPC1_BITS bit;; порядок полей определяет расположение данных. */ + struct GPC1_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений GPC2_REG в одной области памяти. */ +union GPC2_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру GPC2_BITS bit;; порядок полей определяет расположение данных. */ + struct GPC2_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// GPIO A DIR/TOGGLE/SET/CLEAR register bit definitions */ +/* Описывает структуру GPADAT_BITS; порядок полей определяет расположение данных. */ +struct GPADAT_BITS { // bits description + /* Битовое поле GPIO0, ширина 1 бит; аппаратная линия ввода/вывода GPIO0. */ + Uint16 GPIO0:1; // 0 GPIO0 + /* Битовое поле GPIO1, ширина 1 бит; аппаратная линия ввода/вывода GPIO1. */ + Uint16 GPIO1:1; // 1 GPIO1 + /* Битовое поле GPIO2, ширина 1 бит; аппаратная линия ввода/вывода GPIO2. */ + Uint16 GPIO2:1; // 2 GPIO2 + /* Битовое поле GPIO3, ширина 1 бит; аппаратная линия ввода/вывода GPIO3. */ + Uint16 GPIO3:1; // 3 GPIO3 + /* Битовое поле GPIO4, ширина 1 бит; аппаратная линия ввода/вывода GPIO4. */ + Uint16 GPIO4:1; // 4 GPIO4 + /* Битовое поле GPIO5, ширина 1 бит; аппаратная линия ввода/вывода GPIO5. */ + Uint16 GPIO5:1; // 5 GPIO5 + /* Битовое поле GPIO6, ширина 1 бит; аппаратная линия ввода/вывода GPIO6. */ + Uint16 GPIO6:1; // 6 GPIO6 + /* Битовое поле GPIO7, ширина 1 бит; аппаратная линия ввода/вывода GPIO7. */ + Uint16 GPIO7:1; // 7 GPIO7 + /* Битовое поле GPIO8, ширина 1 бит; аппаратная линия ввода/вывода GPIO8. */ + Uint16 GPIO8:1; // 8 GPIO8 + /* Битовое поле GPIO9, ширина 1 бит; аппаратная линия ввода/вывода GPIO9. */ + Uint16 GPIO9:1; // 9 GPIO9 + /* Битовое поле GPIO10, ширина 1 бит; аппаратная линия ввода/вывода GPIO10. */ + Uint16 GPIO10:1; // 10 GPIO10 + /* Битовое поле GPIO11, ширина 1 бит; аппаратная линия ввода/вывода GPIO11. */ + Uint16 GPIO11:1; // 11 GPIO11 + /* Битовое поле GPIO12, ширина 1 бит; аппаратная линия ввода/вывода GPIO12. */ + Uint16 GPIO12:1; // 12 GPIO12 + /* Битовое поле GPIO13, ширина 1 бит; аппаратная линия ввода/вывода GPIO13. */ + Uint16 GPIO13:1; // 13 GPIO13 + /* Битовое поле GPIO14, ширина 1 бит; аппаратная линия ввода/вывода GPIO14. */ + Uint16 GPIO14:1; // 14 GPIO14 + /* Битовое поле GPIO15, ширина 1 бит; аппаратная линия ввода/вывода GPIO15. */ + Uint16 GPIO15:1; // 15 GPIO15 + /* Битовое поле GPIO16, ширина 1 бит; аппаратная линия ввода/вывода GPIO16. */ + Uint16 GPIO16:1; // 16 GPIO16 + /* Битовое поле GPIO17, ширина 1 бит; аппаратная линия ввода/вывода GPIO17. */ + Uint16 GPIO17:1; // 17 GPIO17 + /* Битовое поле GPIO18, ширина 1 бит; аппаратная линия ввода/вывода GPIO18. */ + Uint16 GPIO18:1; // 18 GPIO18 + /* Битовое поле GPIO19, ширина 1 бит; аппаратная линия ввода/вывода GPIO19. */ + Uint16 GPIO19:1; // 19 GPIO19 + /* Битовое поле GPIO20, ширина 1 бит; аппаратная линия ввода/вывода GPIO20. */ + Uint16 GPIO20:1; // 20 GPIO20 + /* Битовое поле GPIO21, ширина 1 бит; аппаратная линия ввода/вывода GPIO21. */ + Uint16 GPIO21:1; // 21 GPIO21 + /* Битовое поле GPIO22, ширина 1 бит; аппаратная линия ввода/вывода GPIO22. */ + Uint16 GPIO22:1; // 22 GPIO22 + /* Битовое поле GPIO23, ширина 1 бит; аппаратная линия ввода/вывода GPIO23. */ + Uint16 GPIO23:1; // 23 GPIO23 + /* Битовое поле GPIO24, ширина 1 бит; аппаратная линия ввода/вывода GPIO24. */ + Uint16 GPIO24:1; // 24 GPIO24 + /* Битовое поле GPIO25, ширина 1 бит; аппаратная линия ввода/вывода GPIO25. */ + Uint16 GPIO25:1; // 25 GPIO25 + /* Битовое поле GPIO26, ширина 1 бит; аппаратная линия ввода/вывода GPIO26. */ + Uint16 GPIO26:1; // 26 GPIO26 + /* Битовое поле GPIO27, ширина 1 бит; аппаратная линия ввода/вывода GPIO27. */ + Uint16 GPIO27:1; // 27 GPIO27 + /* Битовое поле GPIO28, ширина 1 бит; аппаратная линия ввода/вывода GPIO28. */ + Uint16 GPIO28:1; // 28 GPIO28 + /* Битовое поле GPIO29, ширина 1 бит; аппаратная линия ввода/вывода GPIO29. */ + Uint16 GPIO29:1; // 29 GPIO29 + /* Битовое поле GPIO30, ширина 1 бит; аппаратная линия ввода/вывода GPIO30. */ + Uint16 GPIO30:1; // 30 GPIO30 + /* Битовое поле GPIO31, ширина 1 бит; аппаратная линия ввода/вывода GPIO31. */ + Uint16 GPIO31:1; // 31 GPIO31 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Описывает структуру GPBDAT_BITS; порядок полей определяет расположение данных. */ +struct GPBDAT_BITS { // bits description + /* Битовое поле GPIO32, ширина 1 бит; аппаратная линия ввода/вывода GPIO32. */ + Uint16 GPIO32:1; // 0 GPIO32 + /* Битовое поле GPIO33, ширина 1 бит; аппаратная линия ввода/вывода GPIO33. */ + Uint16 GPIO33:1; // 1 GPIO33 + /* Битовое поле GPIO34, ширина 1 бит; аппаратная линия ввода/вывода GPIO34. */ + Uint16 GPIO34:1; // 2 GPIO34 + /* Битовое поле GPIO35, ширина 1 бит; аппаратная линия ввода/вывода GPIO35. */ + Uint16 GPIO35:1; // 3 GPIO35 + /* Битовое поле GPIO36, ширина 1 бит; аппаратная линия ввода/вывода GPIO36. */ + Uint16 GPIO36:1; // 4 GPIO36 + /* Битовое поле GPIO37, ширина 1 бит; аппаратная линия ввода/вывода GPIO37. */ + Uint16 GPIO37:1; // 5 GPIO37 + /* Битовое поле GPIO38, ширина 1 бит; аппаратная линия ввода/вывода GPIO38. */ + Uint16 GPIO38:1; // 6 GPIO38 + /* Битовое поле GPIO39, ширина 1 бит; аппаратная линия ввода/вывода GPIO39. */ + Uint16 GPIO39:1; // 7 GPIO39 + /* Битовое поле GPIO40, ширина 1 бит; аппаратная линия ввода/вывода GPIO40. */ + Uint16 GPIO40:1; // 8 GPIO40 + /* Битовое поле GPIO41, ширина 1 бит; аппаратная линия ввода/вывода GPIO41. */ + Uint16 GPIO41:1; // 9 GPIO41 + /* Битовое поле GPIO42, ширина 1 бит; аппаратная линия ввода/вывода GPIO42. */ + Uint16 GPIO42:1; // 10 GPIO42 + /* Битовое поле GPIO43, ширина 1 бит; аппаратная линия ввода/вывода GPIO43. */ + Uint16 GPIO43:1; // 11 GPIO43 + /* Битовое поле GPIO44, ширина 1 бит; аппаратная линия ввода/вывода GPIO44. */ + Uint16 GPIO44:1; // 12 GPIO44 + /* Битовое поле GPIO45, ширина 1 бит; аппаратная линия ввода/вывода GPIO45. */ + Uint16 GPIO45:1; // 13 GPIO45 + /* Битовое поле GPIO46, ширина 1 бит; аппаратная линия ввода/вывода GPIO46. */ + Uint16 GPIO46:1; // 14 GPIO46 + /* Битовое поле GPIO47, ширина 1 бит; аппаратная линия ввода/вывода GPIO47. */ + Uint16 GPIO47:1; // 15 GPIO47 + /* Битовое поле GPIO48, ширина 1 бит; аппаратная линия ввода/вывода GPIO48. */ + Uint16 GPIO48:1; // 16 GPIO48 + /* Битовое поле GPIO49, ширина 1 бит; аппаратная линия ввода/вывода GPIO49. */ + Uint16 GPIO49:1; // 17 GPIO49 + /* Битовое поле GPIO50, ширина 1 бит; аппаратная линия ввода/вывода GPIO50. */ + Uint16 GPIO50:1; // 18 GPIO50 + /* Битовое поле GPIO51, ширина 1 бит; аппаратная линия ввода/вывода GPIO51. */ + Uint16 GPIO51:1; // 19 GPIO51 + /* Битовое поле GPIO52, ширина 1 бит; аппаратная линия ввода/вывода GPIO52. */ + Uint16 GPIO52:1; // 20 GPIO52 + /* Битовое поле GPIO53, ширина 1 бит; аппаратная линия ввода/вывода GPIO53. */ + Uint16 GPIO53:1; // 21 GPIO53 + /* Битовое поле GPIO54, ширина 1 бит; аппаратная линия ввода/вывода GPIO54. */ + Uint16 GPIO54:1; // 22 GPIO54 + /* Битовое поле GPIO55, ширина 1 бит; аппаратная линия ввода/вывода GPIO55. */ + Uint16 GPIO55:1; // 23 GPIO55 + /* Битовое поле GPIO56, ширина 1 бит; аппаратная линия ввода/вывода GPIO56. */ + Uint16 GPIO56:1; // 24 GPIO56 + /* Битовое поле GPIO57, ширина 1 бит; аппаратная линия ввода/вывода GPIO57. */ + Uint16 GPIO57:1; // 25 GPIO57 + /* Битовое поле GPIO58, ширина 1 бит; аппаратная линия ввода/вывода GPIO58. */ + Uint16 GPIO58:1; // 26 GPIO58 + /* Битовое поле GPIO59, ширина 1 бит; аппаратная линия ввода/вывода GPIO59. */ + Uint16 GPIO59:1; // 27 GPIO59 + /* Битовое поле GPIO60, ширина 1 бит; аппаратная линия ввода/вывода GPIO60. */ + Uint16 GPIO60:1; // 28 GPIO60 + /* Битовое поле GPIO61, ширина 1 бит; аппаратная линия ввода/вывода GPIO61. */ + Uint16 GPIO61:1; // 29 GPIO61 + /* Битовое поле GPIO62, ширина 1 бит; аппаратная линия ввода/вывода GPIO62. */ + Uint16 GPIO62:1; // 30 GPIO62 + /* Битовое поле GPIO63, ширина 1 бит; аппаратная линия ввода/вывода GPIO63. */ + Uint16 GPIO63:1; // 31 GPIO63 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Описывает структуру GPCDAT_BITS; порядок полей определяет расположение данных. */ +struct GPCDAT_BITS { // bits description + /* Битовое поле GPIO64, ширина 1 бит; аппаратная линия ввода/вывода GPIO64. */ + Uint16 GPIO64:1; // 0 GPIO64 + /* Битовое поле GPIO65, ширина 1 бит; аппаратная линия ввода/вывода GPIO65. */ + Uint16 GPIO65:1; // 1 GPIO65 + /* Битовое поле GPIO66, ширина 1 бит; аппаратная линия ввода/вывода GPIO66. */ + Uint16 GPIO66:1; // 2 GPIO66 + /* Битовое поле GPIO67, ширина 1 бит; аппаратная линия ввода/вывода GPIO67. */ + Uint16 GPIO67:1; // 3 GPIO67 + /* Битовое поле GPIO68, ширина 1 бит; аппаратная линия ввода/вывода GPIO68. */ + Uint16 GPIO68:1; // 4 GPIO68 + /* Битовое поле GPIO69, ширина 1 бит; аппаратная линия ввода/вывода GPIO69. */ + Uint16 GPIO69:1; // 5 GPIO69 + /* Битовое поле GPIO70, ширина 1 бит; аппаратная линия ввода/вывода GPIO70. */ + Uint16 GPIO70:1; // 6 GPIO70 + /* Битовое поле GPIO71, ширина 1 бит; аппаратная линия ввода/вывода GPIO71. */ + Uint16 GPIO71:1; // 7 GPIO71 + /* Битовое поле GPIO72, ширина 1 бит; аппаратная линия ввода/вывода GPIO72. */ + Uint16 GPIO72:1; // 8 GPIO72 + /* Битовое поле GPIO73, ширина 1 бит; аппаратная линия ввода/вывода GPIO73. */ + Uint16 GPIO73:1; // 9 GPIO73 + /* Битовое поле GPIO74, ширина 1 бит; аппаратная линия ввода/вывода GPIO74. */ + Uint16 GPIO74:1; // 10 GPIO74 + /* Битовое поле GPIO75, ширина 1 бит; аппаратная линия ввода/вывода GPIO75. */ + Uint16 GPIO75:1; // 11 GPIO75 + /* Битовое поле GPIO76, ширина 1 бит; аппаратная линия ввода/вывода GPIO76. */ + Uint16 GPIO76:1; // 12 GPIO76 + /* Битовое поле GPIO77, ширина 1 бит; аппаратная линия ввода/вывода GPIO77. */ + Uint16 GPIO77:1; // 13 GPIO77 + /* Битовое поле GPIO78, ширина 1 бит; аппаратная линия ввода/вывода GPIO78. */ + Uint16 GPIO78:1; // 14 GPIO78 + /* Битовое поле GPIO79, ширина 1 бит; аппаратная линия ввода/вывода GPIO79. */ + Uint16 GPIO79:1; // 15 GPIO79 + /* Битовое поле GPIO80, ширина 1 бит; аппаратная линия ввода/вывода GPIO80. */ + Uint16 GPIO80:1; // 16 GPIO80 + /* Битовое поле GPIO81, ширина 1 бит; аппаратная линия ввода/вывода GPIO81. */ + Uint16 GPIO81:1; // 17 GPIO81 + /* Битовое поле GPIO82, ширина 1 бит; аппаратная линия ввода/вывода GPIO82. */ + Uint16 GPIO82:1; // 18 GPIO82 + /* Битовое поле GPIO83, ширина 1 бит; аппаратная линия ввода/вывода GPIO83. */ + Uint16 GPIO83:1; // 19 GPIO83 + /* Битовое поле GPIO84, ширина 1 бит; аппаратная линия ввода/вывода GPIO84. */ + Uint16 GPIO84:1; // 20 GPIO84 + /* Битовое поле GPIO85, ширина 1 бит; аппаратная линия ввода/вывода GPIO85. */ + Uint16 GPIO85:1; // 21 GPIO85 + /* Битовое поле GPIO86, ширина 1 бит; аппаратная линия ввода/вывода GPIO86. */ + Uint16 GPIO86:1; // 22 GPIO86 + /* Битовое поле GPIO87, ширина 1 бит; аппаратная линия ввода/вывода GPIO87. */ + Uint16 GPIO87:1; // 23 GPIO87 + /* Битовое поле rsvd1, ширина 8 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:8; // 31:24 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Объединяет несколько представлений GPADAT_REG в одной области памяти. */ +union GPADAT_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру GPADAT_BITS bit;; порядок полей определяет расположение данных. */ + struct GPADAT_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений GPBDAT_REG в одной области памяти. */ +union GPBDAT_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру GPBDAT_BITS bit;; порядок полей определяет расположение данных. */ + struct GPBDAT_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений GPCDAT_REG в одной области памяти. */ +union GPCDAT_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру GPCDAT_BITS bit;; порядок полей определяет расположение данных. */ + struct GPCDAT_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + + + +//---------------------------------------------------- +// GPIO Xint1/XINT2/XNMI select register bit definitions */ +/* Описывает структуру GPIOXINT_BITS; порядок полей определяет расположение данных. */ +struct GPIOXINT_BITS { // bits description + /* Битовое поле GPIOSEL, ширина 5 бит; аппаратная линия ввода/вывода GPIOSEL. */ + Uint16 GPIOSEL:5; // 4:0 Select GPIO interrupt input source + /* Битовое поле rsvd1, ширина 11 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:11; // 15:5 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений GPIOXINT_REG в одной области памяти. */ +union GPIOXINT_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру GPIOXINT_BITS bit;; порядок полей определяет расположение данных. */ + struct GPIOXINT_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Описывает структуру GPIO_CTRL_REGS; порядок полей определяет расположение данных. */ +struct GPIO_CTRL_REGS { + /* Объединяет несколько представлений GPACTRL_REG GPACTRL; в одной области памяти. */ + union GPACTRL_REG GPACTRL; // GPIO A Control Register (GPIO0 to 31) + /* Объединяет несколько представлений GPA1_REG GPAQSEL1; в одной области памяти. */ + union GPA1_REG GPAQSEL1; // GPIO A Qualifier Select 1 Register (GPIO0 to 15) + /* Объединяет несколько представлений GPA2_REG GPAQSEL2; в одной области памяти. */ + union GPA2_REG GPAQSEL2; // GPIO A Qualifier Select 2 Register (GPIO16 to 31) + /* Объединяет несколько представлений GPA1_REG GPAMUX1; в одной области памяти. */ + union GPA1_REG GPAMUX1; // GPIO A Mux 1 Register (GPIO0 to 15) + /* Объединяет несколько представлений GPA2_REG GPAMUX2; в одной области памяти. */ + union GPA2_REG GPAMUX2; // GPIO A Mux 2 Register (GPIO16 to 31) + /* Объединяет несколько представлений GPADAT_REG GPADIR; в одной области памяти. */ + union GPADAT_REG GPADIR; // GPIO A Direction Register (GPIO0 to 31) + /* Объединяет несколько представлений GPADAT_REG GPAPUD; в одной области памяти. */ + union GPADAT_REG GPAPUD; // GPIO A Pull Up Disable Register (GPIO0 to 31) + /* Объявляет rsvd1 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint32 rsvd1; + /* Объединяет несколько представлений GPBCTRL_REG GPBCTRL; в одной области памяти. */ + union GPBCTRL_REG GPBCTRL; // GPIO B Control Register (GPIO32 to 63) + /* Объединяет несколько представлений GPB1_REG GPBQSEL1; в одной области памяти. */ + union GPB1_REG GPBQSEL1; // GPIO B Qualifier Select 1 Register (GPIO32 to 47) + /* Объединяет несколько представлений GPB2_REG GPBQSEL2; в одной области памяти. */ + union GPB2_REG GPBQSEL2; // GPIO B Qualifier Select 2 Register (GPIO48 to 63) + /* Объединяет несколько представлений GPB1_REG GPBMUX1; в одной области памяти. */ + union GPB1_REG GPBMUX1; // GPIO B Mux 1 Register (GPIO32 to 47) + /* Объединяет несколько представлений GPB2_REG GPBMUX2; в одной области памяти. */ + union GPB2_REG GPBMUX2; // GPIO B Mux 2 Register (GPIO48 to 63) + /* Объединяет несколько представлений GPBDAT_REG GPBDIR; в одной области памяти. */ + union GPBDAT_REG GPBDIR; // GPIO B Direction Register (GPIO32 to 63) + /* Объединяет несколько представлений GPBDAT_REG GPBPUD; в одной области памяти. */ + union GPBDAT_REG GPBPUD; // GPIO B Pull Up Disable Register (GPIO32 to 63) + /* Объявляет rsvd2 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2[8]; + /* Объединяет несколько представлений GPC1_REG GPCMUX1; в одной области памяти. */ + union GPC1_REG GPCMUX1; // GPIO C Mux 1 Register (GPIO64 to 79) + /* Объединяет несколько представлений GPC2_REG GPCMUX2; в одной области памяти. */ + union GPC2_REG GPCMUX2; // GPIO C Mux 2 Register (GPIO80 to 95) + /* Объединяет несколько представлений GPCDAT_REG GPCDIR; в одной области памяти. */ + union GPCDAT_REG GPCDIR; // GPIO C Direction Register (GPIO64 to 95) + /* Объединяет несколько представлений GPCDAT_REG GPCPUD; в одной области памяти. */ + union GPCDAT_REG GPCPUD; // GPIO C Pull Up Disable Register (GPIO64 to 95) +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Описывает структуру GPIO_DATA_REGS; порядок полей определяет расположение данных. */ +struct GPIO_DATA_REGS { + /* Объединяет несколько представлений GPADAT_REG GPADAT; в одной области памяти. */ + union GPADAT_REG GPADAT; // GPIO Data Register (GPIO0 to 31) + /* Объединяет несколько представлений GPADAT_REG GPASET; в одной области памяти. */ + union GPADAT_REG GPASET; // GPIO Data Set Register (GPIO0 to 31) + /* Объединяет несколько представлений GPADAT_REG GPACLEAR; в одной области памяти. */ + union GPADAT_REG GPACLEAR; // GPIO Data Clear Register (GPIO0 to 31) + /* Объединяет несколько представлений GPADAT_REG GPATOGGLE; в одной области памяти. */ + union GPADAT_REG GPATOGGLE; // GPIO Data Toggle Register (GPIO0 to 31) + /* Объединяет несколько представлений GPBDAT_REG GPBDAT; в одной области памяти. */ + union GPBDAT_REG GPBDAT; // GPIO Data Register (GPIO32 to 63) + /* Объединяет несколько представлений GPBDAT_REG GPBSET; в одной области памяти. */ + union GPBDAT_REG GPBSET; // GPIO Data Set Register (GPIO32 to 63) + /* Объединяет несколько представлений GPBDAT_REG GPBCLEAR; в одной области памяти. */ + union GPBDAT_REG GPBCLEAR; // GPIO Data Clear Register (GPIO32 to 63) + /* Объединяет несколько представлений GPBDAT_REG GPBTOGGLE; в одной области памяти. */ + union GPBDAT_REG GPBTOGGLE; // GPIO Data Toggle Register (GPIO32 to 63) + /* Объединяет несколько представлений GPCDAT_REG GPCDAT; в одной области памяти. */ + union GPCDAT_REG GPCDAT; // GPIO Data Register (GPIO64 to 95) + /* Объединяет несколько представлений GPCDAT_REG GPCSET; в одной области памяти. */ + union GPCDAT_REG GPCSET; // GPIO Data Set Register (GPIO64 to 95) + /* Объединяет несколько представлений GPCDAT_REG GPCCLEAR; в одной области памяти. */ + union GPCDAT_REG GPCCLEAR; // GPIO Data Clear Register (GPIO64 to 95) + /* Объединяет несколько представлений GPCDAT_REG GPCTOGGLE; в одной области памяти. */ + union GPCDAT_REG GPCTOGGLE; // GPIO Data Toggle Register (GPIO64 to 95) + /* Объявляет rsvd1 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1[8]; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Описывает структуру GPIO_INT_REGS; порядок полей определяет расположение данных. */ +struct GPIO_INT_REGS { + /* Объединяет несколько представлений GPIOXINT_REG GPIOXINT1SEL; в одной области памяти. */ + union GPIOXINT_REG GPIOXINT1SEL; // XINT1 GPIO Input Selection + /* Объединяет несколько представлений GPIOXINT_REG GPIOXINT2SEL; в одной области памяти. */ + union GPIOXINT_REG GPIOXINT2SEL; // XINT2 GPIO Input Selection + /* Объединяет несколько представлений GPIOXINT_REG GPIOXNMISEL; в одной области памяти. */ + union GPIOXINT_REG GPIOXNMISEL; // XNMI_Xint13 GPIO Input Selection + /* Объединяет несколько представлений GPIOXINT_REG GPIOXINT3SEL; в одной области памяти. */ + union GPIOXINT_REG GPIOXINT3SEL; // XINT3 GPIO Input Selection + /* Объединяет несколько представлений GPIOXINT_REG GPIOXINT4SEL; в одной области памяти. */ + union GPIOXINT_REG GPIOXINT4SEL; // XINT4 GPIO Input Selection + /* Объединяет несколько представлений GPIOXINT_REG GPIOXINT5SEL; в одной области памяти. */ + union GPIOXINT_REG GPIOXINT5SEL; // XINT5 GPIO Input Selection + /* Объединяет несколько представлений GPIOXINT_REG GPIOXINT6SEL; в одной области памяти. */ + union GPIOXINT_REG GPIOXINT6SEL; // XINT6 GPIO Input Selection + /* Объединяет несколько представлений GPIOXINT_REG GPIOXINT7SEL; в одной области памяти. */ + union GPIOXINT_REG GPIOXINT7SEL; // XINT7 GPIO Input Selection + /* Объединяет несколько представлений GPADAT_REG GPIOLPMSEL; в одной области памяти. */ + union GPADAT_REG GPIOLPMSEL; // Low power modes GP I/O input select +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +//--------------------------------------------------------------------------- +// GPI/O External References & Function Declarations: +// +/* Продолжает список аргументов, полей или выражение extern volatile struct GPIO_CTRL_REGS GpioCtrlRegs;; порядок элементов сохраняется. */ +extern volatile struct GPIO_CTRL_REGS GpioCtrlRegs; +/* Продолжает список аргументов, полей или выражение extern volatile struct GPIO_DATA_REGS GpioDataRegs;; порядок элементов сохраняется. */ +extern volatile struct GPIO_DATA_REGS GpioDataRegs; +/* Продолжает список аргументов, полей или выражение extern volatile struct GPIO_INT_REGS GpioIntRegs;; порядок элементов сохраняется. */ +extern volatile struct GPIO_INT_REGS GpioIntRegs; + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_GPIO_H definition + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_I2c.h b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_I2c.h new file mode 100644 index 0000000..da548ce --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_I2c.h @@ -0,0 +1,319 @@ +/* Поставляемое TI описание I2c для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/2 $ +// Checkin $Date: March 22, 2007 10:40:22 $ +//########################################################################### +// +// FILE: DSP2833x_I2c.h +// +// TITLE: DSP2833x Enhanced Quadrature Encoder Pulse Module +// Register Bit Definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_I2C_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_I2C_H +/* Определяет защитный символ или переключатель DSP2833x_I2C_H для последующей компиляции. */ +#define DSP2833x_I2C_H + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + + +//---------------------------------------------------- +// I2C interrupt vector register bit definitions */ +/* Описывает структуру I2CISRC_BITS; порядок полей определяет расположение данных. */ +struct I2CISRC_BITS { // bits description + /* Битовое поле INTCODE, ширина 3 бит; данные INTCODE. */ + Uint16 INTCODE:3; // 2:0 Interrupt code + /* Битовое поле rsvd1, ширина 13 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:13; // 15:3 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений I2CISRC_REG в одной области памяти. */ +union I2CISRC_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру I2CISRC_BITS bit;; порядок полей определяет расположение данных. */ + struct I2CISRC_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// I2C interrupt mask register bit definitions */ +/* Описывает структуру I2CIER_BITS; порядок полей определяет расположение данных. */ +struct I2CIER_BITS { // bits description + /* Битовое поле ARBL, ширина 1 бит; данные ARBL. */ + Uint16 ARBL:1; // 0 Arbitration lost interrupt + /* Битовое поле NACK, ширина 1 бит; данные NACK. */ + Uint16 NACK:1; // 1 No ack interrupt + /* Битовое поле ARDY, ширина 1 бит; данные ARDY. */ + Uint16 ARDY:1; // 2 Register access ready interrupt + /* Битовое поле RRDY, ширина 1 бит; данные RRDY. */ + Uint16 RRDY:1; // 3 Recieve data ready interrupt + /* Битовое поле XRDY, ширина 1 бит; данные XRDY. */ + Uint16 XRDY:1; // 4 Transmit data ready interrupt + /* Битовое поле SCD, ширина 1 бит; данные SCD. */ + Uint16 SCD:1; // 5 Stop condition detection + /* Битовое поле AAS, ширина 1 бит; данные AAS. */ + Uint16 AAS:1; // 6 Address as slave + /* Битовое поле rsvd, ширина 9 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:9; // 15:7 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений I2CIER_REG в одной области памяти. */ +union I2CIER_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру I2CIER_BITS bit;; порядок полей определяет расположение данных. */ + struct I2CIER_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// I2C status register bit definitions */ +/* Описывает структуру I2CSTR_BITS; порядок полей определяет расположение данных. */ +struct I2CSTR_BITS { // bits description + /* Битовое поле ARBL, ширина 1 бит; данные ARBL. */ + Uint16 ARBL:1; // 0 Arbitration lost interrupt + /* Битовое поле NACK, ширина 1 бит; данные NACK. */ + Uint16 NACK:1; // 1 No ack interrupt + /* Битовое поле ARDY, ширина 1 бит; данные ARDY. */ + Uint16 ARDY:1; // 2 Register access ready interrupt + /* Битовое поле RRDY, ширина 1 бит; данные RRDY. */ + Uint16 RRDY:1; // 3 Recieve data ready interrupt + /* Битовое поле XRDY, ширина 1 бит; данные XRDY. */ + Uint16 XRDY:1; // 4 Transmit data ready interrupt + /* Битовое поле SCD, ширина 1 бит; данные SCD. */ + Uint16 SCD:1; // 5 Stop condition detection + /* Битовое поле rsvd1, ширина 2 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:2; // 7:6 reserved + /* Битовое поле AD0, ширина 1 бит; данные AD0. */ + Uint16 AD0:1; // 8 Address Zero + /* Битовое поле AAS, ширина 1 бит; данные AAS. */ + Uint16 AAS:1; // 9 Address as slave + /* Битовое поле XSMT, ширина 1 бит; данные XSMT. */ + Uint16 XSMT:1; // 10 XMIT shift empty + /* Битовое поле RSFULL, ширина 1 бит; данные RSFULL. */ + Uint16 RSFULL:1; // 11 Recieve shift full + /* Битовое поле BB, ширина 1 бит; данные BB. */ + Uint16 BB:1; // 12 Bus busy + /* Битовое поле NACKSNT, ширина 1 бит; данные NACKSNT. */ + Uint16 NACKSNT:1; // 13 A no ack sent + /* Битовое поле SDIR, ширина 1 бит; данные SDIR. */ + Uint16 SDIR:1; // 14 Slave direction + /* Битовое поле rsvd2, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:1; // 15 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений I2CSTR_REG в одной области памяти. */ +union I2CSTR_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру I2CSTR_BITS bit;; порядок полей определяет расположение данных. */ + struct I2CSTR_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +//---------------------------------------------------- +// I2C mode control register bit definitions */ +/* Описывает структуру I2CMDR_BITS; порядок полей определяет расположение данных. */ +struct I2CMDR_BITS { // bits description + /* Битовое поле BC, ширина 3 бит; данные BC. */ + Uint16 BC:3; // 2:0 Bit count + /* Битовое поле FDF, ширина 1 бит; данные FDF. */ + Uint16 FDF:1; // 3 Free data format + /* Битовое поле STB, ширина 1 бит; данные STB. */ + Uint16 STB:1; // 4 Start byte + /* Битовое поле IRS, ширина 1 бит; данные IRS. */ + Uint16 IRS:1; // 5 I2C Reset not + /* Битовое поле DLB, ширина 1 бит; данные DLB. */ + Uint16 DLB:1; // 6 Digital loopback + /* Битовое поле RM, ширина 1 бит; данные RM. */ + Uint16 RM:1; // 7 Repeat mode + /* Битовое поле XA, ширина 1 бит; данные XA. */ + Uint16 XA:1; // 8 Expand address + /* Битовое поле TRX, ширина 1 бит; данные TRX. */ + Uint16 TRX:1; // 9 Transmitter/reciever + /* Битовое поле MST, ширина 1 бит; данные MST. */ + Uint16 MST:1; // 10 Master/slave + /* Битовое поле STP, ширина 1 бит; данные STP. */ + Uint16 STP:1; // 11 Stop condition + /* Битовое поле rsvd1, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:1; // 12 reserved + /* Битовое поле STT, ширина 1 бит; данные STT. */ + Uint16 STT:1; // 13 Start condition + /* Битовое поле FREE, ширина 1 бит; данные FREE. */ + Uint16 FREE:1; // 14 Emulation mode + /* Битовое поле NACKMOD, ширина 1 бит; данные NACKMOD. */ + Uint16 NACKMOD:1; // 15 No Ack mode +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений I2CMDR_REG в одной области памяти. */ +union I2CMDR_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру I2CMDR_BITS bit;; порядок полей определяет расположение данных. */ + struct I2CMDR_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// I2C pre-scaler register bit definitions */ +/* Описывает структуру I2CPSC_BITS; порядок полей определяет расположение данных. */ +struct I2CPSC_BITS { // bits description + /* Битовое поле IPSC, ширина 8 бит; данные IPSC. */ + Uint16 IPSC:8; // 7:0 pre-scaler + /* Битовое поле rsvd1, ширина 8 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:8; // 15:8 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Объединяет несколько представлений I2CPSC_REG в одной области памяти. */ +union I2CPSC_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру I2CPSC_BITS bit;; порядок полей определяет расположение данных. */ + struct I2CPSC_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +//---------------------------------------------------- +// TX FIFO control register bit definitions */ +/* Описывает структуру I2CFFTX_BITS; порядок полей определяет расположение данных. */ +struct I2CFFTX_BITS { // bits description + /* Битовое поле TXFFIL, ширина 5 бит; данные TXFFIL. */ + Uint16 TXFFIL:5; // 4:0 FIFO interrupt level + /* Битовое поле TXFFIENA, ширина 1 бит; данные TXFFIENA. */ + Uint16 TXFFIENA:1; // 5 FIFO interrupt enable/disable + /* Битовое поле TXFFINTCLR, ширина 1 бит; данные TXFFINTCLR. */ + Uint16 TXFFINTCLR:1; // 6 FIFO clear + /* Битовое поле TXFFINT, ширина 1 бит; данные TXFFINT. */ + Uint16 TXFFINT:1; // 7 FIFO interrupt flag + /* Битовое поле TXFFST, ширина 5 бит; данные TXFFST. */ + Uint16 TXFFST:5; // 12:8 FIFO level status + /* Битовое поле TXFFRST, ширина 1 бит; данные TXFFRST. */ + Uint16 TXFFRST:1; // 13 FIFO reset + /* Битовое поле I2CFFEN, ширина 1 бит; данные I2CFFEN. */ + Uint16 I2CFFEN:1; // 14 enable/disable TX & RX FIFOs + /* Битовое поле rsvd1, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:1; // 15 reserved + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений I2CFFTX_REG в одной области памяти. */ +union I2CFFTX_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру I2CFFTX_BITS bit;; порядок полей определяет расположение данных. */ + struct I2CFFTX_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// RX FIFO control register bit definitions */ +/* Описывает структуру I2CFFRX_BITS; порядок полей определяет расположение данных. */ +struct I2CFFRX_BITS { // bits description + /* Битовое поле RXFFIL, ширина 5 бит; данные RXFFIL. */ + Uint16 RXFFIL:5; // 4:0 FIFO interrupt level + /* Битовое поле RXFFIENA, ширина 1 бит; данные RXFFIENA. */ + Uint16 RXFFIENA:1; // 5 FIFO interrupt enable/disable + /* Битовое поле RXFFINTCLR, ширина 1 бит; данные RXFFINTCLR. */ + Uint16 RXFFINTCLR:1; // 6 FIFO clear + /* Битовое поле RXFFINT, ширина 1 бит; данные RXFFINT. */ + Uint16 RXFFINT:1; // 7 FIFO interrupt flag + /* Битовое поле RXFFST, ширина 5 бит; данные RXFFST. */ + Uint16 RXFFST:5; // 12:8 FIFO level + /* Битовое поле RXFFRST, ширина 1 бит; данные RXFFRST. */ + Uint16 RXFFRST:1; // 13 FIFO reset + /* Битовое поле rsvd1, ширина 2 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:2; // 15:14 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений I2CFFRX_REG в одной области памяти. */ +union I2CFFRX_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру I2CFFRX_BITS bit;; порядок полей определяет расположение данных. */ + struct I2CFFRX_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +//---------------------------------------------------- + +/* Описывает структуру I2C_REGS; порядок полей определяет расположение данных. */ +struct I2C_REGS { + /* Объявляет I2COAR — данные I2COAR. */ + Uint16 I2COAR; // Own address register + /* Объединяет несколько представлений I2CIER_REG I2CIER; в одной области памяти. */ + union I2CIER_REG I2CIER; // Interrupt enable + /* Объединяет несколько представлений I2CSTR_REG I2CSTR; в одной области памяти. */ + union I2CSTR_REG I2CSTR; // Interrupt status + /* Объявляет I2CCLKL — данные I2CCLKL. */ + Uint16 I2CCLKL; // Clock divider low + /* Объявляет I2CCLKH — данные I2CCLKH. */ + Uint16 I2CCLKH; // Clock divider high + /* Объявляет I2CCNT — данные I2CCNT. */ + Uint16 I2CCNT; // Data count + /* Объявляет I2CDRR — данные I2CDRR. */ + Uint16 I2CDRR; // Data recieve + /* Объявляет I2CSAR — данные I2CSAR. */ + Uint16 I2CSAR; // Slave address + /* Объявляет I2CDXR — данные I2CDXR. */ + Uint16 I2CDXR; // Data transmit + /* Объединяет несколько представлений I2CMDR_REG I2CMDR; в одной области памяти. */ + union I2CMDR_REG I2CMDR; // Mode + /* Объединяет несколько представлений I2CISRC_REG I2CISRC; в одной области памяти. */ + union I2CISRC_REG I2CISRC; // Interrupt source + /* Объявляет rsvd1 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1; // reserved + /* Объединяет несколько представлений I2CPSC_REG I2CPSC; в одной области памяти. */ + union I2CPSC_REG I2CPSC; // Pre-scaler + /* Объявляет rsvd2 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2[19]; // reserved + /* Объединяет несколько представлений I2CFFTX_REG I2CFFTX; в одной области памяти. */ + union I2CFFTX_REG I2CFFTX; // Transmit FIFO + /* Объединяет несколько представлений I2CFFRX_REG I2CFFRX; в одной области памяти. */ + union I2CFFRX_REG I2CFFRX; // Recieve FIFO +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + + + +//--------------------------------------------------------------------------- +// External References & Function Declarations: +// +/* Продолжает список аргументов, полей или выражение extern volatile struct I2C_REGS I2caRegs;; порядок элементов сохраняется. */ +extern volatile struct I2C_REGS I2caRegs; + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_I2C_H definition + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_Mcbsp.h b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_Mcbsp.h new file mode 100644 index 0000000..b70e765 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_Mcbsp.h @@ -0,0 +1,1299 @@ +/* Поставляемое TI описание Mcbsp для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/5 $ +// Checkin $Date: May 14, 2008 16:30:31 $ +//########################################################################### +// +// FILE: DSP2833x_Mcbsp.h +// +// TITLE: DSP2833x Device McBSP Register Definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_MCBSP_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_MCBSP_H +/* Определяет защитный символ или переключатель DSP2833x_MCBSP_H для последующей компиляции. */ +#define DSP2833x_MCBSP_H + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + + +//--------------------------------------------------------------------------- +// McBSP Individual Register Bit Definitions: +// +// McBSP DRR2 register bit definitions: +/* Описывает структуру DRR2_BITS; порядок полей определяет расположение данных. */ +struct DRR2_BITS { // bit description + /* Битовое поле HWLB, ширина 8 бит; данные HWLB. */ + Uint16 HWLB:8; // 16:23 High word low byte + /* Битовое поле HWHB, ширина 8 бит; данные HWHB. */ + Uint16 HWHB:8; // 24:31 High word high byte +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений DRR2_REG в одной области памяти. */ +union DRR2_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру DRR2_BITS bit;; порядок полей определяет расположение данных. */ + struct DRR2_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// McBSP DRR1 register bit definitions: +/* Описывает структуру DRR1_BITS; порядок полей определяет расположение данных. */ +struct DRR1_BITS { // bit description + /* Битовое поле LWLB, ширина 8 бит; данные LWLB. */ + Uint16 LWLB:8; // 16:23 Low word low byte + /* Битовое поле LWHB, ширина 8 бит; данные LWHB. */ + Uint16 LWHB:8; // 24:31 low word high byte +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений DRR1_REG в одной области памяти. */ +union DRR1_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру DRR1_BITS bit;; порядок полей определяет расположение данных. */ + struct DRR1_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// McBSP DXR2 register bit definitions: +/* Описывает структуру DXR2_BITS; порядок полей определяет расположение данных. */ +struct DXR2_BITS { // bit description + /* Битовое поле HWLB, ширина 8 бит; данные HWLB. */ + Uint16 HWLB:8; // 16:23 High word low byte + /* Битовое поле HWHB, ширина 8 бит; данные HWHB. */ + Uint16 HWHB:8; // 24:31 High word high byte +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений DXR2_REG в одной области памяти. */ +union DXR2_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру DXR2_BITS bit;; порядок полей определяет расположение данных. */ + struct DXR2_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// McBSP DXR1 register bit definitions: +/* Описывает структуру DXR1_BITS; порядок полей определяет расположение данных. */ +struct DXR1_BITS { // bit description + /* Битовое поле LWLB, ширина 8 бит; данные LWLB. */ + Uint16 LWLB:8; // 16:23 Low word low byte + /* Битовое поле LWHB, ширина 8 бит; данные LWHB. */ + Uint16 LWHB:8; // 24:31 low word high byte +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений DXR1_REG в одной области памяти. */ +union DXR1_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру DXR1_BITS bit;; порядок полей определяет расположение данных. */ + struct DXR1_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// SPCR2 control register bit definitions: +/* Описывает структуру SPCR2_BITS; порядок полей определяет расположение данных. */ +struct SPCR2_BITS { // bit description + /* Битовое поле XRST, ширина 1 бит; данные XRST. */ + Uint16 XRST:1; // 0 transmit reset + /* Битовое поле XRDY, ширина 1 бит; данные XRDY. */ + Uint16 XRDY:1; // 1 transmit ready + /* Битовое поле XEMPTY, ширина 1 бит; данные XEMPTY. */ + Uint16 XEMPTY:1; // 2 Transmit empty + /* Битовое поле XSYNCERR, ширина 1 бит; данные XSYNCERR. */ + Uint16 XSYNCERR:1; // 3 Transmit syn errorINT flag + /* Битовое поле XINTM, ширина 2 бит; данные XINTM. */ + Uint16 XINTM:2; // 5:4 Transmit interrupt types + /* Битовое поле GRST, ширина 1 бит; данные GRST. */ + Uint16 GRST:1; // 6 CLKG reset + /* Битовое поле FRST, ширина 1 бит; данные FRST. */ + Uint16 FRST:1; // 7 Frame sync reset + /* Битовое поле SOFT, ширина 1 бит; данные SOFT. */ + Uint16 SOFT:1; // 8 SOFT bit + /* Битовое поле FREE, ширина 1 бит; данные FREE. */ + Uint16 FREE:1; // 9 FREE bit + /* Битовое поле rsvd, ширина 6 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:6; // 15:10 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений SPCR2_REG в одной области памяти. */ +union SPCR2_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру SPCR2_BITS bit;; порядок полей определяет расположение данных. */ + struct SPCR2_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// SPCR1 control register bit definitions: +/* Описывает структуру SPCR1_BITS; порядок полей определяет расположение данных. */ +struct SPCR1_BITS { // bit description + /* Битовое поле RRST, ширина 1 бит; данные RRST. */ + Uint16 RRST:1; // 0 Receive reset + /* Битовое поле RRDY, ширина 1 бит; данные RRDY. */ + Uint16 RRDY:1; // 1 Receive ready + /* Битовое поле RFULL, ширина 1 бит; данные RFULL. */ + Uint16 RFULL:1; // 2 Receive full + /* Битовое поле RSYNCERR, ширина 1 бит; данные RSYNCERR. */ + Uint16 RSYNCERR:1; // 7 Receive syn error + /* Битовое поле RINTM, ширина 2 бит; данные RINTM. */ + Uint16 RINTM:2; // 5:4 Receive interrupt types + /* Битовое поле ABIS, ширина 1 бит; данные ABIS. */ + Uint16 ABIS:1; // 6 ABIS mode select + /* Битовое поле DXENA, ширина 1 бит; данные DXENA. */ + Uint16 DXENA:1; // 7 DX hi-z enable + /* Битовое поле rsvd, ширина 3 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:3; // 10:8 reserved + /* Битовое поле CLKSTP, ширина 2 бит; данные CLKSTP. */ + Uint16 CLKSTP:2; // 12:11 CLKSTOP mode bit + /* Битовое поле RJUST, ширина 2 бит; данные RJUST. */ + Uint16 RJUST:2; // 13:14 Right justified + /* Битовое поле DLB, ширина 1 бит; данные DLB. */ + Uint16 DLB:1; // 15 Digital loop back +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений SPCR1_REG в одной области памяти. */ +union SPCR1_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру SPCR1_BITS bit;; порядок полей определяет расположение данных. */ + struct SPCR1_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// RCR2 control register bit definitions: +/* Описывает структуру RCR2_BITS; порядок полей определяет расположение данных. */ +struct RCR2_BITS { // bit description + /* Битовое поле RDATDLY, ширина 2 бит; данные RDATDLY. */ + Uint16 RDATDLY:2; // 1:0 Receive data delay + /* Битовое поле RFIG, ширина 1 бит; данные RFIG. */ + Uint16 RFIG:1; // 2 Receive frame sync ignore + /* Битовое поле RCOMPAND, ширина 2 бит; данные RCOMPAND. */ + Uint16 RCOMPAND:2; // 4:3 Receive Companding Mode selects + /* Битовое поле RWDLEN2, ширина 3 бит; данные RWDLEN2. */ + Uint16 RWDLEN2:3; // 7:5 Receive word length + /* Битовое поле RFRLEN2, ширина 7 бит; данные RFRLEN2. */ + Uint16 RFRLEN2:7; // 14:8 Receive Frame sync + /* Битовое поле RPHASE, ширина 1 бит; данные RPHASE. */ + Uint16 RPHASE:1; // 15 Receive Phase +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений RCR2_REG в одной области памяти. */ +union RCR2_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру RCR2_BITS bit;; порядок полей определяет расположение данных. */ + struct RCR2_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// RCR1 control register bit definitions: +/* Описывает структуру RCR1_BITS; порядок полей определяет расположение данных. */ +struct RCR1_BITS { // bit description + /* Битовое поле rsvd1, ширина 5 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:5; // 4:0 reserved + /* Битовое поле RWDLEN1, ширина 3 бит; данные RWDLEN1. */ + Uint16 RWDLEN1:3; // 7:5 Receive word length + /* Битовое поле RFRLEN1, ширина 7 бит; данные RFRLEN1. */ + Uint16 RFRLEN1:7; // 14:8 Receive frame length + /* Битовое поле rsvd2, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:1; // 15 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений RCR1_REG в одной области памяти. */ +union RCR1_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру RCR1_BITS bit;; порядок полей определяет расположение данных. */ + struct RCR1_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// XCR2 control register bit definitions: + +/* Описывает структуру XCR2_BITS; порядок полей определяет расположение данных. */ +struct XCR2_BITS { // bit description + /* Битовое поле XDATDLY, ширина 2 бит; данные XDATDLY. */ + Uint16 XDATDLY:2; // 1:0 Transmit data delay + /* Битовое поле XFIG, ширина 1 бит; данные XFIG. */ + Uint16 XFIG:1; // 2 Transmit frame sync ignore + /* Битовое поле XCOMPAND, ширина 2 бит; данные XCOMPAND. */ + Uint16 XCOMPAND:2; // 4:3 Transmit Companding Mode selects + /* Битовое поле XWDLEN2, ширина 3 бит; данные XWDLEN2. */ + Uint16 XWDLEN2:3; // 7:5 Transmit word length + /* Битовое поле XFRLEN2, ширина 7 бит; данные XFRLEN2. */ + Uint16 XFRLEN2:7; // 14:8 Transmit Frame sync + /* Битовое поле XPHASE, ширина 1 бит; данные XPHASE. */ + Uint16 XPHASE:1; // 15 Transmit Phase +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений XCR2_REG в одной области памяти. */ +union XCR2_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру XCR2_BITS bit;; порядок полей определяет расположение данных. */ + struct XCR2_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// XCR1 control register bit definitions: +/* Описывает структуру XCR1_BITS; порядок полей определяет расположение данных. */ +struct XCR1_BITS { // bit description + /* Битовое поле rsvd1, ширина 5 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:5; // 4:0 reserved + /* Битовое поле XWDLEN1, ширина 3 бит; данные XWDLEN1. */ + Uint16 XWDLEN1:3; // 7:5 Transmit word length + /* Битовое поле XFRLEN1, ширина 7 бит; данные XFRLEN1. */ + Uint16 XFRLEN1:7; // 14:8 Transmit frame length + /* Битовое поле rsvd2, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:1; // 15 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений XCR1_REG в одной области памяти. */ +union XCR1_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру XCR1_BITS bit;; порядок полей определяет расположение данных. */ + struct XCR1_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// SRGR2 Sample rate generator control register bit definitions: +/* Описывает структуру SRGR2_BITS; порядок полей определяет расположение данных. */ +struct SRGR2_BITS { // bit description + /* Битовое поле FPER, ширина 12 бит; данные FPER. */ + Uint16 FPER:12; // 11:0 Frame period + /* Битовое поле FSGM, ширина 1 бит; данные FSGM. */ + Uint16 FSGM:1; // 12 Frame sync generator mode + /* Битовое поле CLKSM, ширина 1 бит; данные CLKSM. */ + Uint16 CLKSM:1; // 13 Sample rate generator mode + /* Битовое поле rsvd, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:1; // 14 reserved + /* Битовое поле GSYNC, ширина 1 бит; данные GSYNC. */ + Uint16 GSYNC:1; // 15 CLKG sync +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений SRGR2_REG в одной области памяти. */ +union SRGR2_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру SRGR2_BITS bit;; порядок полей определяет расположение данных. */ + struct SRGR2_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// SRGR1 control register bit definitions: +/* Описывает структуру SRGR1_BITS; порядок полей определяет расположение данных. */ +struct SRGR1_BITS { // bit description + /* Битовое поле CLKGDV, ширина 8 бит; данные CLKGDV. */ + Uint16 CLKGDV:8; // 7:0 CLKG divider + /* Битовое поле FWID, ширина 8 бит; данные FWID. */ + Uint16 FWID:8; // 15:8 Frame width +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений SRGR1_REG в одной области памяти. */ +union SRGR1_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру SRGR1_BITS bit;; порядок полей определяет расположение данных. */ + struct SRGR1_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// MCR2 Multichannel control register bit definitions: +/* Описывает структуру MCR2_BITS; порядок полей определяет расположение данных. */ +struct MCR2_BITS { // bit description + /* Битовое поле XMCM, ширина 2 бит; данные XMCM. */ + Uint16 XMCM:2; // 1:0 Transmit multichannel mode + /* Битовое поле XCBLK, ширина 3 бит; данные XCBLK. */ + Uint16 XCBLK:3; // 2:4 Transmit current block + /* Битовое поле XPABLK, ширина 2 бит; данные XPABLK. */ + Uint16 XPABLK:2; // 5:6 Transmit partition A Block + /* Битовое поле XPBBLK, ширина 2 бит; данные XPBBLK. */ + Uint16 XPBBLK:2; // 7:8 Transmit partition B Block + /* Битовое поле XMCME, ширина 1 бит; данные XMCME. */ + Uint16 XMCME:1; // 9 Transmit multi-channel enhance mode + /* Битовое поле rsvd, ширина 6 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:6; // 15:10 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений MCR2_REG в одной области памяти. */ +union MCR2_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру MCR2_BITS bit;; порядок полей определяет расположение данных. */ + struct MCR2_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// MCR1 Multichannel control register bit definitions: +/* Описывает структуру MCR1_BITS; порядок полей определяет расположение данных. */ +struct MCR1_BITS { // bit description + /* Битовое поле RMCM, ширина 1 бит; данные RMCM. */ + Uint16 RMCM:1; // 0 Receive multichannel mode + /* Битовое поле rsvd, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:1; // 1 reserved + /* Битовое поле RCBLK, ширина 3 бит; данные RCBLK. */ + Uint16 RCBLK:3; // 4:2 Receive current block + /* Битовое поле RPABLK, ширина 2 бит; данные RPABLK. */ + Uint16 RPABLK:2; // 6:5 Receive partition A Block + /* Битовое поле RPBBLK, ширина 2 бит; данные RPBBLK. */ + Uint16 RPBBLK:2; // 7:8 Receive partition B Block + /* Битовое поле RMCME, ширина 1 бит; данные RMCME. */ + Uint16 RMCME:1; // 9 Receive multi-channel enhance mode + /* Битовое поле rsvd1, ширина 6 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:6; // 15:10 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений MCR1_REG в одной области памяти. */ +union MCR1_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру MCR1_BITS bit;; порядок полей определяет расположение данных. */ + struct MCR1_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// RCERA control register bit definitions: +/* Описывает структуру RCERA_BITS; порядок полей определяет расположение данных. */ +struct RCERA_BITS { // bit description + /* Битовое поле RCEA0, ширина 1 бит; данные RCEA0. */ + Uint16 RCEA0:1; // 0 Receive Channel enable bit + /* Битовое поле RCEA1, ширина 1 бит; данные RCEA1. */ + Uint16 RCEA1:1; // 1 Receive Channel enable bit + /* Битовое поле RCEA2, ширина 1 бит; данные RCEA2. */ + Uint16 RCEA2:1; // 2 Receive Channel enable bit + /* Битовое поле RCEA3, ширина 1 бит; данные RCEA3. */ + Uint16 RCEA3:1; // 3 Receive Channel enable bit + /* Битовое поле RCEA4, ширина 1 бит; данные RCEA4. */ + Uint16 RCEA4:1; // 4 Receive Channel enable bit + /* Битовое поле RCEA5, ширина 1 бит; данные RCEA5. */ + Uint16 RCEA5:1; // 5 Receive Channel enable bit + /* Битовое поле RCEA6, ширина 1 бит; данные RCEA6. */ + Uint16 RCEA6:1; // 6 Receive Channel enable bit + /* Битовое поле RCEA7, ширина 1 бит; данные RCEA7. */ + Uint16 RCEA7:1; // 7 Receive Channel enable bit + /* Битовое поле RCEA8, ширина 1 бит; данные RCEA8. */ + Uint16 RCEA8:1; // 8 Receive Channel enable bit + /* Битовое поле RCEA9, ширина 1 бит; данные RCEA9. */ + Uint16 RCEA9:1; // 9 Receive Channel enable bit + /* Битовое поле RCEA10, ширина 1 бит; данные RCEA10. */ + Uint16 RCEA10:1; // 10 Receive Channel enable bit + /* Битовое поле RCEA11, ширина 1 бит; данные RCEA11. */ + Uint16 RCEA11:1; // 11 Receive Channel enable bit + /* Битовое поле RCEA12, ширина 1 бит; данные RCEA12. */ + Uint16 RCEA12:1; // 12 Receive Channel enable bit + /* Битовое поле RCEA13, ширина 1 бит; данные RCEA13. */ + Uint16 RCEA13:1; // 13 Receive Channel enable bit + /* Битовое поле RCEA14, ширина 1 бит; данные RCEA14. */ + Uint16 RCEA14:1; // 14 Receive Channel enable bit + /* Битовое поле RCEA15, ширина 1 бит; данные RCEA15. */ + Uint16 RCEA15:1; // 15 Receive Channel enable bit +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений RCERA_REG в одной области памяти. */ +union RCERA_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру RCERA_BITS bit;; порядок полей определяет расположение данных. */ + struct RCERA_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// RCERB control register bit definitions: +/* Описывает структуру RCERB_BITS; порядок полей определяет расположение данных. */ +struct RCERB_BITS { // bit description + /* Битовое поле RCEB0, ширина 1 бит; данные RCEB0. */ + Uint16 RCEB0:1; // 0 Receive Channel enable bit + /* Битовое поле RCEB1, ширина 1 бит; данные RCEB1. */ + Uint16 RCEB1:1; // 1 Receive Channel enable bit + /* Битовое поле RCEB2, ширина 1 бит; данные RCEB2. */ + Uint16 RCEB2:1; // 2 Receive Channel enable bit + /* Битовое поле RCEB3, ширина 1 бит; данные RCEB3. */ + Uint16 RCEB3:1; // 3 Receive Channel enable bit + /* Битовое поле RCEB4, ширина 1 бит; данные RCEB4. */ + Uint16 RCEB4:1; // 4 Receive Channel enable bit + /* Битовое поле RCEB5, ширина 1 бит; данные RCEB5. */ + Uint16 RCEB5:1; // 5 Receive Channel enable bit + /* Битовое поле RCEB6, ширина 1 бит; данные RCEB6. */ + Uint16 RCEB6:1; // 6 Receive Channel enable bit + /* Битовое поле RCEB7, ширина 1 бит; данные RCEB7. */ + Uint16 RCEB7:1; // 7 Receive Channel enable bit + /* Битовое поле RCEB8, ширина 1 бит; данные RCEB8. */ + Uint16 RCEB8:1; // 8 Receive Channel enable bit + /* Битовое поле RCEB9, ширина 1 бит; данные RCEB9. */ + Uint16 RCEB9:1; // 9 Receive Channel enable bit + /* Битовое поле RCEB10, ширина 1 бит; данные RCEB10. */ + Uint16 RCEB10:1; // 10 Receive Channel enable bit + /* Битовое поле RCEB11, ширина 1 бит; данные RCEB11. */ + Uint16 RCEB11:1; // 11 Receive Channel enable bit + /* Битовое поле RCEB12, ширина 1 бит; данные RCEB12. */ + Uint16 RCEB12:1; // 12 Receive Channel enable bit + /* Битовое поле RCEB13, ширина 1 бит; данные RCEB13. */ + Uint16 RCEB13:1; // 13 Receive Channel enable bit + /* Битовое поле RCEB14, ширина 1 бит; данные RCEB14. */ + Uint16 RCEB14:1; // 14 Receive Channel enable bit + /* Битовое поле RCEB15, ширина 1 бит; данные RCEB15. */ + Uint16 RCEB15:1; // 15 Receive Channel enable bit +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений RCERB_REG в одной области памяти. */ +union RCERB_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру RCERB_BITS bit;; порядок полей определяет расположение данных. */ + struct RCERB_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// XCERA control register bit definitions: +/* Описывает структуру XCERA_BITS; порядок полей определяет расположение данных. */ +struct XCERA_BITS { // bit description + /* Битовое поле XCERA0, ширина 1 бит; данные XCERA0. */ + Uint16 XCERA0:1; // 0 Receive Channel enable bit + /* Битовое поле XCERA1, ширина 1 бит; данные XCERA1. */ + Uint16 XCERA1:1; // 1 Receive Channel enable bit + /* Битовое поле XCERA2, ширина 1 бит; данные XCERA2. */ + Uint16 XCERA2:1; // 2 Receive Channel enable bit + /* Битовое поле XCERA3, ширина 1 бит; данные XCERA3. */ + Uint16 XCERA3:1; // 3 Receive Channel enable bit + /* Битовое поле XCERA4, ширина 1 бит; данные XCERA4. */ + Uint16 XCERA4:1; // 4 Receive Channel enable bit + /* Битовое поле XCERA5, ширина 1 бит; данные XCERA5. */ + Uint16 XCERA5:1; // 5 Receive Channel enable bit + /* Битовое поле XCERA6, ширина 1 бит; данные XCERA6. */ + Uint16 XCERA6:1; // 6 Receive Channel enable bit + /* Битовое поле XCERA7, ширина 1 бит; данные XCERA7. */ + Uint16 XCERA7:1; // 7 Receive Channel enable bit + /* Битовое поле XCERA8, ширина 1 бит; данные XCERA8. */ + Uint16 XCERA8:1; // 8 Receive Channel enable bit + /* Битовое поле XCERA9, ширина 1 бит; данные XCERA9. */ + Uint16 XCERA9:1; // 9 Receive Channel enable bit + /* Битовое поле XCERA10, ширина 1 бит; данные XCERA10. */ + Uint16 XCERA10:1; // 10 Receive Channel enable bit + /* Битовое поле XCERA11, ширина 1 бит; данные XCERA11. */ + Uint16 XCERA11:1; // 11 Receive Channel enable bit + /* Битовое поле XCERA12, ширина 1 бит; данные XCERA12. */ + Uint16 XCERA12:1; // 12 Receive Channel enable bit + /* Битовое поле XCERA13, ширина 1 бит; данные XCERA13. */ + Uint16 XCERA13:1; // 13 Receive Channel enable bit + /* Битовое поле XCERA14, ширина 1 бит; данные XCERA14. */ + Uint16 XCERA14:1; // 14 Receive Channel enable bit + /* Битовое поле XCERA15, ширина 1 бит; данные XCERA15. */ + Uint16 XCERA15:1; // 15 Receive Channel enable bit +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений XCERA_REG в одной области памяти. */ +union XCERA_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру XCERA_BITS bit;; порядок полей определяет расположение данных. */ + struct XCERA_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// XCERB control register bit definitions: +/* Описывает структуру XCERB_BITS; порядок полей определяет расположение данных. */ +struct XCERB_BITS { // bit description + /* Битовое поле XCERB0, ширина 1 бит; данные XCERB0. */ + Uint16 XCERB0:1; // 0 Receive Channel enable bit + /* Битовое поле XCERB1, ширина 1 бит; данные XCERB1. */ + Uint16 XCERB1:1; // 1 Receive Channel enable bit + /* Битовое поле XCERB2, ширина 1 бит; данные XCERB2. */ + Uint16 XCERB2:1; // 2 Receive Channel enable bit + /* Битовое поле XCERB3, ширина 1 бит; данные XCERB3. */ + Uint16 XCERB3:1; // 3 Receive Channel enable bit + /* Битовое поле XCERB4, ширина 1 бит; данные XCERB4. */ + Uint16 XCERB4:1; // 4 Receive Channel enable bit + /* Битовое поле XCERB5, ширина 1 бит; данные XCERB5. */ + Uint16 XCERB5:1; // 5 Receive Channel enable bit + /* Битовое поле XCERB6, ширина 1 бит; данные XCERB6. */ + Uint16 XCERB6:1; // 6 Receive Channel enable bit + /* Битовое поле XCERB7, ширина 1 бит; данные XCERB7. */ + Uint16 XCERB7:1; // 7 Receive Channel enable bit + /* Битовое поле XCERB8, ширина 1 бит; данные XCERB8. */ + Uint16 XCERB8:1; // 8 Receive Channel enable bit + /* Битовое поле XCERB9, ширина 1 бит; данные XCERB9. */ + Uint16 XCERB9:1; // 9 Receive Channel enable bit + /* Битовое поле XCERB10, ширина 1 бит; данные XCERB10. */ + Uint16 XCERB10:1; // 10 Receive Channel enable bit + /* Битовое поле XCERB11, ширина 1 бит; данные XCERB11. */ + Uint16 XCERB11:1; // 11 Receive Channel enable bit + /* Битовое поле XCERB12, ширина 1 бит; данные XCERB12. */ + Uint16 XCERB12:1; // 12 Receive Channel enable bit + /* Битовое поле XCERB13, ширина 1 бит; данные XCERB13. */ + Uint16 XCERB13:1; // 13 Receive Channel enable bit + /* Битовое поле XCERB14, ширина 1 бит; данные XCERB14. */ + Uint16 XCERB14:1; // 14 Receive Channel enable bit + /* Битовое поле XCERB15, ширина 1 бит; данные XCERB15. */ + Uint16 XCERB15:1; // 15 Receive Channel enable bit +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений XCERB_REG в одной области памяти. */ +union XCERB_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру XCERB_BITS bit;; порядок полей определяет расположение данных. */ + struct XCERB_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// PCR control register bit definitions: +/* Описывает структуру PCR_BITS; порядок полей определяет расположение данных. */ +struct PCR_BITS { // bit description + /* Битовое поле CLKRP, ширина 1 бит; данные CLKRP. */ + Uint16 CLKRP:1; // 0 Receive Clock polarity + /* Битовое поле CLKXP, ширина 1 бит; данные CLKXP. */ + Uint16 CLKXP:1; // 1 Transmit clock polarity + /* Битовое поле FSRP, ширина 1 бит; данные FSRP. */ + Uint16 FSRP:1; // 2 Receive Frame synchronization polarity + /* Битовое поле FSXP, ширина 1 бит; данные FSXP. */ + Uint16 FSXP:1; // 3 Transmit Frame synchronization polarity + /* Битовое поле DR_STAT, ширина 1 бит; данные DR_STAT. */ + Uint16 DR_STAT:1; // 4 DR pin status - reserved for this McBSP + /* Битовое поле DX_STAT, ширина 1 бит; данные DX_STAT. */ + Uint16 DX_STAT:1; // 5 DX pin status - reserved for this McBSP + /* Битовое поле CLKS_STAT, ширина 1 бит; данные CLKS_STAT. */ + Uint16 CLKS_STAT:1; // 6 CLKS pin status - reserved for 28x -McBSP + /* Битовое поле SCLKME, ширина 1 бит; данные SCLKME. */ + Uint16 SCLKME:1; // 7 Enhanced sample clock mode selection bit. + /* Битовое поле CLKRM, ширина 1 бит; данные CLKRM. */ + Uint16 CLKRM:1; // 8 Receiver Clock Mode + /* Битовое поле CLKXM, ширина 1 бит; данные CLKXM. */ + Uint16 CLKXM:1; // 9 Transmitter Clock Mode. + /* Битовое поле FSRM, ширина 1 бит; данные FSRM. */ + Uint16 FSRM:1; // 10 Receive Frame Synchronization Mode + /* Битовое поле FSXM, ширина 1 бит; данные FSXM. */ + Uint16 FSXM:1; // 11 Transmit Frame Synchronization Mode + /* Битовое поле RIOEN, ширина 1 бит; данные RIOEN. */ + Uint16 RIOEN:1; // 12 General Purpose I/O Mode - reserved in this 28x-McBSP + /* Битовое поле XIOEN, ширина 1 бит; данные XIOEN. */ + Uint16 XIOEN:1; // 13 General Purpose I/O Mode - reserved in this 28x-McBSP + /* Битовое поле IDEL_EN, ширина 1 бит; данные IDEL_EN. */ + Uint16 IDEL_EN:1; // 14 reserved in this 28x-McBSP + /* Битовое поле rsvd, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:1 ; // 15 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений PCR_REG в одной области памяти. */ +union PCR_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру PCR_BITS bit;; порядок полей определяет расположение данных. */ + struct PCR_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// RCERC control register bit definitions: +/* Описывает структуру RCERC_BITS; порядок полей определяет расположение данных. */ +struct RCERC_BITS { // bit description + /* Битовое поле RCEC0, ширина 1 бит; данные RCEC0. */ + Uint16 RCEC0:1; // 0 Receive Channel enable bit + /* Битовое поле RCEC1, ширина 1 бит; данные RCEC1. */ + Uint16 RCEC1:1; // 1 Receive Channel enable bit + /* Битовое поле RCEC2, ширина 1 бит; данные RCEC2. */ + Uint16 RCEC2:1; // 2 Receive Channel enable bit + /* Битовое поле RCEC3, ширина 1 бит; данные RCEC3. */ + Uint16 RCEC3:1; // 3 Receive Channel enable bit + /* Битовое поле RCEC4, ширина 1 бит; данные RCEC4. */ + Uint16 RCEC4:1; // 4 Receive Channel enable bit + /* Битовое поле RCEC5, ширина 1 бит; данные RCEC5. */ + Uint16 RCEC5:1; // 5 Receive Channel enable bit + /* Битовое поле RCEC6, ширина 1 бит; данные RCEC6. */ + Uint16 RCEC6:1; // 6 Receive Channel enable bit + /* Битовое поле RCEC7, ширина 1 бит; данные RCEC7. */ + Uint16 RCEC7:1; // 7 Receive Channel enable bit + /* Битовое поле RCEC8, ширина 1 бит; данные RCEC8. */ + Uint16 RCEC8:1; // 8 Receive Channel enable bit + /* Битовое поле RCEC9, ширина 1 бит; данные RCEC9. */ + Uint16 RCEC9:1; // 9 Receive Channel enable bit + /* Битовое поле RCEC10, ширина 1 бит; данные RCEC10. */ + Uint16 RCEC10:1; // 10 Receive Channel enable bit + /* Битовое поле RCEC11, ширина 1 бит; данные RCEC11. */ + Uint16 RCEC11:1; // 11 Receive Channel enable bit + /* Битовое поле RCEC12, ширина 1 бит; данные RCEC12. */ + Uint16 RCEC12:1; // 12 Receive Channel enable bit + /* Битовое поле RCEC13, ширина 1 бит; данные RCEC13. */ + Uint16 RCEC13:1; // 13 Receive Channel enable bit + /* Битовое поле RCEC14, ширина 1 бит; данные RCEC14. */ + Uint16 RCEC14:1; // 14 Receive Channel enable bit + /* Битовое поле RCEC15, ширина 1 бит; данные RCEC15. */ + Uint16 RCEC15:1; // 15 Receive Channel enable bit +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений RCERC_REG в одной области памяти. */ +union RCERC_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру RCERC_BITS bit;; порядок полей определяет расположение данных. */ + struct RCERC_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// RCERD control register bit definitions: +/* Описывает структуру RCERD_BITS; порядок полей определяет расположение данных. */ +struct RCERD_BITS { // bit description + /* Битовое поле RCED0, ширина 1 бит; данные RCED0. */ + Uint16 RCED0:1; // 0 Receive Channel enable bit + /* Битовое поле RCED1, ширина 1 бит; данные RCED1. */ + Uint16 RCED1:1; // 1 Receive Channel enable bit + /* Битовое поле RCED2, ширина 1 бит; данные RCED2. */ + Uint16 RCED2:1; // 2 Receive Channel enable bit + /* Битовое поле RCED3, ширина 1 бит; данные RCED3. */ + Uint16 RCED3:1; // 3 Receive Channel enable bit + /* Битовое поле RCED4, ширина 1 бит; данные RCED4. */ + Uint16 RCED4:1; // 4 Receive Channel enable bit + /* Битовое поле RCED5, ширина 1 бит; данные RCED5. */ + Uint16 RCED5:1; // 5 Receive Channel enable bit + /* Битовое поле RCED6, ширина 1 бит; данные RCED6. */ + Uint16 RCED6:1; // 6 Receive Channel enable bit + /* Битовое поле RCED7, ширина 1 бит; данные RCED7. */ + Uint16 RCED7:1; // 7 Receive Channel enable bit + /* Битовое поле RCED8, ширина 1 бит; данные RCED8. */ + Uint16 RCED8:1; // 8 Receive Channel enable bit + /* Битовое поле RCED9, ширина 1 бит; данные RCED9. */ + Uint16 RCED9:1; // 9 Receive Channel enable bit + /* Битовое поле RCED10, ширина 1 бит; данные RCED10. */ + Uint16 RCED10:1; // 10 Receive Channel enable bit + /* Битовое поле RCED11, ширина 1 бит; данные RCED11. */ + Uint16 RCED11:1; // 11 Receive Channel enable bit + /* Битовое поле RCED12, ширина 1 бит; данные RCED12. */ + Uint16 RCED12:1; // 12 Receive Channel enable bit + /* Битовое поле RCED13, ширина 1 бит; данные RCED13. */ + Uint16 RCED13:1; // 13 Receive Channel enable bit + /* Битовое поле RCED14, ширина 1 бит; данные RCED14. */ + Uint16 RCED14:1; // 14 Receive Channel enable bit + /* Битовое поле RCED15, ширина 1 бит; данные RCED15. */ + Uint16 RCED15:1; // 15 Receive Channel enable bit +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений RCERD_REG в одной области памяти. */ +union RCERD_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру RCERD_BITS bit;; порядок полей определяет расположение данных. */ + struct RCERD_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// XCERC control register bit definitions: +/* Описывает структуру XCERC_BITS; порядок полей определяет расположение данных. */ +struct XCERC_BITS { // bit description + /* Битовое поле XCERC0, ширина 1 бит; данные XCERC0. */ + Uint16 XCERC0:1; // 0 Receive Channel enable bit + /* Битовое поле XCERC1, ширина 1 бит; данные XCERC1. */ + Uint16 XCERC1:1; // 1 Receive Channel enable bit + /* Битовое поле XCERC2, ширина 1 бит; данные XCERC2. */ + Uint16 XCERC2:1; // 2 Receive Channel enable bit + /* Битовое поле XCERC3, ширина 1 бит; данные XCERC3. */ + Uint16 XCERC3:1; // 3 Receive Channel enable bit + /* Битовое поле XCERC4, ширина 1 бит; данные XCERC4. */ + Uint16 XCERC4:1; // 4 Receive Channel enable bit + /* Битовое поле XCERC5, ширина 1 бит; данные XCERC5. */ + Uint16 XCERC5:1; // 5 Receive Channel enable bit + /* Битовое поле XCERC6, ширина 1 бит; данные XCERC6. */ + Uint16 XCERC6:1; // 6 Receive Channel enable bit + /* Битовое поле XCERC7, ширина 1 бит; данные XCERC7. */ + Uint16 XCERC7:1; // 7 Receive Channel enable bit + /* Битовое поле XCERC8, ширина 1 бит; данные XCERC8. */ + Uint16 XCERC8:1; // 8 Receive Channel enable bit + /* Битовое поле XCERC9, ширина 1 бит; данные XCERC9. */ + Uint16 XCERC9:1; // 9 Receive Channel enable bit + /* Битовое поле XCERC10, ширина 1 бит; данные XCERC10. */ + Uint16 XCERC10:1; // 10 Receive Channel enable bit + /* Битовое поле XCERC11, ширина 1 бит; данные XCERC11. */ + Uint16 XCERC11:1; // 11 Receive Channel enable bit + /* Битовое поле XCERC12, ширина 1 бит; данные XCERC12. */ + Uint16 XCERC12:1; // 12 Receive Channel enable bit + /* Битовое поле XCERC13, ширина 1 бит; данные XCERC13. */ + Uint16 XCERC13:1; // 13 Receive Channel enable bit + /* Битовое поле XCERC14, ширина 1 бит; данные XCERC14. */ + Uint16 XCERC14:1; // 14 Receive Channel enable bit + /* Битовое поле XCERC15, ширина 1 бит; данные XCERC15. */ + Uint16 XCERC15:1; // 15 Receive Channel enable bit +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений XCERC_REG в одной области памяти. */ +union XCERC_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру XCERC_BITS bit;; порядок полей определяет расположение данных. */ + struct XCERC_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// XCERD control register bit definitions: +/* Описывает структуру XCERD_BITS; порядок полей определяет расположение данных. */ +struct XCERD_BITS { // bit description + /* Битовое поле XCERD0, ширина 1 бит; данные XCERD0. */ + Uint16 XCERD0:1; // 0 Receive Channel enable bit + /* Битовое поле XCERD1, ширина 1 бит; данные XCERD1. */ + Uint16 XCERD1:1; // 1 Receive Channel enable bit + /* Битовое поле XCERD2, ширина 1 бит; данные XCERD2. */ + Uint16 XCERD2:1; // 2 Receive Channel enable bit + /* Битовое поле XCERD3, ширина 1 бит; данные XCERD3. */ + Uint16 XCERD3:1; // 3 Receive Channel enable bit + /* Битовое поле XCERD4, ширина 1 бит; данные XCERD4. */ + Uint16 XCERD4:1; // 4 Receive Channel enable bit + /* Битовое поле XCERD5, ширина 1 бит; данные XCERD5. */ + Uint16 XCERD5:1; // 5 Receive Channel enable bit + /* Битовое поле XCERD6, ширина 1 бит; данные XCERD6. */ + Uint16 XCERD6:1; // 6 Receive Channel enable bit + /* Битовое поле XCERD7, ширина 1 бит; данные XCERD7. */ + Uint16 XCERD7:1; // 7 Receive Channel enable bit + /* Битовое поле XCERD8, ширина 1 бит; данные XCERD8. */ + Uint16 XCERD8:1; // 8 Receive Channel enable bit + /* Битовое поле XCERD9, ширина 1 бит; данные XCERD9. */ + Uint16 XCERD9:1; // 9 Receive Channel enable bit + /* Битовое поле XCERD10, ширина 1 бит; данные XCERD10. */ + Uint16 XCERD10:1; // 10 Receive Channel enable bit + /* Битовое поле XCERD11, ширина 1 бит; данные XCERD11. */ + Uint16 XCERD11:1; // 11 Receive Channel enable bit + /* Битовое поле XCERD12, ширина 1 бит; данные XCERD12. */ + Uint16 XCERD12:1; // 12 Receive Channel enable bit + /* Битовое поле XCERD13, ширина 1 бит; данные XCERD13. */ + Uint16 XCERD13:1; // 13 Receive Channel enable bit + /* Битовое поле XCERD14, ширина 1 бит; данные XCERD14. */ + Uint16 XCERD14:1; // 14 Receive Channel enable bit + /* Битовое поле XCERD15, ширина 1 бит; данные XCERD15. */ + Uint16 XCERD15:1; // 15 Receive Channel enable bit +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений XCERD_REG в одной области памяти. */ +union XCERD_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру XCERD_BITS bit;; порядок полей определяет расположение данных. */ + struct XCERD_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// RCERE control register bit definitions: +/* Описывает структуру RCERE_BITS; порядок полей определяет расположение данных. */ +struct RCERE_BITS { // bit description + /* Битовое поле RCEE0, ширина 1 бит; данные RCEE0. */ + Uint16 RCEE0:1; // 0 Receive Channel enable bit + /* Битовое поле RCEE1, ширина 1 бит; данные RCEE1. */ + Uint16 RCEE1:1; // 1 Receive Channel enable bit + /* Битовое поле RCEE2, ширина 1 бит; данные RCEE2. */ + Uint16 RCEE2:1; // 2 Receive Channel enable bit + /* Битовое поле RCEE3, ширина 1 бит; данные RCEE3. */ + Uint16 RCEE3:1; // 3 Receive Channel enable bit + /* Битовое поле RCEE4, ширина 1 бит; данные RCEE4. */ + Uint16 RCEE4:1; // 4 Receive Channel enable bit + /* Битовое поле RCEE5, ширина 1 бит; данные RCEE5. */ + Uint16 RCEE5:1; // 5 Receive Channel enable bit + /* Битовое поле RCEE6, ширина 1 бит; данные RCEE6. */ + Uint16 RCEE6:1; // 6 Receive Channel enable bit + /* Битовое поле RCEE7, ширина 1 бит; данные RCEE7. */ + Uint16 RCEE7:1; // 7 Receive Channel enable bit + /* Битовое поле RCEE8, ширина 1 бит; данные RCEE8. */ + Uint16 RCEE8:1; // 8 Receive Channel enable bit + /* Битовое поле RCEE9, ширина 1 бит; данные RCEE9. */ + Uint16 RCEE9:1; // 9 Receive Channel enable bit + /* Битовое поле RCEE10, ширина 1 бит; данные RCEE10. */ + Uint16 RCEE10:1; // 10 Receive Channel enable bit + /* Битовое поле RCEE11, ширина 1 бит; данные RCEE11. */ + Uint16 RCEE11:1; // 11 Receive Channel enable bit + /* Битовое поле RCEE12, ширина 1 бит; данные RCEE12. */ + Uint16 RCEE12:1; // 12 Receive Channel enable bit + /* Битовое поле RCEE13, ширина 1 бит; данные RCEE13. */ + Uint16 RCEE13:1; // 13 Receive Channel enable bit + /* Битовое поле RCEE14, ширина 1 бит; данные RCEE14. */ + Uint16 RCEE14:1; // 14 Receive Channel enable bit + /* Битовое поле RCEE15, ширина 1 бит; данные RCEE15. */ + Uint16 RCEE15:1; // 15 Receive Channel enable bit +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений RCERE_REG в одной области памяти. */ +union RCERE_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру RCERE_BITS bit;; порядок полей определяет расположение данных. */ + struct RCERE_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// RCERF control register bit definitions: +/* Описывает структуру RCERF_BITS; порядок полей определяет расположение данных. */ +struct RCERF_BITS { // bit description + /* Битовое поле RCEF0, ширина 1 бит; данные RCEF0. */ + Uint16 RCEF0:1; // 0 Receive Channel enable bit + /* Битовое поле RCEF1, ширина 1 бит; данные RCEF1. */ + Uint16 RCEF1:1; // 1 Receive Channel enable bit + /* Битовое поле RCEF2, ширина 1 бит; данные RCEF2. */ + Uint16 RCEF2:1; // 2 Receive Channel enable bit + /* Битовое поле RCEF3, ширина 1 бит; данные RCEF3. */ + Uint16 RCEF3:1; // 3 Receive Channel enable bit + /* Битовое поле RCEF4, ширина 1 бит; данные RCEF4. */ + Uint16 RCEF4:1; // 4 Receive Channel enable bit + /* Битовое поле RCEF5, ширина 1 бит; данные RCEF5. */ + Uint16 RCEF5:1; // 5 Receive Channel enable bit + /* Битовое поле RCEF6, ширина 1 бит; данные RCEF6. */ + Uint16 RCEF6:1; // 6 Receive Channel enable bit + /* Битовое поле RCEF7, ширина 1 бит; данные RCEF7. */ + Uint16 RCEF7:1; // 7 Receive Channel enable bit + /* Битовое поле RCEF8, ширина 1 бит; данные RCEF8. */ + Uint16 RCEF8:1; // 8 Receive Channel enable bit + /* Битовое поле RCEF9, ширина 1 бит; данные RCEF9. */ + Uint16 RCEF9:1; // 9 Receive Channel enable bit + /* Битовое поле RCEF10, ширина 1 бит; данные RCEF10. */ + Uint16 RCEF10:1; // 10 Receive Channel enable bit + /* Битовое поле RCEF11, ширина 1 бит; данные RCEF11. */ + Uint16 RCEF11:1; // 11 Receive Channel enable bit + /* Битовое поле RCEF12, ширина 1 бит; данные RCEF12. */ + Uint16 RCEF12:1; // 12 Receive Channel enable bit + /* Битовое поле RCEF13, ширина 1 бит; данные RCEF13. */ + Uint16 RCEF13:1; // 13 Receive Channel enable bit + /* Битовое поле RCEF14, ширина 1 бит; данные RCEF14. */ + Uint16 RCEF14:1; // 14 Receive Channel enable bit + /* Битовое поле RCEF15, ширина 1 бит; данные RCEF15. */ + Uint16 RCEF15:1; // 15 Receive Channel enable bit +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений RCERF_REG в одной области памяти. */ +union RCERF_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру RCERF_BITS bit;; порядок полей определяет расположение данных. */ + struct RCERF_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// XCERE control register bit definitions: +/* Описывает структуру XCERE_BITS; порядок полей определяет расположение данных. */ +struct XCERE_BITS { // bit description + /* Битовое поле XCERE0, ширина 1 бит; данные XCERE0. */ + Uint16 XCERE0:1; // 0 Receive Channel enable bit + /* Битовое поле XCERE1, ширина 1 бит; данные XCERE1. */ + Uint16 XCERE1:1; // 1 Receive Channel enable bit + /* Битовое поле XCERE2, ширина 1 бит; данные XCERE2. */ + Uint16 XCERE2:1; // 2 Receive Channel enable bit + /* Битовое поле XCERE3, ширина 1 бит; данные XCERE3. */ + Uint16 XCERE3:1; // 3 Receive Channel enable bit + /* Битовое поле XCERE4, ширина 1 бит; данные XCERE4. */ + Uint16 XCERE4:1; // 4 Receive Channel enable bit + /* Битовое поле XCERE5, ширина 1 бит; данные XCERE5. */ + Uint16 XCERE5:1; // 5 Receive Channel enable bit + /* Битовое поле XCERE6, ширина 1 бит; данные XCERE6. */ + Uint16 XCERE6:1; // 6 Receive Channel enable bit + /* Битовое поле XCERE7, ширина 1 бит; данные XCERE7. */ + Uint16 XCERE7:1; // 7 Receive Channel enable bit + /* Битовое поле XCERE8, ширина 1 бит; данные XCERE8. */ + Uint16 XCERE8:1; // 8 Receive Channel enable bit + /* Битовое поле XCERE9, ширина 1 бит; данные XCERE9. */ + Uint16 XCERE9:1; // 9 Receive Channel enable bit + /* Битовое поле XCERE10, ширина 1 бит; данные XCERE10. */ + Uint16 XCERE10:1; // 10 Receive Channel enable bit + /* Битовое поле XCERE11, ширина 1 бит; данные XCERE11. */ + Uint16 XCERE11:1; // 11 Receive Channel enable bit + /* Битовое поле XCERE12, ширина 1 бит; данные XCERE12. */ + Uint16 XCERE12:1; // 12 Receive Channel enable bit + /* Битовое поле XCERE13, ширина 1 бит; данные XCERE13. */ + Uint16 XCERE13:1; // 13 Receive Channel enable bit + /* Битовое поле XCERE14, ширина 1 бит; данные XCERE14. */ + Uint16 XCERE14:1; // 14 Receive Channel enable bit + /* Битовое поле XCERE15, ширина 1 бит; данные XCERE15. */ + Uint16 XCERE15:1; // 15 Receive Channel enable bit +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений XCERE_REG в одной области памяти. */ +union XCERE_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру XCERE_BITS bit;; порядок полей определяет расположение данных. */ + struct XCERE_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// XCERF control register bit definitions: +/* Описывает структуру XCERF_BITS; порядок полей определяет расположение данных. */ +struct XCERF_BITS { // bit description + /* Битовое поле XCERF0, ширина 1 бит; данные XCERF0. */ + Uint16 XCERF0:1; // 0 Receive Channel enable bit + /* Битовое поле XCERF1, ширина 1 бит; данные XCERF1. */ + Uint16 XCERF1:1; // 1 Receive Channel enable bit + /* Битовое поле XCERF2, ширина 1 бит; данные XCERF2. */ + Uint16 XCERF2:1; // 2 Receive Channel enable bit + /* Битовое поле XCERF3, ширина 1 бит; данные XCERF3. */ + Uint16 XCERF3:1; // 3 Receive Channel enable bit + /* Битовое поле XCERF4, ширина 1 бит; данные XCERF4. */ + Uint16 XCERF4:1; // 4 Receive Channel enable bit + /* Битовое поле XCERF5, ширина 1 бит; данные XCERF5. */ + Uint16 XCERF5:1; // 5 Receive Channel enable bit + /* Битовое поле XCERF6, ширина 1 бит; данные XCERF6. */ + Uint16 XCERF6:1; // 6 Receive Channel enable bit + /* Битовое поле XCERF7, ширина 1 бит; данные XCERF7. */ + Uint16 XCERF7:1; // 7 Receive Channel enable bit + /* Битовое поле XCERF8, ширина 1 бит; данные XCERF8. */ + Uint16 XCERF8:1; // 8 Receive Channel enable bit + /* Битовое поле XCERF9, ширина 1 бит; данные XCERF9. */ + Uint16 XCERF9:1; // 9 Receive Channel enable bit + /* Битовое поле XCERF10, ширина 1 бит; данные XCERF10. */ + Uint16 XCERF10:1; // 10 Receive Channel enable bit + /* Битовое поле XCERF11, ширина 1 бит; данные XCERF11. */ + Uint16 XCERF11:1; // 11 Receive Channel enable bit + /* Битовое поле XCERF12, ширина 1 бит; данные XCERF12. */ + Uint16 XCERF12:1; // 12 Receive Channel enable bit + /* Битовое поле XCERF13, ширина 1 бит; данные XCERF13. */ + Uint16 XCERF13:1; // 13 Receive Channel enable bit + /* Битовое поле XCERF14, ширина 1 бит; данные XCERF14. */ + Uint16 XCERF14:1; // 14 Receive Channel enable bit + /* Битовое поле XCERF15, ширина 1 бит; данные XCERF15. */ + Uint16 XCERF15:1; // 15 Receive Channel enable bit +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений XCERF_REG в одной области памяти. */ +union XCERF_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру XCERF_BITS bit;; порядок полей определяет расположение данных. */ + struct XCERF_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// RCERG control register bit definitions: +/* Описывает структуру RCERG_BITS; порядок полей определяет расположение данных. */ +struct RCERG_BITS { // bit description + /* Битовое поле RCEG0, ширина 1 бит; данные RCEG0. */ + Uint16 RCEG0:1; // 0 Receive Channel enable bit + /* Битовое поле RCEG1, ширина 1 бит; данные RCEG1. */ + Uint16 RCEG1:1; // 1 Receive Channel enable bit + /* Битовое поле RCEG2, ширина 1 бит; данные RCEG2. */ + Uint16 RCEG2:1; // 2 Receive Channel enable bit + /* Битовое поле RCEG3, ширина 1 бит; данные RCEG3. */ + Uint16 RCEG3:1; // 3 Receive Channel enable bit + /* Битовое поле RCEG4, ширина 1 бит; данные RCEG4. */ + Uint16 RCEG4:1; // 4 Receive Channel enable bit + /* Битовое поле RCEG5, ширина 1 бит; данные RCEG5. */ + Uint16 RCEG5:1; // 5 Receive Channel enable bit + /* Битовое поле RCEG6, ширина 1 бит; данные RCEG6. */ + Uint16 RCEG6:1; // 6 Receive Channel enable bit + /* Битовое поле RCEG7, ширина 1 бит; данные RCEG7. */ + Uint16 RCEG7:1; // 7 Receive Channel enable bit + /* Битовое поле RCEG8, ширина 1 бит; данные RCEG8. */ + Uint16 RCEG8:1; // 8 Receive Channel enable bit + /* Битовое поле RCEG9, ширина 1 бит; данные RCEG9. */ + Uint16 RCEG9:1; // 9 Receive Channel enable bit + /* Битовое поле RCEG10, ширина 1 бит; данные RCEG10. */ + Uint16 RCEG10:1; // 10 Receive Channel enable bit + /* Битовое поле RCEG11, ширина 1 бит; данные RCEG11. */ + Uint16 RCEG11:1; // 11 Receive Channel enable bit + /* Битовое поле RCEG12, ширина 1 бит; данные RCEG12. */ + Uint16 RCEG12:1; // 12 Receive Channel enable bit + /* Битовое поле RCEG13, ширина 1 бит; данные RCEG13. */ + Uint16 RCEG13:1; // 13 Receive Channel enable bit + /* Битовое поле RCEG14, ширина 1 бит; данные RCEG14. */ + Uint16 RCEG14:1; // 14 Receive Channel enable bit + /* Битовое поле RCEG15, ширина 1 бит; данные RCEG15. */ + Uint16 RCEG15:1; // 15 Receive Channel enable bit +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений RCERG_REG в одной области памяти. */ +union RCERG_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру RCERG_BITS bit;; порядок полей определяет расположение данных. */ + struct RCERG_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// RCERH control register bit definitions: +/* Описывает структуру RCERH_BITS; порядок полей определяет расположение данных. */ +struct RCERH_BITS { // bit description + /* Битовое поле RCEH0, ширина 1 бит; данные RCEH0. */ + Uint16 RCEH0:1; // 0 Receive Channel enable bit + /* Битовое поле RCEH1, ширина 1 бит; данные RCEH1. */ + Uint16 RCEH1:1; // 1 Receive Channel enable bit + /* Битовое поле RCEH2, ширина 1 бит; данные RCEH2. */ + Uint16 RCEH2:1; // 2 Receive Channel enable bit + /* Битовое поле RCEH3, ширина 1 бит; данные RCEH3. */ + Uint16 RCEH3:1; // 3 Receive Channel enable bit + /* Битовое поле RCEH4, ширина 1 бит; данные RCEH4. */ + Uint16 RCEH4:1; // 4 Receive Channel enable bit + /* Битовое поле RCEH5, ширина 1 бит; данные RCEH5. */ + Uint16 RCEH5:1; // 5 Receive Channel enable bit + /* Битовое поле RCEH6, ширина 1 бит; данные RCEH6. */ + Uint16 RCEH6:1; // 6 Receive Channel enable bit + /* Битовое поле RCEH7, ширина 1 бит; данные RCEH7. */ + Uint16 RCEH7:1; // 7 Receive Channel enable bit + /* Битовое поле RCEH8, ширина 1 бит; данные RCEH8. */ + Uint16 RCEH8:1; // 8 Receive Channel enable bit + /* Битовое поле RCEH9, ширина 1 бит; данные RCEH9. */ + Uint16 RCEH9:1; // 9 Receive Channel enable bit + /* Битовое поле RCEH10, ширина 1 бит; данные RCEH10. */ + Uint16 RCEH10:1; // 10 Receive Channel enable bit + /* Битовое поле RCEH11, ширина 1 бит; данные RCEH11. */ + Uint16 RCEH11:1; // 11 Receive Channel enable bit + /* Битовое поле RCEH12, ширина 1 бит; данные RCEH12. */ + Uint16 RCEH12:1; // 12 Receive Channel enable bit + /* Битовое поле RCEH13, ширина 1 бит; данные RCEH13. */ + Uint16 RCEH13:1; // 13 Receive Channel enable bit + /* Битовое поле RCEH14, ширина 1 бит; данные RCEH14. */ + Uint16 RCEH14:1; // 14 Receive Channel enable bit + /* Битовое поле RCEH15, ширина 1 бит; данные RCEH15. */ + Uint16 RCEH15:1; // 15 Receive Channel enable bit +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений RCERH_REG в одной области памяти. */ +union RCERH_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру RCERH_BITS bit;; порядок полей определяет расположение данных. */ + struct RCERH_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// XCERG control register bit definitions: +/* Описывает структуру XCERG_BITS; порядок полей определяет расположение данных. */ +struct XCERG_BITS { // bit description + /* Битовое поле XCERG0, ширина 1 бит; данные XCERG0. */ + Uint16 XCERG0:1; // 0 Receive Channel enable bit + /* Битовое поле XCERG1, ширина 1 бит; данные XCERG1. */ + Uint16 XCERG1:1; // 1 Receive Channel enable bit + /* Битовое поле XCERG2, ширина 1 бит; данные XCERG2. */ + Uint16 XCERG2:1; // 2 Receive Channel enable bit + /* Битовое поле XCERG3, ширина 1 бит; данные XCERG3. */ + Uint16 XCERG3:1; // 3 Receive Channel enable bit + /* Битовое поле XCERG4, ширина 1 бит; данные XCERG4. */ + Uint16 XCERG4:1; // 4 Receive Channel enable bit + /* Битовое поле XCERG5, ширина 1 бит; данные XCERG5. */ + Uint16 XCERG5:1; // 5 Receive Channel enable bit + /* Битовое поле XCERG6, ширина 1 бит; данные XCERG6. */ + Uint16 XCERG6:1; // 6 Receive Channel enable bit + /* Битовое поле XCERG7, ширина 1 бит; данные XCERG7. */ + Uint16 XCERG7:1; // 7 Receive Channel enable bit + /* Битовое поле XCERG8, ширина 1 бит; данные XCERG8. */ + Uint16 XCERG8:1; // 8 Receive Channel enable bit + /* Битовое поле XCERG9, ширина 1 бит; данные XCERG9. */ + Uint16 XCERG9:1; // 9 Receive Channel enable bit + /* Битовое поле XCERG10, ширина 1 бит; данные XCERG10. */ + Uint16 XCERG10:1; // 10 Receive Channel enable bit + /* Битовое поле XCERG11, ширина 1 бит; данные XCERG11. */ + Uint16 XCERG11:1; // 11 Receive Channel enable bit + /* Битовое поле XCERG12, ширина 1 бит; данные XCERG12. */ + Uint16 XCERG12:1; // 12 Receive Channel enable bit + /* Битовое поле XCERG13, ширина 1 бит; данные XCERG13. */ + Uint16 XCERG13:1; // 13 Receive Channel enable bit + /* Битовое поле XCERG14, ширина 1 бит; данные XCERG14. */ + Uint16 XCERG14:1; // 14 Receive Channel enable bit + /* Битовое поле XCERG15, ширина 1 бит; данные XCERG15. */ + Uint16 XCERG15:1; // 15 Receive Channel enable bit +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений XCERG_REG в одной области памяти. */ +union XCERG_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру XCERG_BITS bit;; порядок полей определяет расположение данных. */ + struct XCERG_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// XCERH control register bit definitions: +/* Описывает структуру XCERH_BITS; порядок полей определяет расположение данных. */ +struct XCERH_BITS { // bit description + /* Битовое поле XCEH0, ширина 1 бит; данные XCEH0. */ + Uint16 XCEH0:1; // 0 Receive Channel enable bit + /* Битовое поле XCEH1, ширина 1 бит; данные XCEH1. */ + Uint16 XCEH1:1; // 1 Receive Channel enable bit + /* Битовое поле XCEH2, ширина 1 бит; данные XCEH2. */ + Uint16 XCEH2:1; // 2 Receive Channel enable bit + /* Битовое поле XCEH3, ширина 1 бит; данные XCEH3. */ + Uint16 XCEH3:1; // 3 Receive Channel enable bit + /* Битовое поле XCEH4, ширина 1 бит; данные XCEH4. */ + Uint16 XCEH4:1; // 4 Receive Channel enable bit + /* Битовое поле XCEH5, ширина 1 бит; данные XCEH5. */ + Uint16 XCEH5:1; // 5 Receive Channel enable bit + /* Битовое поле XCEH6, ширина 1 бит; данные XCEH6. */ + Uint16 XCEH6:1; // 6 Receive Channel enable bit + /* Битовое поле XCEH7, ширина 1 бит; данные XCEH7. */ + Uint16 XCEH7:1; // 7 Receive Channel enable bit + /* Битовое поле XCEH8, ширина 1 бит; данные XCEH8. */ + Uint16 XCEH8:1; // 8 Receive Channel enable bit + /* Битовое поле XCEH9, ширина 1 бит; данные XCEH9. */ + Uint16 XCEH9:1; // 9 Receive Channel enable bit + /* Битовое поле XCEH10, ширина 1 бит; данные XCEH10. */ + Uint16 XCEH10:1; // 10 Receive Channel enable bit + /* Битовое поле XCEH11, ширина 1 бит; данные XCEH11. */ + Uint16 XCEH11:1; // 11 Receive Channel enable bit + /* Битовое поле XCEH12, ширина 1 бит; данные XCEH12. */ + Uint16 XCEH12:1; // 12 Receive Channel enable bit + /* Битовое поле XCEH13, ширина 1 бит; данные XCEH13. */ + Uint16 XCEH13:1; // 13 Receive Channel enable bit + /* Битовое поле XCEH14, ширина 1 бит; данные XCEH14. */ + Uint16 XCEH14:1; // 14 Receive Channel enable bit + /* Битовое поле XCEH15, ширина 1 бит; данные XCEH15. */ + Uint16 XCEH15:1; // 15 Receive Channel enable bit +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений XCERH_REG в одной области памяти. */ +union XCERH_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру XCERH_BITS bit;; порядок полей определяет расположение данных. */ + struct XCERH_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +// McBSP Interrupt enable register for RINT/XINT +/* Описывает структуру MFFINT_BITS; порядок полей определяет расположение данных. */ +struct MFFINT_BITS { // bits description + /* Битовое поле XINT, ширина 1 бит; данные XINT. */ + Uint16 XINT:1; // 0 XINT interrupt enable + /* Битовое поле rsvd1, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:1; // 1 reserved + /* Битовое поле RINT, ширина 1 бит; данные RINT. */ + Uint16 RINT:1; // 2 RINT interrupt enable + /* Битовое поле rsvd2, ширина 13 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:13; // 15:3 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений MFFINT_REG в одной области памяти. */ +union MFFINT_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру MFFINT_BITS bit;; порядок полей определяет расположение данных. */ + struct MFFINT_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +//--------------------------------------------------------------------------- +// McBSP Register File: +// +/* Описывает структуру MCBSP_REGS; порядок полей определяет расположение данных. */ +struct MCBSP_REGS { + /* Объединяет несколько представлений DRR2_REG DRR2; в одной области памяти. */ + union DRR2_REG DRR2; // MCBSP Data receive register bits 31-16 + /* Объединяет несколько представлений DRR1_REG DRR1; в одной области памяти. */ + union DRR1_REG DRR1; // MCBSP Data receive register bits 15-0 + /* Объединяет несколько представлений DXR2_REG DXR2; в одной области памяти. */ + union DXR2_REG DXR2; // MCBSP Data transmit register bits 31-16 + /* Объединяет несколько представлений DXR1_REG DXR1; в одной области памяти. */ + union DXR1_REG DXR1; // MCBSP Data transmit register bits 15-0 + /* Объединяет несколько представлений SPCR2_REG SPCR2; в одной области памяти. */ + union SPCR2_REG SPCR2; // MCBSP control register bits 31-16 + /* Объединяет несколько представлений SPCR1_REG SPCR1; в одной области памяти. */ + union SPCR1_REG SPCR1; // MCBSP control register bits 15-0 + /* Объединяет несколько представлений RCR2_REG RCR2; в одной области памяти. */ + union RCR2_REG RCR2; // MCBSP receive control register bits 31-16 + /* Объединяет несколько представлений RCR1_REG RCR1; в одной области памяти. */ + union RCR1_REG RCR1; // MCBSP receive control register bits 15-0 + /* Объединяет несколько представлений XCR2_REG XCR2; в одной области памяти. */ + union XCR2_REG XCR2; // MCBSP transmit control register bits 31-16 + /* Объединяет несколько представлений XCR1_REG XCR1; в одной области памяти. */ + union XCR1_REG XCR1; // MCBSP transmit control register bits 15-0 + /* Объединяет несколько представлений SRGR2_REG SRGR2; в одной области памяти. */ + union SRGR2_REG SRGR2; // MCBSP sample rate gen register bits 31-16 + /* Объединяет несколько представлений SRGR1_REG SRGR1; в одной области памяти. */ + union SRGR1_REG SRGR1; // MCBSP sample rate gen register bits 15-0 + /* Объединяет несколько представлений MCR2_REG MCR2; в одной области памяти. */ + union MCR2_REG MCR2; // MCBSP multichannel register bits 31-16 + /* Объединяет несколько представлений MCR1_REG MCR1; в одной области памяти. */ + union MCR1_REG MCR1; // MCBSP multichannel register bits 15-0 + /* Объединяет несколько представлений RCERA_REG RCERA; в одной области памяти. */ + union RCERA_REG RCERA; // MCBSP Receive channel enable partition A + /* Объединяет несколько представлений RCERB_REG RCERB; в одной области памяти. */ + union RCERB_REG RCERB; // MCBSP Receive channel enable partition B + /* Объединяет несколько представлений XCERA_REG XCERA; в одной области памяти. */ + union XCERA_REG XCERA; // MCBSP Transmit channel enable partition A + /* Объединяет несколько представлений XCERB_REG XCERB; в одной области памяти. */ + union XCERB_REG XCERB; // MCBSP Transmit channel enable partition B + /* Объединяет несколько представлений PCR_REG PCR; в одной области памяти. */ + union PCR_REG PCR; // MCBSP Pin control register bits 15-0 + /* Объединяет несколько представлений RCERC_REG RCERC; в одной области памяти. */ + union RCERC_REG RCERC; // MCBSP Receive channel enable partition C + /* Объединяет несколько представлений RCERD_REG RCERD; в одной области памяти. */ + union RCERD_REG RCERD; // MCBSP Receive channel enable partition D + /* Объединяет несколько представлений XCERC_REG XCERC; в одной области памяти. */ + union XCERC_REG XCERC; // MCBSP Transmit channel enable partition C + /* Объединяет несколько представлений XCERD_REG XCERD; в одной области памяти. */ + union XCERD_REG XCERD; // MCBSP Transmit channel enable partition D + /* Объединяет несколько представлений RCERE_REG RCERE; в одной области памяти. */ + union RCERE_REG RCERE; // MCBSP Receive channel enable partition E + /* Объединяет несколько представлений RCERF_REG RCERF; в одной области памяти. */ + union RCERF_REG RCERF; // MCBSP Receive channel enable partition F + /* Объединяет несколько представлений XCERE_REG XCERE; в одной области памяти. */ + union XCERE_REG XCERE; // MCBSP Transmit channel enable partition E + /* Объединяет несколько представлений XCERF_REG XCERF; в одной области памяти. */ + union XCERF_REG XCERF; // MCBSP Transmit channel enable partition F + /* Объединяет несколько представлений RCERG_REG RCERG; в одной области памяти. */ + union RCERG_REG RCERG; // MCBSP Receive channel enable partition G + /* Объединяет несколько представлений RCERH_REG RCERH; в одной области памяти. */ + union RCERH_REG RCERH; // MCBSP Receive channel enable partition H + /* Объединяет несколько представлений XCERG_REG XCERG; в одной области памяти. */ + union XCERG_REG XCERG; // MCBSP Transmit channel enable partition G + /* Объединяет несколько представлений XCERH_REG XCERH; в одной области памяти. */ + union XCERH_REG XCERH; // MCBSP Transmit channel enable partition H + /* Объявляет rsvd1 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1[4]; // reserved + /* Объединяет несколько представлений MFFINT_REG MFFINT; в одной области памяти. */ + union MFFINT_REG MFFINT; // MCBSP Interrupt enable register for RINT/XINT + /* Объявляет rsvd2 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2; // reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//--------------------------------------------------------------------------- +// McBSP External References & Function Declarations: +// +/* Продолжает список аргументов, полей или выражение extern volatile struct MCBSP_REGS McbspaRegs;; порядок элементов сохраняется. */ +extern volatile struct MCBSP_REGS McbspaRegs; +/* Продолжает список аргументов, полей или выражение extern volatile struct MCBSP_REGS McbspbRegs;; порядок элементов сохраняется. */ +extern volatile struct MCBSP_REGS McbspbRegs; + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_MCBSP_H definition + +//=========================================================================== +// No more. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_PieCtrl.h b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_PieCtrl.h new file mode 100644 index 0000000..b7eece6 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_PieCtrl.h @@ -0,0 +1,260 @@ +/* Поставляемое TI описание PieCtrl для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/1 $ +// Checkin $Date: August 18, 2006 13:52:24 $ +//########################################################################### +// +// FILE: DSP2833x_PieCtrl.h +// +// TITLE: DSP2833x Device PIE Control Register Definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + + +/* Начинает условие: DSP2833x_PIE_CTRL_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_PIE_CTRL_H +/* Определяет защитный символ или переключатель DSP2833x_PIE_CTRL_H для последующей компиляции. */ +#define DSP2833x_PIE_CTRL_H + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +//--------------------------------------------------------------------------- +// PIE Control Register Bit Definitions: +// +// PIECTRL: Register bit definitions: +/* Описывает структуру PIECTRL_BITS; порядок полей определяет расположение данных. */ +struct PIECTRL_BITS { // bits description + /* Битовое поле ENPIE, ширина 1 бит; данные ENPIE. */ + Uint16 ENPIE:1; // 0 Enable PIE block + /* Битовое поле PIEVECT, ширина 15 бит; данные PIEVECT. */ + Uint16 PIEVECT:15; // 15:1 Fetched vector address +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений PIECTRL_REG в одной области памяти. */ +union PIECTRL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру PIECTRL_BITS bit;; порядок полей определяет расположение данных. */ + struct PIECTRL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// PIEIER: Register bit definitions: +/* Описывает структуру PIEIER_BITS; порядок полей определяет расположение данных. */ +struct PIEIER_BITS { // bits description + /* Битовое поле INTx1, ширина 1 бит; данные INTx1. */ + Uint16 INTx1:1; // 0 INTx.1 + /* Битовое поле INTx2, ширина 1 бит; данные INTx2. */ + Uint16 INTx2:1; // 1 INTx.2 + /* Битовое поле INTx3, ширина 1 бит; данные INTx3. */ + Uint16 INTx3:1; // 2 INTx.3 + /* Битовое поле INTx4, ширина 1 бит; данные INTx4. */ + Uint16 INTx4:1; // 3 INTx.4 + /* Битовое поле INTx5, ширина 1 бит; данные INTx5. */ + Uint16 INTx5:1; // 4 INTx.5 + /* Битовое поле INTx6, ширина 1 бит; данные INTx6. */ + Uint16 INTx6:1; // 5 INTx.6 + /* Битовое поле INTx7, ширина 1 бит; данные INTx7. */ + Uint16 INTx7:1; // 6 INTx.7 + /* Битовое поле INTx8, ширина 1 бит; данные INTx8. */ + Uint16 INTx8:1; // 7 INTx.8 + /* Битовое поле rsvd, ширина 8 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:8; // 15:8 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений PIEIER_REG в одной области памяти. */ +union PIEIER_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру PIEIER_BITS bit;; порядок полей определяет расположение данных. */ + struct PIEIER_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// PIEIFR: Register bit definitions: +/* Описывает структуру PIEIFR_BITS; порядок полей определяет расположение данных. */ +struct PIEIFR_BITS { // bits description + /* Битовое поле INTx1, ширина 1 бит; данные INTx1. */ + Uint16 INTx1:1; // 0 INTx.1 + /* Битовое поле INTx2, ширина 1 бит; данные INTx2. */ + Uint16 INTx2:1; // 1 INTx.2 + /* Битовое поле INTx3, ширина 1 бит; данные INTx3. */ + Uint16 INTx3:1; // 2 INTx.3 + /* Битовое поле INTx4, ширина 1 бит; данные INTx4. */ + Uint16 INTx4:1; // 3 INTx.4 + /* Битовое поле INTx5, ширина 1 бит; данные INTx5. */ + Uint16 INTx5:1; // 4 INTx.5 + /* Битовое поле INTx6, ширина 1 бит; данные INTx6. */ + Uint16 INTx6:1; // 5 INTx.6 + /* Битовое поле INTx7, ширина 1 бит; данные INTx7. */ + Uint16 INTx7:1; // 6 INTx.7 + /* Битовое поле INTx8, ширина 1 бит; данные INTx8. */ + Uint16 INTx8:1; // 7 INTx.8 + /* Битовое поле rsvd, ширина 8 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:8; // 15:8 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений PIEIFR_REG в одной области памяти. */ +union PIEIFR_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру PIEIFR_BITS bit;; порядок полей определяет расположение данных. */ + struct PIEIFR_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// PIEACK: Register bit definitions: +/* Описывает структуру PIEACK_BITS; порядок полей определяет расположение данных. */ +struct PIEACK_BITS { // bits description + /* Битовое поле ACK1, ширина 1 бит; данные ACK1. */ + Uint16 ACK1:1; // 0 Acknowledge PIE interrupt group 1 + /* Битовое поле ACK2, ширина 1 бит; данные ACK2. */ + Uint16 ACK2:1; // 1 Acknowledge PIE interrupt group 2 + /* Битовое поле ACK3, ширина 1 бит; данные ACK3. */ + Uint16 ACK3:1; // 2 Acknowledge PIE interrupt group 3 + /* Битовое поле ACK4, ширина 1 бит; данные ACK4. */ + Uint16 ACK4:1; // 3 Acknowledge PIE interrupt group 4 + /* Битовое поле ACK5, ширина 1 бит; данные ACK5. */ + Uint16 ACK5:1; // 4 Acknowledge PIE interrupt group 5 + /* Битовое поле ACK6, ширина 1 бит; данные ACK6. */ + Uint16 ACK6:1; // 5 Acknowledge PIE interrupt group 6 + /* Битовое поле ACK7, ширина 1 бит; данные ACK7. */ + Uint16 ACK7:1; // 6 Acknowledge PIE interrupt group 7 + /* Битовое поле ACK8, ширина 1 бит; данные ACK8. */ + Uint16 ACK8:1; // 7 Acknowledge PIE interrupt group 8 + /* Битовое поле ACK9, ширина 1 бит; данные ACK9. */ + Uint16 ACK9:1; // 8 Acknowledge PIE interrupt group 9 + /* Битовое поле ACK10, ширина 1 бит; данные ACK10. */ + Uint16 ACK10:1; // 9 Acknowledge PIE interrupt group 10 + /* Битовое поле ACK11, ширина 1 бит; данные ACK11. */ + Uint16 ACK11:1; // 10 Acknowledge PIE interrupt group 11 + /* Битовое поле ACK12, ширина 1 бит; данные ACK12. */ + Uint16 ACK12:1; // 11 Acknowledge PIE interrupt group 12 + /* Битовое поле rsvd, ширина 4 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:4; // 15:12 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений PIEACK_REG в одной области памяти. */ +union PIEACK_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру PIEACK_BITS bit;; порядок полей определяет расположение данных. */ + struct PIEACK_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//--------------------------------------------------------------------------- +// PIE Control Register File: +// +/* Описывает структуру PIE_CTRL_REGS; порядок полей определяет расположение данных. */ +struct PIE_CTRL_REGS { + /* Объединяет несколько представлений PIECTRL_REG PIECTRL; в одной области памяти. */ + union PIECTRL_REG PIECTRL; // PIE control register + /* Объединяет несколько представлений PIEACK_REG PIEACK; в одной области памяти. */ + union PIEACK_REG PIEACK; // PIE acknowledge + /* Объединяет несколько представлений PIEIER_REG PIEIER1; в одной области памяти. */ + union PIEIER_REG PIEIER1; // PIE int1 IER register + /* Объединяет несколько представлений PIEIFR_REG PIEIFR1; в одной области памяти. */ + union PIEIFR_REG PIEIFR1; // PIE int1 IFR register + /* Объединяет несколько представлений PIEIER_REG PIEIER2; в одной области памяти. */ + union PIEIER_REG PIEIER2; // PIE INT2 IER register + /* Объединяет несколько представлений PIEIFR_REG PIEIFR2; в одной области памяти. */ + union PIEIFR_REG PIEIFR2; // PIE INT2 IFR register + /* Объединяет несколько представлений PIEIER_REG PIEIER3; в одной области памяти. */ + union PIEIER_REG PIEIER3; // PIE INT3 IER register + /* Объединяет несколько представлений PIEIFR_REG PIEIFR3; в одной области памяти. */ + union PIEIFR_REG PIEIFR3; // PIE INT3 IFR register + /* Объединяет несколько представлений PIEIER_REG PIEIER4; в одной области памяти. */ + union PIEIER_REG PIEIER4; // PIE INT4 IER register + /* Объединяет несколько представлений PIEIFR_REG PIEIFR4; в одной области памяти. */ + union PIEIFR_REG PIEIFR4; // PIE INT4 IFR register + /* Объединяет несколько представлений PIEIER_REG PIEIER5; в одной области памяти. */ + union PIEIER_REG PIEIER5; // PIE INT5 IER register + /* Объединяет несколько представлений PIEIFR_REG PIEIFR5; в одной области памяти. */ + union PIEIFR_REG PIEIFR5; // PIE INT5 IFR register + /* Объединяет несколько представлений PIEIER_REG PIEIER6; в одной области памяти. */ + union PIEIER_REG PIEIER6; // PIE INT6 IER register + /* Объединяет несколько представлений PIEIFR_REG PIEIFR6; в одной области памяти. */ + union PIEIFR_REG PIEIFR6; // PIE INT6 IFR register + /* Объединяет несколько представлений PIEIER_REG PIEIER7; в одной области памяти. */ + union PIEIER_REG PIEIER7; // PIE INT7 IER register + /* Объединяет несколько представлений PIEIFR_REG PIEIFR7; в одной области памяти. */ + union PIEIFR_REG PIEIFR7; // PIE INT7 IFR register + /* Объединяет несколько представлений PIEIER_REG PIEIER8; в одной области памяти. */ + union PIEIER_REG PIEIER8; // PIE INT8 IER register + /* Объединяет несколько представлений PIEIFR_REG PIEIFR8; в одной области памяти. */ + union PIEIFR_REG PIEIFR8; // PIE INT8 IFR register + /* Объединяет несколько представлений PIEIER_REG PIEIER9; в одной области памяти. */ + union PIEIER_REG PIEIER9; // PIE INT9 IER register + /* Объединяет несколько представлений PIEIFR_REG PIEIFR9; в одной области памяти. */ + union PIEIFR_REG PIEIFR9; // PIE INT9 IFR register + /* Объединяет несколько представлений PIEIER_REG PIEIER10; в одной области памяти. */ + union PIEIER_REG PIEIER10; // PIE int10 IER register + /* Объединяет несколько представлений PIEIFR_REG PIEIFR10; в одной области памяти. */ + union PIEIFR_REG PIEIFR10; // PIE int10 IFR register + /* Объединяет несколько представлений PIEIER_REG PIEIER11; в одной области памяти. */ + union PIEIER_REG PIEIER11; // PIE int11 IER register + /* Объединяет несколько представлений PIEIFR_REG PIEIFR11; в одной области памяти. */ + union PIEIFR_REG PIEIFR11; // PIE int11 IFR register + /* Объединяет несколько представлений PIEIER_REG PIEIER12; в одной области памяти. */ + union PIEIER_REG PIEIER12; // PIE int12 IER register + /* Объединяет несколько представлений PIEIFR_REG PIEIFR12; в одной области памяти. */ + union PIEIFR_REG PIEIFR12; // PIE int12 IFR register +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Задаёт PIEACK_GROUP1 = 0x0001; данные PIEACK_GROUP1. */ +#define PIEACK_GROUP1 0x0001 +/* Задаёт PIEACK_GROUP2 = 0x0002; данные PIEACK_GROUP2. */ +#define PIEACK_GROUP2 0x0002 +/* Задаёт PIEACK_GROUP3 = 0x0004; данные PIEACK_GROUP3. */ +#define PIEACK_GROUP3 0x0004 +/* Задаёт PIEACK_GROUP4 = 0x0008; данные PIEACK_GROUP4. */ +#define PIEACK_GROUP4 0x0008 +/* Задаёт PIEACK_GROUP5 = 0x0010; данные PIEACK_GROUP5. */ +#define PIEACK_GROUP5 0x0010 +/* Задаёт PIEACK_GROUP6 = 0x0020; данные PIEACK_GROUP6. */ +#define PIEACK_GROUP6 0x0020 +/* Задаёт PIEACK_GROUP7 = 0x0040; данные PIEACK_GROUP7. */ +#define PIEACK_GROUP7 0x0040 +/* Задаёт PIEACK_GROUP8 = 0x0080; данные PIEACK_GROUP8. */ +#define PIEACK_GROUP8 0x0080 +/* Задаёт PIEACK_GROUP9 = 0x0100; данные PIEACK_GROUP9. */ +#define PIEACK_GROUP9 0x0100 +/* Задаёт PIEACK_GROUP10 = 0x0200; данные PIEACK_GROUP10. */ +#define PIEACK_GROUP10 0x0200 +/* Задаёт PIEACK_GROUP11 = 0x0400; данные PIEACK_GROUP11. */ +#define PIEACK_GROUP11 0x0400 +/* Задаёт PIEACK_GROUP12 = 0x0800; данные PIEACK_GROUP12. */ +#define PIEACK_GROUP12 0x0800 + +//--------------------------------------------------------------------------- +// PIE Control Registers External References & Function Declarations: +// +/* Продолжает список аргументов, полей или выражение extern volatile struct PIE_CTRL_REGS PieCtrlRegs;; порядок элементов сохраняется. */ +extern volatile struct PIE_CTRL_REGS PieCtrlRegs; + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_PIE_CTRL_H definition + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_PieVect.h b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_PieVect.h new file mode 100644 index 0000000..b768be2 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_PieVect.h @@ -0,0 +1,349 @@ +/* Поставляемое TI описание PieVect для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/2 $ +// Checkin $Date: March 16, 2007 09:00:21 $ +//########################################################################### +// +// FILE: DSP2833x_PieVect.h +// +// TITLE: DSP2833x Devices PIE Vector Table Definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_PIE_VECT_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_PIE_VECT_H +/* Определяет защитный символ или переключатель DSP2833x_PIE_VECT_H для последующей компиляции. */ +#define DSP2833x_PIE_VECT_H + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + + +//--------------------------------------------------------------------------- +// PIE Interrupt Vector Table Definition: +// +// Create a user type called PINT (pointer to interrupt): + +/* Объявляет интерфейс функции void; реализация вызывается через этот прототип. */ +typedef interrupt void(*PINT)(void); + +// Define Vector Table: +/* Описывает структуру PIE_VECT_TABLE; порядок полей определяет расположение данных. */ +struct PIE_VECT_TABLE { + +// Reset is never fetched from this table. +// It will always be fetched from 0x3FFFC0 in +// boot ROM + + /* Продолжает список аргументов, полей или выражение PINT PIE1_RESERVED;; порядок элементов сохраняется. */ + PINT PIE1_RESERVED; + /* Продолжает список аргументов, полей или выражение PINT PIE2_RESERVED;; порядок элементов сохраняется. */ + PINT PIE2_RESERVED; + /* Продолжает список аргументов, полей или выражение PINT PIE3_RESERVED;; порядок элементов сохраняется. */ + PINT PIE3_RESERVED; + /* Продолжает список аргументов, полей или выражение PINT PIE4_RESERVED;; порядок элементов сохраняется. */ + PINT PIE4_RESERVED; + /* Продолжает список аргументов, полей или выражение PINT PIE5_RESERVED;; порядок элементов сохраняется. */ + PINT PIE5_RESERVED; + /* Продолжает список аргументов, полей или выражение PINT PIE6_RESERVED;; порядок элементов сохраняется. */ + PINT PIE6_RESERVED; + /* Продолжает список аргументов, полей или выражение PINT PIE7_RESERVED;; порядок элементов сохраняется. */ + PINT PIE7_RESERVED; + /* Продолжает список аргументов, полей или выражение PINT PIE8_RESERVED;; порядок элементов сохраняется. */ + PINT PIE8_RESERVED; + /* Продолжает список аргументов, полей или выражение PINT PIE9_RESERVED;; порядок элементов сохраняется. */ + PINT PIE9_RESERVED; + /* Продолжает список аргументов, полей или выражение PINT PIE10_RESERVED;; порядок элементов сохраняется. */ + PINT PIE10_RESERVED; + /* Продолжает список аргументов, полей или выражение PINT PIE11_RESERVED;; порядок элементов сохраняется. */ + PINT PIE11_RESERVED; + /* Продолжает список аргументов, полей или выражение PINT PIE12_RESERVED;; порядок элементов сохраняется. */ + PINT PIE12_RESERVED; + /* Продолжает список аргументов, полей или выражение PINT PIE13_RESERVED;; порядок элементов сохраняется. */ + PINT PIE13_RESERVED; + +// Non-Peripheral Interrupts: + /* Продолжает список аргументов, полей или выражение PINT XINT13;; порядок элементов сохраняется. */ + PINT XINT13; // XINT13 / CPU-Timer1 + /* Продолжает список аргументов, полей или выражение PINT TINT2;; порядок элементов сохраняется. */ + PINT TINT2; // CPU-Timer2 + /* Продолжает список аргументов, полей или выражение PINT DATALOG;; порядок элементов сохраняется. */ + PINT DATALOG; // Datalogging interrupt + /* Продолжает список аргументов, полей или выражение PINT RTOSINT;; порядок элементов сохраняется. */ + PINT RTOSINT; // RTOS interrupt + /* Продолжает список аргументов, полей или выражение PINT EMUINT;; порядок элементов сохраняется. */ + PINT EMUINT; // Emulation interrupt + /* Продолжает список аргументов, полей или выражение PINT XNMI;; порядок элементов сохраняется. */ + PINT XNMI; // Non-maskable interrupt + /* Продолжает список аргументов, полей или выражение PINT ILLEGAL;; порядок элементов сохраняется. */ + PINT ILLEGAL; // Illegal operation TRAP + /* Продолжает список аргументов, полей или выражение PINT USER1;; порядок элементов сохраняется. */ + PINT USER1; // User Defined trap 1 + /* Продолжает список аргументов, полей или выражение PINT USER2;; порядок элементов сохраняется. */ + PINT USER2; // User Defined trap 2 + /* Продолжает список аргументов, полей или выражение PINT USER3;; порядок элементов сохраняется. */ + PINT USER3; // User Defined trap 3 + /* Продолжает список аргументов, полей или выражение PINT USER4;; порядок элементов сохраняется. */ + PINT USER4; // User Defined trap 4 + /* Продолжает список аргументов, полей или выражение PINT USER5;; порядок элементов сохраняется. */ + PINT USER5; // User Defined trap 5 + /* Продолжает список аргументов, полей или выражение PINT USER6;; порядок элементов сохраняется. */ + PINT USER6; // User Defined trap 6 + /* Продолжает список аргументов, полей или выражение PINT USER7;; порядок элементов сохраняется. */ + PINT USER7; // User Defined trap 7 + /* Продолжает список аргументов, полей или выражение PINT USER8;; порядок элементов сохраняется. */ + PINT USER8; // User Defined trap 8 + /* Продолжает список аргументов, полей или выражение PINT USER9;; порядок элементов сохраняется. */ + PINT USER9; // User Defined trap 9 + /* Продолжает список аргументов, полей или выражение PINT USER10;; порядок элементов сохраняется. */ + PINT USER10; // User Defined trap 10 + /* Продолжает список аргументов, полей или выражение PINT USER11;; порядок элементов сохраняется. */ + PINT USER11; // User Defined trap 11 + /* Продолжает список аргументов, полей или выражение PINT USER12;; порядок элементов сохраняется. */ + PINT USER12; // User Defined trap 12 + +// Group 1 PIE Peripheral Vectors: + /* Продолжает список аргументов, полей или выражение PINT SEQ1INT;; порядок элементов сохраняется. */ + PINT SEQ1INT; + /* Продолжает список аргументов, полей или выражение PINT SEQ2INT;; порядок элементов сохраняется. */ + PINT SEQ2INT; + /* Продолжает список аргументов, полей или выражение PINT rsvd1_3;; порядок элементов сохраняется. */ + PINT rsvd1_3; + /* Продолжает список аргументов, полей или выражение PINT XINT1;; порядок элементов сохраняется. */ + PINT XINT1; + /* Продолжает список аргументов, полей или выражение PINT XINT2;; порядок элементов сохраняется. */ + PINT XINT2; + /* Продолжает список аргументов, полей или выражение PINT ADCINT;; порядок элементов сохраняется. */ + PINT ADCINT; // ADC + /* Продолжает список аргументов, полей или выражение PINT TINT0;; порядок элементов сохраняется. */ + PINT TINT0; // Timer 0 + /* Продолжает список аргументов, полей или выражение PINT WAKEINT;; порядок элементов сохраняется. */ + PINT WAKEINT; // WD + +// Group 2 PIE Peripheral Vectors: + /* Продолжает список аргументов, полей или выражение PINT EPWM1_TZINT;; порядок элементов сохраняется. */ + PINT EPWM1_TZINT; // EPWM-1 + /* Продолжает список аргументов, полей или выражение PINT EPWM2_TZINT;; порядок элементов сохраняется. */ + PINT EPWM2_TZINT; // EPWM-2 + /* Продолжает список аргументов, полей или выражение PINT EPWM3_TZINT;; порядок элементов сохраняется. */ + PINT EPWM3_TZINT; // EPWM-3 + /* Продолжает список аргументов, полей или выражение PINT EPWM4_TZINT;; порядок элементов сохраняется. */ + PINT EPWM4_TZINT; // EPWM-4 + /* Продолжает список аргументов, полей или выражение PINT EPWM5_TZINT;; порядок элементов сохраняется. */ + PINT EPWM5_TZINT; // EPWM-5 + /* Продолжает список аргументов, полей или выражение PINT EPWM6_TZINT;; порядок элементов сохраняется. */ + PINT EPWM6_TZINT; // EPWM-6 + /* Продолжает список аргументов, полей или выражение PINT rsvd2_7;; порядок элементов сохраняется. */ + PINT rsvd2_7; + /* Продолжает список аргументов, полей или выражение PINT rsvd2_8;; порядок элементов сохраняется. */ + PINT rsvd2_8; + +// Group 3 PIE Peripheral Vectors: + /* Продолжает список аргументов, полей или выражение PINT EPWM1_INT;; порядок элементов сохраняется. */ + PINT EPWM1_INT; // EPWM-1 + /* Продолжает список аргументов, полей или выражение PINT EPWM2_INT;; порядок элементов сохраняется. */ + PINT EPWM2_INT; // EPWM-2 + /* Продолжает список аргументов, полей или выражение PINT EPWM3_INT;; порядок элементов сохраняется. */ + PINT EPWM3_INT; // EPWM-3 + /* Продолжает список аргументов, полей или выражение PINT EPWM4_INT;; порядок элементов сохраняется. */ + PINT EPWM4_INT; // EPWM-4 + /* Продолжает список аргументов, полей или выражение PINT EPWM5_INT;; порядок элементов сохраняется. */ + PINT EPWM5_INT; // EPWM-5 + /* Продолжает список аргументов, полей или выражение PINT EPWM6_INT;; порядок элементов сохраняется. */ + PINT EPWM6_INT; // EPWM-6 + /* Продолжает список аргументов, полей или выражение PINT rsvd3_7;; порядок элементов сохраняется. */ + PINT rsvd3_7; + /* Продолжает список аргументов, полей или выражение PINT rsvd3_8;; порядок элементов сохраняется. */ + PINT rsvd3_8; + +// Group 4 PIE Peripheral Vectors: + /* Продолжает список аргументов, полей или выражение PINT ECAP1_INT;; порядок элементов сохраняется. */ + PINT ECAP1_INT; // ECAP-1 + /* Продолжает список аргументов, полей или выражение PINT ECAP2_INT;; порядок элементов сохраняется. */ + PINT ECAP2_INT; // ECAP-2 + /* Продолжает список аргументов, полей или выражение PINT ECAP3_INT;; порядок элементов сохраняется. */ + PINT ECAP3_INT; // ECAP-3 + /* Продолжает список аргументов, полей или выражение PINT ECAP4_INT;; порядок элементов сохраняется. */ + PINT ECAP4_INT; // ECAP-4 + /* Продолжает список аргументов, полей или выражение PINT ECAP5_INT;; порядок элементов сохраняется. */ + PINT ECAP5_INT; // ECAP-5 + /* Продолжает список аргументов, полей или выражение PINT ECAP6_INT;; порядок элементов сохраняется. */ + PINT ECAP6_INT; // ECAP-6 + /* Продолжает список аргументов, полей или выражение PINT rsvd4_7;; порядок элементов сохраняется. */ + PINT rsvd4_7; + /* Продолжает список аргументов, полей или выражение PINT rsvd4_8;; порядок элементов сохраняется. */ + PINT rsvd4_8; + +// Group 5 PIE Peripheral Vectors: + /* Продолжает список аргументов, полей или выражение PINT EQEP1_INT;; порядок элементов сохраняется. */ + PINT EQEP1_INT; // EQEP-1 + /* Продолжает список аргументов, полей или выражение PINT EQEP2_INT;; порядок элементов сохраняется. */ + PINT EQEP2_INT; // EQEP-2 + /* Продолжает список аргументов, полей или выражение PINT rsvd5_3;; порядок элементов сохраняется. */ + PINT rsvd5_3; + /* Продолжает список аргументов, полей или выражение PINT rsvd5_4;; порядок элементов сохраняется. */ + PINT rsvd5_4; + /* Продолжает список аргументов, полей или выражение PINT rsvd5_5;; порядок элементов сохраняется. */ + PINT rsvd5_5; + /* Продолжает список аргументов, полей или выражение PINT rsvd5_6;; порядок элементов сохраняется. */ + PINT rsvd5_6; + /* Продолжает список аргументов, полей или выражение PINT rsvd5_7;; порядок элементов сохраняется. */ + PINT rsvd5_7; + /* Продолжает список аргументов, полей или выражение PINT rsvd5_8;; порядок элементов сохраняется. */ + PINT rsvd5_8; + +// Group 6 PIE Peripheral Vectors: + /* Продолжает список аргументов, полей или выражение PINT SPIRXINTA;; порядок элементов сохраняется. */ + PINT SPIRXINTA; // SPI-A + /* Продолжает список аргументов, полей или выражение PINT SPITXINTA;; порядок элементов сохраняется. */ + PINT SPITXINTA; // SPI-A + /* Продолжает список аргументов, полей или выражение PINT MRINTB;; порядок элементов сохраняется. */ + PINT MRINTB; // McBSP-B + /* Продолжает список аргументов, полей или выражение PINT MXINTB;; порядок элементов сохраняется. */ + PINT MXINTB; // McBSP-B + /* Продолжает список аргументов, полей или выражение PINT MRINTA;; порядок элементов сохраняется. */ + PINT MRINTA; // McBSP-A + /* Продолжает список аргументов, полей или выражение PINT MXINTA;; порядок элементов сохраняется. */ + PINT MXINTA; // McBSP-A + /* Продолжает список аргументов, полей или выражение PINT rsvd6_7;; порядок элементов сохраняется. */ + PINT rsvd6_7; + /* Продолжает список аргументов, полей или выражение PINT rsvd6_8;; порядок элементов сохраняется. */ + PINT rsvd6_8; + +// Group 7 PIE Peripheral Vectors: + /* Продолжает список аргументов, полей или выражение PINT DINTCH1;; порядок элементов сохраняется. */ + PINT DINTCH1; // DMA + /* Продолжает список аргументов, полей или выражение PINT DINTCH2;; порядок элементов сохраняется. */ + PINT DINTCH2; // DMA + /* Продолжает список аргументов, полей или выражение PINT DINTCH3;; порядок элементов сохраняется. */ + PINT DINTCH3; // DMA + /* Продолжает список аргументов, полей или выражение PINT DINTCH4;; порядок элементов сохраняется. */ + PINT DINTCH4; // DMA + /* Продолжает список аргументов, полей или выражение PINT DINTCH5;; порядок элементов сохраняется. */ + PINT DINTCH5; // DMA + /* Продолжает список аргументов, полей или выражение PINT DINTCH6;; порядок элементов сохраняется. */ + PINT DINTCH6; // DMA + /* Продолжает список аргументов, полей или выражение PINT rsvd7_7;; порядок элементов сохраняется. */ + PINT rsvd7_7; + /* Продолжает список аргументов, полей или выражение PINT rsvd7_8;; порядок элементов сохраняется. */ + PINT rsvd7_8; + +// Group 8 PIE Peripheral Vectors: + /* Продолжает список аргументов, полей или выражение PINT I2CINT1A;; порядок элементов сохраняется. */ + PINT I2CINT1A; // I2C-A + /* Продолжает список аргументов, полей или выражение PINT I2CINT2A;; порядок элементов сохраняется. */ + PINT I2CINT2A; // I2C-A + /* Продолжает список аргументов, полей или выражение PINT rsvd8_3;; порядок элементов сохраняется. */ + PINT rsvd8_3; + /* Продолжает список аргументов, полей или выражение PINT rsvd8_4;; порядок элементов сохраняется. */ + PINT rsvd8_4; + /* Продолжает список аргументов, полей или выражение PINT SCIRXINTC;; порядок элементов сохраняется. */ + PINT SCIRXINTC; // SCI-C + /* Продолжает список аргументов, полей или выражение PINT SCITXINTC;; порядок элементов сохраняется. */ + PINT SCITXINTC; // SCI-C + /* Продолжает список аргументов, полей или выражение PINT rsvd8_7;; порядок элементов сохраняется. */ + PINT rsvd8_7; + /* Продолжает список аргументов, полей или выражение PINT rsvd8_8;; порядок элементов сохраняется. */ + PINT rsvd8_8; + +// Group 9 PIE Peripheral Vectors: + /* Продолжает список аргументов, полей или выражение PINT SCIRXINTA;; порядок элементов сохраняется. */ + PINT SCIRXINTA; // SCI-A + /* Продолжает список аргументов, полей или выражение PINT SCITXINTA;; порядок элементов сохраняется. */ + PINT SCITXINTA; // SCI-A + /* Продолжает список аргументов, полей или выражение PINT SCIRXINTB;; порядок элементов сохраняется. */ + PINT SCIRXINTB; // SCI-B + /* Продолжает список аргументов, полей или выражение PINT SCITXINTB;; порядок элементов сохраняется. */ + PINT SCITXINTB; // SCI-B + /* Продолжает список аргументов, полей или выражение PINT ECAN0INTA;; порядок элементов сохраняется. */ + PINT ECAN0INTA; // eCAN-A + /* Продолжает список аргументов, полей или выражение PINT ECAN1INTA;; порядок элементов сохраняется. */ + PINT ECAN1INTA; // eCAN-A + /* Продолжает список аргументов, полей или выражение PINT ECAN0INTB;; порядок элементов сохраняется. */ + PINT ECAN0INTB; // eCAN-B + /* Продолжает список аргументов, полей или выражение PINT ECAN1INTB;; порядок элементов сохраняется. */ + PINT ECAN1INTB; // eCAN-B + +// Group 10 PIE Peripheral Vectors: + /* Продолжает список аргументов, полей или выражение PINT rsvd10_1;; порядок элементов сохраняется. */ + PINT rsvd10_1; + /* Продолжает список аргументов, полей или выражение PINT rsvd10_2;; порядок элементов сохраняется. */ + PINT rsvd10_2; + /* Продолжает список аргументов, полей или выражение PINT rsvd10_3;; порядок элементов сохраняется. */ + PINT rsvd10_3; + /* Продолжает список аргументов, полей или выражение PINT rsvd10_4;; порядок элементов сохраняется. */ + PINT rsvd10_4; + /* Продолжает список аргументов, полей или выражение PINT rsvd10_5;; порядок элементов сохраняется. */ + PINT rsvd10_5; + /* Продолжает список аргументов, полей или выражение PINT rsvd10_6;; порядок элементов сохраняется. */ + PINT rsvd10_6; + /* Продолжает список аргументов, полей или выражение PINT rsvd10_7;; порядок элементов сохраняется. */ + PINT rsvd10_7; + /* Продолжает список аргументов, полей или выражение PINT rsvd10_8;; порядок элементов сохраняется. */ + PINT rsvd10_8; + +// Group 11 PIE Peripheral Vectors: + /* Продолжает список аргументов, полей или выражение PINT rsvd11_1;; порядок элементов сохраняется. */ + PINT rsvd11_1; + /* Продолжает список аргументов, полей или выражение PINT rsvd11_2;; порядок элементов сохраняется. */ + PINT rsvd11_2; + /* Продолжает список аргументов, полей или выражение PINT rsvd11_3;; порядок элементов сохраняется. */ + PINT rsvd11_3; + /* Продолжает список аргументов, полей или выражение PINT rsvd11_4;; порядок элементов сохраняется. */ + PINT rsvd11_4; + /* Продолжает список аргументов, полей или выражение PINT rsvd11_5;; порядок элементов сохраняется. */ + PINT rsvd11_5; + /* Продолжает список аргументов, полей или выражение PINT rsvd11_6;; порядок элементов сохраняется. */ + PINT rsvd11_6; + /* Продолжает список аргументов, полей или выражение PINT rsvd11_7;; порядок элементов сохраняется. */ + PINT rsvd11_7; + /* Продолжает список аргументов, полей или выражение PINT rsvd11_8;; порядок элементов сохраняется. */ + PINT rsvd11_8; + +// Group 12 PIE Peripheral Vectors: + /* Продолжает список аргументов, полей или выражение PINT XINT3;; порядок элементов сохраняется. */ + PINT XINT3; // External interrupt + /* Продолжает список аргументов, полей или выражение PINT XINT4;; порядок элементов сохраняется. */ + PINT XINT4; + /* Продолжает список аргументов, полей или выражение PINT XINT5;; порядок элементов сохраняется. */ + PINT XINT5; + /* Продолжает список аргументов, полей или выражение PINT XINT6;; порядок элементов сохраняется. */ + PINT XINT6; + /* Продолжает список аргументов, полей или выражение PINT XINT7;; порядок элементов сохраняется. */ + PINT XINT7; + /* Продолжает список аргументов, полей или выражение PINT rsvd12_6;; порядок элементов сохраняется. */ + PINT rsvd12_6; + /* Продолжает список аргументов, полей или выражение PINT LVF;; порядок элементов сохраняется. */ + PINT LVF; // Latched overflow + /* Продолжает список аргументов, полей или выражение PINT LUF;; порядок элементов сохраняется. */ + PINT LUF; // Latched underflow +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//--------------------------------------------------------------------------- +// PIE Interrupt Vector Table External References & Function Declarations: +// +/* Продолжает список аргументов, полей или выражение extern struct PIE_VECT_TABLE PieVectTable;; порядок элементов сохраняется. */ +extern struct PIE_VECT_TABLE PieVectTable; + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_PIE_VECT_H definition + +//=========================================================================== +// End of file. +//=========================================================================== + diff --git a/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_Sci.h b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_Sci.h new file mode 100644 index 0000000..83b5a65 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_Sci.h @@ -0,0 +1,377 @@ +/* Поставляемое TI описание Sci для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/2 $ +// Checkin $Date: March 1, 2007 15:57:02 $ +//########################################################################### +// +// FILE: DSP2833x_Sci.h +// +// TITLE: DSP2833x Device SCI Register Definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_SCI_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_SCI_H +/* Определяет защитный символ или переключатель DSP2833x_SCI_H для последующей компиляции. */ +#define DSP2833x_SCI_H + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +//--------------------------------------------------------------------------- +// SCI Individual Register Bit Definitions + +//---------------------------------------------------------- +// SCICCR communication control register bit definitions: +// + +/* Описывает структуру SCICCR_BITS; порядок полей определяет расположение данных. */ +struct SCICCR_BITS { // bit description + /* Битовое поле SCICHAR, ширина 3 бит; данные SCICHAR. */ + Uint16 SCICHAR:3; // 2:0 Character length control + /* Битовое поле ADDRIDLE_MODE, ширина 1 бит; ADDRIDLE режим. */ + Uint16 ADDRIDLE_MODE:1; // 3 ADDR/IDLE Mode control + /* Битовое поле LOOPBKENA, ширина 1 бит; данные LOOPBKENA. */ + Uint16 LOOPBKENA:1; // 4 Loop Back enable + /* Битовое поле PARITYENA, ширина 1 бит; данные PARITYENA. */ + Uint16 PARITYENA:1; // 5 Parity enable + /* Битовое поле PARITY, ширина 1 бит; чётность. */ + Uint16 PARITY:1; // 6 Even or Odd Parity + /* Битовое поле STOPBITS, ширина 1 бит; данные STOPBITS. */ + Uint16 STOPBITS:1; // 7 Number of Stop Bits + /* Битовое поле rsvd1, ширина 8 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:8; // 15:8 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Объединяет несколько представлений SCICCR_REG в одной области памяти. */ +union SCICCR_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру SCICCR_BITS bit;; порядок полей определяет расположение данных. */ + struct SCICCR_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//------------------------------------------- +// SCICTL1 control register 1 bit definitions: +// + +/* Описывает структуру SCICTL1_BITS; порядок полей определяет расположение данных. */ +struct SCICTL1_BITS { // bit description + /* Битовое поле RXENA, ширина 1 бит; данные RXENA. */ + Uint16 RXENA:1; // 0 SCI receiver enable + /* Битовое поле TXENA, ширина 1 бит; данные TXENA. */ + Uint16 TXENA:1; // 1 SCI transmitter enable + /* Битовое поле SLEEP, ширина 1 бит; данные SLEEP. */ + Uint16 SLEEP:1; // 2 SCI sleep + /* Битовое поле TXWAKE, ширина 1 бит; данные TXWAKE. */ + Uint16 TXWAKE:1; // 3 Transmitter wakeup method + /* Битовое поле rsvd, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:1; // 4 reserved + /* Битовое поле SWRESET, ширина 1 бит; данные SWRESET. */ + Uint16 SWRESET:1; // 5 Software reset + /* Битовое поле RXERRINTENA, ширина 1 бит; данные RXERRINTENA. */ + Uint16 RXERRINTENA:1; // 6 Recieve interrupt enable + /* Битовое поле rsvd1, ширина 9 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:9; // 15:7 reserved + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений SCICTL1_REG в одной области памяти. */ +union SCICTL1_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру SCICTL1_BITS bit;; порядок полей определяет расположение данных. */ + struct SCICTL1_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//--------------------------------------------- +// SCICTL2 control register 2 bit definitions: +// + +/* Описывает структуру SCICTL2_BITS; порядок полей определяет расположение данных. */ +struct SCICTL2_BITS { // bit description + /* Битовое поле TXINTENA, ширина 1 бит; данные TXINTENA. */ + Uint16 TXINTENA:1; // 0 Transmit interrupt enable + /* Битовое поле RXBKINTENA, ширина 1 бит; данные RXBKINTENA. */ + Uint16 RXBKINTENA:1; // 1 Receiver-buffer break enable + /* Битовое поле rsvd, ширина 4 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:4; // 5:2 reserved + /* Битовое поле TXEMPTY, ширина 1 бит; данные TXEMPTY. */ + Uint16 TXEMPTY:1; // 6 Transmitter empty flag + /* Битовое поле TXRDY, ширина 1 бит; данные TXRDY. */ + Uint16 TXRDY:1; // 7 Transmitter ready flag + /* Битовое поле rsvd1, ширина 8 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:8; // 15:8 reserved + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений SCICTL2_REG в одной области памяти. */ +union SCICTL2_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру SCICTL2_BITS bit;; порядок полей определяет расположение данных. */ + struct SCICTL2_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//--------------------------------------------------- +// SCIRXST Receiver status register bit definitions: +// + +/* Описывает структуру SCIRXST_BITS; порядок полей определяет расположение данных. */ +struct SCIRXST_BITS { // bit description + /* Битовое поле rsvd, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:1; // 0 reserved + /* Битовое поле RXWAKE, ширина 1 бит; данные RXWAKE. */ + Uint16 RXWAKE:1; // 1 Receiver wakeup detect flag + /* Битовое поле PE, ширина 1 бит; данные PE. */ + Uint16 PE:1; // 2 Parity error flag + /* Битовое поле OE, ширина 1 бит; данные OE. */ + Uint16 OE:1; // 3 Overrun error flag + /* Битовое поле FE, ширина 1 бит; данные FE. */ + Uint16 FE:1; // 4 Framing error flag + /* Битовое поле BRKDT, ширина 1 бит; данные BRKDT. */ + Uint16 BRKDT:1; // 5 Break-detect flag + /* Битовое поле RXRDY, ширина 1 бит; данные RXRDY. */ + Uint16 RXRDY:1; // 6 Receiver ready flag + /* Битовое поле RXERROR, ширина 1 бит; данные RXERROR. */ + Uint16 RXERROR:1; // 7 Receiver error flag + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений SCIRXST_REG в одной области памяти. */ +union SCIRXST_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру SCIRXST_BITS bit;; порядок полей определяет расположение данных. */ + struct SCIRXST_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//---------------------------------------------------- +// SCIRXBUF Receiver Data Buffer with FIFO bit definitions: +// + +/* Описывает структуру SCIRXBUF_BITS; порядок полей определяет расположение данных. */ +struct SCIRXBUF_BITS { // bits description + /* Битовое поле RXDT, ширина 8 бит; данные RXDT. */ + Uint16 RXDT:8; // 7:0 Receive word + /* Битовое поле rsvd, ширина 6 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:6; // 13:8 reserved + /* Битовое поле SCIFFPE, ширина 1 бит; данные SCIFFPE. */ + Uint16 SCIFFPE:1; // 14 SCI PE error in FIFO mode + /* Битовое поле SCIFFFE, ширина 1 бит; данные SCIFFFE. */ + Uint16 SCIFFFE:1; // 15 SCI FE error in FIFO mode +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений SCIRXBUF_REG в одной области памяти. */ +union SCIRXBUF_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру SCIRXBUF_BITS bit;; порядок полей определяет расположение данных. */ + struct SCIRXBUF_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//-------------------------------------------------- +// SCIPRI Priority control register bit definitions: +// +// + +/* Описывает структуру SCIPRI_BITS; порядок полей определяет расположение данных. */ +struct SCIPRI_BITS { // bit description + /* Битовое поле rsvd, ширина 3 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:3; // 2:0 reserved + /* Битовое поле FREE, ширина 1 бит; данные FREE. */ + Uint16 FREE:1; // 3 Free emulation suspend mode + /* Битовое поле SOFT, ширина 1 бит; данные SOFT. */ + Uint16 SOFT:1; // 4 Soft emulation suspend mode + /* Битовое поле rsvd1, ширина 3 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:3; // 7:5 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений SCIPRI_REG в одной области памяти. */ +union SCIPRI_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру SCIPRI_BITS bit;; порядок полей определяет расположение данных. */ + struct SCIPRI_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//------------------------------------------------- +// SCI FIFO Transmit register bit definitions: +// +// + +/* Описывает структуру SCIFFTX_BITS; порядок полей определяет расположение данных. */ +struct SCIFFTX_BITS { // bit description + /* Битовое поле TXFFIL, ширина 5 бит; данные TXFFIL. */ + Uint16 TXFFIL:5; // 4:0 Interrupt level + /* Битовое поле TXFFIENA, ширина 1 бит; данные TXFFIENA. */ + Uint16 TXFFIENA:1; // 5 Interrupt enable + /* Битовое поле TXFFINTCLR, ширина 1 бит; данные TXFFINTCLR. */ + Uint16 TXFFINTCLR:1; // 6 Clear INT flag + /* Битовое поле TXFFINT, ширина 1 бит; данные TXFFINT. */ + Uint16 TXFFINT:1; // 7 INT flag + /* Битовое поле TXFFST, ширина 5 бит; данные TXFFST. */ + Uint16 TXFFST:5; // 12:8 FIFO status + /* Битовое поле TXFIFOXRESET, ширина 1 бит; данные TXFIFOXRESET. */ + Uint16 TXFIFOXRESET:1; // 13 FIFO reset + /* Битовое поле SCIFFENA, ширина 1 бит; данные SCIFFENA. */ + Uint16 SCIFFENA:1; // 14 Enhancement enable + /* Битовое поле SCIRST, ширина 1 бит; данные SCIRST. */ + Uint16 SCIRST:1; // 15 SCI reset rx/tx channels + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений SCIFFTX_REG в одной области памяти. */ +union SCIFFTX_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру SCIFFTX_BITS bit;; порядок полей определяет расположение данных. */ + struct SCIFFTX_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//------------------------------------------------ +// SCI FIFO recieve register bit definitions: +// +// + +/* Описывает структуру SCIFFRX_BITS; порядок полей определяет расположение данных. */ +struct SCIFFRX_BITS { // bits description + /* Битовое поле RXFFIL, ширина 5 бит; данные RXFFIL. */ + Uint16 RXFFIL:5; // 4:0 Interrupt level + /* Битовое поле RXFFIENA, ширина 1 бит; данные RXFFIENA. */ + Uint16 RXFFIENA:1; // 5 Interrupt enable + /* Битовое поле RXFFINTCLR, ширина 1 бит; данные RXFFINTCLR. */ + Uint16 RXFFINTCLR:1; // 6 Clear INT flag + /* Битовое поле RXFFINT, ширина 1 бит; данные RXFFINT. */ + Uint16 RXFFINT:1; // 7 INT flag + /* Битовое поле RXFFST, ширина 5 бит; данные RXFFST. */ + Uint16 RXFFST:5; // 12:8 FIFO status + /* Битовое поле RXFIFORESET, ширина 1 бит; данные RXFIFORESET. */ + Uint16 RXFIFORESET:1; // 13 FIFO reset + /* Битовое поле RXFFOVRCLR, ширина 1 бит; данные RXFFOVRCLR. */ + Uint16 RXFFOVRCLR:1; // 14 Clear overflow + /* Битовое поле RXFFOVF, ширина 1 бит; данные RXFFOVF. */ + Uint16 RXFFOVF:1; // 15 FIFO overflow + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений SCIFFRX_REG в одной области памяти. */ +union SCIFFRX_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру SCIFFRX_BITS bit;; порядок полей определяет расположение данных. */ + struct SCIFFRX_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// SCI FIFO control register bit definitions: +/* Описывает структуру SCIFFCT_BITS; порядок полей определяет расположение данных. */ +struct SCIFFCT_BITS { // bits description + /* Битовое поле FFTXDLY, ширина 8 бит; данные FFTXDLY. */ + Uint16 FFTXDLY:8; // 7:0 FIFO transmit delay + /* Битовое поле rsvd, ширина 5 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:5; // 12:8 reserved + /* Битовое поле CDC, ширина 1 бит; данные CDC. */ + Uint16 CDC:1; // 13 Auto baud mode enable + /* Битовое поле ABDCLR, ширина 1 бит; данные ABDCLR. */ + Uint16 ABDCLR:1; // 14 Auto baud clear + /* Битовое поле ABD, ширина 1 бит; данные ABD. */ + Uint16 ABD:1; // 15 Auto baud detect +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений SCIFFCT_REG в одной области памяти. */ +union SCIFFCT_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру SCIFFCT_BITS bit;; порядок полей определяет расположение данных. */ + struct SCIFFCT_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//--------------------------------------------------------------------------- +// SCI Register File: +// +/* Описывает структуру SCI_REGS; порядок полей определяет расположение данных. */ +struct SCI_REGS { + /* Объединяет несколько представлений SCICCR_REG SCICCR; в одной области памяти. */ + union SCICCR_REG SCICCR; // Communications control register + /* Объединяет несколько представлений SCICTL1_REG SCICTL1; в одной области памяти. */ + union SCICTL1_REG SCICTL1; // Control register 1 + /* Объявляет SCIHBAUD — данные SCIHBAUD. */ + Uint16 SCIHBAUD; // Baud rate (high) register + /* Объявляет SCILBAUD — данные SCILBAUD. */ + Uint16 SCILBAUD; // Baud rate (low) register + /* Объединяет несколько представлений SCICTL2_REG SCICTL2; в одной области памяти. */ + union SCICTL2_REG SCICTL2; // Control register 2 + /* Объединяет несколько представлений SCIRXST_REG SCIRXST; в одной области памяти. */ + union SCIRXST_REG SCIRXST; // Recieve status register + /* Объявляет SCIRXEMU — данные SCIRXEMU. */ + Uint16 SCIRXEMU; // Recieve emulation buffer register + /* Объединяет несколько представлений SCIRXBUF_REG SCIRXBUF; в одной области памяти. */ + union SCIRXBUF_REG SCIRXBUF; // Recieve data buffer + /* Объявляет rsvd1 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1; // reserved + /* Объявляет SCITXBUF — данные SCITXBUF. */ + Uint16 SCITXBUF; // Transmit data buffer + /* Объединяет несколько представлений SCIFFTX_REG SCIFFTX; в одной области памяти. */ + union SCIFFTX_REG SCIFFTX; // FIFO transmit register + /* Объединяет несколько представлений SCIFFRX_REG SCIFFRX; в одной области памяти. */ + union SCIFFRX_REG SCIFFRX; // FIFO recieve register + /* Объединяет несколько представлений SCIFFCT_REG SCIFFCT; в одной области памяти. */ + union SCIFFCT_REG SCIFFCT; // FIFO control register + /* Объявляет rsvd2 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2; // reserved + /* Объявляет rsvd3 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd3; // reserved + /* Объединяет несколько представлений SCIPRI_REG SCIPRI; в одной области памяти. */ + union SCIPRI_REG SCIPRI; // FIFO Priority control +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//--------------------------------------------------------------------------- +// SCI External References & Function Declarations: +// +/* Продолжает список аргументов, полей или выражение extern volatile struct SCI_REGS SciaRegs;; порядок элементов сохраняется. */ +extern volatile struct SCI_REGS SciaRegs; +/* Продолжает список аргументов, полей или выражение extern volatile struct SCI_REGS ScibRegs;; порядок элементов сохраняется. */ +extern volatile struct SCI_REGS ScibRegs; +/* Продолжает список аргументов, полей или выражение extern volatile struct SCI_REGS ScicRegs;; порядок элементов сохраняется. */ +extern volatile struct SCI_REGS ScicRegs; + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_SCI_H definition + +//=========================================================================== +// End of file. +//=========================================================================== + diff --git a/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_Spi.h b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_Spi.h new file mode 100644 index 0000000..cdce516 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_Spi.h @@ -0,0 +1,292 @@ +/* Поставляемое TI описание Spi для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/3 $ +// Checkin $Date: April 17, 2008 11:08:27 $ +//########################################################################### +// +// FILE: DSP2833x_Spi.h +// +// TITLE: DSP2833x Device SPI Register Definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_SPI_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_SPI_H +/* Определяет защитный символ или переключатель DSP2833x_SPI_H для последующей компиляции. */ +#define DSP2833x_SPI_H + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + + +//--------------------------------------------------------------------------- +// SPI Individual Register Bit Definitions: +// +// SPI FIFO Transmit register bit definitions: +/* Описывает структуру SPIFFTX_BITS; порядок полей определяет расположение данных. */ +struct SPIFFTX_BITS { // bit description + /* Битовое поле TXFFIL, ширина 5 бит; данные TXFFIL. */ + Uint16 TXFFIL:5; // 4:0 Interrupt level + /* Битовое поле TXFFIENA, ширина 1 бит; данные TXFFIENA. */ + Uint16 TXFFIENA:1; // 5 Interrupt enable + /* Битовое поле TXFFINTCLR, ширина 1 бит; данные TXFFINTCLR. */ + Uint16 TXFFINTCLR:1; // 6 Clear INT flag + /* Битовое поле TXFFINT, ширина 1 бит; данные TXFFINT. */ + Uint16 TXFFINT:1; // 7 INT flag + /* Битовое поле TXFFST, ширина 5 бит; данные TXFFST. */ + Uint16 TXFFST:5; // 12:8 FIFO status + /* Битовое поле TXFIFO, ширина 1 бит; данные TXFIFO. */ + Uint16 TXFIFO:1; // 13 FIFO reset + /* Битовое поле SPIFFENA, ширина 1 бит; данные SPIFFENA. */ + Uint16 SPIFFENA:1; // 14 Enhancement enable + /* Битовое поле SPIRST, ширина 1 бит; данные SPIRST. */ + Uint16 SPIRST:1; // 15 Reset SPI +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений SPIFFTX_REG в одной области памяти. */ +union SPIFFTX_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру SPIFFTX_BITS bit;; порядок полей определяет расположение данных. */ + struct SPIFFTX_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//-------------------------------------------- +// SPI FIFO recieve register bit definitions: +// +// +/* Описывает структуру SPIFFRX_BITS; порядок полей определяет расположение данных. */ +struct SPIFFRX_BITS { // bits description + /* Битовое поле RXFFIL, ширина 5 бит; данные RXFFIL. */ + Uint16 RXFFIL:5; // 4:0 Interrupt level + /* Битовое поле RXFFIENA, ширина 1 бит; данные RXFFIENA. */ + Uint16 RXFFIENA:1; // 5 Interrupt enable + /* Битовое поле RXFFINTCLR, ширина 1 бит; данные RXFFINTCLR. */ + Uint16 RXFFINTCLR:1; // 6 Clear INT flag + /* Битовое поле RXFFINT, ширина 1 бит; данные RXFFINT. */ + Uint16 RXFFINT:1; // 7 INT flag + /* Битовое поле RXFFST, ширина 5 бит; данные RXFFST. */ + Uint16 RXFFST:5; // 12:8 FIFO status + /* Битовое поле RXFIFORESET, ширина 1 бит; данные RXFIFORESET. */ + Uint16 RXFIFORESET:1; // 13 FIFO reset + /* Битовое поле RXFFOVFCLR, ширина 1 бит; данные RXFFOVFCLR. */ + Uint16 RXFFOVFCLR:1; // 14 Clear overflow + /* Битовое поле RXFFOVF, ширина 1 бит; данные RXFFOVF. */ + Uint16 RXFFOVF:1; // 15 FIFO overflow + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений SPIFFRX_REG в одной области памяти. */ +union SPIFFRX_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру SPIFFRX_BITS bit;; порядок полей определяет расположение данных. */ + struct SPIFFRX_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//-------------------------------------------- +// SPI FIFO control register bit definitions: +// +// +/* Описывает структуру SPIFFCT_BITS; порядок полей определяет расположение данных. */ +struct SPIFFCT_BITS { // bits description + /* Битовое поле TXDLY, ширина 8 бит; данные TXDLY. */ + Uint16 TXDLY:8; // 7:0 FIFO transmit delay + /* Битовое поле rsvd, ширина 8 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:8; // 15:8 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений SPIFFCT_REG в одной области памяти. */ +union SPIFFCT_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру SPIFFCT_BITS bit;; порядок полей определяет расположение данных. */ + struct SPIFFCT_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//--------------------------------------------- +// SPI configuration register bit definitions: +// +// +/* Описывает структуру SPICCR_BITS; порядок полей определяет расположение данных. */ +struct SPICCR_BITS { // bits description + /* Битовое поле SPICHAR, ширина 4 бит; данные SPICHAR. */ + Uint16 SPICHAR:4; // 3:0 Character length control + /* Битовое поле SPILBK, ширина 1 бит; данные SPILBK. */ + Uint16 SPILBK:1; // 4 Loop-back enable/disable + /* Битовое поле rsvd1, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:1; // 5 reserved + /* Битовое поле CLKPOLARITY, ширина 1 бит; данные CLKPOLARITY. */ + Uint16 CLKPOLARITY:1; // 6 Clock polarity + /* Битовое поле SPISWRESET, ширина 1 бит; данные SPISWRESET. */ + Uint16 SPISWRESET:1; // 7 SPI SW Reset + /* Битовое поле rsvd2, ширина 8 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:8; // 15:8 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений SPICCR_REG в одной области памяти. */ +union SPICCR_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру SPICCR_BITS bit;; порядок полей определяет расположение данных. */ + struct SPICCR_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//------------------------------------------------- +// SPI operation control register bit definitions: +// +// +/* Описывает структуру SPICTL_BITS; порядок полей определяет расположение данных. */ +struct SPICTL_BITS { // bits description + /* Битовое поле SPIINTENA, ширина 1 бит; данные SPIINTENA. */ + Uint16 SPIINTENA:1; // 0 Interrupt enable + /* Битовое поле TALK, ширина 1 бит; данные TALK. */ + Uint16 TALK:1; // 1 Master/Slave transmit enable + /* Битовое поле MASTER_SLAVE, ширина 1 бит; данные MASTER_SLAVE. */ + Uint16 MASTER_SLAVE:1; // 2 Network control mode + /* Битовое поле CLK_PHASE, ширина 1 бит; CLK фаза. */ + Uint16 CLK_PHASE:1; // 3 Clock phase select + /* Битовое поле OVERRUNINTENA, ширина 1 бит; данные OVERRUNINTENA. */ + Uint16 OVERRUNINTENA:1; // 4 Overrun interrupt enable + /* Битовое поле rsvd, ширина 11 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:11; // 15:5 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений SPICTL_REG в одной области памяти. */ +union SPICTL_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру SPICTL_BITS bit;; порядок полей определяет расположение данных. */ + struct SPICTL_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//-------------------------------------- +// SPI status register bit definitions: +// +// +/* Описывает структуру SPISTS_BITS; порядок полей определяет расположение данных. */ +struct SPISTS_BITS { // bits description + /* Битовое поле rsvd1, ширина 5 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:5; // 4:0 reserved + /* Битовое поле BUFFULL_FLAG, ширина 1 бит; BUFFULL флаг. */ + Uint16 BUFFULL_FLAG:1; // 5 SPI transmit buffer full flag + /* Битовое поле INT_FLAG, ширина 1 бит; INT флаг. */ + Uint16 INT_FLAG:1; // 6 SPI interrupt flag + /* Битовое поле OVERRUN_FLAG, ширина 1 бит; OVERRUN флаг. */ + Uint16 OVERRUN_FLAG:1; // 7 SPI reciever overrun flag + /* Битовое поле rsvd2, ширина 8 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:8; // 15:8 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений SPISTS_REG в одной области памяти. */ +union SPISTS_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру SPISTS_BITS bit;; порядок полей определяет расположение данных. */ + struct SPISTS_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//------------------------------------------------ +// SPI priority control register bit definitions: +// +// +/* Описывает структуру SPIPRI_BITS; порядок полей определяет расположение данных. */ +struct SPIPRI_BITS { // bits description + /* Битовое поле rsvd1, ширина 4 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:4; // 3:0 reserved + /* Битовое поле FREE, ширина 1 бит; данные FREE. */ + Uint16 FREE:1; // 4 Free emulation mode control + /* Битовое поле SOFT, ширина 1 бит; данные SOFT. */ + Uint16 SOFT:1; // 5 Soft emulation mode control + /* Битовое поле rsvd2, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:1; // 6 reserved + /* Битовое поле rsvd3, ширина 9 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd3:9; // 15:7 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений SPIPRI_REG в одной области памяти. */ +union SPIPRI_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру SPIPRI_BITS bit;; порядок полей определяет расположение данных. */ + struct SPIPRI_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//--------------------------------------------------------------------------- +// SPI Register File: +// +/* Описывает структуру SPI_REGS; порядок полей определяет расположение данных. */ +struct SPI_REGS { + /* Объединяет несколько представлений SPICCR_REG SPICCR; в одной области памяти. */ + union SPICCR_REG SPICCR; // Configuration register + /* Объединяет несколько представлений SPICTL_REG SPICTL; в одной области памяти. */ + union SPICTL_REG SPICTL; // Operation control register + /* Объединяет несколько представлений SPISTS_REG SPISTS; в одной области памяти. */ + union SPISTS_REG SPISTS; // Status register + /* Объявляет rsvd1 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1; // reserved + /* Объявляет SPIBRR — данные SPIBRR. */ + Uint16 SPIBRR; // Baud Rate + /* Объявляет rsvd2 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2; // reserved + /* Объявляет SPIRXEMU — данные SPIRXEMU. */ + Uint16 SPIRXEMU; // Emulation buffer + /* Объявляет SPIRXBUF — данные SPIRXBUF. */ + Uint16 SPIRXBUF; // Serial input buffer + /* Объявляет SPITXBUF — данные SPITXBUF. */ + Uint16 SPITXBUF; // Serial output buffer + /* Объявляет SPIDAT — данные SPIDAT. */ + Uint16 SPIDAT; // Serial data + /* Объединяет несколько представлений SPIFFTX_REG SPIFFTX; в одной области памяти. */ + union SPIFFTX_REG SPIFFTX; // FIFO transmit register + /* Объединяет несколько представлений SPIFFRX_REG SPIFFRX; в одной области памяти. */ + union SPIFFRX_REG SPIFFRX; // FIFO recieve register + /* Объединяет несколько представлений SPIFFCT_REG SPIFFCT; в одной области памяти. */ + union SPIFFCT_REG SPIFFCT; // FIFO control register + /* Объявляет rsvd3 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd3[2]; // reserved + /* Объединяет несколько представлений SPIPRI_REG SPIPRI; в одной области памяти. */ + union SPIPRI_REG SPIPRI; // FIFO Priority control +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//--------------------------------------------------------------------------- +// SPI External References & Function Declarations: +// +/* Продолжает список аргументов, полей или выражение extern volatile struct SPI_REGS SpiaRegs;; порядок элементов сохраняется. */ +extern volatile struct SPI_REGS SpiaRegs; + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_SPI_H definition + +//=========================================================================== +// End of file. +//=========================================================================== + diff --git a/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_SysCtrl.h b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_SysCtrl.h new file mode 100644 index 0000000..0ab964e --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_SysCtrl.h @@ -0,0 +1,642 @@ +/* Поставляемое TI описание SysCtrl для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/5 $ +// Checkin $Date: May 12, 2008 09:34:58 $ +//########################################################################### +// +// FILE: DSP2833x_SysCtrl.h +// +// TITLE: DSP2833x Device System Control Register Definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_SYS_CTRL_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_SYS_CTRL_H +/* Определяет защитный символ или переключатель DSP2833x_SYS_CTRL_H для последующей компиляции. */ +#define DSP2833x_SYS_CTRL_H + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + + +//--------------------------------------------------------------------------- +// System Control Individual Register Bit Definitions: +// + + +// PLL Status Register +/* Описывает структуру PLLSTS_BITS; порядок полей определяет расположение данных. */ +struct PLLSTS_BITS { // bits description + /* Битовое поле PLLLOCKS, ширина 1 бит; данные PLLLOCKS. */ + Uint16 PLLLOCKS:1; // 0 PLL lock status + /* Битовое поле rsvd1, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:1; // 1 reserved + /* Битовое поле PLLOFF, ширина 1 бит; данные PLLOFF. */ + Uint16 PLLOFF:1; // 2 PLL off bit + /* Битовое поле MCLKSTS, ширина 1 бит; данные MCLKSTS. */ + Uint16 MCLKSTS:1; // 3 Missing clock status bit + /* Битовое поле MCLKCLR, ширина 1 бит; данные MCLKCLR. */ + Uint16 MCLKCLR:1; // 4 Missing clock clear bit + /* Битовое поле OSCOFF, ширина 1 бит; данные OSCOFF. */ + Uint16 OSCOFF:1; // 5 Oscillator clock off + /* Битовое поле MCLKOFF, ширина 1 бит; данные MCLKOFF. */ + Uint16 MCLKOFF:1; // 6 Missing clock detect + /* Битовое поле DIVSEL, ширина 2 бит; данные DIVSEL. */ + Uint16 DIVSEL:2; // 7 Divide Select + /* Битовое поле rsvd2, ширина 7 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:7; // 15:7 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений PLLSTS_REG в одной области памяти. */ +union PLLSTS_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру PLLSTS_BITS bit;; порядок полей определяет расположение данных. */ + struct PLLSTS_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// High speed peripheral clock register bit definitions: +/* Описывает структуру HISPCP_BITS; порядок полей определяет расположение данных. */ +struct HISPCP_BITS { // bits description + /* Битовое поле HSPCLK, ширина 3 бит; данные HSPCLK. */ + Uint16 HSPCLK:3; // 2:0 Rate relative to SYSCLKOUT + /* Битовое поле rsvd1, ширина 13 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:13; // 15:3 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений HISPCP_REG в одной области памяти. */ +union HISPCP_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру HISPCP_BITS bit;; порядок полей определяет расположение данных. */ + struct HISPCP_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// Low speed peripheral clock register bit definitions: +/* Описывает структуру LOSPCP_BITS; порядок полей определяет расположение данных. */ +struct LOSPCP_BITS { // bits description + /* Битовое поле LSPCLK, ширина 3 бит; данные LSPCLK. */ + Uint16 LSPCLK:3; // 2:0 Rate relative to SYSCLKOUT + /* Битовое поле rsvd1, ширина 13 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:13; // 15:3 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений LOSPCP_REG в одной области памяти. */ +union LOSPCP_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру LOSPCP_BITS bit;; порядок полей определяет расположение данных. */ + struct LOSPCP_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// Peripheral clock control register 0 bit definitions: +/* Описывает структуру PCLKCR0_BITS; порядок полей определяет расположение данных. */ +struct PCLKCR0_BITS { // bits description + /* Битовое поле rsvd1, ширина 2 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:2; // 1:0 reserved + /* Битовое поле TBCLKSYNC, ширина 1 бит; данные TBCLKSYNC. */ + Uint16 TBCLKSYNC:1; // 2 EWPM Module TBCLK enable/sync + /* Битовое поле ADCENCLK, ширина 1 бит; данные ADCENCLK. */ + Uint16 ADCENCLK:1; // 3 Enable high speed clk to ADC + /* Битовое поле I2CAENCLK, ширина 1 бит; данные I2CAENCLK. */ + Uint16 I2CAENCLK:1; // 4 Enable SYSCLKOUT to I2C-A + /* Битовое поле SCICENCLK, ширина 1 бит; данные SCICENCLK. */ + Uint16 SCICENCLK:1; // 5 Enalbe low speed clk to SCI-C + /* Битовое поле rsvd2, ширина 2 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:2; // 7:6 reserved + /* Битовое поле SPIAENCLK, ширина 1 бит; данные SPIAENCLK. */ + Uint16 SPIAENCLK:1; // 8 Enable low speed clk to SPI-A + /* Битовое поле rsvd3, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd3:1; // 9 reserved + /* Битовое поле SCIAENCLK, ширина 1 бит; данные SCIAENCLK. */ + Uint16 SCIAENCLK:1; // 10 Enable low speed clk to SCI-A + /* Битовое поле SCIBENCLK, ширина 1 бит; данные SCIBENCLK. */ + Uint16 SCIBENCLK:1; // 11 Enable low speed clk to SCI-B + /* Битовое поле MCBSPAENCLK, ширина 1 бит; данные MCBSPAENCLK. */ + Uint16 MCBSPAENCLK:1; // 12 Enable low speed clk to McBSP-A + /* Битовое поле MCBSPBENCLK, ширина 1 бит; данные MCBSPBENCLK. */ + Uint16 MCBSPBENCLK:1; // 13 Enable low speed clk to McBSP-B + /* Битовое поле ECANAENCLK, ширина 1 бит; данные ECANAENCLK. */ + Uint16 ECANAENCLK:1; // 14 Enable system clk to eCAN-A + /* Битовое поле ECANBENCLK, ширина 1 бит; данные ECANBENCLK. */ + Uint16 ECANBENCLK:1; // 15 Enable system clk to eCAN-B +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений PCLKCR0_REG в одной области памяти. */ +union PCLKCR0_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру PCLKCR0_BITS bit;; порядок полей определяет расположение данных. */ + struct PCLKCR0_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// Peripheral clock control register 1 bit definitions: +/* Описывает структуру PCLKCR1_BITS; порядок полей определяет расположение данных. */ +struct PCLKCR1_BITS { // bits description + /* Битовое поле EPWM1ENCLK, ширина 1 бит; данные EPWM1ENCLK. */ + Uint16 EPWM1ENCLK:1; // 0 Enable SYSCLKOUT to EPWM1 + /* Битовое поле EPWM2ENCLK, ширина 1 бит; данные EPWM2ENCLK. */ + Uint16 EPWM2ENCLK:1; // 1 Enable SYSCLKOUT to EPWM2 + /* Битовое поле EPWM3ENCLK, ширина 1 бит; данные EPWM3ENCLK. */ + Uint16 EPWM3ENCLK:1; // 2 Enable SYSCLKOUT to EPWM3 + /* Битовое поле EPWM4ENCLK, ширина 1 бит; данные EPWM4ENCLK. */ + Uint16 EPWM4ENCLK:1; // 3 Enable SYSCLKOUT to EPWM4 + /* Битовое поле EPWM5ENCLK, ширина 1 бит; данные EPWM5ENCLK. */ + Uint16 EPWM5ENCLK:1; // 4 Enable SYSCLKOUT to EPWM5 + /* Битовое поле EPWM6ENCLK, ширина 1 бит; данные EPWM6ENCLK. */ + Uint16 EPWM6ENCLK:1; // 5 Enable SYSCLKOUT to EPWM6 + /* Битовое поле rsvd1, ширина 2 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:2; // 7:6 reserved + /* Битовое поле ECAP1ENCLK, ширина 1 бит; данные ECAP1ENCLK. */ + Uint16 ECAP1ENCLK:1; // 8 Enable SYSCLKOUT to ECAP1 + /* Битовое поле ECAP2ENCLK, ширина 1 бит; данные ECAP2ENCLK. */ + Uint16 ECAP2ENCLK:1; // 9 Enable SYSCLKOUT to ECAP2 + /* Битовое поле ECAP3ENCLK, ширина 1 бит; данные ECAP3ENCLK. */ + Uint16 ECAP3ENCLK:1; // 10 Enable SYSCLKOUT to ECAP3 + /* Битовое поле ECAP4ENCLK, ширина 1 бит; данные ECAP4ENCLK. */ + Uint16 ECAP4ENCLK:1; // 11 Enable SYSCLKOUT to ECAP4 + /* Битовое поле ECAP5ENCLK, ширина 1 бит; данные ECAP5ENCLK. */ + Uint16 ECAP5ENCLK:1; // 12 Enable SYSCLKOUT to ECAP5 + /* Битовое поле ECAP6ENCLK, ширина 1 бит; данные ECAP6ENCLK. */ + Uint16 ECAP6ENCLK:1; // 13 Enable SYSCLKOUT to ECAP6 + /* Битовое поле EQEP1ENCLK, ширина 1 бит; данные EQEP1ENCLK. */ + Uint16 EQEP1ENCLK:1; // 14 Enable SYSCLKOUT to EQEP1 + /* Битовое поле EQEP2ENCLK, ширина 1 бит; данные EQEP2ENCLK. */ + Uint16 EQEP2ENCLK:1; // 15 Enable SYSCLKOUT to EQEP2 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений PCLKCR1_REG в одной области памяти. */ +union PCLKCR1_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру PCLKCR1_BITS bit;; порядок полей определяет расположение данных. */ + struct PCLKCR1_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +// Peripheral clock control register 2 bit definitions: +/* Описывает структуру PCLKCR3_BITS; порядок полей определяет расположение данных. */ +struct PCLKCR3_BITS { // bits description + /* Битовое поле rsvd1, ширина 8 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:8; // 7:0 reserved + /* Битовое поле CPUTIMER0ENCLK, ширина 1 бит; данные CPUTIMER0ENCLK. */ + Uint16 CPUTIMER0ENCLK:1; // 8 Enable SYSCLKOUT to CPU-Timer 0 + /* Битовое поле CPUTIMER1ENCLK, ширина 1 бит; данные CPUTIMER1ENCLK. */ + Uint16 CPUTIMER1ENCLK:1; // 9 Enable SYSCLKOUT to CPU-Timer 1 + /* Битовое поле CPUTIMER2ENCLK, ширина 1 бит; данные CPUTIMER2ENCLK. */ + Uint16 CPUTIMER2ENCLK:1; // 10 Enable SYSCLKOUT to CPU-Timer 2 + /* Битовое поле DMAENCLK, ширина 1 бит; данные DMAENCLK. */ + Uint16 DMAENCLK:1; // 11 Enable the DMA clock + /* Битовое поле XINTFENCLK, ширина 1 бит; данные XINTFENCLK. */ + Uint16 XINTFENCLK:1; // 12 Enable SYSCLKOUT to XINTF + /* Битовое поле GPIOINENCLK, ширина 1 бит; аппаратная линия ввода/вывода GPIOINENCLK. */ + Uint16 GPIOINENCLK:1; // Enable GPIO input clock + /* Битовое поле rsvd2, ширина 2 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:2; // 15:14 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений PCLKCR3_REG в одной области памяти. */ +union PCLKCR3_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру PCLKCR3_BITS bit;; порядок полей определяет расположение данных. */ + struct PCLKCR3_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + + +// PLL control register bit definitions: +/* Описывает структуру PLLCR_BITS; порядок полей определяет расположение данных. */ +struct PLLCR_BITS { // bits description + /* Битовое поле DIV, ширина 4 бит; данные DIV. */ + Uint16 DIV:4; // 3:0 Set clock ratio for the PLL + /* Битовое поле rsvd1, ширина 12 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:12; // 15:4 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений PLLCR_REG в одной области памяти. */ +union PLLCR_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру PLLCR_BITS bit;; порядок полей определяет расположение данных. */ + struct PLLCR_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// Low Power Mode 0 control register bit definitions: +/* Описывает структуру LPMCR0_BITS; порядок полей определяет расположение данных. */ +struct LPMCR0_BITS { // bits description + /* Битовое поле LPM, ширина 2 бит; данные LPM. */ + Uint16 LPM:2; // 1:0 Set the low power mode + /* Битовое поле QUALSTDBY, ширина 6 бит; данные QUALSTDBY. */ + Uint16 QUALSTDBY:6; // 7:2 Qualification + /* Битовое поле rsvd1, ширина 7 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:7; // 14:8 reserved + /* Битовое поле WDINTE, ширина 1 бит; данные WDINTE. */ + Uint16 WDINTE:1; // 15 Enables WD to wake the device from STANDBY +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений LPMCR0_REG в одной области памяти. */ +union LPMCR0_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру LPMCR0_BITS bit;; порядок полей определяет расположение данных. */ + struct LPMCR0_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// Dual-mapping configuration register bit definitions: +/* Описывает структуру MAPCNF_BITS; порядок полей определяет расположение данных. */ +struct MAPCNF_BITS { // bits description + /* Битовое поле MAPEPWM, ширина 1 бит; данные MAPEPWM. */ + Uint16 MAPEPWM:1; // 0 EPWM dual-map enable + /* Битовое поле rsvd1, ширина 15 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:15; // 15:1 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений MAPCNF_REG в одной области памяти. */ +union MAPCNF_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру MAPCNF_BITS bit;; порядок полей определяет расположение данных. */ + struct MAPCNF_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//--------------------------------------------------------------------------- +// System Control Register File: +// +/* Описывает структуру SYS_CTRL_REGS; порядок полей определяет расположение данных. */ +struct SYS_CTRL_REGS { + /* Объявляет rsvd1 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1; // 0 + /* Объединяет несколько представлений PLLSTS_REG PLLSTS; в одной области памяти. */ + union PLLSTS_REG PLLSTS; // 1 + /* Объявляет rsvd2 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2[8]; // 2-9 + /* Объединяет несколько представлений HISPCP_REG HISPCP; в одной области памяти. */ + union HISPCP_REG HISPCP; // 10: High-speed peripheral clock pre-scaler + /* Объединяет несколько представлений LOSPCP_REG LOSPCP; в одной области памяти. */ + union LOSPCP_REG LOSPCP; // 11: Low-speed peripheral clock pre-scaler + /* Объединяет несколько представлений PCLKCR0_REG PCLKCR0; в одной области памяти. */ + union PCLKCR0_REG PCLKCR0; // 12: Peripheral clock control register + /* Объединяет несколько представлений PCLKCR1_REG PCLKCR1; в одной области памяти. */ + union PCLKCR1_REG PCLKCR1; // 13: Peripheral clock control register + /* Объединяет несколько представлений LPMCR0_REG LPMCR0; в одной области памяти. */ + union LPMCR0_REG LPMCR0; // 14: Low-power mode control register 0 + /* Объявляет rsvd3 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd3; // 15: reserved + /* Объединяет несколько представлений PCLKCR3_REG PCLKCR3; в одной области памяти. */ + union PCLKCR3_REG PCLKCR3; // 16: Peripheral clock control register + /* Объединяет несколько представлений PLLCR_REG PLLCR; в одной области памяти. */ + union PLLCR_REG PLLCR; // 17: PLL control register + // No bit definitions are defined for SCSR because + // a read-modify-write instruction can clear the WDOVERRIDE bit + /* Объявляет SCSR — данные SCSR. */ + Uint16 SCSR; // 18: System control and status register + /* Объявляет WDCNTR — данные WDCNTR. */ + Uint16 WDCNTR; // 19: WD counter register + /* Объявляет rsvd4 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd4; // 20 + /* Объявляет WDKEY — данные WDKEY. */ + Uint16 WDKEY; // 21: WD reset key register + /* Объявляет rsvd5 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd5[3]; // 22-24 + // No bit definitions are defined for WDCR because + // the proper value must be written to the WDCHK field + // whenever writing to this register. + /* Объявляет WDCR — данные WDCR. */ + Uint16 WDCR; // 25: WD timer control register + /* Объявляет rsvd6 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd6[4]; // 26-29 + /* Объединяет несколько представлений MAPCNF_REG MAPCNF; в одной области памяти. */ + union MAPCNF_REG MAPCNF; // 30: Dual-mapping configuration register + /* Объявляет rsvd7 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd7[1]; // 31 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* --------------------------------------------------- */ +/* CSM Registers */ +/* */ +/* ----------------------------------------------------*/ + +/* CSM Status & Control register bit definitions */ +/* Описывает структуру CSMSCR_BITS; порядок полей определяет расположение данных. */ +struct CSMSCR_BITS { // bit description + /* Битовое поле SECURE, ширина 1 бит; данные SECURE. */ + Uint16 SECURE:1; // 0 Secure flag + /* Битовое поле rsvd1, ширина 14 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:14; // 14-1 reserved + /* Битовое поле FORCESEC, ширина 1 бит; данные FORCESEC. */ + Uint16 FORCESEC:1; // 15 Force Secure control bit + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений CSMSCR_REG в одной области памяти. */ +union CSMSCR_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру CSMSCR_BITS bit;; порядок полей определяет расположение данных. */ + struct CSMSCR_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* CSM Register File */ +/* Описывает структуру CSM_REGS; порядок полей определяет расположение данных. */ +struct CSM_REGS { + /* Объявляет KEY0 — данные KEY0. */ + Uint16 KEY0; // KEY reg bits 15-0 + /* Объявляет KEY1 — данные KEY1. */ + Uint16 KEY1; // KEY reg bits 31-16 + /* Объявляет KEY2 — данные KEY2. */ + Uint16 KEY2; // KEY reg bits 47-32 + /* Объявляет KEY3 — данные KEY3. */ + Uint16 KEY3; // KEY reg bits 63-48 + /* Объявляет KEY4 — данные KEY4. */ + Uint16 KEY4; // KEY reg bits 79-64 + /* Объявляет KEY5 — данные KEY5. */ + Uint16 KEY5; // KEY reg bits 95-80 + /* Объявляет KEY6 — данные KEY6. */ + Uint16 KEY6; // KEY reg bits 111-96 + /* Объявляет KEY7 — данные KEY7. */ + Uint16 KEY7; // KEY reg bits 127-112 + /* Объявляет rsvd1 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1; // reserved + /* Объявляет rsvd2 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2; // reserved + /* Объявляет rsvd3 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd3; // reserved + /* Объявляет rsvd4 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd4; // reserved + /* Объявляет rsvd5 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd5; // reserved + /* Объявляет rsvd6 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd6; // reserved + /* Объявляет rsvd7 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd7; // reserved + /* Объединяет несколько представлений CSMSCR_REG CSMSCR; в одной области памяти. */ + union CSMSCR_REG CSMSCR; // CSM Status & Control register +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Password locations */ +/* Описывает структуру CSM_PWL; порядок полей определяет расположение данных. */ +struct CSM_PWL { + /* Объявляет PSWD0 — данные PSWD0. */ + Uint16 PSWD0; // PSWD bits 15-0 + /* Объявляет PSWD1 — данные PSWD1. */ + Uint16 PSWD1; // PSWD bits 31-16 + /* Объявляет PSWD2 — данные PSWD2. */ + Uint16 PSWD2; // PSWD bits 47-32 + /* Объявляет PSWD3 — данные PSWD3. */ + Uint16 PSWD3; // PSWD bits 63-48 + /* Объявляет PSWD4 — данные PSWD4. */ + Uint16 PSWD4; // PSWD bits 79-64 + /* Объявляет PSWD5 — данные PSWD5. */ + Uint16 PSWD5; // PSWD bits 95-80 + /* Объявляет PSWD6 — данные PSWD6. */ + Uint16 PSWD6; // PSWD bits 111-96 + /* Объявляет PSWD7 — данные PSWD7. */ + Uint16 PSWD7; // PSWD bits 127-112 +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + + +/* Flash Registers */ + +/* Задаёт FLASH_SLEEP = 0x0000;; данные FLASH_SLEEP. */ +#define FLASH_SLEEP 0x0000; +/* Задаёт FLASH_STANDBY = 0x0001;; данные FLASH_STANDBY. */ +#define FLASH_STANDBY 0x0001; +/* Задаёт FLASH_ACTIVE = 0x0003;; данные FLASH_ACTIVE. */ +#define FLASH_ACTIVE 0x0003; + + +/* Flash Option Register bit definitions */ +/* Описывает структуру FOPT_BITS; порядок полей определяет расположение данных. */ +struct FOPT_BITS { // bit description + /* Битовое поле ENPIPE, ширина 1 бит; данные ENPIPE. */ + Uint16 ENPIPE:1; // 0 Enable Pipeline Mode + /* Битовое поле rsvd, ширина 15 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:15; // 1-15 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений FOPT_REG в одной области памяти. */ +union FOPT_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру FOPT_BITS bit;; порядок полей определяет расположение данных. */ + struct FOPT_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Flash Power Modes Register bit definitions */ +/* Описывает структуру FPWR_BITS; порядок полей определяет расположение данных. */ +struct FPWR_BITS { // bit description + /* Битовое поле PWR, ширина 2 бит; данные PWR. */ + Uint16 PWR:2; // 0-1 Power Mode bits + /* Битовое поле rsvd, ширина 14 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:14; // 2-15 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений FPWR_REG в одной области памяти. */ +union FPWR_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру FPWR_BITS bit;; порядок полей определяет расположение данных. */ + struct FPWR_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Flash Status Register bit definitions */ +/* Описывает структуру FSTATUS_BITS; порядок полей определяет расположение данных. */ +struct FSTATUS_BITS { // bit description + /* Битовое поле PWRS, ширина 2 бит; данные PWRS. */ + Uint16 PWRS:2; // 0-1 Power Mode Status bits + /* Битовое поле STDBYWAITS, ширина 1 бит; данные STDBYWAITS. */ + Uint16 STDBYWAITS:1; // 2 Bank/Pump Sleep to Standby Wait Counter Status bits + /* Битовое поле ACTIVEWAITS, ширина 1 бит; данные ACTIVEWAITS. */ + Uint16 ACTIVEWAITS:1; // 3 Bank/Pump Standby to Active Wait Counter Status bits + /* Битовое поле rsvd1, ширина 4 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:4; // 4-7 reserved + /* Битовое поле V3STAT, ширина 1 бит; данные V3STAT. */ + Uint16 V3STAT:1; // 8 VDD3V Status Latch bit + /* Битовое поле rsvd2, ширина 7 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:7; // 9-15 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений FSTATUS_REG в одной области памяти. */ +union FSTATUS_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру FSTATUS_BITS bit;; порядок полей определяет расположение данных. */ + struct FSTATUS_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Flash Sleep to Standby Wait Counter Register bit definitions */ +/* Описывает структуру FSTDBYWAIT_BITS; порядок полей определяет расположение данных. */ +struct FSTDBYWAIT_BITS { // bit description + /* Битовое поле STDBYWAIT, ширина 9 бит; данные STDBYWAIT. */ + Uint16 STDBYWAIT:9; // 0-8 Bank/Pump Sleep to Standby Wait Count bits + /* Битовое поле rsvd, ширина 7 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:7; // 9-15 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений FSTDBYWAIT_REG в одной области памяти. */ +union FSTDBYWAIT_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру FSTDBYWAIT_BITS bit;; порядок полей определяет расположение данных. */ + struct FSTDBYWAIT_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Flash Standby to Active Wait Counter Register bit definitions */ +/* Описывает структуру FACTIVEWAIT_BITS; порядок полей определяет расположение данных. */ +struct FACTIVEWAIT_BITS { // bit description + /* Битовое поле ACTIVEWAIT, ширина 9 бит; данные ACTIVEWAIT. */ + Uint16 ACTIVEWAIT:9; // 0-8 Bank/Pump Standby to Active Wait Count bits + /* Битовое поле rsvd, ширина 7 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:7; // 9-15 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений FACTIVEWAIT_REG в одной области памяти. */ +union FACTIVEWAIT_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру FACTIVEWAIT_BITS bit;; порядок полей определяет расположение данных. */ + struct FACTIVEWAIT_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Bank Read Access Wait State Register bit definitions */ +/* Описывает структуру FBANKWAIT_BITS; порядок полей определяет расположение данных. */ +struct FBANKWAIT_BITS { // bit description + /* Битовое поле RANDWAIT, ширина 4 бит; данные RANDWAIT. */ + Uint16 RANDWAIT:4; // 0-3 Flash Random Read Wait State bits + /* Битовое поле rsvd1, ширина 4 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:4; // 4-7 reserved + /* Битовое поле PAGEWAIT, ширина 4 бит; данные PAGEWAIT. */ + Uint16 PAGEWAIT:4; // 8-11 Flash Paged Read Wait State bits + /* Битовое поле rsvd2, ширина 4 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:4; // 12-15 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений FBANKWAIT_REG в одной области памяти. */ +union FBANKWAIT_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру FBANKWAIT_BITS bit;; порядок полей определяет расположение данных. */ + struct FBANKWAIT_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* OTP Read Access Wait State Register bit definitions */ +/* Описывает структуру FOTPWAIT_BITS; порядок полей определяет расположение данных. */ +struct FOTPWAIT_BITS { // bit description + /* Битовое поле OTPWAIT, ширина 5 бит; данные OTPWAIT. */ + Uint16 OTPWAIT:5; // 0-4 OTP Read Wait State bits + /* Битовое поле rsvd, ширина 11 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:11; // 5-15 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Allow access to the bit fields or entire register */ +/* Объединяет несколько представлений FOTPWAIT_REG в одной области памяти. */ +union FOTPWAIT_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру FOTPWAIT_BITS bit;; порядок полей определяет расположение данных. */ + struct FOTPWAIT_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +/* Описывает структуру FLASH_REGS; порядок полей определяет расположение данных. */ +struct FLASH_REGS { + /* Объединяет несколько представлений FOPT_REG FOPT; в одной области памяти. */ + union FOPT_REG FOPT; // Option Register + /* Объявляет rsvd1 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1; // reserved + /* Объединяет несколько представлений FPWR_REG FPWR; в одной области памяти. */ + union FPWR_REG FPWR; // Power Modes Register + /* Объединяет несколько представлений FSTATUS_REG FSTATUS; в одной области памяти. */ + union FSTATUS_REG FSTATUS; // Status Register + /* Объединяет несколько представлений FSTDBYWAIT_REG FSTDBYWAIT; в одной области памяти. */ + union FSTDBYWAIT_REG FSTDBYWAIT; // Pump/Bank Sleep to Standby Wait State Register + /* Объединяет несколько представлений FACTIVEWAIT_REG FACTIVEWAIT; в одной области памяти. */ + union FACTIVEWAIT_REG FACTIVEWAIT; // Pump/Bank Standby to Active Wait State Register + /* Объединяет несколько представлений FBANKWAIT_REG FBANKWAIT; в одной области памяти. */ + union FBANKWAIT_REG FBANKWAIT; // Bank Read Access Wait State Register + /* Объединяет несколько представлений FOTPWAIT_REG FOTPWAIT; в одной области памяти. */ + union FOTPWAIT_REG FOTPWAIT; // OTP Read Access Wait State Register +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//--------------------------------------------------------------------------- +// System Control External References & Function Declarations: +// +/* Продолжает список аргументов, полей или выражение extern volatile struct SYS_CTRL_REGS SysCtrlRegs;; порядок элементов сохраняется. */ +extern volatile struct SYS_CTRL_REGS SysCtrlRegs; +/* Продолжает список аргументов, полей или выражение extern volatile struct CSM_REGS CsmRegs;; порядок элементов сохраняется. */ +extern volatile struct CSM_REGS CsmRegs; +/* Продолжает список аргументов, полей или выражение extern volatile struct CSM_PWL CsmPwl;; порядок элементов сохраняется. */ +extern volatile struct CSM_PWL CsmPwl; +/* Продолжает список аргументов, полей или выражение extern volatile struct FLASH_REGS FlashRegs;; порядок элементов сохраняется. */ +extern volatile struct FLASH_REGS FlashRegs; + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_SYS_CTRL_H definition + +//=========================================================================== +// End of file. +//=========================================================================== + diff --git a/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_XIntrupt.h b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_XIntrupt.h new file mode 100644 index 0000000..91eca18 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_XIntrupt.h @@ -0,0 +1,127 @@ +/* Поставляемое TI описание XIntrupt для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/1 $ +// Checkin $Date: August 18, 2006 13:52:39 $ +//########################################################################### +// +// FILE: DSP2833x_XIntrupt.h +// +// TITLE: DSP2833x Device External Interrupt Register Definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_XINTRUPT_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_XINTRUPT_H +/* Определяет защитный символ или переключатель DSP2833x_XINTRUPT_H для последующей компиляции. */ +#define DSP2833x_XINTRUPT_H + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +//--------------------------------------------------------------------------- + +/* Описывает структуру XINTCR_BITS; порядок полей определяет расположение данных. */ +struct XINTCR_BITS { + /* Битовое поле ENABLE, ширина 1 бит; разрешение. */ + Uint16 ENABLE:1; // 0 enable/disable + /* Битовое поле rsvd1, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:1; // 1 reserved + /* Битовое поле POLARITY, ширина 2 бит; данные POLARITY. */ + Uint16 POLARITY:2; // 3:2 pos/neg, both triggered + /* Битовое поле rsvd2, ширина 12 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:12; //15:4 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений XINTCR_REG в одной области памяти. */ +union XINTCR_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру XINTCR_BITS bit;; порядок полей определяет расположение данных. */ + struct XINTCR_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Описывает структуру XNMICR_BITS; порядок полей определяет расположение данных. */ +struct XNMICR_BITS { + /* Битовое поле ENABLE, ширина 1 бит; разрешение. */ + Uint16 ENABLE:1; // 0 enable/disable + /* Битовое поле SELECT, ширина 1 бит; выбор. */ + Uint16 SELECT:1; // 1 Timer 1 or XNMI connected to int13 + /* Битовое поле POLARITY, ширина 2 бит; данные POLARITY. */ + Uint16 POLARITY:2; // 3:2 pos/neg, or both triggered + /* Битовое поле rsvd2, ширина 12 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:12; // 15:4 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений XNMICR_REG в одной области памяти. */ +union XNMICR_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру XNMICR_BITS bit;; порядок полей определяет расположение данных. */ + struct XNMICR_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + + + +//--------------------------------------------------------------------------- +// External Interrupt Register File: +// +/* Описывает структуру XINTRUPT_REGS; порядок полей определяет расположение данных. */ +struct XINTRUPT_REGS { + /* Объединяет несколько представлений XINTCR_REG XINT1CR; в одной области памяти. */ + union XINTCR_REG XINT1CR; + /* Объединяет несколько представлений XINTCR_REG XINT2CR; в одной области памяти. */ + union XINTCR_REG XINT2CR; + /* Объединяет несколько представлений XINTCR_REG XINT3CR; в одной области памяти. */ + union XINTCR_REG XINT3CR; + /* Объединяет несколько представлений XINTCR_REG XINT4CR; в одной области памяти. */ + union XINTCR_REG XINT4CR; + /* Объединяет несколько представлений XINTCR_REG XINT5CR; в одной области памяти. */ + union XINTCR_REG XINT5CR; + /* Объединяет несколько представлений XINTCR_REG XINT6CR; в одной области памяти. */ + union XINTCR_REG XINT6CR; + /* Объединяет несколько представлений XINTCR_REG XINT7CR; в одной области памяти. */ + union XINTCR_REG XINT7CR; + /* Объединяет несколько представлений XNMICR_REG XNMICR; в одной области памяти. */ + union XNMICR_REG XNMICR; + /* Объявляет XINT1CTR — данные XINT1CTR. */ + Uint16 XINT1CTR; + /* Объявляет XINT2CTR — данные XINT2CTR. */ + Uint16 XINT2CTR; + /* Объявляет rsvd — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd[5]; + /* Объявляет XNMICTR — данные XNMICTR. */ + Uint16 XNMICTR; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//--------------------------------------------------------------------------- +// External Interrupt References & Function Declarations: +// +/* Продолжает список аргументов, полей или выражение extern volatile struct XINTRUPT_REGS XIntruptRegs;; порядок элементов сохраняется. */ +extern volatile struct XINTRUPT_REGS XIntruptRegs; + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_XINTF_H definition + +//=========================================================================== +// End of file. +//=========================================================================== + diff --git a/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_Xintf.h b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_Xintf.h new file mode 100644 index 0000000..63686b1 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/include/DSP2833x_Xintf.h @@ -0,0 +1,197 @@ +/* Поставляемое TI описание Xintf для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/3 $ +// Checkin $Date: March 20, 2007 16:34:08 $ +//########################################################################### +// +// FILE: DSP2833x_Xintf.h +// +// TITLE: DSP2833x Device External Interface Register Definitions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Начинает условие: DSP2833x_XINTF_H ещё не определён; защищает повторное включение или задаёт значение сборки. */ +#ifndef DSP2833x_XINTF_H +/* Определяет защитный символ или переключатель DSP2833x_XINTF_H для последующей компиляции. */ +#define DSP2833x_XINTF_H + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */ +extern "C" { +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + + +// XINTF timing register bit definitions: +/* Описывает структуру XTIMING_BITS; порядок полей определяет расположение данных. */ +struct XTIMING_BITS { // bits description + /* Битовое поле XWRTRAIL, ширина 2 бит; данные XWRTRAIL. */ + Uint16 XWRTRAIL:2; // 1:0 Write access trail timing + /* Битовое поле XWRACTIVE, ширина 3 бит; данные XWRACTIVE. */ + Uint16 XWRACTIVE:3; // 4:2 Write access active timing + /* Битовое поле XWRLEAD, ширина 2 бит; данные XWRLEAD. */ + Uint16 XWRLEAD:2; // 6:5 Write access lead timing + /* Битовое поле XRDTRAIL, ширина 2 бит; данные XRDTRAIL. */ + Uint16 XRDTRAIL:2; // 8:7 Read access trail timing + /* Битовое поле XRDACTIVE, ширина 3 бит; данные XRDACTIVE. */ + Uint16 XRDACTIVE:3; // 11:9 Read access active timing + /* Битовое поле XRDLEAD, ширина 2 бит; данные XRDLEAD. */ + Uint16 XRDLEAD:2; // 13:12 Read access lead timing + /* Битовое поле USEREADY, ширина 1 бит; данные USEREADY. */ + Uint16 USEREADY:1; // 14 Extend access using HW waitstates + /* Битовое поле READYMODE, ширина 1 бит; данные READYMODE. */ + Uint16 READYMODE:1; // 15 Ready mode + /* Битовое поле XSIZE, ширина 2 бит; данные XSIZE. */ + Uint16 XSIZE:2; // 17:16 XINTF bus width - must be written as 11b + /* Битовое поле rsvd1, ширина 4 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:4; // 21:18 reserved + /* Битовое поле X2TIMING, ширина 1 бит; данные X2TIMING. */ + Uint16 X2TIMING:1; // 22 Double lead/active/trail timing + /* Битовое поле rsvd3, ширина 9 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd3:9; // 31:23 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений XTIMING_REG в одной области памяти. */ +union XTIMING_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру XTIMING_BITS bit;; порядок полей определяет расположение данных. */ + struct XTIMING_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// XINTF control register bit definitions: +/* Описывает структуру XINTCNF2_BITS; порядок полей определяет расположение данных. */ +struct XINTCNF2_BITS { // bits description + /* Битовое поле WRBUFF, ширина 2 бит; данные WRBUFF. */ + Uint16 WRBUFF:2; // 1:0 Write buffer depth + /* Битовое поле CLKMODE, ширина 1 бит; данные CLKMODE. */ + Uint16 CLKMODE:1; // 2 Ratio for XCLKOUT with respect to XTIMCLK + /* Битовое поле CLKOFF, ширина 1 бит; данные CLKOFF. */ + Uint16 CLKOFF:1; // 3 Disable XCLKOUT + /* Битовое поле rsvd1, ширина 2 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:2; // 5:4 reserved + /* Битовое поле WLEVEL, ширина 2 бит; данные WLEVEL. */ + Uint16 WLEVEL:2; // 7:6 Current level of the write buffer + /* Битовое поле rsvd2, ширина 1 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd2:1; // 8 reserved + /* Битовое поле HOLD, ширина 1 бит; данные HOLD. */ + Uint16 HOLD:1; // 9 Hold enable/disable + /* Битовое поле HOLDS, ширина 1 бит; данные HOLDS. */ + Uint16 HOLDS:1; // 10 Current state of HOLDn input + /* Битовое поле HOLDAS, ширина 1 бит; данные HOLDAS. */ + Uint16 HOLDAS:1; // 11 Current state of HOLDAn output + /* Битовое поле rsvd3, ширина 4 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd3:4; // 15:12 reserved + /* Битовое поле XTIMCLK, ширина 3 бит; данные XTIMCLK. */ + Uint16 XTIMCLK:3; // 18:16 Ratio for XTIMCLK + /* Битовое поле rsvd4, ширина 13 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd4:13; // 31:19 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений XINTCNF2_REG в одной области памяти. */ +union XINTCNF2_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint32 all; + /* Описывает структуру XINTCNF2_BITS bit;; порядок полей определяет расположение данных. */ + struct XINTCNF2_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +// XINTF bank switching register bit definitions: +/* Описывает структуру XBANK_BITS; порядок полей определяет расположение данных. */ +struct XBANK_BITS { // bits description + /* Битовое поле BANK, ширина 3 бит; данные BANK. */ + Uint16 BANK:3; // 2:0 Zone for which banking is enabled + /* Битовое поле BCYC, ширина 3 бит; данные BCYC. */ + Uint16 BCYC:3; // 5:3 XTIMCLK cycles to add + /* Битовое поле rsvd, ширина 10 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd:10; // 15:6 reserved +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений XBANK_REG в одной области памяти. */ +union XBANK_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру XBANK_BITS bit;; порядок полей определяет расположение данных. */ + struct XBANK_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Описывает структуру XRESET_BITS; порядок полей определяет расположение данных. */ +struct XRESET_BITS { + /* Битовое поле XHARDRESET, ширина 1 бит; данные XHARDRESET. */ + Uint16 XHARDRESET:1; + /* Битовое поле rsvd1, ширина 15 бит; зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd1:15; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +/* Объединяет несколько представлений XRESET_REG в одной области памяти. */ +union XRESET_REG { + /* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */ + Uint16 all; + /* Описывает структуру XBANK_BITS bit;; порядок полей определяет расположение данных. */ + struct XBANK_BITS bit; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + + +//--------------------------------------------------------------------------- +// XINTF Register File: +// +/* Описывает структуру XINTF_REGS; порядок полей определяет расположение данных. */ +struct XINTF_REGS { + /* Объединяет несколько представлений XTIMING_REG XTIMING0; в одной области памяти. */ + union XTIMING_REG XTIMING0; + /* Объявляет rsvd1 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint32 rsvd1[5]; + /* Объединяет несколько представлений XTIMING_REG XTIMING6; в одной области памяти. */ + union XTIMING_REG XTIMING6; + /* Объединяет несколько представлений XTIMING_REG XTIMING7; в одной области памяти. */ + union XTIMING_REG XTIMING7; + /* Объявляет rsvd2 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint32 rsvd2[2]; + /* Объединяет несколько представлений XINTCNF2_REG XINTCNF2; в одной области памяти. */ + union XINTCNF2_REG XINTCNF2; + /* Объявляет rsvd3 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint32 rsvd3; + /* Объединяет несколько представлений XBANK_REG XBANK; в одной области памяти. */ + union XBANK_REG XBANK; + /* Объявляет rsvd4 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd4; + /* Объявляет XREVISION — данные XREVISION. */ + Uint16 XREVISION; + /* Объявляет rsvd5 — зарезервированные биты для сохранения аппаратного расположения. */ + Uint16 rsvd5[2]; + /* Объединяет несколько представлений XRESET_REG XRESET; в одной области памяти. */ + union XRESET_REG XRESET; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +}; + +//--------------------------------------------------------------------------- +// XINTF External References & Function Declarations: +// +/* Продолжает список аргументов, полей или выражение extern volatile struct XINTF_REGS XintfRegs;; порядок элементов сохраняется. */ +extern volatile struct XINTF_REGS XintfRegs; + + +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} +#endif /* extern "C" */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ + +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif // end of DSP2833x_XINTF_H definition + +//=========================================================================== +// No more. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/source/DSP2833x_ADC_cal.asm b/c/protocan-boot/vendor/ti/f28335/source/DSP2833x_ADC_cal.asm new file mode 100644 index 0000000..1de162b --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/source/DSP2833x_ADC_cal.asm @@ -0,0 +1,51 @@ +; Поставляемое ti описание adc_cal для семейства c2833x. Пояснения в UTF-8. +;; TI File $Revision: /main/1 $ +;; Checkin $Date: July 30, 2007 10:29:23 $ +;;########################################################################### +;; +;; FILE: ADC_cal.asm +;; +;; TITLE: 2833x Boot Rom ADC Cal routine. +;; +;; Functions: +;; +;; _ADC_cal - Copies device specific calibration data into ADCREFSEL and ADCOFFTRIM registers +;; Notes: +;; +;;########################################################################### +;; $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +;; $Release Date: August 1, 2008 $ +;;########################################################################### + + ; Экспортирует символ для связывания с C-кодом. Операция: .def _ADC_cal. + .def _ADC_cal + ; Задаёт текстовый псевдоним константы для ассемблера. Операция: .asg "0x711C", ADCREFSEL_LOC. + .asg "0x711C", ADCREFSEL_LOC + +;----------------------------------------------- +; _ADC_cal +;----------------------------------------------- +;----------------------------------------------- +; This is the ADC cal routine.This routine is programmed into +; reserved memory by the factory. 0xAAAA and 0xBBBB are place- +; holders for calibration data. +;The actual values programmed by TI are device specific. +; +; This function assumes that the clocks have been +; enabled to the ADC module. +;----------------------------------------------- + + ; Выбирает секцию объектного файла для следующих инструкций. Операция: .sect ".adc_cal". + .sect ".adc_cal" + +; Объявляет метку _ADC_cal для перехода или вызова. Операция: _ADC_cal. +_ADC_cal + ; Загружает регистр страниц данных DP для доступа к указанной области. Операция: MOVW DP, #ADCREFSEL_LOC >> 6. + MOVW DP, #ADCREFSEL_LOC >> 6 + ; Переносит операнд в регистр или ячейку назначения. Операция: MOV @28, #0xAAAA. + MOV @28, #0xAAAA ; actual value may not be 0xAAAA + ; Переносит операнд в регистр или ячейку назначения. Операция: MOV @29, #0xBBBB. + MOV @29, #0xBBBB ; actual value may not be 0xBBBB + ; Возвращает управление вызывающему коду через длинный адрес возврата. Операция: LRETR. + LRETR +;eof ---------- diff --git a/c/protocan-boot/vendor/ti/f28335/source/DSP2833x_CpuTimers.c b/c/protocan-boot/vendor/ti/f28335/source/DSP2833x_CpuTimers.c new file mode 100644 index 0000000..def985e --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/source/DSP2833x_CpuTimers.c @@ -0,0 +1,161 @@ +/* Поставляемое TI описание CpuTimers для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/3 $ +// Checkin $Date: March 16, 2007 08:37:30 $ +//########################################################################### +// +// FILE: DSP2833x_CpuTimers.c +// +// TITLE: CPU 32-bit Timers Initialization & Support Functions. +// +// NOTES: CpuTimer1 and CpuTimer2 are reserved for use with DSP BIOS and +// other realtime operating systems. +// +// Do not use these two timers in your application if you ever plan +// on integrating DSP-BIOS or another realtime OS. +// +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */ +#include "DSP2833x_Device.h" // Headerfile Include File +/* Подключает "DSP2833x_Examples.h": поставляемое TI описание Examples для семейства C2833x. */ +#include "DSP2833x_Examples.h" // Examples Include File + +/* Описывает структуру CPUTIMER_VARS CpuTimer0;; порядок полей определяет расположение данных. */ +struct CPUTIMER_VARS CpuTimer0; + +// CpuTimer 1 and CpuTimer2 are used by DSP BIOS & other RTOS. Comment out if using DSP BIOS or other RTOS. +/* Описывает структуру CPUTIMER_VARS CpuTimer1;; порядок полей определяет расположение данных. */ +struct CPUTIMER_VARS CpuTimer1; +/* Описывает структуру CPUTIMER_VARS CpuTimer2;; порядок полей определяет расположение данных. */ +struct CPUTIMER_VARS CpuTimer2; + +//--------------------------------------------------------------------------- +// InitCpuTimers: +//--------------------------------------------------------------------------- +// This function initializes all three CPU timers to a known state. +// +/* Начинает функцию InitCpuTimers; назначение модуля — поставляемое TI описание CpuTimers для семейства C2833x. */ +void InitCpuTimers(void) +/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ +{ + // CPU Timer 0 + // Initialize address pointers to respective timer registers: + /* Записывает CpuTimer0.RegsAddr значением &CpuTimer0Regs; данные RegsAddr. */ + CpuTimer0.RegsAddr = &CpuTimer0Regs; + // Initialize timer period to maximum: + /* Записывает CpuTimer0Regs.PRD.all значением 0xFFFFFFFF; представление регистра целым словом без разбиения на битовые поля. */ + CpuTimer0Regs.PRD.all = 0xFFFFFFFF; + // Initialize pre-scale counter to divide by 1 (SYSCLKOUT): + /* Записывает CpuTimer0Regs.TPR.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + CpuTimer0Regs.TPR.all = 0; + /* Записывает CpuTimer0Regs.TPRH.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + CpuTimer0Regs.TPRH.all = 0; + // Make sure timer is stopped: + /* Записывает CpuTimer0Regs.TCR.bit.TSS значением 1; данные TSS. */ + CpuTimer0Regs.TCR.bit.TSS = 1; + // Reload all counter register with period value: + /* Записывает CpuTimer0Regs.TCR.bit.TRB значением 1; данные TRB. */ + CpuTimer0Regs.TCR.bit.TRB = 1; + // Reset interrupt counters: + /* Записывает CpuTimer0.InterruptCount значением 0; прерывание число. */ + CpuTimer0.InterruptCount = 0; + + +// CpuTimer 1 and CpuTimer2 are reserved for DSP BIOS & other RTOS +// Do not use these two timers if you ever plan on integrating +// DSP-BIOS or another realtime OS. +// +// Initialize address pointers to respective timer registers: + /* Записывает CpuTimer1.RegsAddr значением &CpuTimer1Regs; данные RegsAddr. */ + CpuTimer1.RegsAddr = &CpuTimer1Regs; + /* Записывает CpuTimer2.RegsAddr значением &CpuTimer2Regs; данные RegsAddr. */ + CpuTimer2.RegsAddr = &CpuTimer2Regs; + // Initialize timer period to maximum: + /* Записывает CpuTimer1Regs.PRD.all значением 0xFFFFFFFF; представление регистра целым словом без разбиения на битовые поля. */ + CpuTimer1Regs.PRD.all = 0xFFFFFFFF; + /* Записывает CpuTimer2Regs.PRD.all значением 0xFFFFFFFF; представление регистра целым словом без разбиения на битовые поля. */ + CpuTimer2Regs.PRD.all = 0xFFFFFFFF; + // Initialize pre-scale counter to divide by 1 (SYSCLKOUT): + /* Записывает CpuTimer1Regs.TPR.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + CpuTimer1Regs.TPR.all = 0; + /* Записывает CpuTimer1Regs.TPRH.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + CpuTimer1Regs.TPRH.all = 0; + /* Записывает CpuTimer2Regs.TPR.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + CpuTimer2Regs.TPR.all = 0; + /* Записывает CpuTimer2Regs.TPRH.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + CpuTimer2Regs.TPRH.all = 0; + // Make sure timers are stopped: + /* Записывает CpuTimer1Regs.TCR.bit.TSS значением 1; данные TSS. */ + CpuTimer1Regs.TCR.bit.TSS = 1; + /* Записывает CpuTimer2Regs.TCR.bit.TSS значением 1; данные TSS. */ + CpuTimer2Regs.TCR.bit.TSS = 1; + // Reload all counter register with period value: + /* Записывает CpuTimer1Regs.TCR.bit.TRB значением 1; данные TRB. */ + CpuTimer1Regs.TCR.bit.TRB = 1; + /* Записывает CpuTimer2Regs.TCR.bit.TRB значением 1; данные TRB. */ + CpuTimer2Regs.TCR.bit.TRB = 1; + // Reset interrupt counters: + /* Записывает CpuTimer1.InterruptCount значением 0; прерывание число. */ + CpuTimer1.InterruptCount = 0; + /* Записывает CpuTimer2.InterruptCount значением 0; прерывание число. */ + CpuTimer2.InterruptCount = 0; + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} + +//--------------------------------------------------------------------------- +// ConfigCpuTimer: +//--------------------------------------------------------------------------- +// This function initializes the selected timer to the period specified +// by the "Freq" and "Period" parameters. The "Freq" is entered as "MHz" +// and the period in "uSeconds". The timer is held in the stopped state +// after configuration. +// +/* Начинает функцию ConfigCpuTimer; назначение модуля — поставляемое TI описание CpuTimers для семейства C2833x. */ +void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period) +/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ +{ + /* Объявляет temp — данные temp. */ + Uint32 temp; + + // Initialize timer period: + /* Записывает Timer->CPUFreqInMHz значением Freq; таймер CPU Freq In M Hz. */ + Timer->CPUFreqInMHz = Freq; + /* Записывает Timer->PeriodInUSec значением Period; таймер период In U Sec. */ + Timer->PeriodInUSec = Period; + /* Записывает temp значением (long) (Freq * Period); данные temp. */ + temp = (long) (Freq * Period); + /* Записывает Timer->RegsAddr->PRD.all значением temp; представление регистра целым словом без разбиения на битовые поля. */ + Timer->RegsAddr->PRD.all = temp; + + // Set pre-scale counter to divide by 1 (SYSCLKOUT): + /* Записывает Timer->RegsAddr->TPR.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + Timer->RegsAddr->TPR.all = 0; + /* Записывает Timer->RegsAddr->TPRH.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + Timer->RegsAddr->TPRH.all = 0; + + // Initialize timer control register: + /* Записывает Timer->RegsAddr->TCR.bit.TSS значением 1; данные TSS. */ + Timer->RegsAddr->TCR.bit.TSS = 1; // 1 = Stop timer, 0 = Start/Restart Timer + /* Записывает Timer->RegsAddr->TCR.bit.TRB значением 1; данные TRB. */ + Timer->RegsAddr->TCR.bit.TRB = 1; // 1 = reload timer + /* Записывает Timer->RegsAddr->TCR.bit.SOFT значением 0; данные SOFT. */ + Timer->RegsAddr->TCR.bit.SOFT = 0; + /* Записывает Timer->RegsAddr->TCR.bit.FREE значением 0; данные FREE. */ + Timer->RegsAddr->TCR.bit.FREE = 0; // Timer Free Run Disabled + /* Записывает Timer->RegsAddr->TCR.bit.TIE значением 1; данные TIE. */ + Timer->RegsAddr->TCR.bit.TIE = 1; // 0 = Disable/ 1 = Enable Timer Interrupt + + // Reset interrupt counter: + /* Записывает Timer->InterruptCount значением 0; таймер прерывание число. */ + Timer->InterruptCount = 0; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/source/DSP2833x_GlobalVariableDefs.c b/c/protocan-boot/vendor/ti/f28335/source/DSP2833x_GlobalVariableDefs.c new file mode 100644 index 0000000..74a8a7e --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/source/DSP2833x_GlobalVariableDefs.c @@ -0,0 +1,746 @@ +/* Поставляемое TI описание GlobalVariableDefs для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/4 $ +// Checkin $Date: June 2, 2008 11:12:33 $ +//########################################################################### +// +// FILE: DSP2833x_GlobalVariableDefs.c +// +// TITLE: DSP2833x Global Variables and Data Section Pragmas. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */ +#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File + +//--------------------------------------------------------------------------- +// Define Global Peripheral Variables: +// +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("AdcRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("AdcRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(AdcRegs,"AdcRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(AdcRegs,"AdcRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct ADC_REGS AdcRegs;; порядок элементов сохраняется. */ +volatile struct ADC_REGS AdcRegs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("AdcMirrorFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("AdcMirrorFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(AdcMirror,"AdcMirrorFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(AdcMirror,"AdcMirrorFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct ADC_RESULT_MIRROR_REGS AdcMirror;; порядок элементов сохраняется. */ +volatile struct ADC_RESULT_MIRROR_REGS AdcMirror; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("CpuTimer0RegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("CpuTimer0RegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(CpuTimer0Regs,"CpuTimer0RegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(CpuTimer0Regs,"CpuTimer0RegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct CPUTIMER_REGS CpuTimer0Regs;; порядок элементов сохраняется. */ +volatile struct CPUTIMER_REGS CpuTimer0Regs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("CpuTimer1RegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("CpuTimer1RegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(CpuTimer1Regs,"CpuTimer1RegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(CpuTimer1Regs,"CpuTimer1RegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct CPUTIMER_REGS CpuTimer1Regs;; порядок элементов сохраняется. */ +volatile struct CPUTIMER_REGS CpuTimer1Regs; + + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("CpuTimer2RegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("CpuTimer2RegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(CpuTimer2Regs,"CpuTimer2RegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(CpuTimer2Regs,"CpuTimer2RegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct CPUTIMER_REGS CpuTimer2Regs;; порядок элементов сохраняется. */ +volatile struct CPUTIMER_REGS CpuTimer2Regs; + + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("CsmPwlFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("CsmPwlFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(CsmPwl,"CsmPwlFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(CsmPwl,"CsmPwlFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct CSM_PWL CsmPwl;; порядок элементов сохраняется. */ +volatile struct CSM_PWL CsmPwl; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("CsmRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("CsmRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(CsmRegs,"CsmRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(CsmRegs,"CsmRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct CSM_REGS CsmRegs;; порядок элементов сохраняется. */ +volatile struct CSM_REGS CsmRegs; + + + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("DevEmuRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("DevEmuRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(DevEmuRegs,"DevEmuRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(DevEmuRegs,"DevEmuRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct DEV_EMU_REGS DevEmuRegs;; порядок элементов сохраняется. */ +volatile struct DEV_EMU_REGS DevEmuRegs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("DmaRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("DmaRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(DmaRegs,"DmaRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(DmaRegs,"DmaRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct DMA_REGS DmaRegs;; порядок элементов сохраняется. */ +volatile struct DMA_REGS DmaRegs; + + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("ECanaRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("ECanaRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(ECanaRegs,"ECanaRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(ECanaRegs,"ECanaRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct ECAN_REGS ECanaRegs;; порядок элементов сохраняется. */ +volatile struct ECAN_REGS ECanaRegs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("ECanaMboxesFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("ECanaMboxesFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(ECanaMboxes,"ECanaMboxesFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(ECanaMboxes,"ECanaMboxesFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct ECAN_MBOXES ECanaMboxes;; порядок элементов сохраняется. */ +volatile struct ECAN_MBOXES ECanaMboxes; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("ECanaLAMRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("ECanaLAMRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(ECanaLAMRegs,"ECanaLAMRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(ECanaLAMRegs,"ECanaLAMRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct LAM_REGS ECanaLAMRegs;; порядок элементов сохраняется. */ +volatile struct LAM_REGS ECanaLAMRegs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("ECanaMOTSRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("ECanaMOTSRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(ECanaMOTSRegs,"ECanaMOTSRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(ECanaMOTSRegs,"ECanaMOTSRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct MOTS_REGS ECanaMOTSRegs;; порядок элементов сохраняется. */ +volatile struct MOTS_REGS ECanaMOTSRegs; + + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("ECanaMOTORegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("ECanaMOTORegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(ECanaMOTORegs,"ECanaMOTORegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(ECanaMOTORegs,"ECanaMOTORegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct MOTO_REGS ECanaMOTORegs;; порядок элементов сохраняется. */ +volatile struct MOTO_REGS ECanaMOTORegs; + + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("ECanbRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("ECanbRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(ECanbRegs,"ECanbRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(ECanbRegs,"ECanbRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct ECAN_REGS ECanbRegs;; порядок элементов сохраняется. */ +volatile struct ECAN_REGS ECanbRegs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("ECanbMboxesFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("ECanbMboxesFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(ECanbMboxes,"ECanbMboxesFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(ECanbMboxes,"ECanbMboxesFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct ECAN_MBOXES ECanbMboxes;; порядок элементов сохраняется. */ +volatile struct ECAN_MBOXES ECanbMboxes; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("ECanbLAMRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("ECanbLAMRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(ECanbLAMRegs,"ECanbLAMRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(ECanbLAMRegs,"ECanbLAMRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct LAM_REGS ECanbLAMRegs;; порядок элементов сохраняется. */ +volatile struct LAM_REGS ECanbLAMRegs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("ECanbMOTSRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("ECanbMOTSRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(ECanbMOTSRegs,"ECanbMOTSRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(ECanbMOTSRegs,"ECanbMOTSRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct MOTS_REGS ECanbMOTSRegs;; порядок элементов сохраняется. */ +volatile struct MOTS_REGS ECanbMOTSRegs; + + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("ECanbMOTORegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("ECanbMOTORegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(ECanbMOTORegs,"ECanbMOTORegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(ECanbMOTORegs,"ECanbMOTORegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct MOTO_REGS ECanbMOTORegs;; порядок элементов сохраняется. */ +volatile struct MOTO_REGS ECanbMOTORegs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("EPwm1RegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("EPwm1RegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(EPwm1Regs,"EPwm1RegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(EPwm1Regs,"EPwm1RegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct EPWM_REGS EPwm1Regs;; порядок элементов сохраняется. */ +volatile struct EPWM_REGS EPwm1Regs; + + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("EPwm2RegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("EPwm2RegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(EPwm2Regs,"EPwm2RegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(EPwm2Regs,"EPwm2RegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct EPWM_REGS EPwm2Regs;; порядок элементов сохраняется. */ +volatile struct EPWM_REGS EPwm2Regs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("EPwm3RegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("EPwm3RegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(EPwm3Regs,"EPwm3RegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(EPwm3Regs,"EPwm3RegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct EPWM_REGS EPwm3Regs;; порядок элементов сохраняется. */ +volatile struct EPWM_REGS EPwm3Regs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("EPwm4RegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("EPwm4RegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(EPwm4Regs,"EPwm4RegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(EPwm4Regs,"EPwm4RegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct EPWM_REGS EPwm4Regs;; порядок элементов сохраняется. */ +volatile struct EPWM_REGS EPwm4Regs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("EPwm5RegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("EPwm5RegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(EPwm5Regs,"EPwm5RegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(EPwm5Regs,"EPwm5RegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct EPWM_REGS EPwm5Regs;; порядок элементов сохраняется. */ +volatile struct EPWM_REGS EPwm5Regs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("EPwm6RegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("EPwm6RegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(EPwm6Regs,"EPwm6RegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(EPwm6Regs,"EPwm6RegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct EPWM_REGS EPwm6Regs;; порядок элементов сохраняется. */ +volatile struct EPWM_REGS EPwm6Regs; + + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("ECap1RegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("ECap1RegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(ECap1Regs,"ECap1RegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(ECap1Regs,"ECap1RegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct ECAP_REGS ECap1Regs;; порядок элементов сохраняется. */ +volatile struct ECAP_REGS ECap1Regs; + + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("ECap2RegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("ECap2RegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(ECap2Regs,"ECap2RegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(ECap2Regs,"ECap2RegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct ECAP_REGS ECap2Regs;; порядок элементов сохраняется. */ +volatile struct ECAP_REGS ECap2Regs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("ECap3RegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("ECap3RegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(ECap3Regs,"ECap3RegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(ECap3Regs,"ECap3RegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct ECAP_REGS ECap3Regs;; порядок элементов сохраняется. */ +volatile struct ECAP_REGS ECap3Regs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("ECap4RegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("ECap4RegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(ECap4Regs,"ECap4RegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(ECap4Regs,"ECap4RegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct ECAP_REGS ECap4Regs;; порядок элементов сохраняется. */ +volatile struct ECAP_REGS ECap4Regs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("ECap5RegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("ECap5RegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(ECap5Regs,"ECap5RegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(ECap5Regs,"ECap5RegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct ECAP_REGS ECap5Regs;; порядок элементов сохраняется. */ +volatile struct ECAP_REGS ECap5Regs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("ECap6RegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("ECap6RegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(ECap6Regs,"ECap6RegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(ECap6Regs,"ECap6RegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct ECAP_REGS ECap6Regs;; порядок элементов сохраняется. */ +volatile struct ECAP_REGS ECap6Regs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("EQep1RegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("EQep1RegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(EQep1Regs,"EQep1RegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(EQep1Regs,"EQep1RegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct EQEP_REGS EQep1Regs;; порядок элементов сохраняется. */ +volatile struct EQEP_REGS EQep1Regs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("EQep2RegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("EQep2RegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(EQep2Regs,"EQep2RegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(EQep2Regs,"EQep2RegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct EQEP_REGS EQep2Regs;; порядок элементов сохраняется. */ +volatile struct EQEP_REGS EQep2Regs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("GpioCtrlRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("GpioCtrlRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(GpioCtrlRegs,"GpioCtrlRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(GpioCtrlRegs,"GpioCtrlRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct GPIO_CTRL_REGS GpioCtrlRegs;; порядок элементов сохраняется. */ +volatile struct GPIO_CTRL_REGS GpioCtrlRegs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("GpioDataRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("GpioDataRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(GpioDataRegs,"GpioDataRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(GpioDataRegs,"GpioDataRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct GPIO_DATA_REGS GpioDataRegs;; порядок элементов сохраняется. */ +volatile struct GPIO_DATA_REGS GpioDataRegs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("GpioIntRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("GpioIntRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(GpioIntRegs,"GpioIntRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(GpioIntRegs,"GpioIntRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct GPIO_INT_REGS GpioIntRegs;; порядок элементов сохраняется. */ +volatile struct GPIO_INT_REGS GpioIntRegs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("I2caRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("I2caRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(I2caRegs,"I2caRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(I2caRegs,"I2caRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct I2C_REGS I2caRegs;; порядок элементов сохраняется. */ +volatile struct I2C_REGS I2caRegs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("McbspaRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("McbspaRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(McbspaRegs,"McbspaRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(McbspaRegs,"McbspaRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct MCBSP_REGS McbspaRegs;; порядок элементов сохраняется. */ +volatile struct MCBSP_REGS McbspaRegs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("McbspbRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("McbspbRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(McbspbRegs,"McbspbRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(McbspbRegs,"McbspbRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct MCBSP_REGS McbspbRegs;; порядок элементов сохраняется. */ +volatile struct MCBSP_REGS McbspbRegs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("PartIdRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("PartIdRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(PartIdRegs,"PartIdRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(PartIdRegs,"PartIdRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct PARTID_REGS PartIdRegs;; порядок элементов сохраняется. */ +volatile struct PARTID_REGS PartIdRegs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("PieCtrlRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("PieCtrlRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(PieCtrlRegs,"PieCtrlRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(PieCtrlRegs,"PieCtrlRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct PIE_CTRL_REGS PieCtrlRegs;; порядок элементов сохраняется. */ +volatile struct PIE_CTRL_REGS PieCtrlRegs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("PieVectTableFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("PieVectTableFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(PieVectTable,"PieVectTableFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(PieVectTable,"PieVectTableFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Описывает структуру PIE_VECT_TABLE PieVectTable;; порядок полей определяет расположение данных. */ +struct PIE_VECT_TABLE PieVectTable; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("SciaRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("SciaRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(SciaRegs,"SciaRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(SciaRegs,"SciaRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct SCI_REGS SciaRegs;; порядок элементов сохраняется. */ +volatile struct SCI_REGS SciaRegs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("ScibRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("ScibRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(ScibRegs,"ScibRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(ScibRegs,"ScibRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct SCI_REGS ScibRegs;; порядок элементов сохраняется. */ +volatile struct SCI_REGS ScibRegs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("ScicRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("ScicRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(ScicRegs,"ScicRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(ScicRegs,"ScicRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct SCI_REGS ScicRegs;; порядок элементов сохраняется. */ +volatile struct SCI_REGS ScicRegs; + + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("SpiaRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("SpiaRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(SpiaRegs,"SpiaRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(SpiaRegs,"SpiaRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct SPI_REGS SpiaRegs;; порядок элементов сохраняется. */ +volatile struct SPI_REGS SpiaRegs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("SysCtrlRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("SysCtrlRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(SysCtrlRegs,"SysCtrlRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(SysCtrlRegs,"SysCtrlRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct SYS_CTRL_REGS SysCtrlRegs;; порядок элементов сохраняется. */ +volatile struct SYS_CTRL_REGS SysCtrlRegs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("FlashRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("FlashRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(FlashRegs,"FlashRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(FlashRegs,"FlashRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct FLASH_REGS FlashRegs;; порядок элементов сохраняется. */ +volatile struct FLASH_REGS FlashRegs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("XIntruptRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("XIntruptRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(XIntruptRegs,"XIntruptRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(XIntruptRegs,"XIntruptRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct XINTRUPT_REGS XIntruptRegs;; порядок элементов сохраняется. */ +volatile struct XINTRUPT_REGS XIntruptRegs; + +//---------------------------------------- +/* Включает следующий блок только при определённом символе __cplusplus. */ +#ifdef __cplusplus +/* Указание компилятору DATA_SECTION("XintfRegsFile"): размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION("XintfRegsFile") +/* Выбирает альтернативный блок текущего условия компиляции. */ +#else +/* Указание компилятору DATA_SECTION(XintfRegs,"XintfRegsFile");: размещение данных или настройка обработки объявлений. */ +#pragma DATA_SECTION(XintfRegs,"XintfRegsFile"); +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Продолжает список аргументов, полей или выражение volatile struct XINTF_REGS XintfRegs;; порядок элементов сохраняется. */ +volatile struct XINTF_REGS XintfRegs; + + + +//=========================================================================== +// End of file. +//=========================================================================== + + + + + + + + + diff --git a/c/protocan-boot/vendor/ti/f28335/source/DSP2833x_PieCtrl.c b/c/protocan-boot/vendor/ti/f28335/source/DSP2833x_PieCtrl.c new file mode 100644 index 0000000..0ca4201 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/source/DSP2833x_PieCtrl.c @@ -0,0 +1,121 @@ +/* Поставляемое TI описание PieCtrl для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/1 $ +// Checkin $Date: August 18, 2006 13:46:35 $ +//########################################################################### +// +// FILE: DSP2833x_PieCtrl.c +// +// TITLE: DSP2833x Device PIE Control Register Initialization Functions. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + +/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */ +#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File +/* Подключает "DSP2833x_Examples.h": поставляемое TI описание Examples для семейства C2833x. */ +#include "DSP2833x_Examples.h" // DSP2833x Examples Include File + +//--------------------------------------------------------------------------- +// InitPieCtrl: +//--------------------------------------------------------------------------- +// This function initializes the PIE control registers to a known state. +// +/* Начинает функцию InitPieCtrl; назначение модуля — поставляемое TI описание PieCtrl для семейства C2833x. */ +void InitPieCtrl(void) +/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ +{ + // Disable Interrupts at the CPU level: + /* Запрет маскируемых прерываний ядра. */ + DINT; + + // Disable the PIE + /* Записывает PieCtrlRegs.PIECTRL.bit.ENPIE значением 0; данные ENPIE. */ + PieCtrlRegs.PIECTRL.bit.ENPIE = 0; + + // Clear all PIEIER registers: + /* Записывает PieCtrlRegs.PIEIER1.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIER1.all = 0; + /* Записывает PieCtrlRegs.PIEIER2.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIER2.all = 0; + /* Записывает PieCtrlRegs.PIEIER3.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIER3.all = 0; + /* Записывает PieCtrlRegs.PIEIER4.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIER4.all = 0; + /* Записывает PieCtrlRegs.PIEIER5.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIER5.all = 0; + /* Записывает PieCtrlRegs.PIEIER6.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIER6.all = 0; + /* Записывает PieCtrlRegs.PIEIER7.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIER7.all = 0; + /* Записывает PieCtrlRegs.PIEIER8.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIER8.all = 0; + /* Записывает PieCtrlRegs.PIEIER9.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIER9.all = 0; + /* Записывает PieCtrlRegs.PIEIER10.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIER10.all = 0; + /* Записывает PieCtrlRegs.PIEIER11.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIER11.all = 0; + /* Записывает PieCtrlRegs.PIEIER12.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIER12.all = 0; + + // Clear all PIEIFR registers: + /* Записывает PieCtrlRegs.PIEIFR1.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIFR1.all = 0; + /* Записывает PieCtrlRegs.PIEIFR2.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIFR2.all = 0; + /* Записывает PieCtrlRegs.PIEIFR3.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIFR3.all = 0; + /* Записывает PieCtrlRegs.PIEIFR4.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIFR4.all = 0; + /* Записывает PieCtrlRegs.PIEIFR5.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIFR5.all = 0; + /* Записывает PieCtrlRegs.PIEIFR6.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIFR6.all = 0; + /* Записывает PieCtrlRegs.PIEIFR7.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIFR7.all = 0; + /* Записывает PieCtrlRegs.PIEIFR8.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIFR8.all = 0; + /* Записывает PieCtrlRegs.PIEIFR9.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIFR9.all = 0; + /* Записывает PieCtrlRegs.PIEIFR10.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIFR10.all = 0; + /* Записывает PieCtrlRegs.PIEIFR11.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIFR11.all = 0; + /* Записывает PieCtrlRegs.PIEIFR12.all значением 0; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEIFR12.all = 0; + + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} + +//--------------------------------------------------------------------------- +// EnableInterrupts: +//--------------------------------------------------------------------------- +// This function enables the PIE module and CPU interrupts +// +/* Начинает функцию EnableInterrupts; назначение модуля — поставляемое TI описание PieCtrl для семейства C2833x. */ +void EnableInterrupts() +/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ +{ + + // Enable the PIE + /* Записывает PieCtrlRegs.PIECTRL.bit.ENPIE значением 1; данные ENPIE. */ + PieCtrlRegs.PIECTRL.bit.ENPIE = 1; + + // Enables PIE to drive a pulse into the CPU + /* Записывает PieCtrlRegs.PIEACK.all значением 0xFFFF; представление регистра целым словом без разбиения на битовые поля. */ + PieCtrlRegs.PIEACK.all = 0xFFFF; + + // Enable Interrupts at the CPU level + /* Разрешение маскируемых прерываний ядра. */ + EINT; + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} + + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/source/DSP2833x_SysCtrl.c b/c/protocan-boot/vendor/ti/f28335/source/DSP2833x_SysCtrl.c new file mode 100644 index 0000000..eaa98f3 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/source/DSP2833x_SysCtrl.c @@ -0,0 +1,604 @@ +/* Поставляемое TI описание SysCtrl для семейства C2833x. Русские пояснения сохранены в UTF-8. */ +// TI File $Revision: /main/7 $ +// Checkin $Date: September 20, 2007 13:30:31 $ +//########################################################################### +// +// FILE: DSP2833x_SysCtrl.c +// +// TITLE: DSP2833x Device System Control Initialization & Support Functions. +// +// DESCRIPTION: +// +// Example initialization of system resources. +// +//########################################################################### +// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +// $Release Date: August 1, 2008 $ +//########################################################################### + + +/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */ +#include "DSP2833x_Device.h" // Headerfile Include File +/* Подключает "DSP2833x_Examples.h": поставляемое TI описание Examples для семейства C2833x. */ +#include "DSP2833x_Examples.h" // Examples Include File + +//#include "RS485.h" +//#include "message.h" + +// Functions that will be run from RAM need to be assigned to +// a different section. This section will then be mapped to a load and +// run address using the linker cmd file. + +/* Указание компилятору CODE_SECTION(InitFlash, "ramfuncs");: размещение данных или настройка обработки объявлений. */ +#pragma CODE_SECTION(InitFlash, "ramfuncs"); + +//--------------------------------------------------------------------------- +// InitSysCtrl: +//--------------------------------------------------------------------------- +// This function initializes the System Control registers to a known state. +// - Disables the watchdog +// - Set the PLLCR for proper SYSCLKOUT frequency +// - Set the pre-scaler for the high and low frequency peripheral clocks +// - Enable the clocks to the peripherals + +/* Объявляет SYSCLKOUT — данные SYSCLKOUT; LSPCLK — данные LSPCLK; HSPCLK — данные HSPCLK. */ +long SYSCLKOUT, LSPCLK, HSPCLK; + +/* Начинает функцию InitSysCtrl; назначение модуля — поставляемое TI описание SysCtrl для семейства C2833x. */ +void InitSysCtrl(void) +/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ +{ + + // Disable the watchdog + /* Вызывает DisableDog с аргументами () в текущей последовательности операций. */ + DisableDog(); + + // Initialize the PLL control: PLLCR and DIVSEL + // DSP28_PLLCR and DSP28_DIVSEL are defined in DSP2833x_Examples.h + /* Инициализирует модуль вызовом InitPll(DSP28_PLLCR,DSP28_DIVSEL); перед его дальнейшим использованием. */ + InitPll(DSP28_PLLCR,DSP28_DIVSEL); + + // Initialize the peripheral clocks + /* Инициализирует модуль вызовом InitPeripheralClocks(); перед его дальнейшим использованием. */ + InitPeripheralClocks(); +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} + + +//--------------------------------------------------------------------------- +// Example: InitFlash: +//--------------------------------------------------------------------------- +// This function initializes the Flash Control registers + +// CAUTION +// This function MUST be executed out of RAM. Executing it +// out of OTP/Flash will yield unpredictable results + +/* Начинает функцию InitFlash; назначение модуля — поставляемое TI описание SysCtrl для семейства C2833x. */ +void InitFlash(void) +/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ +{ + /* Разрешение записи в защищённые регистры периферии. */ + EALLOW; + //Enable Flash Pipeline mode to improve performance + //of code executed from Flash. + /* Записывает FlashRegs.FOPT.bit.ENPIPE значением 1; данные ENPIPE. */ + FlashRegs.FOPT.bit.ENPIPE = 1; + + // CAUTION + //Minimum waitstates required for the flash operating + //at a given CPU rate must be characterized by TI. + //Refer to the datasheet for the latest information. +/* Условие компиляции CPU_FRQ_150MHZ: выбранный блок включается в текущий вариант прошивки. */ +#if CPU_FRQ_150MHZ + //Set the Paged Waitstate for the Flash + /* Записывает FlashRegs.FBANKWAIT.bit.PAGEWAIT значением 5; данные PAGEWAIT. */ + FlashRegs.FBANKWAIT.bit.PAGEWAIT = 5; + + //Set the Random Waitstate for the Flash + /* Записывает FlashRegs.FBANKWAIT.bit.RANDWAIT значением 5; данные RANDWAIT. */ + FlashRegs.FBANKWAIT.bit.RANDWAIT = 5; + + //Set the Waitstate for the OTP + /* Записывает FlashRegs.FOTPWAIT.bit.OTPWAIT значением 8; данные OTPWAIT. */ + FlashRegs.FOTPWAIT.bit.OTPWAIT = 8; +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + +/* Условие компиляции CPU_FRQ_100MHZ: выбранный блок включается в текущий вариант прошивки. */ +#if CPU_FRQ_100MHZ + //Set the Paged Waitstate for the Flash + /* Записывает FlashRegs.FBANKWAIT.bit.PAGEWAIT значением 3; данные PAGEWAIT. */ + FlashRegs.FBANKWAIT.bit.PAGEWAIT = 3; + + //Set the Random Waitstate for the Flash + /* Записывает FlashRegs.FBANKWAIT.bit.RANDWAIT значением 3; данные RANDWAIT. */ + FlashRegs.FBANKWAIT.bit.RANDWAIT = 3; + + //Set the Waitstate for the OTP + /* Записывает FlashRegs.FOTPWAIT.bit.OTPWAIT значением 5; данные OTPWAIT. */ + FlashRegs.FOTPWAIT.bit.OTPWAIT = 5; +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + // CAUTION + //ONLY THE DEFAULT VALUE FOR THESE 2 REGISTERS SHOULD BE USED + /* Записывает FlashRegs.FSTDBYWAIT.bit.STDBYWAIT значением 0x01FF; данные STDBYWAIT. */ + FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF; + /* Записывает FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT значением 0x01FF; данные ACTIVEWAIT. */ + FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF; + /* Закрытие доступа к защищённым регистрам периферии. */ + EDIS; + + //Force a pipeline flush to ensure that the write to + //the last register configured occurs before returning. + + /* Вызывает asm с аргументами (" RPT #7 || NOP") в текущей последовательности операций. */ + asm(" RPT #7 || NOP"); +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} + + +//--------------------------------------------------------------------------- +// Example: ServiceDog: +//--------------------------------------------------------------------------- +// This function resets the watchdog timer. +// Enable this function for using ServiceDog in the application + +/* Начинает функцию ServiceDog; назначение модуля — поставляемое TI описание SysCtrl для семейства C2833x. */ +void ServiceDog(void) +/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ +{ + /* Проверяет if(SysCtrlRegs.PLLCR.bit.DIV == DSP28_PLLCR); последующий оператор выполняется только при истинном условии. */ + if(SysCtrlRegs.PLLCR.bit.DIV == DSP28_PLLCR) + /* Проверяет if(SysCtrlRegs.PLLSTS.bit.DIVSEL == DSP28_DIVSEL); последующий оператор выполняется только при истинном условии. */ + if(SysCtrlRegs.PLLSTS.bit.DIVSEL == DSP28_DIVSEL) + /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ + { + /* Разрешение записи в защищённые регистры периферии. */ + EALLOW; + /* Записывает SysCtrlRegs.WDKEY значением 0x0055; данные WDKEY. */ + SysCtrlRegs.WDKEY = 0x0055; + /* Записывает SysCtrlRegs.WDKEY значением 0x00AA; данные WDKEY. */ + SysCtrlRegs.WDKEY = 0x00AA; + /* Закрытие доступа к защищённым регистрам периферии. */ + EDIS; + /* Завершает ServiceDog без возвращаемого значения. */ + return; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} } + + +//--------------------------------------------------------------------------- +// Example: DisableDog: +//--------------------------------------------------------------------------- +// This function disables the watchdog timer. + +/* Начинает функцию DisableDog; назначение модуля — поставляемое TI описание SysCtrl для семейства C2833x. */ +void DisableDog(void) +/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ +{ + /* Разрешение записи в защищённые регистры периферии. */ + EALLOW; + /* Записывает SysCtrlRegs.WDCR значением 0x0068; данные WDCR. */ + SysCtrlRegs.WDCR= 0x0068; + /* Закрытие доступа к защищённым регистрам периферии. */ + EDIS; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} + +//--------------------------------------------------------------------------- +// Example: InitPll: +//--------------------------------------------------------------------------- +// This function initializes the PLLCR register. + +/* Начинает функцию InitPll; назначение модуля — поставляемое TI описание SysCtrl для семейства C2833x. */ +void InitPll(Uint16 divval, Uint16 divsel) +/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ +{ + /* Объявляет clkVal — данные clkVal. */ + long clkVal; + + // Make sure the PLL is not running in limp mode + /* Проверяет if (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0); последующий оператор выполняется только при истинном условии. */ + if (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0) + /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ + { + // Missing external clock has been detected + // Replace this line with a call to an appropriate + // SystemShutdown(); function. + /* Вызывает asm с аргументами (" ESTOP0") в текущей последовательности операций. */ + asm(" ESTOP0"); + /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ + } + + // DIVSEL MUST be 0 before PLLCR can be changed from + // 0x0000. It is set to 0 by an external reset XRSn + // This puts us in 1/4 + /* Проверяет if (SysCtrlRegs.PLLSTS.bit.DIVSEL != 0); последующий оператор выполняется только при истинном условии. */ + if (SysCtrlRegs.PLLSTS.bit.DIVSEL != 0) + /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ + { + /* Разрешение записи в защищённые регистры периферии. */ + EALLOW; + /* Записывает SysCtrlRegs.PLLSTS.bit.DIVSEL значением 0; данные DIVSEL. */ + SysCtrlRegs.PLLSTS.bit.DIVSEL = 0; + /* Закрытие доступа к защищённым регистрам периферии. */ + EDIS; + /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ + } + + // Change the PLLCR +// if (SysCtrlRegs.PLLCR.bit.DIV != val) + /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ + { + + /* Разрешение записи в защищённые регистры периферии. */ + EALLOW; + // Before setting PLLCR turn off missing clock detect logic + /* Записывает SysCtrlRegs.PLLSTS.bit.MCLKOFF значением 1; данные MCLKOFF. */ + SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1; + /* Записывает SysCtrlRegs.PLLCR.bit.DIV значением divval; данные DIV. */ + SysCtrlRegs.PLLCR.bit.DIV = divval; + /* Закрытие доступа к защищённым регистрам периферии. */ + EDIS; + + /* Записывает clkVal значением (divval)?divval:1; данные clkVal. */ + clkVal = (divval)?divval:1; + /* Записывает clkVal значением XCLKIN * clkVal; данные clkVal. */ + clkVal = XCLKIN * clkVal; + + // Optional: Wait for PLL to lock. + // During this time the CPU will switch to OSCCLK/2 until + // the PLL is stable. Once the PLL is stable the CPU will + // switch to the new PLL value. + // + // This time-to-lock is monitored by a PLL lock counter. + // + // Code is not required to sit and wait for the PLL to lock. + // However, if the code does anything that is timing critical, + // and requires the correct clock be locked, then it is best to + // wait until this switching has completed. + + // Wait for the PLL lock bit to be set. + + // The watchdog should be disabled before this loop, or fed within + // the loop via ServiceDog(). + + // Uncomment to disable the watchdog + /* Вызывает DisableDog с аргументами () в текущей последовательности операций. */ + DisableDog(); + + /* Повторяет или ожидает, пока выполняется while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1). */ + while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1) + /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ + { + // Uncomment to service the watchdog + // ServiceDog(); + /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ + } + + /* Разрешение записи в защищённые регистры периферии. */ + EALLOW; + /* Записывает SysCtrlRegs.PLLSTS.bit.MCLKOFF значением 0; данные MCLKOFF. */ + SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0; + /* Закрытие доступа к защищённым регистрам периферии. */ + EDIS; + /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ + } + + // If switching to 1/2 + /* Проверяет if((divsel == 1) или (divsel == 2)); последующий оператор выполняется только при истинном условии. */ + if((divsel == 1)||(divsel == 2)) + /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ + { + /* Разрешение записи в защищённые регистры периферии. */ + EALLOW; + /* Записывает SysCtrlRegs.PLLSTS.bit.DIVSEL значением divsel; данные DIVSEL. */ + SysCtrlRegs.PLLSTS.bit.DIVSEL = divsel; + /* Закрытие доступа к защищённым регистрам периферии. */ + EDIS; + /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ + } + + /* Проверяет if(divsel == 0) clkVal /= 4; последующий оператор выполняется только при истинном условии. */ + if(divsel == 0) clkVal /= 4; + /* Проверяет if(divsel == 1) clkVal /= 4; последующий оператор выполняется только при истинном условии. */ + if(divsel == 1) clkVal /= 4; + /* Проверяет if(divsel == 2) clkVal /= 2; последующий оператор выполняется только при истинном условии. */ + if(divsel == 2) clkVal /= 2; + + // If switching to 1/1 + // * First go to 1/2 and let the power settle + // The time required will depend on the system, this is only an example + // * Then switch to 1/1 + + /* Проверяет if((divval == 0) и (divsel == 3)); последующий оператор выполняется только при истинном условии. */ + if((divval == 0) && (divsel == 3)) + /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ + { + /* Разрешение записи в защищённые регистры периферии. */ + EALLOW; + /* Записывает SysCtrlRegs.PLLSTS.bit.DIVSEL значением 2; данные DIVSEL. */ + SysCtrlRegs.PLLSTS.bit.DIVSEL = 2; + /* Вызывает DELAY_US с аргументами (50L) в текущей последовательности операций. */ + DELAY_US(50L); +// pause_us(50L); + /* Записывает SysCtrlRegs.PLLSTS.bit.DIVSEL значением 3; данные DIVSEL. */ + SysCtrlRegs.PLLSTS.bit.DIVSEL = 3; + /* Закрытие доступа к защищённым регистрам периферии. */ + EDIS; + /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ + } + + /* Записывает SYSCLKOUT значением clkVal; данные SYSCLKOUT. */ + SYSCLKOUT = clkVal; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} + +//-------------------------------------------------------------------------- +// Example: InitPeripheralClocks: +//--------------------------------------------------------------------------- +// This function initializes the clocks to the peripheral modules. +// First the high and low clock prescalers are set +// Second the clocks are enabled to each peripheral. +// To reduce power, leave clocks to unused peripherals disabled +// +// Note: If a peripherals clock is not enabled then you cannot +// read or write to the registers for that peripheral + +/* Начинает функцию InitPeripheralClocks; назначение модуля — поставляемое TI описание SysCtrl для семейства C2833x. */ +void InitPeripheralClocks(void) +/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ +{ + /* Объявляет Val — данные Val. */ + long Val; + + /* Разрешение записи в защищённые регистры периферии. */ + EALLOW; + +// HISPCP/LOSPCP prescale register settings, normally it will be set to default values + +/* Условие компиляции CLKMULT == 0: выбранный блок включается в текущий вариант прошивки. */ +#if CLKMULT == 0 + /* Записывает SysCtrlRegs.HISPCP.all значением 0x0000; представление регистра целым словом без разбиения на битовые поля. */ + SysCtrlRegs.HISPCP.all = 0x0000; +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции CLKMULT == 1: выбранный блок включается в текущий вариант прошивки. */ +#if CLKMULT == 1 + /* Записывает SysCtrlRegs.HISPCP.all значением 0x0000; представление регистра целым словом без разбиения на битовые поля. */ + SysCtrlRegs.HISPCP.all = 0x0000; +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции CLKMULT == 2: выбранный блок включается в текущий вариант прошивки. */ +#if CLKMULT == 2 + /* Записывает SysCtrlRegs.HISPCP.all значением 0x0001; представление регистра целым словом без разбиения на битовые поля. */ + SysCtrlRegs.HISPCP.all = 0x0001; +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции CLKMULT == 3: выбранный блок включается в текущий вариант прошивки. */ +#if CLKMULT == 3 + /* Записывает SysCtrlRegs.HISPCP.all значением 0x0002; представление регистра целым словом без разбиения на битовые поля. */ + SysCtrlRegs.HISPCP.all = 0x0002; +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции CLKMULT == 4: выбранный блок включается в текущий вариант прошивки. */ +#if CLKMULT == 4 + /* Записывает SysCtrlRegs.HISPCP.all значением 0x0002; представление регистра целым словом без разбиения на битовые поля. */ + SysCtrlRegs.HISPCP.all = 0x0002; +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif +/* Условие компиляции CLKMULT == 5: выбранный блок включается в текущий вариант прошивки. */ +#if CLKMULT == 5 + /* Записывает SysCtrlRegs.HISPCP.all значением 0x0003; представление регистра целым словом без разбиения на битовые поля. */ + SysCtrlRegs.HISPCP.all = 0x0003; +/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ +#endif + + /* Записывает SysCtrlRegs.LOSPCP.all значением 0x0000; представление регистра целым словом без разбиения на битовые поля. */ + SysCtrlRegs.LOSPCP.all = 0x0000; + + /* Записывает Val значением (SysCtrlRegs.HISPCP.all)?; данные Val. */ + Val = (SysCtrlRegs.HISPCP.all)? + /* Продолжает список аргументов, полей или выражение SysCtrlRegs.HISPCP.all*2 : 1;; порядок элементов сохраняется. */ + SysCtrlRegs.HISPCP.all*2 : 1; + /* Записывает Val значением SYSCLKOUT / Val; данные Val. */ + Val = SYSCLKOUT / Val; + + /* Записывает HSPCLK значением Val; данные HSPCLK. */ + HSPCLK = Val; + + /* Записывает Val значением (SysCtrlRegs.LOSPCP.all)?; данные Val. */ + Val = (SysCtrlRegs.LOSPCP.all)? + /* Продолжает список аргументов, полей или выражение SysCtrlRegs.LOSPCP.all*2 : 1;; порядок элементов сохраняется. */ + SysCtrlRegs.LOSPCP.all*2 : 1; + /* Записывает Val значением SYSCLKOUT / Val; данные Val. */ + Val = SYSCLKOUT / Val; + /* Записывает LSPCLK значением Val; данные LSPCLK. */ + LSPCLK = Val; + +// XCLKOUT to SYSCLKOUT ratio. By default XCLKOUT = 1/4 SYSCLKOUT + // XTIMCLK = SYSCLKOUT/2 + /* Записывает XintfRegs.XINTCNF2.bit.XTIMCLK значением 1; данные XTIMCLK. */ + XintfRegs.XINTCNF2.bit.XTIMCLK = 1; + // XCLKOUT = XTIMCLK/2 + /* Записывает XintfRegs.XINTCNF2.bit.CLKMODE значением 1; данные CLKMODE. */ + XintfRegs.XINTCNF2.bit.CLKMODE = 1; + // Enable XCLKOUT + /* Записывает XintfRegs.XINTCNF2.bit.CLKOFF значением 0; данные CLKOFF. */ + XintfRegs.XINTCNF2.bit.CLKOFF = 0; + +// Peripheral clock enables set for the selected peripherals. +// If you are not using a peripheral leave the clock off +// to save on power. +// +// Note: not all peripherals are available on all 2833x derivates. +// Refer to the datasheet for your particular device. +// +// This function is not written to be an example of efficient code. + + /* Записывает SysCtrlRegs.PCLKCR0.bit.ADCENCLK значением 1; данные ADCENCLK. */ + SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // ADC + + // *IMPORTANT* + // The ADC_cal function, which copies the ADC calibration values from TI reserved + // OTP into the ADCREFSEL and ADCOFFTRIM registers, occurs automatically in the + // Boot ROM. If the boot ROM code is bypassed during the debug process, the + // following function MUST be called for the ADC to function according + // to specification. The clocks to the ADC MUST be enabled before calling this + // function. + // See the device data manual and/or the ADC Reference + // Manual for more information. + + /* Вызывает ADC_cal с аргументами () в текущей последовательности операций. */ + ADC_cal(); + + + /* Записывает SysCtrlRegs.PCLKCR0.bit.I2CAENCLK значением 1; данные I2CAENCLK. */ + SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 1; // I2C + /* Записывает SysCtrlRegs.PCLKCR0.bit.SCIAENCLK значением 1; данные SCIAENCLK. */ + SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // SCI-A + /* Записывает SysCtrlRegs.PCLKCR0.bit.SCIBENCLK значением 1; данные SCIBENCLK. */ + SysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 1; // SCI-B + /* Записывает SysCtrlRegs.PCLKCR0.bit.SCICENCLK значением 1; данные SCICENCLK. */ + SysCtrlRegs.PCLKCR0.bit.SCICENCLK = 1; // SCI-C + /* Записывает SysCtrlRegs.PCLKCR0.bit.SPIAENCLK значением 1; данные SPIAENCLK. */ + SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1; // SPI-A + /* Записывает SysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK значением 1; данные MCBSPAENCLK. */ + SysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK = 1; // McBSP-A + /* Записывает SysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK значением 1; данные MCBSPBENCLK. */ + SysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 1; // McBSP-B + /* Записывает SysCtrlRegs.PCLKCR0.bit.ECANAENCLK значением 1; данные ECANAENCLK. */ + SysCtrlRegs.PCLKCR0.bit.ECANAENCLK=1; // eCAN-A + /* Записывает SysCtrlRegs.PCLKCR0.bit.ECANBENCLK значением 1; данные ECANBENCLK. */ + SysCtrlRegs.PCLKCR0.bit.ECANBENCLK=1; // eCAN-B + + /* Записывает SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC значением 0; данные TBCLKSYNC. */ + SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // Disable TBCLK within the ePWM + /* Записывает SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK значением 1; данные EPWM1ENCLK. */ + SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1; // ePWM1 + /* Записывает SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK значением 1; данные EPWM2ENCLK. */ + SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1; // ePWM2 + /* Записывает SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK значением 1; данные EPWM3ENCLK. */ + SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1; // ePWM3 + /* Записывает SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK значением 1; данные EPWM4ENCLK. */ + SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1; // ePWM4 + /* Записывает SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK значением 1; данные EPWM5ENCLK. */ + SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1; // ePWM5 + /* Записывает SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK значением 1; данные EPWM6ENCLK. */ + SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1; // ePWM6 + /* Записывает SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC значением 1; данные TBCLKSYNC. */ + SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // Enable TBCLK within the ePWM + + /* Записывает SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK значением 1; данные ECAP3ENCLK. */ + SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 1; // eCAP3 + /* Записывает SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK значением 1; данные ECAP4ENCLK. */ + SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 1; // eCAP4 + /* Записывает SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK значением 1; данные ECAP5ENCLK. */ + SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK = 1; // eCAP5 + /* Записывает SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK значением 1; данные ECAP6ENCLK. */ + SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK = 1; // eCAP6 + /* Записывает SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK значением 1; данные ECAP1ENCLK. */ + SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 1; // eCAP1 + /* Записывает SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK значением 1; данные ECAP2ENCLK. */ + SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 1; // eCAP2 + /* Записывает SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK значением 1; данные EQEP1ENCLK. */ + SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 1; // eQEP1 + /* Записывает SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK значением 1; данные EQEP2ENCLK. */ + SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 1; // eQEP2 + + /* Записывает SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK значением 1; данные CPUTIMER0ENCLK. */ + SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0 + /* Записывает SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK значением 1; данные CPUTIMER1ENCLK. */ + SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 1 + /* Записывает SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK значением 1; данные CPUTIMER2ENCLK. */ + SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 1; // CPU Timer 2 + + /* Записывает SysCtrlRegs.PCLKCR3.bit.DMAENCLK значением 1; данные DMAENCLK. */ + SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 1; // DMA Clock + /* Записывает SysCtrlRegs.PCLKCR3.bit.XINTFENCLK значением 1; данные XINTFENCLK. */ + SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1; // XTIMCLK + /* Записывает SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK значением 1; аппаратная линия ввода/вывода GPIOINENCLK. */ + SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; // GPIO input clock + + /* Закрытие доступа к защищённым регистрам периферии. */ + EDIS; +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} + +//--------------------------------------------------------------------------- +// Example: CsmUnlock: +//--------------------------------------------------------------------------- +// This function unlocks the CSM. User must replace 0xFFFF's with current +// password for the DSP. Returns 1 if unlock is successful. + +/* Задаёт STATUS_FAIL = 0; состояние FAIL. */ +#define STATUS_FAIL 0 +/* Задаёт STATUS_SUCCESS = 1; состояние SUCCESS. */ +#define STATUS_SUCCESS 1 + +/* Начинает функцию CsmUnlock; назначение модуля — поставляемое TI описание SysCtrl для семейства C2833x. */ +Uint16 CsmUnlock() +/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ +{ + /* Объявляет temp — данные temp. volatile требует фактического чтения или записи при каждом доступе. */ + volatile Uint16 temp; + + // Load the key registers with the current password. The 0xFFFF's are dummy + // passwords. User should replace them with the correct password for the DSP. + + /* Разрешение записи в защищённые регистры периферии. */ + EALLOW; + /* Записывает CsmRegs.KEY0 значением 0xFFFF; данные KEY0. */ + CsmRegs.KEY0 = 0xFFFF; + /* Записывает CsmRegs.KEY1 значением 0xFFFF; данные KEY1. */ + CsmRegs.KEY1 = 0xFFFF; + /* Записывает CsmRegs.KEY2 значением 0xFFFF; данные KEY2. */ + CsmRegs.KEY2 = 0xFFFF; + /* Записывает CsmRegs.KEY3 значением 0xFFFF; данные KEY3. */ + CsmRegs.KEY3 = 0xFFFF; + /* Записывает CsmRegs.KEY4 значением 0xFFFF; данные KEY4. */ + CsmRegs.KEY4 = 0xFFFF; + /* Записывает CsmRegs.KEY5 значением 0xFFFF; данные KEY5. */ + CsmRegs.KEY5 = 0xFFFF; + /* Записывает CsmRegs.KEY6 значением 0xFFFF; данные KEY6. */ + CsmRegs.KEY6 = 0xFFFF; + /* Записывает CsmRegs.KEY7 значением 0xFFFF; данные KEY7. */ + CsmRegs.KEY7 = 0xFFFF; + /* Закрытие доступа к защищённым регистрам периферии. */ + EDIS; + + // Perform a dummy read of the password locations + // if they match the key values, the CSM will unlock + + /* Записывает temp значением CsmPwl.PSWD0; данные temp. */ + temp = CsmPwl.PSWD0; + /* Записывает temp значением CsmPwl.PSWD1; данные temp. */ + temp = CsmPwl.PSWD1; + /* Записывает temp значением CsmPwl.PSWD2; данные temp. */ + temp = CsmPwl.PSWD2; + /* Записывает temp значением CsmPwl.PSWD3; данные temp. */ + temp = CsmPwl.PSWD3; + /* Записывает temp значением CsmPwl.PSWD4; данные temp. */ + temp = CsmPwl.PSWD4; + /* Записывает temp значением CsmPwl.PSWD5; данные temp. */ + temp = CsmPwl.PSWD5; + /* Записывает temp значением CsmPwl.PSWD6; данные temp. */ + temp = CsmPwl.PSWD6; + /* Записывает temp значением CsmPwl.PSWD7; данные temp. */ + temp = CsmPwl.PSWD7; + + // If the CSM unlocked, return succes, otherwise return + // failure. + /* Проверяет if (CsmRegs.CSMSCR.bit.SECURE == 0) return STATUS_SUCCESS; последующий оператор выполняется только при истинном условии. */ + if (CsmRegs.CSMSCR.bit.SECURE == 0) return STATUS_SUCCESS; + /* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */ + else return STATUS_FAIL; + +/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ +} + + +//=========================================================================== +// End of file. +//=========================================================================== diff --git a/c/protocan-boot/vendor/ti/f28335/source/DSP2833x_usDelay.asm b/c/protocan-boot/vendor/ti/f28335/source/DSP2833x_usDelay.asm new file mode 100644 index 0000000..9425409 --- /dev/null +++ b/c/protocan-boot/vendor/ti/f28335/source/DSP2833x_usDelay.asm @@ -0,0 +1,84 @@ +; Поставляемое ti описание usdelay для семейства c2833x. Пояснения в UTF-8. +;// TI File $Revision: /main/4 $ +;// Checkin $Date: July 30, 2007 10:28:57 $ +;//########################################################################### +;// +;// FILE: DSP2833x_usDelay.asm +;// +;// TITLE: Simple delay function +;// +;// DESCRIPTION: +;// +;// This is a simple delay function that can be used to insert a specified +;// delay into code. +;// +;// This function is only accurate if executed from internal zero-waitstate +;// SARAM. If it is executed from waitstate memory then the delay will be +;// longer then specified. +;// +;// To use this function: +;// +;// 1 - update the CPU clock speed in the DSP2833x_Examples.h +;// file. For example: +;// #define CPU_RATE 6.667L // for a 150MHz CPU clock speed +;// or #define CPU_RATE 10.000L // for a 100MHz CPU clock speed +;// +;// 2 - Call this function by using the DELAY_US(A) macro +;// that is defined in the DSP2833x_Examples.h file. This macro +;// will convert the number of microseconds specified +;// into a loop count for use with this function. +;// This count will be based on the CPU frequency you specify. +;// +;// 3 - For the most accurate delay +;// - Execute this function in 0 waitstate RAM. +;// - Disable interrupts before calling the function +;// If you do not disable interrupts, then think of +;// this as an "at least" delay function as the actual +;// delay may be longer. +;// +;// The C assembly call from the DELAY_US(time) macro will +;// look as follows: +;// +;// extern void Delay(long LoopCount); +;// +;// MOV AL,#LowLoopCount +;// MOV AH,#HighLoopCount +;// LCR _Delay +;// +;// Or as follows (if count is less then 16-bits): +;// +;// MOV ACC,#LoopCount +;// LCR _Delay +;// +;// +;//########################################################################### +;// $TI Release: DSP2833x/DSP2823x Header Files V1.20 $ +;// $Release Date: August 1, 2008 $ +;//########################################################################### + + ; Экспортирует символ для связывания с C-кодом. Операция: .def _DSP28x_usDelay. + .def _DSP28x_usDelay + ; Выбирает секцию объектного файла для следующих инструкций. Операция: .sect ".text". + .sect ".text" + + ; Объявляет глобальный символ для линкера. Операция: .global __DSP28x_usDelay. + .global __DSP28x_usDelay +; Объявляет метку _DSP28x_usDelay: для перехода или вызова. Операция: _DSP28x_usDelay:. +_DSP28x_usDelay: + ; Вычитает операнд и обновляет арифметическое состояние. Операция: SUB ACC,#1. + SUB ACC,#1 + ; Выполняет условный переход по флагам результата. Операция: BF _DSP28x_usDelay,GEQ. + BF _DSP28x_usDelay,GEQ ;; Loop if ACC >= 0 + ; Возвращает управление вызывающему коду через длинный адрес возврата. Операция: LRETR. + LRETR + +;There is a 9/10 cycle overhead and each loop +;takes five cycles. The LoopCount is given by +;the following formula: +; DELAY_CPU_CYCLES = 9 + 5*LoopCount +; LoopCount = (DELAY_CPU_CYCLES - 9) / 5 +; The macro DELAY_US(A) performs this calculation for you +; +;//=========================================================================== +;// End of file. +;//=========================================================================== diff --git a/c/set-protocol/CMakeLists.txt b/c/set-protocol/CMakeLists.txt index 6a6b56d..3e41d91 100644 --- a/c/set-protocol/CMakeLists.txt +++ b/c/set-protocol/CMakeLists.txt @@ -44,6 +44,7 @@ set(SETPROTOCOL_LEGACY_SOURCES ) set(SETPROTOCOL_SOURCES + src/deif_xdi.c # Общий DEIF-кодек и автомат SLAVE используются всеми платформами. src/set_regmap.c src/set_emu_ump.c src/set_emu_tms.c @@ -94,6 +95,9 @@ endif() option(SETP_BUILD_TESTS "Build host tests" ON) if(SETP_BUILD_TESTS) enable_testing() + add_executable(test_deif_xdi tests/test_deif_xdi.c) # Эталонные MPDO, пассивные 90° и сервисы SLAVE проверяются непосредственно в C. + target_link_libraries(test_deif_xdi PRIVATE setprotocol_static) # Тест вызывает ту же реализацию, что Python и Android. + add_test(NAME deif_xdi COMMAND test_deif_xdi "${CMAKE_CURRENT_SOURCE_DIR}/tests/fixtures/deif-xdi-v1.tsv") # Общая fixture используется также JNI/JVM-портом. add_executable(test_emulator_services tests/test_emulator_services.c ports/example-emulator/service.c) target_link_libraries(test_emulator_services PRIVATE setprotocol_static) add_test(NAME emulator_services COMMAND test_emulator_services) diff --git a/c/set-protocol/docs/DEIF_XDI.md b/c/set-protocol/docs/DEIF_XDI.md new file mode 100644 index 0000000..598cb13 --- /dev/null +++ b/c/set-protocol/docs/DEIF_XDI.md @@ -0,0 +1,104 @@ +# Общее ядро DEIF XDi / CANopen + +Единственная реализация профиля DEIF находится в `include/deif_xdi.h` и +`src/deif_xdi.c`. Desktop использует её через `python/set_devices/deif_native.py`, +Android — через `ports/android/set_deif_jni.c` и `deif/DeifXdi.kt`. +Кодеки, адресация, числовой каталог, NMT, сроки, SDO и выбор азимута +не реализуются повторно в Python или Kotlin. + +Основание профиля: DEIF XDi-net/CANopen reference manual 4189350066D, +§§1–3, §9.11, Appendix 3 и Appendix 5. Набор переменных соответствует +наблюдаемой библиотеке: азимут, RPM, RPM%, мощность AC2 и POWER%. +Абсолютная мощность остаётся RAW до подтверждения её физической единицы. + +## Два режима + +- **Пассивный наблюдатель** принимает данные без включения симуляции, + ничего не отправляет, скрывает устаревшее показание через пять секунд. +- **CAN-SLAVE** принимает данные от внешнего MASTER и производит Boot-up, + heartbeat, EMCY и ответы на явно поддерживаемые SDO. После 3000 мс без + обновления поля сохраняет последнее валидное число и сообщает Data lost; + мигание выполняет GUI по готовой маске устаревших входов. + +Пассивный режим предназначен в том числе для обычного приёма показаний +без занятия собственного Node-ID в сети. На MPDO в активном режиме +также нет ответного PDO. В нормальном обмене SLAVE передаёт heartbeat. + +## Азимут + +Фактическое значение `0x3001:02` и сетевое задание `0x3001:07` хранятся +независимо. `setp_deif_angle` возвращает значение и его тип: + +- `0` — пригодного показания нет; +- `1` — фактический угол; +- `2` — принятое задание, которое GUI обязан подписывать как задание. + +При исходной привязке фактического угла до первого кадра `0x02` допускается +показывать принятое `0x07`. После первого фактического кадра задание его +не подменяет. Ошибочный фактический I16 также не заменяется старым заданием. +Явная ручная привязка к `0x07` остаётся индикатором задания. +Локальный черновик MASTER не входит в состояние C-модели. + +Эталонный кадр `STD 0x201 / 01 01 30 07 84 03 00 00` должен показывать +**90° · задание** и при выключенной симуляции. Node-ID физического SLAVE +не является источником этой SAM-рассылки: источник здесь Node 1. + +## Адресация и сервисы + +SAM согласует источник с COB-ID и поддерживает legacy broadcast `0x27F`. +DAM проверяет собственный Node-ID и выбранный RPDO. XDi-net резервирует +RPDO1 для SAM и Node 127 для сервисного прибора. Чистый CANopen допускает +DAM RPDO1. Все кадры профиля являются Classic CAN STD data frames. + +После Boot-up выдаётся Pre-operational; стандартный self-start занимает +1000 мс. Исходный период heartbeat — 500 мс. NMT Start/Stop/Pre-operational, +Reset node и Reset communication принимаются только для собственного узла +либо broadcast 0. Reset communication сохраняет прикладные значения и +возвращает несохранённые коммуникационные параметры к исходным значениям. + +SDO обслуживается в Operational и Pre-operational, в Stopped не отвечает. +Чтение: `0x1000:00`, `0x1001:00`, `0x1017:00`, `0x1018:00/01` и привязанные +I16-переменные. До обновления переменной возвращается `0x7FFF`. +Запись: U16 `0x1017:00`. Ноль отключает HB только вне XDi-net. +Неизвестный индекс, подиндекс, неподдерживаемая запись или команда дают +стандартный SDO abort. Серийный номер и код конкретного изделия не выдумываются. + +Это явный поднабор профиля индикации, а не полный EDS прошивки. LSS, +segmented SDO, EEPROM, произвольные конфигурационные записи, TPDO mapping, +двухканальное резервирование и механика привода не моделируются. + +## Контракт портов + +Память состояния выделяет вызывающий через `setp_deif_state_size`. +Буфер должен иметь выравнивание не слабее `uint64_t`; ctypes использует +массив `uint64`, JNI — direct ByteBuffer. Private-layout состояния не +передаётся между языками и не сериализуется. + +Все часы передаются как монотонные миллисекунды. C не вызывает ОС, +не использует Qt/JVM и не выделяет динамическую память. Каждый прибор +имеет отдельный контекст. JNI-порт сериализует операции экземпляра. + +`setp_deif_poll` выдаёт готовые кадры однократно. Порт обслуживает его +регулярно и после запросов SDO; очередь ограничена 16 событиями. Экранная +пауза CAN-журнала не должна останавливать протокол. Потеря подключения, +ошибка TX и закрытие владельца останавливают активный сервер. + +`setp_deif_make/master/service/angle_command` создают готовые сообщения. +`setp_deif_selector_info/readdress/route` обслуживают редакторы профиля: +UI не извлекает endian, смещения или адресные маски самостоятельно. +Локализованные тексты и мигание готовых показаний остаются в GUI. + +При отсутствии нативного ядра порт выдаёт явную ошибку. Python/Kotlin +fallback протокола отсутствует. Windows source build может использовать +дополнительную сборку того же C-ядра `setprotocol_deif.dll`; путь задаёт +приложение либо стандартный загрузчик находит компонент рядом с основной +DLL. Новый автономный EXE использует собственную основную DLL с DEIF. + +## Проверки + +`tests/fixtures/deif-xdi-v1.tsv` — единые эталонные байты для C, Python и JNI. +Их используют `tests/test_deif_xdi.c`, `python/tests/test_deif_shared.py` и +`ports/android/tests/.../deif/DeifXdiTest.kt`. Отдельно проверяются пассивные +90°, независимый фактический угол, Boot-up, NMT, heartbeat и отсутствие +выдуманного ответного PDO. Desktop дополнительно проверяет миграцию старой +пустой привязки без включения симуляции и без физического TX. diff --git a/c/set-protocol/docs/EMULATOR_SERVICES.md b/c/set-protocol/docs/EMULATOR_SERVICES.md index cbdec5d..cf934d8 100644 --- a/c/set-protocol/docs/EMULATOR_SERVICES.md +++ b/c/set-protocol/docs/EMULATOR_SERVICES.md @@ -1,5 +1,31 @@ # Универсальное адресное пространство эмуляторов +## Подключение панелей к конкретному MCU + +Каталог `python/set_devices/mcu_profiles.py` связывает платы с общими сервисами, +моделью `DEVICE_INFO`, настройками подключения и аппаратным таймером. +`python/set_devices/qt_ports/emulator_workspace.py` принимает готовые панели +потребителя по ключам `settings`, `ump`, `tms2812`, `igbt`, `wavegen` и выбирает +их состав методом `select_mcu`. Общие алгоритмы УМП, 2812, IGBT и ЦАП остаются +в описанном ниже C-ядре; новая панель не создаёт вторую модель или соединение. + +SETGUI подключает эти инструменты из страниц «Терминал → STM32 → MCU». +Поддержаны эмулятор STM32F407VET6 с TIM6 72 МГц и порт STM32G474RB с TIM6 +160 МГц. Параметры COM хранятся отдельно; расчёт частот ЦАП, подписи Vin +и проверяемая модель SET v2 соответствуют выбранной плате. Профиль MCU +нельзя переключать во время обмена. Сам выбор профиля не отправляет команды. + +Общий автомат обнаружения находится в `python/set_devices/emulator_protocol.py`, +COM-адаптер и клиент IGBT — в `python/set_devices/qt_ports/emulator_serial.py` +и `igbt_client.py`. Они не импортируют SETGUI. Старые пути SETGUI только +реэкспортируют эти реализации для совместимости. + +STM32G474VET6 с прошивкой CANdle имеет отдельный профиль BOOT: приложение +`0x08008000`, размер до 480 КиБ, CAN 500 кбит/с, Type 7 / Device 15 / +Product 0, либо USART1 PA9/PA10 на 512000 бод, 8N1. Это другая прошивка, +чем эмулятор STM32G474RB. Профиль BOOT готовит форму обновления и проверяет +векторы приложения до начала CAN-передачи. + Общий код находится в `templates/c/set-protocol`. Прошивка платы задаёт память, GPIO и аппаратные callbacks; протокол и модели не включают STM32/HAL/USB/ОС, не выделяют heap и не читают системное время. Все вызовы одного экземпляра diff --git a/c/set-protocol/include/deif_xdi.h b/c/set-protocol/include/deif_xdi.h new file mode 100644 index 0000000..7924820 --- /dev/null +++ b/c/set-protocol/include/deif_xdi.h @@ -0,0 +1,41 @@ +#ifndef SETP_DEIF_XDI_H /* Защита переносимого ABI от повторного включения. */ +#define SETP_DEIF_XDI_H /* Контракт DEIF одинаков для ctypes, JNI и прошивок. */ +#include "pcan_abi.h" /* Общий макрос экспорта и целочисленные типы стабильного ABI. */ +#ifdef __cplusplus /* C++-потребители должны видеть тот же немодифицированный ABI символов. */ +extern "C" { /* Реализация остаётся C99 для ctypes, JNI и MCU. */ +#endif /* Начало совместимого C ABI. */ +typedef struct { /* Готовый стандартный CAN-кадр; упаковка транспортного моста остаётся отдельным слоем. */ + uint32_t can_id; /* 11-битный COB-ID, вычисленный ядром. */ + uint32_t dlc; /* Число используемых байтов Classic CAN, от нуля до восьми. */ + uint8_t data[8]; /* Готовые wire-байты без преобразований в GUI. */ +} setp_deif_frame_t; /* Размер структуры фиксирован: 16 байт без указателей. */ +PCAN_ABI_API int setp_deif_version(void); /* Версия этого независимого расширения ABI. */ +PCAN_ABI_API size_t setp_deif_state_size(void); /* Размер состояния, память выделяет вызывающая сторона. */ +PCAN_ABI_API int setp_deif_catalog(unsigned field, int32_t *metadata); /* base, subindex, десятичное разрешение; поле 0…7. */ +PCAN_ABI_API int setp_deif_selector(unsigned field, unsigned node, unsigned instance, unsigned dam, uint8_t *out); /* Четырёхбайтный селектор без дублирования endian в портах. */ +PCAN_ABI_API int setp_deif_inspect(uint32_t id, const uint8_t *data, size_t size, unsigned flags, int32_t *out); /* Метаданные кадра и детерминированный код ошибки. */ +PCAN_ABI_API int setp_deif_make(unsigned field, unsigned node, unsigned instance, int32_t value, uint32_t id, unsigned dam, setp_deif_frame_t *out); /* Данные MASTER, яркость и палитра. */ +PCAN_ABI_API int setp_deif_master(unsigned node, const int32_t *values, uint32_t id, unsigned dam, unsigned angle_subindex, setp_deif_frame_t *out); /* Порядок пяти объектов MASTER хранится только в C-каталоге. */ +PCAN_ABI_API int setp_deif_service(unsigned kind, unsigned node, unsigned value, setp_deif_frame_t *out); /* kind=0 строит heartbeat, kind=1 — локальную команду NMT. */ +PCAN_ABI_API int setp_deif_angle_command(const setp_deif_frame_t *actual, setp_deif_frame_t *out); /* Строит отдельное задание из фактического угла без изменения wire-байтов в UI. */ +PCAN_ABI_API int setp_deif_selector_info(const uint8_t *selector, int32_t *out); /* Node, index, subindex и DAM для редактора привязок. */ +PCAN_ABI_API int setp_deif_readdress(const uint8_t *selector, unsigned node, unsigned mode, uint8_t *out); /* Переносит только адрес; mode=2 сохраняет текущий SAM/DAM. */ +PCAN_ABI_API int setp_deif_route(unsigned node, unsigned dam, uint32_t previous, unsigned operation, uint32_t *out); /* COB-ID, Node и адрес; operation=0 согласовать, 1 сохранить, 2 извлечь Node. */ +PCAN_ABI_API int setp_deif_validate(uint32_t id, const uint8_t *data, size_t size, unsigned flags, unsigned slave); /* slave=0 проверяет MASTER, иначе серверные ответы своего узла. */ +PCAN_ABI_API int setp_deif_init(void *state, size_t size, unsigned node, unsigned source, unsigned xdi, unsigned self_start, unsigned pdo, unsigned group, unsigned services, uint32_t monitor_id); /* Инициализация профиля без системных часов и heap. */ +PCAN_ABI_API int setp_deif_bind(void *state, unsigned field, const uint8_t *selector, double scale); /* Привязка индикатора к явному объекту библиотеки. */ +PCAN_ABI_API int setp_deif_get_binding(void *state, unsigned field, uint8_t *selector, double *scale); /* Готовая привязка и масштаб текущего C-профиля. */ +PCAN_ABI_API int setp_deif_default_angle(void *state, uint8_t *selector, double *scale); /* Восстановление отсутствующей старой привязки с адресацией существующих полей. */ +PCAN_ABI_API int setp_deif_start(void *state, uint64_t now, unsigned reset_values); /* Время задаётся монотонными миллисекундами порта. */ +PCAN_ABI_API void setp_deif_stop(void *state); /* Выключенный узел прекращает все служебные события. */ +PCAN_ABI_API void setp_deif_reset_values(void *state); /* Сбрасывает только измерения и их временные отметки. */ +PCAN_ABI_API int setp_deif_accept(void *state, uint32_t id, const uint8_t *data, size_t size, unsigned flags, uint64_t now); /* Приём STD MPDO, NMT и expedited SDO. */ +PCAN_ABI_API size_t setp_deif_poll(void *state, uint64_t now, setp_deif_frame_t *out, size_t capacity); /* Таймеры и однократная выдача очереди Boot-up/HB/EMCY/SDO. */ +PCAN_ABI_API int setp_deif_read(void *state, unsigned field, uint64_t now, unsigned expiry_ms, double *value, int64_t *metadata); /* metadata: seen_ms, raw, статус, флаги seen/valid/stale. */ +PCAN_ABI_API unsigned setp_deif_lost(void *state, uint64_t now); /* Маска входов без обновлений 3000 мс. */ +PCAN_ABI_API int setp_deif_angle(void *state, uint64_t now, unsigned expiry_ms, double *value); /* 1 — фактический угол, 2 — явно помеченное задание, 0 — нет данных. */ +PCAN_ABI_API int setp_deif_meta(void *state, int64_t *out); /* active, NMT, start, lastHB, period, accepted, group, brightness, palette, error. */ +#ifdef __cplusplus /* Закрываем C ABI перед возвратом в C++-контекст клиента. */ +} /* extern C не влияет на чистый C99-компилятор. */ +#endif /* Совместимость с C++-портами. */ +#endif /* SETP_DEIF_XDI_H: все алгоритмы находятся в единственном C99-модуле. */ diff --git a/c/set-protocol/include/set_signal.h b/c/set-protocol/include/set_signal.h index cf2a768..e302b52 100644 --- a/c/set-protocol/include/set_signal.h +++ b/c/set-protocol/include/set_signal.h @@ -27,6 +27,15 @@ enum { SET_SIGNAL_POLYNOMIAL, SET_SIGNAL_LINEAR, SET_SIGNAL_PCHIP, SET_SIGNAL_SP PCAN_ABI_API int set_signal_reconstruct(const double *x, const double *y, size_t count, int method, unsigned degree, size_t output_count, int endpoint, double *out_x, double *out_y, double *meta, double *work, size_t work_count); +/* Дополнительный решатель получает уникальные нормированные X/Y и пишет degree+1 + * коэффициентов по возрастанию степени для аргумента 2*x-1. Код 0 означает успех, + * 3 — недостаточный ранг, 5 — ошибку памяти/решателя. NULL сохраняет прежний МНК. + * C99-подготовка, интерполяция, RMSE и размещение work одинаковы для всех решателей. */ +typedef int (*set_signal_fit_fn)(const double *, const double *, size_t, unsigned, double *); /* Обратный вызов отделяет необязательный C++-порт от переносимого ядра. */ +PCAN_ABI_API int set_signal_reconstruct_with_fit( /* Расширение ABI не меняет сигнатуру существующей функции для прошивок и GUI. */ + const double *x, const double *y, size_t count, int method, unsigned degree, /* Входные точки и степень имеют те же ограничения, что у исходного API. */ + size_t output_count, int endpoint, double *out_x, double *out_y, /* Результат остаётся в памяти вызывающего и сохраняет выбор конечной точки. */ + double *meta, double *work, size_t work_count, set_signal_fit_fn fit); /* Решатель используется только для полинома; рабочая память сохраняет прежний формат. */ /* Reject out-of-range voltages, never silently clip. vref must be positive. * All input is validated before any output is written. */ PCAN_ABI_API int set_signal_dac12(const double *volts, size_t count, double vref, diff --git a/c/set-protocol/ports/android/Android.mk b/c/set-protocol/ports/android/Android.mk index de1ba13..567f11d 100644 --- a/c/set-protocol/ports/android/Android.mk +++ b/c/set-protocol/ports/android/Android.mk @@ -30,5 +30,6 @@ LOCAL_SRC_FILES := \ ../../src/pcan_gas.c \ setprotocol_jni.c LOCAL_CFLAGS := -std=c99 -Wall -Wextra -Wpedantic -fvisibility=hidden +LOCAL_SRC_FILES += ../../src/deif_xdi.c set_deif_jni.c # Единственные DEIF-правила компилируются вместе с тонким JNI-портом. LOCAL_LDLIBS := -llog -lm include $(BUILD_SHARED_LIBRARY) diff --git a/c/set-protocol/ports/android/kotlin/ru/setcorp/setprotocol/deif/DeifXdi.kt b/c/set-protocol/ports/android/kotlin/ru/setcorp/setprotocol/deif/DeifXdi.kt new file mode 100644 index 0000000..77c42b9 --- /dev/null +++ b/c/set-protocol/ports/android/kotlin/ru/setcorp/setprotocol/deif/DeifXdi.kt @@ -0,0 +1,60 @@ +package ru.setcorp.setprotocol.deif // Общий Android/JVM-порт находится в templates, без зависимости от приложения. +import java.nio.ByteBuffer // Caller-owned direct buffer обеспечивает выравнивание и управляемое JVM время жизни. +import ru.setcorp.setprotocol.NativeSetProtocol // Загрузку общей нативной библиотеки выполняет существующий порт. + +internal object NativeDeifBridge { // Только JNI-объявления; здесь нет второго кодека или автомата. + external fun size(): Int // Размер private C-состояния сообщает само ядро. + external fun initialize(state: ByteBuffer, node: Int, source: Int, xdi: Boolean, automatic: Boolean, pdo: Int, group: Int, services: Boolean, monitorId: Long): Boolean // Профиль проверяет C. + external fun start(state: ByteBuffer, nowMs: Long, reset: Boolean): Boolean // Время передаётся явно для воспроизводимых тестов. + external fun stop(state: ByteBuffer) // Выключенный сервер не производит heartbeat. + external fun accept(state: ByteBuffer, id: Long, data: ByteArray, flags: Int, nowMs: Long): Boolean // Байты обрабатывает общий C-код. + external fun poll(state: ByteBuffer, nowMs: Long): IntArray // Готовые события возвращаются скалярами id, dlc, data[8]. + external fun snapshot(state: ByteBuffer, nowMs: Long, expiryMs: Int): DoubleArray // Числа, статусы и сроки уже вычислены в C. + external fun inspect(id: Long, data: ByteArray, flags: Int): IntArray // Журнал получает единый результат декодирования. +} // ABI не раскрывает Kotlin layout внутренних структур. +data class DeifFrame(val canId: Long, val data: ByteArray) // Готовый STD data frame передаётся существующему CAN-транспорту приложения. +data class DeifSnapshot( // Неизменяемая модель пригодна для Compose, другого GUI и JVM-тестов. + val active: Boolean, val nmt: Int, val accepted: Int, // Жизненный цикл и число действительно принятых MPDO. + val brightness: Int, val palette: Int, // Значения текущего профиля подсветки. + val angle: Double?, val angleIsSetpoint: Boolean, // Фактический угол отделён от явно помеченного принятого задания. + val values: List, val statuses: List, val lostFields: Set, // Порядок полей задаёт общий ABI C, недействительные числа не подменяются нулями. +) // Снимок не содержит указателя на состояние C. +class DeifXdi(node: Int = 13, source: Int = 1, xdi: Boolean = true, automatic: Boolean = true, pdo: Int = 2, group: Int = 1, private val services: Boolean = false, monitorId: Long = 0) : AutoCloseable { // Один независимый прибор на экземпляр. + private val state: ByteBuffer // Память остаётся управляемой JVM, C не использует malloc. + init { // Отсутствующее ядро является явной ошибкой сборки, fallback на Kotlin запрещён. + check(NativeSetProtocol.available) { "Не загружено общее C-ядро DEIF" } // Приложение не должно молча использовать иной алгоритм. + state = ByteBuffer.allocateDirect(NativeDeifBridge.size()) // Размер и выравнивание не дублируют private C-структуру. + require(NativeDeifBridge.initialize(state, node, source, xdi, automatic, pdo, group, services, monitorId)) { "DEIF: неверный Node-ID, источник или RPDO" } // Ограничения XDi-net проверяет C. + } // Создание пассивного наблюдателя ничего не отправляет. + @Synchronized fun start(nowMs: Long, resetValues: Boolean = true) { // NMT и таймеры безопасны при приёме и тиках из разных потоков. + check(NativeDeifBridge.start(state, nowMs, resetValues)) { "Не удалось запустить DEIF" } // Boot-up создаётся только в C-сервере. + } // Физическую отправку выбирает приложение по результату poll. + @Synchronized fun accept(id: Long, data: ByteArray, extended: Boolean = false, remote: Boolean = false, nowMs: Long): Boolean { // Имя транспорта фильтруется приложением до этого вызова. + return NativeDeifBridge.accept(state, id, data, (if (extended) 1 else 0) or (if (remote) 2 else 0), nowMs) // Флаги описывают тип CAN, payload не разбирается в Kotlin. + } // C различает NMT, MPDO, heartbeat и SDO. + @Synchronized fun poll(nowMs: Long): List { // События выдаются один раз, даже если экран журнала стоит на паузе. + return NativeDeifBridge.poll(state, nowMs).asList().chunked(10).map { row -> DeifFrame(row[0].toLong(), ByteArray(row[1]) { row[it + 2].toByte() }) } // Это раскладка скалярного ABI JNI, а не CAN-кодек. + } // Готовые byte arrays не меняются в транспортном слое. + @Synchronized fun snapshot(nowMs: Long): DeifSnapshot { // Тайм-аут наблюдателя сохраняет совместимость Desktop; сервер хранит число при Data lost. + val raw = NativeDeifBridge.snapshot(state, nowMs, if (services) 0 else 5000) // Правило выбора и свежести вычисляет C. + return DeifSnapshot(raw[0] != 0.0, raw[1].toInt(), raw[5].toInt(), raw[7].toInt(), raw[8].toInt(), if (raw[34] != 0.0) raw[35] else null, raw[34] == 2.0, // Метаданные профиля и готовый азимут. + List(6) { field -> val flags = raw[13 + field * 4].toInt(); if (flags and 2 != 0 && flags and 4 == 0) raw[10 + field * 4] else null }, // Порт отображает valid/stale-флаги, не повторяя таймеры. + List(6) { raw[12 + it * 4].toInt() }, (0..5).filter { raw[36].toInt() and (1 shl it) != 0 }.toSet()) // Имена и цвета ошибок остаются ответственностью GUI. + } // Снимок можно использовать в UI без обращения к байтам протокола. + @Synchronized override fun close() { NativeDeifBridge.stop(state) } // Жизненный цикл отменяет heartbeat и очередь до закрытия адаптера. + companion object { // Диагностическое представление не содержит второго парсера. + fun inspect(id: Long, data: ByteArray, extended: Boolean = false, remote: Boolean = false): IntArray { // Приложение передаёт целый транспортный кадр. + check(NativeSetProtocol.available) { "Не загружено общее C-ядро DEIF" } // Без C-декодера никакого угадывания формата нет. + return NativeDeifBridge.inspect(id, data, (if (extended) 1 else 0) or (if (remote) 2 else 0)) // Индексы результата закреплены ABI deif_xdi.h. + } // Один и тот же вход даёт одинаковые поля в Python и Android. + fun summary(id: Long, data: ByteArray, extended: Boolean = false, remote: Boolean = false): String { // Только локализованный текст поверх метаданных C. + val m = inspect(id, data, extended, remote) // Никакого endian-разбора в Kotlin. + return when (m[0]) { // Код результата сообщает общий декодер. + 2 -> "Heartbeat/Boot-up · Node ${m[2]} · NMT ${m[11]}" // Состояние относится к узлу, а не к подтверждению показаний. + 1 -> "DEIF Node ${m[2]} · 0x%04X:%02X · RAW %d".format(m[3], m[4], m[5]) // Физические единицы показывает отдельный снимок модели. + 3 -> "DEIF · яркость/Color · ${m[5]}" // U8 подсветки не получает масштаб RPM. + else -> "DEIF: кадр не принят, код ${m[0]}" // Неизвестный объект не интерпретируется заново портом. + } // Текст не влияет на протокольное принятие. + } // Журнал и индикатор используют один C-каталог. + } // Общий порт не зависит от конкретного Android-приложения. +} // Контекст освобождается JVM после закрытия владельца. diff --git a/c/set-protocol/ports/android/set_deif_jni.c b/c/set-protocol/ports/android/set_deif_jni.c new file mode 100644 index 0000000..a637be5 --- /dev/null +++ b/c/set-protocol/ports/android/set_deif_jni.c @@ -0,0 +1,32 @@ +#include /* JNI здесь преобразует только контейнеры Java и указатели C. */ +#include "deif_xdi.h" /* Все правила DEIF принадлежат общему переносимому ядру. */ +static void *deif_context(JNIEnv *e,jobject b) { /* Direct ByteBuffer владеет памятью состояния и освобождается JVM. */ + if(!b || (*e)->GetDirectBufferCapacity(e,b)<(jlong)setp_deif_state_size()) return NULL; return (*e)->GetDirectBufferAddress(e,b); /* Не допускаем короткий либо недиректный буфер. */ +} /* JNI не копирует private-layout структуры. */ +static int deif_input(JNIEnv *e,jbyteArray a,uint8_t *d) { /* Classic CAN ограничен восемью байтами. */ + jsize n; if(!a) return -1; n=(*e)->GetArrayLength(e,a); if(n>8) return -1; (*e)->GetByteArrayRegion(e,a,0,n,(jbyte *)d); return (int)n; /* Буфер локален текущему вызову JNI. */ +} /* Время жизни Java-указателей не пересекает вызов. */ +JNIEXPORT jint JNICALL Java_ru_setcorp_setprotocol_deif_NativeDeifBridge_size(JNIEnv *e,jobject self) { (void)e; (void)self; return (jint)setp_deif_state_size(); } /* Kotlin выделяет точно нужный объём без heap в C. */ +JNIEXPORT jboolean JNICALL Java_ru_setcorp_setprotocol_deif_NativeDeifBridge_initialize(JNIEnv *e,jobject self,jobject b,jint node,jint source,jboolean xdi,jboolean automatic,jint pdo,jint group,jboolean services,jlong id) { /* Параметры профиля передаются без повторения правил. */ + void *s=deif_context(e,b); (void)self; if(!s || id<0 || id>0x1FFFFFFF) return JNI_FALSE; return setp_deif_init(s,setp_deif_state_size(),(unsigned)node,(unsigned)source,xdi!=0,automatic!=0,(unsigned)pdo,(unsigned)group,services!=0,(uint32_t)id)?JNI_TRUE:JNI_FALSE; /* Сервисный Node и RPDO проверяет C. */ +} /* Источником исходных привязок остаётся C-каталог. */ +JNIEXPORT jboolean JNICALL Java_ru_setcorp_setprotocol_deif_NativeDeifBridge_start(JNIEnv *e,jobject self,jobject b,jlong now,jboolean reset) { (void)self; return now>=0 && setp_deif_start(deif_context(e,b),(uint64_t)now,reset!=0)?JNI_TRUE:JNI_FALSE; } /* Часы Android передаются в монотонных миллисекундах. */ +JNIEXPORT void JNICALL Java_ru_setcorp_setprotocol_deif_NativeDeifBridge_stop(JNIEnv *e,jobject self,jobject b) { (void)self; setp_deif_stop(deif_context(e,b)); } /* Закрытие сервера прекращает очередь событий. */ +JNIEXPORT jboolean JNICALL Java_ru_setcorp_setprotocol_deif_NativeDeifBridge_accept(JNIEnv *e,jobject self,jobject b,jlong id,jbyteArray a,jint flags,jlong now) { /* Принимается готовый транспортом CAN-кадр. */ + uint8_t d[8]; int n=deif_input(e,a,d); (void)self; if(n<0 || id<0 || id>0x1FFFFFFF || now<0) return JNI_FALSE; return setp_deif_accept(deif_context(e,b),(uint32_t)id,d,(size_t)n,(unsigned)flags,(uint64_t)now)?JNI_TRUE:JNI_FALSE; /* JNI не разбирает индекс, подиндекс или signed I16. */ +} /* C обслуживает адресацию, NMT и SDO одинаково для Desktop и Android. */ +JNIEXPORT jintArray JNICALL Java_ru_setcorp_setprotocol_deif_NativeDeifBridge_poll(JNIEnv *e,jobject self,jobject b,jlong now) { /* Очередь возвращается массивом скаляров ABI, а не вторым CAN-пакетом. */ + setp_deif_frame_t frames[16]; jint values[160]; size_t n,i,j; jintArray result; (void)self; if(now<0) return NULL; n=setp_deif_poll(deif_context(e,b),(uint64_t)now,frames,16); /* Все исходящие байты уже сформированы C-ядром. */ + for(i=0;iNewIntArray(e,(jsize)(n*10)); if(result) (*e)->SetIntArrayRegion(e,result,0,(jsize)(n*10),values); return result; /* Владение результатом передаётся JVM. */ +} /* JNI не создаёт фиктивного ответного PDO. */ +JNIEXPORT jdoubleArray JNICALL Java_ru_setcorp_setprotocol_deif_NativeDeifBridge_snapshot(JNIEnv *e,jobject self,jobject b,jlong now,jint expiry) { /* Универсальный скалярный снимок пригоден без Compose. */ + void *s=deif_context(e,b); int64_t meta[10],m[4]; jdouble values[37]; double v; unsigned i; jdoubleArray result; (void)self; if(now<0 || expiry<0 || !setp_deif_meta(s,meta)) return NULL; /* Layout состояния не дублируется в Kotlin. */ + for(i=0;i<10;i++) values[i]=(double)meta[i]; for(i=0;i<6;i++) { setp_deif_read(s,i,(uint64_t)now,(unsigned)expiry,&v,m); values[10+i*4]=v; values[11+i*4]=(double)m[0]; values[12+i*4]=(double)m[2]; values[13+i*4]=(double)m[3]; } /* Масштабы, статусы и свежесть вычислены C. */ + values[34]=(double)setp_deif_angle(s,(uint64_t)now,(unsigned)expiry,&v); values[35]=v; values[36]=setp_deif_lost(s,(uint64_t)now); /* Факт, задание и Data lost определяются общим алгоритмом. */ + result=(*e)->NewDoubleArray(e,37); if(result) (*e)->SetDoubleArrayRegion(e,result,0,37,values); return result; /* Java получает независимый неизменяемый снимок. */ +} /* Здесь нет системных часов и транспортного ввода-вывода. */ +JNIEXPORT jintArray JNICALL Java_ru_setcorp_setprotocol_deif_NativeDeifBridge_inspect(JNIEnv *e,jobject self,jlong id,jbyteArray a,jint flags) { /* Общий декодер доступен также журналу Android. */ + uint8_t d[8]; int32_t m[12]={0}; jint values[13]; int n=deif_input(e,a,d),code; unsigned i; jintArray result; (void)self; code=n<0 || id<0 || id>0x1FFFFFFF?-1:setp_deif_inspect((uint32_t)id,d,(size_t)n,(unsigned)flags,m); /* Только C знает wire-формат DEIF. */ + values[0]=code; for(i=0;i<12;i++) values[i+1]=m[i]; result=(*e)->NewIntArray(e,13); if(result) (*e)->SetIntArrayRegion(e,result,0,13,values); return result; /* Метаданные индексируются по ABI, не по смещениям CAN-data. */ +} /* Локализованные подписи формирует Kotlin. */ diff --git a/c/set-protocol/ports/android/tests/ru/setcorp/setprotocol/deif/DeifXdiTest.kt b/c/set-protocol/ports/android/tests/ru/setcorp/setprotocol/deif/DeifXdiTest.kt new file mode 100644 index 0000000..c43038d --- /dev/null +++ b/c/set-protocol/ports/android/tests/ru/setcorp/setprotocol/deif/DeifXdiTest.kt @@ -0,0 +1,34 @@ +package ru.setcorp.setprotocol.deif // JVM-тест использует тот же пакет и JNI-порт, что Android GUI. +import org.junit.Assert.* // Сверяются значения, тип индикации и точные служебные байты. +import org.junit.Test // Обычный локальный JUnit запускает нативную host-библиотеку. +class DeifXdiTest { // В тесте отсутствует Kotlin-копия протокола. + private fun bytes(hex: String) = hex.chunked(2).map { it.toInt(16).toByte() }.toByteArray() // Конвертируется только текст тестовой fixture. + @Test fun sameVectorsAsCAndPython() { // Общий TSV фиксирует межъязыковую совместимость кодека. + val lines = javaClass.getResourceAsStream("/deif-xdi-v1.tsv")!!.bufferedReader().use { it.readLines() } // Fixture поставляется тем же submodule templates. + lines.filter { it.isNotBlank() && !it.startsWith("#") }.forEach { line -> // Комментарии не являются тестовыми пакетами. + val row = line.trim().split(Regex("\\s+")) // Столбцы описывают ожидаемый результат независимо от реализации C. + val flags = row[2].toInt() // Метаданные теста задают STD/EXT/RTR. + val result = DeifXdi.inspect(row[0].toLong(16), bytes(row[1]), flags and 1 != 0, flags and 2 != 0) // JNI вызывает единственный C-декодер. + assertEquals(line, row[3].toInt(), result[0]); assertEquals(line, row[4].toInt(), result[5]) // Сверяем тип принятия и знаковый RAW. + assertEquals(line, row[5].toInt(16), result[3]); assertEquals(line, row[6].toInt(16), result[4]) // Индекс и подиндекс не декодируются повторно в Kotlin. + } // Каждый ошибочный формат проверяется тем же контрактом. + } // Тест не зависит от Android Runtime. + @Test fun passiveNinetyDegreesDoesNotRequireSimulation() { // Воспроизводит выключенный флаг симуляции на снимке пользователя. + DeifXdi().use { model -> // Пассивный наблюдатель не создаёт heartbeat. + assertTrue(model.accept(0x201, bytes("0101300784030000"), nowMs = 10000)) // MASTER Node 1 передаёт сетевое задание RAW 900. + assertEquals(90.0, model.snapshot(10000).angle!!, 0.0); assertTrue(model.snapshot(10000).angleIsSetpoint) // 90° видны с честной пометкой задания. + assertTrue(model.poll(10000).isEmpty()) // Показание не требует физической отправки или включённого SLAVE-сервера. + assertTrue(model.accept(0x201, bytes("01013002E5010000"), nowMs = 10100)) // Отдельное фактическое сообщение передаёт 48,5°. + assertEquals(48.5, model.snapshot(10100).angle!!, 0.0); assertFalse(model.snapshot(10100).angleIsSetpoint) // Угол и тип отображения совпадают с C- и Python-тестами. + } // Close освобождает протокольный сеанс, память direct buffer управляется JVM. + } // Черновика MASTER в API общего ядра вообще нет. + @Test fun slaveOnlySendsHeartbeatForNormalMpdo() { // Обычный приём рассылки не должен создавать ответный PDO. + DeifXdi(node = 13, services = true).use { model -> // Сервисный режим использует адрес Node 13. + model.start(0); val boot = model.poll(0).single() // Boot-up должен быть выдан ровно один раз. + assertEquals(0x70DL, boot.canId); assertArrayEquals(byteArrayOf(0), boot.data) // COB-ID и DLC совпадают с физическим DEIF-профилем. + assertArrayEquals(byteArrayOf(5), model.poll(1000).single().data) // Self-start завершается через 1000 мс. + assertTrue(model.accept(0x201, bytes("0101300784030000"), nowMs = 1000)) // Измерение принимается через общий C-автомат. + assertTrue(model.poll(1000).isEmpty()); assertEquals(90.0, model.snapshot(1000).angle!!, 0.0) // Есть обновлённое показание, но отсутствует выдуманный ACK-PDO. + } // Нативная очередь останавливается при закрытии владельца. + } // Все события проверены на точных монотонных сроках. +} // Этот же класс теста подключается к Android sourceSets из templates. diff --git a/c/set-protocol/src/deif_xdi.c b/c/set-protocol/src/deif_xdi.c new file mode 100644 index 0000000..dc23a45 --- /dev/null +++ b/c/set-protocol/src/deif_xdi.c @@ -0,0 +1,185 @@ +#include "deif_xdi.h" /* Публичный ABI не зависит от Python, Kotlin, Qt или Android. */ +#include /* Фиксированные структуры копируются без динамической памяти. */ +#include /* Проверка конечности пользовательского масштаба предотвращает недопустимые показания. */ +#define DEIF_MAGIC 0x44454946U /* Метка DEIF отличает валидный caller-owned контекст. */ +#define DEIF_FIELDS 6U /* POWER, RPM, фактический угол, POWER%, RPM%, задание угла. */ +#define DEIF_QUEUE 16U /* Ограниченная очередь покрывает Boot-up, heartbeat и ответы без heap. */ +typedef struct { /* Привязка и последнее сообщение одного индикатора. */ + uint8_t selector[4]; /* SAM/DAM, индекс LE и подиндекс сохраняются в wire-порядке. */ + double scale; /* Множитель физической величины задаётся библиотекой прибора. */ + uint64_t seen; /* Монотонные миллисекунды последнего принятого объекта. */ + int32_t raw; /* Исходный I16 хранится без обратного округления показания. */ + unsigned bound, received, status; /* Привязка, наличие кадра и служебный статус I16. */ +} deif_binding; /* Внутренний layout не является частью публичного ABI. */ +typedef struct { /* Всё состояние принадлежит порту, часы и транспорт в ядре отсутствуют. */ + uint32_t magic, monitor_id; /* Метка контекста и точный CAN ID пассивного наблюдателя. */ + unsigned node, source, xdi, self_start, pdo, group, services; /* Профиль по DEIF 4189350066D. */ + unsigned active, nmt, heartbeat, accepted, brightness, palette, error, queued; /* Изменяемые коммуникационные параметры сеанса. */ + uint64_t started, last_hb, auto_at; /* Независимые сроки в монотонных миллисекундах. */ + deif_binding field[DEIF_FIELDS]; /* Каждый вход имеет собственные данные и срок свежести. */ + setp_deif_frame_t queue[DEIF_QUEUE]; /* Служебные кадры выдаются только один раз через poll. */ +} deif_state; /* Размер сообщает state_size, порты не повторяют эту структуру. */ +static const uint16_t bases[8] = {0x3420,0x3080,0x3000,0x3430,0x3090,0x3000,0x3500,0x3500}; /* Опубликованные семейства переменных и диммера. */ +static const uint8_t subs[8] = {2,2,2,2,2,7,2,3}; /* Фактическое значение, отдельное задание, яркость и палитра. */ +static deif_state *context(void *p) { /* Все публичные функции проверяют инициализацию состояния. */ + deif_state *s = (deif_state *)p; /* Порт выделяет выровненную память через uint64 либо direct ByteBuffer. */ + return s && s->magic == DEIF_MAGIC ? s : NULL; /* Невалидный указатель контекста не трактуется как работающий узел. */ +} /* Проверка не обращается к ОС. */ +static uint16_t le16(const uint8_t *p) { return (uint16_t)((uint16_t)p[0] | ((uint16_t)p[1] << 8)); } /* Единственная реализация little-endian U16. */ +static void put16(uint8_t *p, uint16_t v) { p[0]=(uint8_t)v; p[1]=(uint8_t)(v>>8); } /* Обратное преобразование принадлежит тому же C-кодеку. */ +static void put32(uint8_t *p, uint32_t v) { unsigned i; for(i=0;i<4;i++) p[i]=(uint8_t)(v>>(8U*i)); } /* SDO и EMCY используют младший байт первым. */ +static unsigned raw_status(int32_t raw) { return raw == -32768 ? 1U : raw == 32766 ? 2U : raw == 32767 ? 3U : 0U; } /* §2.1.2: три зарезервированных значения I16. */ +static int address(uint32_t id, unsigned node, unsigned dam) { /* Проверка адреса применяется одинаково в обоих GUI. */ + if(!node || node>127U) return 0; /* Нулевой адрес не является источником или получателем MPDO. */ + return dam ? (id==0x200U+node || id==0x300U+node || id==0x400U+node || id==0x500U+node) : (id==0x200U+node || id==0x27FU); /* RPDO1…4 либо SAM с исключением service broadcast. */ +} /* Номер получателя не подменяет источник SAM. */ +int setp_deif_version(void) { return 1; } /* Независимая версия расширения ABI. */ +size_t setp_deif_state_size(void) { return sizeof(deif_state); } /* Клиент не зависит от внутренних паддингов структуры. */ +int setp_deif_catalog(unsigned f, int32_t *o) { /* Каталог является единственным источником числовых индексов. */ + if(f>=8U || !o) return 0; /* Неизвестное поле не создаёт фиктивный объект. */ + o[0]=bases[f]; o[1]=subs[f]; o[2]=(f==0U ? 127 : f<6U ? -1 : 0); return 1; /* 127 означает неизвестную физическую единицу POWER, прочие разрешения заданы в десятичной степени. */ +} /* Тексты и локализация остаются в GUI-портах. */ +int setp_deif_selector(unsigned f,unsigned node,unsigned instance,unsigned dam,uint8_t *o) { /* Формирует четыре байта привязки из каталога. */ + if(f>=8U || !o || node<1U || node>127U || instance<1U || instance>(f<6U?15U:9U) || dam>1U) return 0; /* Проверяет границы Node, экземпляра и сетевой группы. */ + o[0]=(uint8_t)(node|(dam?128U:0U)); put16(o+1,(uint16_t)(bases[f]+instance)); o[3]=subs[f]; return 1; /* Индекс и режим MPDO собираются только здесь. */ +} /* В портах нет копии wire-разметки. */ +int setp_deif_inspect(uint32_t id,const uint8_t *d,size_t n,unsigned flags,int32_t *o) { /* Коды ошибок сохраняют причину для локализованной диагностики. */ + unsigned i,node,index,sub,instance; int field=-1; /* Промежуточные поля ограничены размерами Classic CAN. */ + if(!o || (!d && n)) return -1; /* Отсутствующий вход не разыменовывается. */ + memset(o,0,12U*sizeof(*o)); if(flags) return -1; /* EXT и RTR не интерпретируются как XDi STD data frames. */ + if(id>=0x701U && id<=0x77FU) { /* Heartbeat и Boot-up имеют отдельный формат DLC1. */ + o[1]=(int32_t)(id-0x700U); if(n!=1U) return -2; o[10]=d[0]; o[0]=2; /* Сохраняем Node-ID и исходный NMT-байт даже при неизвестном коде. */ + return d[0]==0U || d[0]==4U || d[0]==5U || d[0]==127U ? 2 : -3; /* Toggle-бит node guarding не снимается автоматически. */ + } /* Переменные и диммер разбираются следующим общим путём. */ + if(id<0x201U || id>0x57FU) return 0; if(n!=8U) return -4; /* Неизвестный COB-ID отделён от неправильного DLC MPDO. */ + node=d[0]&127U; index=le16(d+1); sub=d[3]; instance=index&15U; /* Семейства переменных имеют по пятнадцать экземпляров. */ + o[1]=(int32_t)node; o[2]=(int32_t)index; o[3]=(int32_t)sub; o[4]=(int16_t)le16(d+4); o[6]=(int32_t)instance; o[8]=(d[0]&128U)!=0; o[9]=(d[6]==0U && d[7]==0U); /* Метаданные не требуют повторного endian-разбора в Python или Kotlin. */ + if(!address(id,node,(unsigned)o[8])) return -5; /* Включает согласование источника SAM с COB-ID. */ + for(i=0;i<6U;i++) if((index&0xFFF0U)==bases[i] && instance && (sub==2U || sub==7U)) { field=(int)i; break; } /* Известные переменные разрешают фактическое значение и задание. */ + if(index>=0x3501U && index<=0x3509U && (sub==2U || sub==3U)) { o[0]=3; o[5]=sub==2U?6:7; o[4]=d[4]; return 3; } /* Диммер имеет U8, а не I16. */ + if(field<0) return -6; o[0]=1; o[5]=field; o[7]=(int32_t)raw_status(o[4]); return 1; /* Служебный I16 не становится физическим измерением. */ +} /* Ненулевые старшие байты отмечаются отдельно, приёмник их отклонит. */ +int setp_deif_make(unsigned f,unsigned node,unsigned instance,int32_t v,uint32_t id,unsigned dam,setp_deif_frame_t *o) { /* Сборка данных, яркости и Color для всех платформ. */ + if(!id) id=0x200U+node; /* Нулевой аргумент выбирает исходный RPDO1 без копии формулы в портах. */ + if(!o || !address(id,node,dam) || (f<6U?(v< -32768 || v>32767):(f==6U?(v<0 || v>100):(f!=7U || v<0 || v>2)))) return 0; /* Значения проверяются до сужения разрядности. */ + memset(o,0,sizeof(*o)); o->can_id=id; o->dlc=8; if(!setp_deif_selector(f,node,instance,dam,o->data)) return 0; /* Неизвестное поле или экземпляр не создаёт частичный кадр. */ + if(f<6U) put16(o->data+4,(uint16_t)v); else o->data[4]=(uint8_t)v; return 1; /* Старшие байты всегда нулевые согласно §3.2.1. */ +} /* Передача готового кадра остаётся обязанностью транспорта. */ +int setp_deif_master(unsigned node,const int32_t *v,uint32_t id,unsigned dam,unsigned angle_subindex,setp_deif_frame_t *o) { /* Цикл MASTER использует единственный каталог и единственную сборку MPDO. */ + static const unsigned order[5]={2,1,4,0,3}; unsigned i,f; if(!v || !o || (angle_subindex!=2U && angle_subindex!=7U)) return 0; /* Подиндекс азимута выбирается явно, неизвестные коды не подставляются автоматически. */ + for(i=0;i<5U;i++) { f=i==0U && angle_subindex==7U?5U:order[i]; if(!setp_deif_make(f,node,1,v[i],id,dam,&o[i])) return 0; } return 5; /* Все кадры сохраняют один Node-ID, режим и COB-ID. */ +} /* Неуспешный цикл не должен передаваться портом частично. */ +int setp_deif_service(unsigned kind,unsigned node,unsigned value,setp_deif_frame_t *o) { /* Готовые служебные кадры не собираются повторно в GUI. */ + if(!o || node>127U || kind>1U) return 0; memset(o,0,sizeof(*o)); /* Границы проверяются до сужения байтов. */ + if(!kind) { if(!node || (value!=0U && value!=4U && value!=5U && value!=127U)) return 0; o->can_id=0x700U+node; o->dlc=1; o->data[0]=(uint8_t)value; } /* Boot-up и heartbeat своего CANopen-узла. */ + else { if(value!=1U && value!=2U && value!=128U && value!=129U && value!=130U) return 0; o->dlc=2; o->data[0]=(uint8_t)value; o->data[1]=(uint8_t)node; } return 1; /* NMT допускает broadcast 0 и передаёт два байта в COB-ID 0. */ +} /* Отправка физическому или локальному получателю остаётся за портом. */ +int setp_deif_angle_command(const setp_deif_frame_t *a,setp_deif_frame_t *o) { /* Перевод фактического азимута в независимый set-point использует тот же каталог. */ + int32_t m[12]; if(!a || setp_deif_inspect(a->can_id,a->data,a->dlc,0,m)!=1 || (m[2]&0xFFF0)!=0x3000) return 0; return setp_deif_make(5,(unsigned)m[1],(unsigned)m[6],m[4],a->can_id,(unsigned)m[8],o); /* Источник, экземпляр и RAW не вычисляются повторно в Python. */ +} /* Это второй отдельный CAN-кадр, не подмена фактического объекта. */ +int setp_deif_selector_info(const uint8_t *s,int32_t *o) { /* Общий разбор пользовательского селектора для всех редакторов. */ + if(!s || !o || !(s[0]&127U)) return 0; o[0]=s[0]&127U; o[1]=le16(s+1); o[2]=s[3]; o[3]=(s[0]&128U)!=0; return 1; /* Текст HEX остаётся форматом настроек, wire-геометрия находится в C. */ +} /* Неизвестные библиотечные индексы могут быть явно привязаны пользователем. */ +int setp_deif_readdress(const uint8_t *s,unsigned node,unsigned mode,uint8_t *o) { /* Перенос старого профиля не требует wire-масок в приложении. */ + if(!s || !o || !node || node>127U || mode>2U) return 0; memcpy(o,s,4); o[0]=(uint8_t)(node|(mode==2U?(s[0]&128U):(mode?128U:0U))); return 1; /* Индекс и подиндекс сохраняются побайтно, включая ручные объекты библиотеки. */ +} /* Адресный байт меняется единственным общим правилом. */ +int setp_deif_route(unsigned node,unsigned dam,uint32_t id,unsigned op,uint32_t *o) { /* Общая настройка COB-ID не смешивается с физическим каналом приложения. */ + if(!o || dam>1U || op>2U || (op==2U && (id<0x201U || id>0x57FU))) return 0; if(op==2U && (id!=0x27FU || dam)) node=id&127U; if(!node) node=1; if(node>127U) return 0; /* Legacy SAM 0x27F сохраняет явно выбранный источник. */ + if(!op) id=dam?(id/0x100U)*0x100U+node:(id==0x27FU?id:0x200U+node); o[0]=id; o[1]=node; o[2]=node|(dam?128U:0U); return 1; /* RPDO-база DAM сохраняется, SAM использует исходный диапазон XDi-net. */ +} /* Точный допустимый адрес проверяется кодеком перед отправкой. */ +int setp_deif_validate(uint32_t id,const uint8_t *d,size_t n,unsigned flags,unsigned slave) { /* Разделяет выход MASTER и события собственного SLAVE. */ + int32_t m[12]; int k; if(flags || (!d && n)) return 0; /* RTR/EXT запрещены в обоих маршрутах. */ + if(slave) { /* Сервер не может посылать запросы конфигурации другим узлам. */ + if(slave>127U) return 0; if(id==0x700U+slave && n==1U) return d[0]==0U || d[0]==4U || d[0]==5U || d[0]==127U; /* Только собственные NMT-состояния. */ + if(id==0x580U+slave && n==8U) return d[0]==0x43U || d[0]==0x47U || d[0]==0x4BU || d[0]==0x4FU || d[0]==0x60U || d[0]==0x80U; /* Только ответы expedited SDO либо abort. */ + if(id==0x80U+slave && n==8U) { static const uint8_t lost[8]={0,0x81,0x81,6,0,0,0,0}; static const uint8_t clear[8]={0}; return !memcmp(d,lost,8) || !memcmp(d,clear,8); } /* Data lost и сброс по Appendix 5. */ + return 0; /* Чужие идентификаторы и ответные PDO не разрешены. */ + } /* MASTER сохраняет отдельный ограниченный набор команд. */ + k=setp_deif_inspect(id,d,n,0,m); if(k==2) return d[0]==5U; if(k!=1 && k!=3) return 0; /* Обычный MASTER не передаёт NMT, SDO и Boot-up. */ + if(!m[9]) return 0; if(k==3) return d[5]==0U && (m[5]==6 ? d[4]<=100U : d[4]<=2U); return 1; /* Значения диммера проверяются как U8 с нулевым хвостом. */ +} /* Проверка не производит физический TX. */ +static void event(deif_state *s,uint32_t id,const uint8_t *d,unsigned n) { /* Очередь имеет явную ограниченную вместимость. */ + setp_deif_frame_t *f; if(s->queued>=DEIF_QUEUE) return; f=&s->queue[s->queued++]; memset(f,0,sizeof(*f)); f->can_id=id; f->dlc=n; memcpy(f->data,d,n); /* Один event соответствует одному готовому CAN-кадру. */ +} /* Порты регулярно выгружают очередь через poll. */ +int setp_deif_init(void *p,size_t size,unsigned node,unsigned source,unsigned xdi,unsigned self_start,unsigned pdo,unsigned group,unsigned services,uint32_t monitor_id) { /* Общий конструктор наблюдателя и серверного SLAVE. */ + deif_state *s=(deif_state *)p; unsigned f; uint8_t selector[4]; /* Селекторы строятся тем же общим каталогом. */ + if(!s || size(services?126U:127U) || group>9U || pdo<1U || pdo>4U || (services && (!node || node>(xdi?126U:127U) || (xdi && pdo==1U)))) return 0; /* Источник обычной рассылки не занимает сервисный Node 127; RPDO1 резервируется в XDi-net. */ + memset(s,0,sizeof(*s)); s->magic=DEIF_MAGIC; s->node=node; s->source=source; s->xdi=xdi; s->self_start=xdi||self_start; s->pdo=pdo; s->group=group; s->services=services; s->monitor_id=monitor_id?monitor_id:0x200U+source; /* Исходный CAN ID источника вычисляется в C, без копии формулы в Kotlin. */ + s->heartbeat=500; s->brightness=100; s->nmt=services?127U:5U; s->active=!services; /* Пассивный наблюдатель не выдаёт heartbeat и сразу принимает данные. */ + for(f=0;f=DEIF_FIELDS || !isfinite(scale)) return 0; /* Неверный масштаб не попадает в снимок индикатора. */ + b=&s->field[f]; bound=selector && (selector[0]||selector[1]||selector[2]||selector[3]); if(b->bound==bound && b->scale==scale && (!bound || !memcmp(b->selector,selector,4))) return 1; /* Повторная синхронизация порта не стирает принятые значения. */ + memset(b,0,sizeof(*b)); b->bound=bound; b->scale=scale; if(bound) memcpy(b->selector,selector,4); /* Новая привязка начинает собственный срок ожидания. */ + if(f==2U) { uint8_t cmd[4]; if(bound && (le16(selector+1)&0xFFF0U)==0x3000U) { memcpy(cmd,selector,4); cmd[3]=7; setp_deif_bind(s,5,cmd,scale); } else setp_deif_bind(s,5,NULL,scale); } return 1; /* Задание угла выводится отдельно даже при пассивном наблюдении. */ +} /* Выбор фактического или заданного объекта сохраняется в исходной привязке. */ +int setp_deif_default_angle(void *p,uint8_t *o,double *scale) { /* Миграция старой пустой привязки использует уже настроенную адресацию прибора. */ + deif_state *s=context(p); unsigned f,addr; if(!s || !o || !scale) return 0; addr=s->source; /* При отсутствии других полей применяется источник профиля. */ + for(f=0;ffield[f].bound) { addr=s->field[f].selector[0]; break; } /* SAM-источник либо DAM-получатель берётся без предположений UI. */ + *scale=0.1; return setp_deif_selector(2,addr&127U,1,(addr&128U)!=0,o); /* Стандартный азимут экземпляра 1 имеет разрешение 0,1°. */ +} /* Остальные пользовательские привязки не меняются. */ +int setp_deif_get_binding(void *p,unsigned f,uint8_t *o,double *scale) { /* Порт не содержит второй таблицы исходных коэффициентов. */ + deif_state *s=context(p); if(!s || f>=DEIF_FIELDS || !o || !scale) return 0; memcpy(o,s->field[f].selector,4); *scale=s->field[f].scale; return (int)s->field[f].bound; /* Публичный ABI выдаёт только селектор и скаляр масштаба. */ +} /* Внутренний layout deif_binding не раскрывается клиентам. */ +void setp_deif_reset_values(void *p) { /* Сброс данных не переключает коммуникационное состояние. */ + deif_state *s=context(p); unsigned f; if(!s) return; for(f=0;ffield[f].received=0; s->field[f].status=0; s->field[f].seen=0; s->field[f].raw=0; } /* Профиль и масштабы сохраняются. */ +} /* Этот путь используется при изменении маршрута наблюдателя. */ +int setp_deif_start(void *p,uint64_t now,unsigned reset_values) { /* NMT Reset communication сохраняет прикладные значения. */ + deif_state *s=context(p); uint8_t boot=0; if(!s) return 0; if(reset_values) setp_deif_reset_values(s); /* Reset node дополнительно очищает прикладную область. */ + s->active=1; s->nmt=s->services?127U:5U; s->accepted=0; s->queued=0; s->error=0; s->heartbeat=500; s->started=s->last_hb=now; s->auto_at=s->services && s->self_start?now+1000U:0; /* DEIF §1.8 и §1.10: 1000 мс self-start, 500 мс heartbeat. */ + if(s->services) event(s,0x700U+s->node,&boot,1); return 1; /* Наблюдатель не объявляет себя узлом сети. */ +} /* Включение само по себе не создаёт выдуманных измерений. */ +void setp_deif_stop(void *p) { deif_state *s=context(p); if(s) { s->active=0; s->queued=0; } } /* Выключение отменяет в том числе невыданные служебные кадры. */ +unsigned setp_deif_lost(void *p,uint64_t now) { /* Каждый используемый вход имеет независимый таймер. */ + deif_state *s=context(p); unsigned f,mask=0; if(!s || !s->active) return 0; /* Неактивный узел не генерирует ошибку Data lost. */ + for(f=0;f<5U;f++) if(s->field[f].bound) { uint64_t t=s->field[f].received?s->field[f].seen:s->started; if(f==2U && !s->field[2].received && s->field[5].received) t=s->field[5].seen; if(now>=t && now-t>=3000U) mask|=1U<raw=raw; b->seen=now; b->received=1; b->status=raw_status(raw); } /* Служебная ошибка отличается от отсутствия обновлений. */ +static int sdo(deif_state *s,const uint8_t *d,uint64_t now) { /* Явный ограниченный сервер expedited SDO без выдуманного полного EDS. */ + uint16_t idx=le16(d+1); unsigned sub=d[3],bytes=0,found_index=0,f; uint32_t value=0,abort=0; uint8_t out[8]={0}; /* Ответ всегда содержит исходный мультиплексор запроса. */ + memcpy(out+1,d+1,3); if(d[0]==0x80U) return 0; /* Клиентский abort не вызывает ответного abort. */ + if(idx==0x1000U || idx==0x1001U || idx==0x1017U || idx==0x1018U) found_index=1; /* Стандартные объекты объявлены явно. */ + if(idx==0x1000U && !sub) { bytes=4; value=0; } else if(idx==0x1001U && !sub) { bytes=1; value=s->error?0x81U:0U; } /* Тип устройства и error register по Appendix 1. */ + else if(idx==0x1017U && !sub) { bytes=2; value=s->heartbeat; } else if(idx==0x1018U && sub<=1U) { bytes=sub?4U:1U; value=sub?0x100000B2U:1U; } /* DEIF vendor ID опубликован; продукт и серийный номер не выдумываются. */ + for(f=0;ffield[f].bound && le16(s->field[f].selector+1)==idx) { found_index=1; if(s->field[f].selector[3]==sub) { bytes=2; value=s->field[f].received?(uint16_t)s->field[f].raw:0x7FFFU; } } /* До обновления I16 возвращается «данные недействительны». */ + if(d[0]!=0x40U && d[0]!=0x2FU && d[0]!=0x2BU && d[0]!=0x27U && d[0]!=0x23U) abort=0x05040001U; else if(!bytes) abort=found_index?0x06090011U:0x06020000U; /* Различаем неподдерживаемую команду, подиндекс и объект. */ + else if(d[0]==0x40U) { out[0]=(uint8_t)(0x43U|((4U-bytes)<<2)); put32(out+4,value); event(s,0x580U+s->node,out,8); return 1; } /* Upload возвращает фактическую ширину U8/U16/U32. */ + else if(idx!=0x1017U || sub) abort=0x06010002U; else if(d[0]!=0x2BU) abort=0x06070010U; /* Запись данного профиля разрешена только для U16 heartbeat producer. */ + else { value=le16(d+4); if(s->xdi && !value) abort=0x06090030U; else { s->heartbeat=value; s->last_hb=now; out[0]=0x60; event(s,0x580U+s->node,out,8); return 1; } } /* В XDi-net heartbeat обязателен, в CANopen ноль его отключает. */ + out[0]=0x80; put32(out+4,abort); event(s,0x580U+s->node,out,8); return 0; /* Неподдерживаемый запрос не меняет значения или NMT-состояние. */ +} /* На каждый запрос получается не более одного ответа. */ +int setp_deif_accept(void *p,uint32_t id,const uint8_t *d,size_t n,unsigned flags,uint64_t now) { /* Основной общий автомат приёма внешнего MASTER. */ + deif_state *s=context(p); int32_t m[12]; int kind,changed=0; unsigned f,dam; if(!s || !s->active || flags || (!d && n)) return 0; /* Неверный канал отфильтровывает порт, EXT/RTR — ядро. */ + if(s->auto_at && now>=s->auto_at) { s->nmt=5; s->auto_at=0; } /* Автозапуск действует и перед приёмом очередного кадра. */ + if(s->services && id==0 && n==2U && (!d[1] || d[1]==s->node)) { /* NMT адресует свой узел либо broadcast 0. */ + if(d[0]==129U || d[0]==130U) return setp_deif_start(s,now,d[0]==129U); /* Два вида сброса различаются сохранением прикладных данных. */ + if(d[0]==1U || d[0]==2U || d[0]==128U) { s->nmt=d[0]==1U?5U:d[0]==2U?4U:127U; s->auto_at=0; return 1; } return 0; /* Явная NMT-команда отменяет отложенный self-start. */ + } /* Остальные служебные кадры не являются измерениями. */ + if(s->services && id==0x600U+s->node && n==8U && (s->nmt==5U || s->nmt==127U)) return sdo(s,d,now); /* SDO доступен в Operational и Pre-operational. */ + if(s->nmt!=5U || n!=8U) return 0; kind=setp_deif_inspect(id,d,n,0,m); if(kind!=1 && kind!=3 && kind!=-6) return 0; /* Явная пользовательская привязка разрешает неизвестный каталогу I16, но не неверную адресацию. */ + dam=(unsigned)m[8]; if(dam) { if(s->node && (unsigned)m[1]!=s->node) return 0; if(!s->node && id!=s->monitor_id) return 0; if(s->services && id!=(s->pdo+1U)*0x100U+s->node) return 0; } /* Без заданного физического Node пассивный монитор сохраняет точную привязку CAN ID и селектора. */ + else if(s->services ? (!s->xdi || m[1]>=127) : id!=s->monitor_id) return 0; /* Пассивный монитор сохраняет точную настройку CAN ID, CANopen без XDi-net игнорирует SAM. */ + if(kind==3 && s->services && s->group && (unsigned)m[2]==0x3500U+s->group) { if(d[5]||d[6]||d[7] || ((m[3]==2 && d[4]>100U)||(m[3]==3 && d[4]>2U))) return 0; if(m[3]==2) s->brightness=d[4]; else s->palette=d[4]; s->accepted++; return 1; } /* Яркость и Color не продлевают свежесть измерений. */ + if(d[6]||d[7]) return 0; for(f=0;ffield[f].bound && !memcmp(s->field[f].selector+1,d+1,3) && ((dam && s->node) || s->field[f].selector[0]==d[0])) { store(&s->field[f],m[4],now); changed=1; } /* DAM без настроенного физического получателя не превращается в приём всех узлов сети. */ + if(changed) s->accepted++; return changed; /* Приём PDO не создаёт выдуманного ответного PDO. */ +} /* Словарь прикладных значений не зависит от способа доставки кадра. */ +size_t setp_deif_poll(void *p,uint64_t now,setp_deif_frame_t *o,size_t cap) { /* Таймеры используют только переданные портом монотонные часы. */ + deif_state *s=context(p); size_t count; uint8_t state; unsigned lost; if(!s || !s->active || !s->services) return 0; /* Пассивное наблюдение не передаёт ничего в сеть. */ + if(s->auto_at && now>=s->auto_at) { s->nmt=5; s->auto_at=0; } /* Стандартный self-start заканчивается через 1000 мс. */ + if(s->heartbeat && now>=s->last_hb && now-s->last_hb>=s->heartbeat) { state=(uint8_t)s->nmt; event(s,0x700U+s->node,&state,1); s->last_hb=now; } /* После задержки создаётся один актуальный heartbeat без пачки пропущенных тиков. */ + lost=setp_deif_lost(s,now)!=0; if(s->nmt==5U && lost!=s->error) { uint8_t emcy[8]={0}; if(lost) { emcy[1]=0x81; emcy[2]=0x81; emcy[3]=6; } event(s,0x80U+s->node,emcy,8); s->error=lost; } /* Appendix 5: Data lost 0x8100/0x81/0x06 и нулевой Error reset. */ + count=s->queuedqueued:cap; if(!o || !count) return 0; memcpy(o,s->queue,count*sizeof(*o)); s->queued-=(unsigned)count; memmove(s->queue,s->queue+count,s->queued*sizeof(*o)); return count; /* Непоместившиеся события сохраняются для следующего вызова. */ +} /* Владение выходным буфером остаётся у Python/JNI/MCU. */ +int setp_deif_read(void *p,unsigned f,uint64_t now,unsigned expiry,double *value,int64_t *m) { /* Возвращает данные без подмены ошибочного кода числом. */ + deif_state *s=context(p); deif_binding *b; unsigned flags=0; if(!s || f>=DEIF_FIELDS || !value || !m) return 0; b=&s->field[f]; /* Границы поля проверяются до доступа к массиву. */ + if(b->bound && b->received) { flags=1U; if(!b->status) flags|=2U; if(expiry && now>=b->seen && now-b->seen>expiry) flags|=4U; } /* Пассивный UI скрывает данные через пять секунд, сервер хранит последнее значение для мигания. */ + *value=b->raw*b->scale; m[0]=(int64_t)b->seen; m[1]=b->raw; m[2]=b->status; m[3]=flags; return (int)flags; /* Разрешение применяется в единственном общем ядре. */ +} /* Метаданные позволяют отличить invalid от устаревания и отсутствия кадра. */ +int setp_deif_angle(void *p,uint64_t now,unsigned expiry,double *v) { /* Единое правило выбора азимута для Desktop и Android. */ + deif_state *s=context(p); int64_t m[4]; unsigned f,kind; int flags; if(!s || !v) return 0; f=s->field[2].received?2U:5U; kind=f==5U || s->field[2].selector[3]==7U?2U:1U; /* До первого фактического кадра используется только принятое сетевое задание с явной пометкой. */ + flags=setp_deif_read(s,f,now,expiry,v,m); return (flags&2) && !(flags&4) ? (int)kind : 0; /* Ошибочное фактическое сообщение не заменяется старым заданием. */ +} /* Черновиков GUI в этом API нет. */ +int setp_deif_meta(void *p,int64_t *o) { /* Копирует скалярный снимок без раскрытия private-layout состояния. */ + deif_state *s=context(p); if(!s || !o) return 0; o[0]=s->active; o[1]=s->nmt; o[2]=(int64_t)s->started; o[3]=(int64_t)s->last_hb; o[4]=s->heartbeat; o[5]=s->accepted; o[6]=s->group; o[7]=s->brightness; o[8]=s->palette; o[9]=s->error; return 1; /* Индексы массива документированы в публичном заголовке. */ +} /* API пригоден для прямого буфера JNI и ctypes без платформенных зависимостей. */ diff --git a/c/set-protocol/src/set_signal.c b/c/set-protocol/src/set_signal.c index 96a0533..e6d80f8 100644 --- a/c/set-protocol/src/set_signal.c +++ b/c/set-protocol/src/set_signal.c @@ -33,9 +33,9 @@ static double evaluate(double t,const double *x,const double *y,size_t n, return (2*u*u*u-3*u*u+1)*y[i]+(u*u*u-2*u*u+u)*h*d[i] +(-2*u*u*u+3*u*u)*y[i+1]+(u*u*u-u*u)*h*d[i+1]; } -int set_signal_reconstruct(const double *input_x,const double *input_y,size_t count, - int method,unsigned degree,size_t output_count,int endpoint,double *out_x, - double *out_y,double *meta,double *work,size_t work_count) { +int set_signal_reconstruct_with_fit(const double *input_x,const double *input_y,size_t count, /* Общая подготовка данных обслуживает исходный и подключаемый решатели. */ + int method,unsigned degree,size_t output_count,int endpoint,double *out_x, /* Метод, степень и временная сетка сохраняют контракт существующего API. */ + double *out_y,double *meta,double *work,size_t work_count,set_signal_fit_fn fit) { /* NULL выбирает прежний МНК; другой callback получает уже нормированные данные. */ point *pairs; double *x,*y,*d,*h,*s,*q,*column; double coef[6]={0},r[6][6]={{0}},origin,span,scale=1,rmse=0; size_t i,j,k,n=0; unsigned pass; @@ -65,6 +65,10 @@ int set_signal_reconstruct(const double *input_x,const double *input_y,size_t co } if(method==SET_SIGNAL_POLYNOMIAL) { if(degree<1||degree>5||n<=degree) return 1; + if(fit) { /* Подключаемый решатель заменяет только вычисление коэффициентов МНК. */ + int status=fit(x,y,n,degree,coef); /* Передаём уникальные нормированные точки и массив до шести коэффициентов. */ + if(status) return status; /* Ошибка ранга или памяти возвращается явно, без скрытого перехода на другой решатель. */ + } else { /* Исходный алгоритм остаётся неизменным вариантом для сравнения и прошивок. */ for(j=0;j<=degree;++j) { double norm=0; for(i=0;i2) { @@ -112,6 +117,11 @@ int set_signal_reconstruct(const double *input_x,const double *input_y,size_t co meta[0]=(double)count; meta[1]=(double)n; meta[2]=sqrt(rmse)*scale; return isfinite(meta[2])?0:2; } +int set_signal_reconstruct(const double *input_x,const double *input_y,size_t count, /* Сохраняем прежний экспорт и поведение всех существующих клиентов. */ + int method,unsigned degree,size_t output_count,int endpoint,double *out_x, /* Параметры передаются без изменения единиц времени и амплитуды. */ + double *out_y,double *meta,double *work,size_t work_count) { /* Владение выходами и рабочим буфером по-прежнему остаётся у вызывающего. */ + return set_signal_reconstruct_with_fit(input_x,input_y,count,method,degree,output_count,endpoint,out_x,out_y,meta,work,work_count,NULL); /* NULL выбирает исходный двухпроходный МНК без зависимости от C++. */ +} /* Завершаем совместимую обёртку исходного C ABI. */ int set_signal_dac12(const double *volts,size_t count,double vref,uint16_t *codes) { size_t i; if(!volts||!codes||count<2||count>10000||!isfinite(vref)||vref<=0) return 1; diff --git a/c/set-protocol/tests/fixtures/deif-xdi-v1.tsv b/c/set-protocol/tests/fixtures/deif-xdi-v1.tsv new file mode 100644 index 0000000..3f8633e --- /dev/null +++ b/c/set-protocol/tests/fixtures/deif-xdi-v1.tsv @@ -0,0 +1,15 @@ +# COB-ID payload flags result RAW index subindex +201 0101300784030000 0 1 900 3001 7 +201 0101300284030000 0 1 900 3001 2 +201 0181300239FC0000 0 1 -967 3081 2 +201 0191300203FE0000 0 1 -509 3091 2 +201 01213402CEF70000 0 1 -2098 3421 2 +201 01313402D4FE0000 0 1 -300 3431 2 +30D 8D01300784030000 0 1 900 3001 7 +201 0101300784030000 1 -1 0 0 0 +201 0101300784030000 2 -1 0 0 0 +202 0101300784030000 0 -5 900 3001 7 +201 0181 0 -4 0 0 0 +701 05 0 2 0 0 0 +70D 00 0 2 0 0 0 +70D 7F 0 2 0 0 0 diff --git a/c/set-protocol/tests/test_deif_xdi.c b/c/set-protocol/tests/test_deif_xdi.c new file mode 100644 index 0000000..39b253c --- /dev/null +++ b/c/set-protocol/tests/test_deif_xdi.c @@ -0,0 +1,26 @@ +#include "deif_xdi.h" /* Эталонные векторы проверяют непосредственно единственное C-ядро. */ +#include /* Любое расхождение байтов или сроков делает тест неуспешным. */ +#include /* Файловый ввод нужен только хостовому тесту, не переносимому ядру. */ +#include /* Выравнивание контекста обеспечивает стандартный хостовый allocator. */ +#include /* Сравниваются точные CAN-последовательности. */ +int main(int argc,char **argv) { /* Один набор векторов используется также Python и Android/JVM. */ + FILE *input; char line[160],hex[17]; unsigned id,flags,index,sub,byte,i; int expected,raw; int32_t meta[12]; uint8_t data[8]; size_t n; void *state; double value; setp_deif_frame_t out[16]; /* Все размеры ограничены форматом Classic CAN и ABI. */ + assert(argc==2); input=fopen(argv[1],"r"); assert(input); /* Путь fixtures передаётся сборщиком без зависимости от cwd. */ + while(fgets(line,sizeof line,input)) { /* Таблица содержит положительные и ошибочные кадры. */ + if(line[0]=='#') continue; assert(sscanf(line,"%x %16s %u %d %d %x %x",&id,hex,&flags,&expected,&raw,&index,&sub)==7); /* Это чтение текстовой fixture, а не второй CAN-декодер. */ + n=strlen(hex)/2U; for(i=0;i None: import_library = build_dir / "setprotocol.lib" jni_flags = " ".join(f'/I"{path}"' for path in JNI_INCLUDES) command = ( - f'call "{vcvars}" && cl /nologo /W4 /std:c11 ' + f'call "{vcvars}" && cl /nologo /W4 /O2 /std:c11 ' # Оптимизируем исходный C-решатель, чтобы сравнение с оптимизированным Eigen не измеряло различие режимов компиляции. f'/DPCAN_ABI_BUILD_DLL /I"{INCLUDE}" {jni_flags} /LD {quoted_sources} ' f'/Fe"{output}" /link /IMPLIB:"{import_library}"' ) @@ -74,7 +74,7 @@ def _build_cc(output: Path, build_dir: Path) -> None: compiler = shutil.which("cc") or shutil.which("clang") or shutil.which("gcc") if compiler is None: raise SystemExit("C compiler was not found") - command = [compiler, "-std=c99", "-Wall", "-Wextra", "-Wpedantic", + command = [compiler, "-O2", "-std=c99", "-Wall", "-Wextra", "-Wpedantic", # Одинаковая оптимизация C99 и C++ делает время настольных вариантов сопоставимым. "-fPIC", "-shared", f"-I{INCLUDE}", *(f"-I{path}" for path in JNI_INCLUDES), *map(str, SOURCES), "-o", str(output), "-lm"] @@ -94,6 +94,7 @@ def main() -> int: SOURCES.extend([ ROOT / "ports" / "android" / "set_plot_jni.c", ROOT / "ports" / "android" / "setprotocol_jni.c", + ROOT / "ports" / "android" / "set_deif_jni.c", # JVM-тесты вызывают тот же DEIF-автомат, что Android NDK и ctypes. ]) output = args.output.resolve() output.parent.mkdir(parents=True, exist_ok=True) diff --git a/c/st7789/st7789_disabled.h b/c/st7789/st7789_disabled.h new file mode 100644 index 0000000..c2e770c --- /dev/null +++ b/c/st7789/st7789_disabled.h @@ -0,0 +1,6 @@ +#ifndef ST7789_DISABLED_H /* Защищает отключённый аппаратный интерфейс от повторного включения. */ +#define ST7789_DISABLED_H /* Позволяет общему main обслуживать одинаковый API на плате без подключённого дисплея. */ +#include /* Время общего опроса передаётся как 32-битное число миллисекунд. */ +static inline void ST7789_BoardInit(void) { } /* Профиль без дисплея не включает SPI и не занимает GPIO, сохраняя работу всех моделей DEIF. */ +static inline void ST7789_BoardPoll(uint32_t now_ms) { (void)now_ms; } /* Опрос без экрана не блокирует UART/CAN/USB и не требует графических исходников в прошивке. */ +#endif /* Завершает отключённый backend общего интерфейса дисплея. */ diff --git a/cpp/signal-eigen/README.md b/cpp/signal-eigen/README.md new file mode 100644 index 0000000..e58bb82 --- /dev/null +++ b/cpp/signal-eigen/README.md @@ -0,0 +1,50 @@ +# Альтернативный МНК Eigen QR + +Необязательный настольный модуль выполняет полиномиальный МНК через +`Eigen::ColPivHouseholderQR`. Исходный двухпроходный решатель остаётся вариантом +по умолчанию. Прошивки и основная SETProtocol DLL продолжают собираться как C99. + +Путь вызова: GUI → Python/ctypes → `setsignal_eigen` → общая подготовка +`set_signal.c` → callback Eigen → общие вычисление кривой и RMSE. +Сортировка, усреднение повторов X, нормировка, сетка, рабочий буфер и аннотации +формул совпадают у обоих вариантов. Порог ранга Eigen относительный: `1e-12`; +он может иначе классифицировать пограничные данные, чем исходная ортогонализация. +Модуль не зависит от Qt и не участвует в обмене с устройствами. + +| Файл | Назначение и зависимости | +| --- | --- | +| `signal_eigen.cpp` | Решатель QR и экспорт `set_signal_reconstruct_eigen`; C++14, Eigen, `set_signal.h` | +| `build.py` | Сборка DLL/SO, проверка и распаковка локального архива; Python 3.8+ и C/C++ компиляторы | +| `vendor/eigen-3.4.0.tar.gz` | Оригинальный архив зависимости, без изменений | +| `../../python/set_devices/signal_eigen.py` | Ленивый ctypes-загрузчик отдельного компонента | + +Зависимость: [Eigen 3.4.0, официальный архив](https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.tar.gz). +SHA-256: `8586084f71f9bde545ee7fa6d00288b264a2b7ac3607b974e54d13e7162c1c72`. +Заголовки компилируются с `EIGEN_MPL2_ONLY`; `Eigen-COPYING.MPL2` копируется +рядом с библиотекой и включается в пакет SETGUI. Сборка не требует интернета. + +Из каталога SETGUI: + +```powershell +.venv/Scripts/python.exe third_party/templates/cpp/signal-eigen/build.py --output src/gui_desktop/native/setsignal_eigen.dll # Собираем 64-битный настольный компонент рядом с основной DLL. +``` + +Для 32-битного приложения добавьте `--arch x86`. Компилятор C обрабатывает +общий алгоритм отдельно от C++14-решателя. Windows-модуль использует статический +CRT и PE-подсистему 6.01; работоспособность на самой Windows 7 требует проверки +на соответствующей машине. Для Linux/macOS укажите имя `libsetsignal_eigen.so` +или `libsetsignal_eigen.dylib`. `scripts/build_exe.py` собирает и упаковывает +компонент автоматически, включая вариант Windows 7 x86. + +Контракт `set_signal_fit_fn` описан в `c/set-protocol/include/set_signal.h`: +callback получает уникальные нормированные X/Y, количество точек и степень 1…5, +возвращает коэффициенты по возрастанию степеней аргумента `2*x-1`. +Владение выходами остаётся у вызывающего; Eigen выделяет временные матрицы +только в настольном порте. Коды ошибок: 0 — успех, 1 — параметры, 2 — нечисловой +результат, 3 — недостаточный ранг, 5 — память/ошибка C++-решателя. +Исключения не пересекают C ABI. Общих изменяемых рабочих буферов нет. + +Загрузчик ищет компонент рядом с выбранной SETProtocol DLL. Переменная +`SETSIGNAL_EIGEN_LIBRARY` позволяет явно задать путь для тестов. Отсутствующая +библиотека вызывает понятную ошибку после выбора Eigen; скрытой замены +на исходный решатель нет. Используется в обработке графиков и генераторе SETGUI. diff --git a/cpp/signal-eigen/build.py b/cpp/signal-eigen/build.py new file mode 100644 index 0000000..45148fb --- /dev/null +++ b/cpp/signal-eigen/build.py @@ -0,0 +1,63 @@ +import argparse # Разбираем путь выходной библиотеки и целевую архитектуру настольной сборки. +import hashlib # Проверяем закреплённый архив Eigen перед использованием заголовков. +import os # Находим стандартный каталог установщика Visual Studio в Windows. +from pathlib import Path # Разрешаем пути независимо от текущего рабочего каталога сборки. +import platform # Выбираем расширение библиотеки и инструментарий целевой ОС. +import shutil # Находим доступный системный компилятор для Unix-подобных ОС. +import subprocess # Запускаем компиляторы с проверкой кода завершения. +import tarfile # Читаем заголовки и лицензии из проверенного архива без сетевого доступа. + +ROOT = Path(__file__).resolve().parent # Все исходники и закреплённая зависимость расположены рядом со скриптом. +CORE = ROOT.parents[1] / "c" / "set-protocol" # Подключаем исходный C99-алгоритм из того же репозитория, не создавая его копию. +SHA256 = "8586084f71f9bde545ee7fa6d00288b264a2b7ac3607b974e54d13e7162c1c72" # Контрольная сумма официального архива Eigen 3.4.0 из GitLab. + +def headers(directory): # Подготавливаем только необходимые заголовки и лицензии в каталоге конкретной сборки. + archive = ROOT / "vendor" / "eigen-3.4.0.tar.gz" # Закреплённый архив позволяет собирать EXE без скачивания зависимостей. + if hashlib.sha256(archive.read_bytes()).hexdigest() != SHA256: # Повреждённая или подменённая зависимость не должна попадать в бинарный модуль. + raise RuntimeError("Неверная SHA-256 архива Eigen 3.4.0") # Останавливаем сборку с явным указанием нарушенной проверки. + destination = directory / "eigen-3.4.0" # Раздельный каталог исключает пересечение разных целевых сборок. + with tarfile.open(archive, "r:gz") as source: # Читаем gzip-архив штатной библиотекой Python, совместимой с Python 3.8. + for member in source.getmembers(): # Рассматриваем каждый элемент, но не используем небезопасную полную распаковку архива. + parts = Path(member.name).parts[1:] # Удаляем единственный верхний каталог официального дистрибутива. + if not member.isfile() or not parts or any(part in ("..", "/", "\\") for part in parts): # Разрешаем только обычные файлы с безопасным относительным путём. + continue # Пропускаем ссылки, каталоги и элементы, способные выйти за корень распаковки. + if parts[0] != "Eigen" and not parts[0].startswith("COPYING"): # Для QR достаточно основного дерева Eigen и его лицензионных файлов. + continue # Примеры, тесты и неподдерживаемые модули не нужны при сборке приложения. + target = destination.joinpath(*parts) # Сохраняем исходное расположение внутренних include относительно корня Eigen. + target.resolve().relative_to(destination.resolve()) # Дополнительно проверяем итоговый абсолютный путь перед записью. + target.parent.mkdir(parents=True, exist_ok=True) # Создаём только каталог текущего безопасного файла. + with source.extractfile(member) as content: # Открываем содержимое обычного файла внутри проверенного архива. + target.write_bytes(content.read()) # Сохраняем оригинальные заголовки без изменения стороннего кода. + return destination # Возвращаем корень, который компилятор должен добавить в include-пути. + +def build(output, arch): # Собираем отдельный модуль, сохраняя основное C99-ядро без зависимости от C++. + output = output.resolve() # Абсолютный путь надёжен при смене рабочего каталога компилятора. + directory = output.parent / (".signal-eigen-" + arch) # Объектные файлы x86 и x64 не смешиваются. + directory.mkdir(parents=True, exist_ok=True) # Создаём каталог выходной библиотеки и промежуточных файлов. + include = headers(directory) # Проверяем архив и получаем локальные заголовки Eigen до запуска компилятора. + if platform.system() == "Windows": # На Windows используем тот же установленный MSVC, что основная DLL. + vswhere = Path(os.environ.get("ProgramFiles(x86)", r"C:\Program Files (x86)")) / "Microsoft Visual Studio/Installer/vswhere.exe" # Стандартный путь установщика соответствует основному сборщику SETGUI. + installation = subprocess.check_output([str(vswhere), "-latest", "-products", "*", "-requires", "Microsoft.VisualStudio.Component.VC.Tools.x86.x64", "-property", "installationPath"], text=True).strip() # Находим установку с компиляторами C/C++ для обеих архитектур. + if not installation: # Пустой ответ означает отсутствие подходящего инструментария. + raise RuntimeError("Не найдены Visual Studio C++ Build Tools") # Сообщаем причину вместо создания приложения без выбранного варианта Eigen. + vcvars = Path(installation) / "VC/Auxiliary/Build" / ("vcvars32.bat" if arch == "x86" else "vcvars64.bat") # Настраиваем среду именно под разрядность Python и EXE. + common = ["cl", "/nologo", "/O2", "/MT", "/DPCAN_ABI_BUILD_DLL", "/I" + str(CORE / "include")] # Оба варианта C и Eigen используют оптимизацию и статический CRT без новой зависимости от установленного runtime. + commands = [common + ["/std:c11", "/c", str(CORE / "src/set_signal.c"), "/Fo" + str(directory / "signal.obj")], common + ["/std:c++14", "/EHsc", "/I" + str(include), "/c", str(ROOT / "signal_eigen.cpp"), "/Fo" + str(directory / "eigen.obj")], ["link", "/nologo", "/DLL", "/MACHINE:" + arch.upper(), "/SUBSYSTEM:WINDOWS,6.01", "/OUT:" + str(output), str(directory / "signal.obj"), str(directory / "eigen.obj")]] # Отдельно компилируем C99 и C++, а PE-подсистему закрепляем на Windows 7 (6.01). + for command in commands: # Последовательные этапы используют только готовые объектные файлы предыдущих команд. + subprocess.run('call "%s" && %s' % (vcvars, subprocess.list2cmdline(command)), cwd=directory, shell=True, check=True) # Batch-настройка MSVC и компилятор выполняются в одном процессе cmd. + else: # Настольные Linux/macOS используют системные C/C++-компиляторы и тот же исходный алгоритм. + cc, cxx = shutil.which("cc"), shutil.which("c++") # C-исходник компилируем как C99, а Eigen исключительно как C++14. + if not cc or not cxx: # Обе стадии необходимы для сохранения языковой границы общего ядра. + raise RuntimeError("Нужны компиляторы C и C++") # Отсутствие инструментария не приводит к скрытому отключению Eigen. + subprocess.run([cc, "-O2", "-std=c99", "-fPIC", "-I" + str(CORE / "include"), "-c", str(CORE / "src/set_signal.c"), "-o", str(directory / "signal.o")], check=True) # Получаем позиционно-независимый объект оригинального C99-ядра. + subprocess.run([cxx, "-O2", "-std=c++14", "-fPIC", "-shared", "-I" + str(CORE / "include"), "-I" + str(include), str(ROOT / "signal_eigen.cpp"), str(directory / "signal.o"), "-o", str(output)], check=True) # Линкер C++ добавляет свою стандартную библиотеку к общему настольному модулю. + for name in ("COPYING.MPL2",): # Распространяем основной текст лицензии вместе с бинарным компонентом. + shutil.copyfile(include / name, output.parent / ("Eigen-" + name)) # Имя явно указывает, к какой встроенной библиотеке относится лицензия. + print(output) # Показываем точный путь успешно собранного компонента для журналов сборки. + +if __name__ == "__main__": # CLI используется как вручную, так и сборщиком EXE. + parser = argparse.ArgumentParser(description="Сборка альтернативного МНК Eigen QR") # Объясняем назначение отдельного настольного модуля. + parser.add_argument("--output", type=Path, required=True) # Вызывающий определяет выходной путь и расширение DLL/SO. + parser.add_argument("--arch", choices=("x86", "x64"), default="x64") # Windows 7 x86 явно выбирает 32-битный PE вместо значения по умолчанию. + arguments = parser.parse_args() # Проверяем обязательные параметры до работы с файловой системой. + build(arguments.output, arguments.arch) # Полностью выполняем сборку либо завершаем процесс исключением и ненулевым кодом. diff --git a/cpp/signal-eigen/signal_eigen.cpp b/cpp/signal-eigen/signal_eigen.cpp new file mode 100644 index 0000000..6508542 --- /dev/null +++ b/cpp/signal-eigen/signal_eigen.cpp @@ -0,0 +1,40 @@ +#define EIGEN_MPL2_ONLY // Ограничиваем подключаемые части Eigen лицензией MPL-2.0. +#include // Подключаем QR с выбором ведущего столбца для полиномиального МНК. +#include // Проверяем конечность вычисленных коэффициентов перед передачей в C. +#include // Перехватываем ошибку выделения памяти внутри границы C ABI. +#include "set_signal.h" // Используем общую подготовку точек, вычисление кривой и стабильный C ABI. + +static int eigen_fit(const double *x,const double *y,size_t count,unsigned degree,double *coefficients) { // Вычисляем только коэффициенты по уже нормированным уникальным точкам. + try { // Исключения C++ не должны пересекать границу ctypes или C-ядра. + Eigen::MatrixXd design(count,degree+1); // Матрица имеет одну строку на точку и до шести степеней, включая свободный член. + for(size_t i=0;i qr(design); // Используем отражения Хаусхолдера с перестановкой столбцов вместо собственной ортогонализации. + qr.setThreshold(1e-12); // Относительный порог ранга соответствует порядку допуска исходного решателя; он не является абсолютной погрешностью сигнала. + if(qr.rank()!=static_cast(degree+1)) return 3; // Отклоняем вырожденный базис, не выдавая неоднозначные коэффициенты за корректную кривую. + Eigen::Map values(y,count); // Читаем нормированные амплитуды из памяти C без дополнительного копирования входного вектора. + Eigen::VectorXd solution=qr.solve(values); // Находим минимум суммы квадратов без формирования нормальных уравнений AᵀA. + for(unsigned j=0;j<=degree;++j) { // Возвращаем степени в исходном порядке: Eigen отменяет перестановку столбцов при solve. + if(!std::isfinite(solution[j])) return 2; // Не разрешаем NaN или бесконечности попасть в оценку кривой и RMSE. + coefficients[j]=solution[j]; // Передаём коэффициент в буфер общего C-алгоритма вычисления полинома. + } // Весь выходной полином проверен до передачи управления C-ядру. + return 0; // Сообщаем общий для двух реализаций код успешного расчёта. + } catch(const std::bad_alloc &) { // Преобразуем нехватку памяти необязательного настольного решателя в детерминированный код. + return 5; // Код 5 обозначает невозможность выполнить расчёт, включая выделение матриц. + } catch(...) { // Защищаем потребителей C ABI от остальных исключений библиотеки C++. + return 5; // Возвращаем явную ошибку без подмены выбранного пользователем решателя. + } // Завершаем защиту границы между C++ и C. +} // Решатель не хранит глобальных данных и допускает независимые параллельные вызовы. + +extern "C" PCAN_ABI_API int set_signal_reconstruct_eigen( // Отдельный экспорт сохраняет возможность загрузить модуль без изменения основной DLL. + const double *x,const double *y,size_t count,int method,unsigned degree, // Формат точек и предел степени совпадают с исходным API. + size_t output_count,int endpoint,double *out_x,double *out_y, // Временная сетка и включение конечной точки рассчитываются общим C-ядром. + double *meta,double *work,size_t work_count) { // Метаданные и рабочая память сохраняют формат аннотаций формулы GUI. + if(method!=SET_SIGNAL_POLYNOMIAL) return 1; // Eigen доступен только для МНК; остальные методы не маскируются под альтернативный решатель. + return set_signal_reconstruct_with_fit(x,y,count,method,degree,output_count,endpoint,out_x,out_y,meta,work,work_count,eigen_fit); // Повторно используем C99-подготовку, обработку повторов, вычисление кривой и RMSE. +} // Завершаем экспорт с соглашением вызова C для x86 и x64. diff --git a/cpp/signal-eigen/vendor/eigen-3.4.0.tar.gz b/cpp/signal-eigen/vendor/eigen-3.4.0.tar.gz new file mode 100644 index 0000000..20635de Binary files /dev/null and b/cpp/signal-eigen/vendor/eigen-3.4.0.tar.gz differ diff --git a/doc/setcan/DEVICE_REGISTRY.md b/doc/setcan/DEVICE_REGISTRY.md index 62df0ec..0310d45 100644 --- a/doc/setcan/DEVICE_REGISTRY.md +++ b/doc/setcan/DEVICE_REGISTRY.md @@ -7,11 +7,24 @@ Device Name — отображаемое имя адреса, а не допол | DeviceType | DeviceID | Device Name | Назначение | |---|---|---|---| | `0x0` | существующие | Верхний уровень | Существующие адреса исходной таблицы | -| `0x3` | `0x7` | **F28335-M95M02** | Загрузка прошивки по ProtoCAN в EEPROM M95M02 платы TMS320F28335; ProductType `0x2833` | +| `0x1` | `0x0…0xF` | PERIPH 0–15 | Первая группа периферии по обновлённому листу «Интерфейс протокола» | +| `0x2` | `0x0…0xF` | PERIPH 16–31 | Вторая группа; номер PERIPH = 16 + DeviceID | +| `0x1` | `0x5` | **УМП1** | PERIPH 5, собственный адрес обычного обмена ProtoCAN и загрузчика | +| `0x1` | `0x6` | **УМП2** | PERIPH 6, отдельный от УМП1 и задатчика адрес | +| `0x1` | `0x8` | **Задатчик** | PERIPH 8; для ПМ35 с M95M02 сохраняется ProductType `0x2833` | | `0x6` | `0xE` | **Altera Logic** | Онлайн-анализатор 16 цифровых каналов | | `0x7` | `0xD` | configurator | Существующий конфигуратор | | `0x7` | `0xF` | KONOR / SETTINGS | Существующий профиль SETCAN и привязка датчиков | +Источник PERIPH: [Протокол CAN и ОАП.xlsx](Протокол%20CAN%20и%20ОАП.xlsx), +лист «Интерфейс протокола», A44:F79. Формула: Type = 1 + ID PERIPH / 16 +(целая часть), DeviceID = ID PERIPH mod 16. Зарезервированные номера не получают +назначений по аналогии со старым Бальзам CAN. Общий Boot-адрес `3/7` отменён. +В ПМ35 приложение использует аппаратный Mode, постоянный загрузчик читает те же +GPIO21/20/22/51; на существующей плате четыре перемычки задают номера 1–16. +Для номеров 0 и 17–31 требуется соответствующий источник аппаратного номера. +Старые CAN ID `0x00BA0007`/`0x00BA0017` задатчика остаются отдельным legacy-форматом. + Для Altera Logic выбран предпоследний тип `0x6` и предпоследний экземпляр `0xE`: эта пара не была назначена в проверенных локальных таблицах и исходниках. Тип `0x7` уже используется. Наличие другого физического узла с тем же адресом diff --git a/doc/setcan/Протокол CAN и ОАП.md b/doc/setcan/Протокол CAN и ОАП.md index 171ec3b..1bf995f 100644 --- a/doc/setcan/Протокол CAN и ОАП.md +++ b/doc/setcan/Протокол CAN и ОАП.md @@ -2,6 +2,13 @@ Таблицы перенесены из `Протокол CAN и ОАП.xlsx`. Цвета, объединённые ячейки и структура листов сохранены средствами HTML внутри Markdown. +Адреса PERIPH обновлены по листу «Интерфейс протокола», A44:F79: +Type `0x01` содержит PERIPH 0–15, Type `0x02` — PERIPH 16–31; +Device ID равен младшим четырём битам номера PERIPH. +УМП1 — `0x01/0x05`, УМП2 — `0x01/0x06`, задатчик — `0x01/0x08`. +Остальные 29 номеров зарезервированы. Общий Boot-адрес `0x03/0x07` отменён. +Полный [реестр назначений](DEVICE_REGISTRY.md) применяется и к загрузчику, и к GUI. + - [Интерфейс протокола](#sheet-protocol) - [Общее адресное пространство](#sheet-oap) - [Прошивка приборов по CAN](#can-firmware) @@ -576,8 +583,8 @@ CRC32 обнаруживает случайное повреждение, но 0x1. Стандартный 0х1. Устройство -0x1 -0x0 - 0xF устройств +0x01 PERIPH +0x0–0xF; PERIPH 0–15
0x5: УМП1; 0x6: УМП2; 0x8: Задатчик 0x1. Запрос на вкл/выкл Выбор "страницы" из 64 устройств (Битовые флаги в Data)   @@ -588,8 +595,8 @@ CRC32 обнаруживает случайное повреждение, но     -0x2 -0x0 - 0xF устройств +0x02 PERIPH +0x0–0xF; PERIPH 16–31 0x2. Рестарт устройств Выбор "страницы" из 64 устройств (Битовые флаги в Data)   @@ -601,7 +608,7 @@ CRC32 обнаруживает случайное повреждение, но     0x3 -0x0 - 0xF устройств
0x7: F28335-M95M02
ProductType: 0x2833 +0x0 - 0xF устройств; прежнее общее назначение F28335 3/7 отменено 0x3. Установка времени     diff --git a/doc/setcan/Протокол CAN и ОАП.xlsx b/doc/setcan/Протокол CAN и ОАП.xlsx index 0ce7a42..755653f 100644 Binary files a/doc/setcan/Протокол CAN и ОАП.xlsx and b/doc/setcan/Протокол CAN и ОАП.xlsx differ diff --git a/docs/reference-comparison.md b/docs/reference-comparison.md new file mode 100644 index 0000000..2515734 --- /dev/null +++ b/docs/reference-comparison.md @@ -0,0 +1,210 @@ +# Сравнение сигналов с CSV-эталоном + +Общее ядро `set_devices.signal_reference` и Qt-порт +`set_devices.qt_ports.reference_comparison` сравнивают измеренную запись с +эталоном. Они не импортируют приложение, не выбирают его каталоги и не +требуют конкретного движка отрисовки. Ядро использует только стандартную +библиотеку Python; Qt-порт поддерживает PySide6 и PySide2. + +## Численный API + +`Comparison.analysis` содержит локальный параметрический отчёт: +`summary`, `details`, `attention`, `findings`, `features`, `model_report`. +Он рассчитывается `set_devices.signal_diagnostics` по тому же интервалу, +временному сдвигу и допускам. Исходные метрики используют все общие отсчёты; +объём выборки подбора моделей явно указан в `model_report`. +Добавлено необязательное поле с пустым словарём по умолчанию: прежний +конструктор `Comparison` с пятью аргументами сохраняет совместимость. + +Для одинаковых известных обозначений `Uce`, `Uge`, `Ic` анализ различает +повторные полные переходы, усиленный звон Uce после выключения, отсутствие +переключения, растянутые фронты и временной сдвиг. Общие причины включают +смещение, шум и неопределённое изменение формы. Разные известные физические +каналы, недостаточное число точек и неполное покрытие отражаются в выводе. +На неизвестных каналах аппаратные гипотезы о снаббере и транзисторе не строятся. + +`set_devices.signal_fault_models` подбирает смещение, масштаб, дрейф, +задержку, растяжение фронтов, постоянный уровень, кусочные прерывания и +затухающий отклик RLC. `set_devices.signal_joint_models` добавляет локальную +ВАХ `Uce=U0+Rdiff*Ic`, остаточный ток выключенного состояния и совпадение +провалов управления/проводимости по трём каналам. + +`compare(..., circuit=..., channels=...)` принимает необязательные известные +`inductance_h`, `capacitance_f`, `resistance_ohm` в СИ и словарь связанных +каналов `dict(measured=..., reference=...)`. GUI формирует эти снимки сам. +Однозначность физических имён и единиц проверяется до совместного анализа. + +Глобальные модели сравниваются по BIC общей обучающей выборки и RMSE на +каждой третьей отложенной точке. JSON сохраняет всех конкурентов, число +параметров, формулы, критерии и ограничения. BIC не интерпретируется как +вероятность аппаратного отказа. Без известного элемента R/L/C не выдаются +три произвольных номинала: доступны только LC и R/L последовательного +эквивалента полюсов. + +`ComparisonAnalysis` в `qt_ports.reference_results` показывает одну строку +и кнопку отчёта с таблицей моделей и подробным текстом по образцу Android GUI. Компонент +используется и над исходным графиком, и в полной форме сравнения; изменение +входов, чтение другого эталона и ошибки очищают прежний анализ. JSON-экспорт +обоих видов включает `analysis` рядом с `metrics`. Ядро не использует сеть +или обученную модель; пороги признаков и ограничения указаны в подробностях. + +`Trace(name, times, values)` содержит имя, строго возрастающие временные +метки в миллисекундах и амплитуды в единицах канала. `trace_from_pairs` +создаёт такой снимок из пар `(time_ms, value)`; необязательный `transform` +применяет множитель или иное преобразование амплитуды. + +`read_reference(path, cancel=...)` потоково читает UTF-8 CSV с необязательным +BOM. Первый столбец — `time_ms` либо `timestamp` с ISO-временем и явным +часовым поясом. Остальные столбцы имеют непустые уникальные имена каналов. +Поддерживаются запятая, точка с запятой и табуляция. Пустые ячейки и NaN +сохраняются как пропуски; повторное время, бесконечности и повреждённые +строки отклоняются. + +```python +from set_devices.signal_reference import compare, read_reference, trace_from_pairs # Ядро можно использовать без Qt и графика. +measured = trace_from_pairs('U (V)', [(0., 2.), (1., 4.), (2., 6.)]) # Время задано в миллисекундах, амплитуда — в вольтах. +reference = read_reference('reference.csv')['U (V)'] # Столбец выбирается по полному имени канала. +result = compare(measured, reference, absolute_tolerance=.1, relative_tolerance_pct=2.) # Допуск равен 0,1 В плюс 2% модуля эталона. +print(result.metrics['rmse']) # Показатель рассчитан по всем корректным точкам измерения в общем интервале. +``` + +`compare` возвращает `Comparison`: нормализованные кривые `measured` и +`reference`, остаток `difference`, эталон на сетке остатка `expected` и +словарь `metrics`. Статистика включает покрытие, пропуски, среднее смещение, +MAE, RMSE, СКО без смещения, максимальную ошибку и выходы за допуск. + +Эталон линейно интерполируется на исходную сетку измерения без +экстраполяции и соединения через NaN. Остаток равен измерению минус эталон. +Допуск равен `absolute_tolerance + relative_tolerance_pct / 100 * abs(reference)`; +равенство границе допуска не считается превышением. Экранная децимация +не участвует в расчёте. + +По умолчанию начала записей совмещаются. `align_start=False` сохраняет +различие абсолютных начал; положительный `shift_ms` сдвигает эталон вправо. +`interval=(start_ms, stop_ms)` задаётся от начала измерения, обе границы +включены. Callback `cancel()` прерывает подготовку, чтение и сравнение через +`InterruptedError`. + +## Наложение на существующий график + +Для добавления эталона в уже работающий график используйте +`set_devices.qt_ports.reference_overlay.ReferenceOverlayPanel`. Это +компактные параметры без canvas. Оригинальный график +остаётся у потребителя и продолжает показывать измерение при загрузке и +изменении эталона. + +Конструктор принимает `sources`, `parent`, `source_path` и необязательный +`path_provider` с тем же смыслом, что в таблице ниже. `load_reference(path)` +автоматически читает CSV, совмещает выбранные каналы и рассчитывает показатели +в рабочем потоке. Отдельной кнопки запуска расчёта нет. Изменение канала, +сдвига, совмещения начал или допусков обновляет результат автоматически. + +Сигнал `changed` сообщает потребителю, что `overlay()` вернёт актуальные +спецификации и точки одной дополнительной кривой. Потребитель **добавляет** +их к оригинальным рядам и общей легенде своего canvas. `RESULT_KEY` +отличает эталон от измерений; оранжевая кривая имеет подпись +`Эталон: <канал>`. Временные метки эталона уже находятся в исходной шкале +измерения: начало оригинала не обнуляется. Потребитель применяет своё +перебазирование короткой развёртки к обеим кривым одинаково. + +`set_sources(sources)` обновляет кадр прибора или преобразование амплитуд, +сохраняя загруженный эталон. Сигнал `remove_requested` предлагает владельцу +удалить дополнительный слой и параметры. `report()` и раскрываемая строка +«Допуски и отчёт» предоставляют актуальную статистику и экспорт JSON. +Если общей части времени нет, кривая остаётся доступна, а показатели +заменяются объяснением отсутствия перекрытия. `close()` останавливает worker, +не закрывая график потребителя. + +Истории, переданные в одном снимке `sources`, должны быть неизменяемыми; +для нового кадра передайте новую историю через `set_sources`. Порт +поддерживает PySide6 и PySide2 без импорта приложения. + +### Подробные показатели рядом с исходным графиком + +`ReferenceOverlayPanel.results` — виджет `ComparisonResults` с полной +таблицей всех 14 показателей: покрытие, пропуски, смещение, MAE, RMSE, +СКО, максимум и его время, нормированная ошибка и выходы за допуск. +Потребитель размещает его в существующей боковой области рядом с canvas; +в SETGUI он открывается автоматически во вкладке «Отклонения и расчёты». +Сигнал `results_requested` кнопки «Расчёты» позволяет вернуться к этой +области после выбора обычной легенды. + +Флажок `results.delta_curve` добавляет в `overlay()` кривую с ключом +`DIFFERENCE_KEY`. Её временные метки находятся в той же исходной шкале, +что эталон и оригинал. Исходные кривые сохраняются, отдельный canvas не +создаётся. Кнопка JSON рядом с таблицей экспортирует тот же актуальный +результат. Изменение параметров и ошибки очищают устаревшие показатели. + +`comparison_rows(metrics)` из `qt_ports.reference_results` задаёт единые +подписи, порядок и единицы как для этой таблицы, так и для прежнего диалога. + +## Совместимые Qt-панель и отдельное окно + +`ReferenceComparisonPanel` — обычный `QWidget` для существующей страницы +графика. Кнопка «К записи» испускает `back_requested`; потребитель сам +скрывает панель и возвращает исходный вид. При повторном показе той же +панели сохраняются эталон, параметры и рассчитанные показатели. + +`ReferenceComparisonDialog` — отдельный `QDialog` с тем же расчётом и +настройками. Оба конструктора принимают: + +| Параметр | Контракт | +| --- | --- | +| `sources` | Последовательность пар `(source, points)`: `source.name` — имя, `source.display_value(value)` — преобразование амплитуды, `points` — полная неизменяемая история `(time_ms, value)` | +| `parent` | Родительский QWidget; для встроенной панели передайте страницу графика | +| `source_path` | Происхождение измерения для JSON-отчёта, по умолчанию пустая строка | +| `plot_factory` | Обязательная фабрика без аргументов, возвращающая настроенный QWidget графика | +| `series_factory` | Обязательная фабрика `factory(key, name, color=..., timestamps=..., values=...)`, создающая кривую потребителя | +| `path_provider` | Необязательный callback `filename → начальный путь`; пустое имя используется для открытия эталона, `reference_comparison.json` — для отчёта | + +```python +from set_devices.qt_ports.reference_comparison import ReferenceComparisonPanel # Qt загружается только при импорте конкретного порта. +panel = ReferenceComparisonPanel( # Один компонент обслуживает выбор каналов, параметры, фоновый расчёт и экспорт. + sources=recording_channels, # Потребитель фиксирует полные истории и преобразование амплитуд до создания панели. + parent=chart_page, # Сравнение размещается в существующей рабочей области. + source_path=recording_filename, # Имя исходной записи попадёт в отчёт. + plot_factory=create_comparison_canvas, # Адаптер создаёт график с единой шкалой Y для обеих кривых. + series_factory=create_series, # Контейнеры кривых принадлежат используемому движку отрисовки. + path_provider=recording_path, # Папки и правила хранения остаются политикой потребителя. +) # Все функции и объекты адаптера задаются приложением до этого вызова. +chart_page.layout().addWidget(panel, 1) # Панель занимает свободное место страницы. +panel.back_requested.connect(show_recording) # Обработчик скрывает сравнение и возвращает исходный график. +``` + +Canvas должен предоставлять изменяемый список `_series`, методы +`reset_interaction()`, `_sync_bounds()`, стандартные `update()` и `close()`, +флажки `axis_lock_x` и `axis_lock_y` с `setChecked()`, поле `axis_limits`, +`visible_bounds.left/right` в миллисекундах и `viewport` типа +`protocan.plot.Viewport`. `_sync_bounds()` задаёт конечный ненулевой диапазон +X даже для пустого графика. Обе наложенные кривые используют **одну шкалу Y**; +автоматическое разделение каналов на независимые оси отключает адаптер. +Дополнительные кнопки canvas, подписи и правила снимков также настраиваются +в `plot_factory`. + +Панель передаёт фабрике кривых полные массивы: их экранное сокращение остаётся +ответственностью canvas. Временные поля интерфейса показывают микросекунды, +ядро и JSON-отчёт используют миллисекунды. Явно различающиеся единицы в +скобках имён каналов блокируют сравнение; автоматической конвертации нет. + +Истории и настройки источников нельзя менять, пока панель использует их +снимок. При смене записи или преобразования канала закройте старую панель +и создайте новую. `close()` встроенной панели отменяет и дожидается worker; +уничтожение родителя также останавливает поток до удаления дочерних объектов. +Отдельный диалог откладывает закрытие до завершения кооперативной отмены. + +`load_reference(path)` позволяет открыть эталон программно, `report()` +возвращает актуальный словарь отчёта либо `None`. Изменение входных +параметров очищает старые кривые и показатели до следующего расчёта. + +## Проверки + +`python/tests/test_reference_comparison_port.py` проверяет внедрение +стороннего canvas, преобразование амплитуд, отклонение и экспорт с внешним +provider путей, а также API отдельного диалога. Его можно запустить из +каталога `templates/python` командой +`python -m unittest discover -s tests -p test_reference_comparison_port.py`. + +`python/tests/test_shared_library_boundary.py` проверяет независимость +вычислительных модулей от GUI и Qt. Интеграционные проверки потребителя +дополнительно покрывают полные истории, общий масштаб Y, отмену, смену +записи, возврат к графику и полноэкранный режим. diff --git a/python/README.md b/python/README.md index 30ba13f..0a039f2 100644 --- a/python/README.md +++ b/python/README.md @@ -15,6 +15,10 @@ | `set_devices.qt_ports` | UART/mock, SLCAN, Candle/WinUSB, STM/TMS boot, STM settings, UMP CAN | | `set_devices.plot_processing` | Общий контракт графиков: аппроксимация, интерполяция, восстановление, единицы и CSV через C99 | | `set_devices.qt_ports.plot_processing` | Переиспользуемая панель всех методов, фоновый расчёт и отдельный слой кривой | +| `set_devices.signal_reference` | Сравнение полной записи с CSV-эталоном: совмещение времени, допуски, остаток и показатели ошибки без Qt | +| `set_devices.qt_ports.reference_comparison` | Общие встроенная панель и диалог сравнения, фоновое чтение/расчёт, внедряемые график и папки, JSON-отчёт | +| `set_devices.qt_ports.reference_overlay` | Компактные параметры и автоматически подготовленный эталон для наложения на существующий canvas без создания второго графика | +| `set_devices.qt_ports.reference_results` | Полная таблица отклонений, единое форматирование 14 показателей, флажок кривой Δ и экспорт | | `protocan`, `setprotocol` | Существующие обёртки общего C99-ядра и SET v2 | Импорт `logic_analyzer` / `set_devices` не загружает Qt и не зависит от GUI. @@ -24,6 +28,9 @@ Saleae SDK подключается при обращении к устройс в приложении. Общая панель обработки графиков размещена в `qt_ports.plot_processing`: [контракт, подключение нового графика и примеры](../c/set-protocol/docs/PLOT_PROCESSING.md). +Сравнение с эталоном подключается через фабрики canvas и кривой без +зависимости от приложения: [API ядра, контракт Qt-порта и пример](../docs/reference-comparison.md). + Конструкторы CAN-адаптера, CAN DevBoard и RS485 DevBoard используют общий компонент `set_devices.qt_ports.can_frame_builder.CanFrameFields`. Он задаёт одинаковые поля и исходный режим «Обычный CAN — ID / DLC / Data», сохраняет diff --git a/python/protocan/can_boot.py b/python/protocan/can_boot.py index 46e5a4b..9f9f9e7 100644 --- a/python/protocan/can_boot.py +++ b/python/protocan/can_boot.py @@ -20,6 +20,7 @@ class CanBootTarget: hardware_min: int = 0 hardware_max: int = 255 session_id: int = 1 + memory: str = "eeprom" # Назначение выбирается явно; старые вызовы сохраняют EEPROM A/B и прежний wire-протокол. def __post_init__(self): if not 0 <= self.device_type <= 7 or not 0 <= self.device <= 15: @@ -30,6 +31,10 @@ class CanBootTarget: raise ValueError("Неверный диапазон аппаратных ревизий") if not 1 <= self.session_id <= 255: raise ValueError("Session ID должен быть 1…255") + if self.memory not in ("eeprom", "flash", "stm32") or self.memory == "flash" and self.product_type != 0x2833: # F28335 требует отдельного подтверждения выбора Flash; STM32 использует штатный односекционный поток. + raise ValueError("Внутренняя Flash по CAN доступна только для F28335 / Product Type 0x2833") # Ошибка назначения обнаруживается до первого CAN-кадра. + if self.memory == "stm32" and self.product_type != 0: # BOOT CANdle G474VET6 публикует Product Type 0 в своём аппаратном профиле. + raise ValueError("CANdle G474VET6 требует Product Type 0") # Не допускает случайную передачу образа с ранее выбранным типом платы Бальзам. class CanBootTransfer: @@ -41,6 +46,19 @@ class CanBootTransfer: raise ValueError("F28335 M95M02 A/B: образ не должен превышать 130560 байт") if not 0 <= image.version <= 0xFFFFFFFF: raise ValueError("Версия образа вне диапазона u32") + if target.memory == "stm32": # Односекционная Flash G474 проверяется до первой команды ENTER_BOOT. + from set_devices.mcu_profiles import CANDLE_G474_BOOT # Размер приложения и адрес векторов берутся из общего профиля платы. + profile = CANDLE_G474_BOOT # Границы соответствуют 32 КиБ BOOT и 480 КиБ приложения STM32G474VET6. + if not 8 <= len(image.data) <= profile["app_size"]: # Первые восемь байтов содержат SP и Reset_Handler; запись не должна выходить за Flash. + raise ValueError("CANdle G474VET6: приложение должно занимать 8…491520 байт") # Ошибка обнаруживается до стирания целевого приложения. + sp, pc = struct.unpack_from(" limit: raise RuntimeError("ProtoCAN Boot: подтверждён непереданный блок") - if self.stage == "data" and status == 0 and expected < self.next_block: - return [], "" + # Один и тот же ACK или SEQUENCE_ERROR может прийти от нескольких оставшихся кадров старого окна. + # Повторная отправка на каждый такой ответ переполняет очередь MCU; при отсутствии продвижения + # последнее окно повторяет транспорт по тайм-ауту, а подтверждённые ранее блоки не отправляются заново. + if self.stage == "data" and expected <= self.next_block: # Сравнивает next_block для обоих статусов: OK и SEQUENCE_ERROR не должны повторно открывать одно окно. + return [], "" # Оставляет текущие кадры и срок ожидания транспорта без изменений до нового прогресса или тайм-аута. self.next_block = expected if expected == total: self.stage = "verify" @@ -129,11 +155,15 @@ class CanBootTransfer: return self._window(), "Передача блоков ProtoCAN Boot" if self.stage == "verify": self.stage = "commit" - return self._control(7), "Активация образа" + return self._control(7), "Запись и проверка внутренней Flash" if self.target.memory == "flash" else "Активация образа" # Для Flash COMMIT означает реальный вызов TI API и публикацию FAB1 последней стадией. if self.stage == "commit": self.stage = "reboot" return self._control(9), "Перезапуск прибора" self.stage, self.finished = "finished", True + if self.target.memory == "stm32": # У односекционного STM32 нет EEPROM-кандидата и механизма пробного запуска A/B. + return [], "Flash STM32 записана и проверена; прибор перезапускается" # Успех сообщается после ACK VERIFY, COMMIT и REBOOT обычного протокола. + if self.target.memory == "flash": # Flash не выдаётся за EEPROM-кандидата, которому требуется trial/CONFIRM. + return [], "Внутренняя Flash записана и проверена; прибор перезапускается" # Успех возможен только после итогового ACK COMMIT и ACK REBOOT. if self.target.product_type == 0x2833: return [], "Образ принят; после перезапуска приложение подтвердит пробный запуск" return [], "Прошивка ProtoCAN Boot завершена" diff --git a/python/protocan/f28335_flash.py b/python/protocan/f28335_flash.py new file mode 100644 index 0000000..4fc9984 --- /dev/null +++ b/python/protocan/f28335_flash.py @@ -0,0 +1,99 @@ +import base64 # Декодирует загружаемые секции из официального XML TI OFD, сохраняя адреса LOAD и RUN. +from pathlib import Path # Сохраняет изменения только в явно переданном результате текущей сборки. +import struct # Упаковывает адресуемые 16-битные слова C28x младшей октетой вперёд. +import subprocess # Вызывает локальный инспектор объектных файлов без доступа к JTAG. +import xml.etree.ElementTree as ET # Разбирает фактические секции COFF независимо от соседней карты линкера. +import zlib # CRC32 IEEE совпадает с проверкой постоянного загрузчика и учитывает незаписанные слова 0xFFFF. + +APP_START = 0x300000 # Сектор H начинает область приложения; аппаратный boot остаётся в секторе A. +HEADER_WORDS = 16 # Заголовок версии 1 занимает 16 слов C28x, то есть 32 физических октета. +APP_DATA = APP_START + HEADER_WORDS # Исполняемые секции следуют после служебного заголовка приложения. +APP_STOP = 0x338000 # Исключённая верхняя граница совпадает с началом защищённого сектора A. + + +def descriptor(entry, loaded): # Создаёт проверяемое описание Flash-приложения без сектора постоянного загрузчика. + if not loaded or any(not APP_START <= address < APP_STOP for address in loaded): # Любое слово в секторе A, CSM, OTP или RAM делает образ непригодным для обновления приложения. + raise ValueError('Flash-приложение пересекает защищённый загрузчик или выходит за область 0x300000–0x337FFF') # Отказ происходит до стирания физической памяти. + end = max(loaded) + 1 # Верхняя граница включает все Flash LOAD-секции, в том числе копируемый в RAM код API. + if not APP_DATA <= entry < end or entry not in loaded: # Точка запуска обязана указывать на действительно присутствующее слово кода после заголовка. + raise ValueError('Точка входа Flash-приложения отсутствует в загружаемом коде') # Исключает пустой заголовок и устаревшую RAM-сборку. + payload = struct.pack('<' + 'H' * (end - APP_DATA), *(loaded.get(address, 0xFFFF) for address in range(APP_DATA, end))) # Пробелы между секциями должны оставаться стёртыми; порядок октетов соответствует C28x. + crc = zlib.crc32(payload) # Контрольная сумма защищает весь непрерывный диапазон приложения, включая промежутки. + values = (0x4146, 0x3142, 1, HEADER_WORDS, entry & 65535, entry >> 16, APP_DATA & 65535, APP_DATA >> 16, end & 65535, end >> 16, crc & 65535, crc >> 16, (~entry) & 65535, ((~entry) >> 16) & 65535, 0x5AA5, 0xA55A) # Первые четыре физических октета образуют ASCII FAB1; далее следуют версия, размер, адреса, CRC, инверсия entry и маркеры завершения. + return struct.pack('<16H', *values) # Передаёт ровно 32 октета без платформенного выравнивания структуры. + + +def validate_words(entry, loaded): # Одинаково проверяет содержимое JTAG COFF и транспортной таблицы RS Flash. + if any(APP_START + index not in loaded for index in range(HEADER_WORDS)): # Все слова заголовка должны присутствовать явно, а не получаться заполнением 0xFFFF. + raise ValueError('Нет полного заголовка Flash-приложения FAB1; требуется новая сборка под постоянный загрузчик') # Старый образ с codestart по 0x33FFF6 не допускается. + actual = struct.pack('<16H', *(loaded[APP_START + index] for index in range(HEADER_WORDS))) # Получает описание именно из передаваемых данных. + if actual != descriptor(entry, loaded): # Проверяет CRC, границы, обе половины entry и маркеры одной независимой реконструкцией. + raise ValueError('Заголовок или CRC32 Flash-приложения FAB1 не соответствует данным') # Повреждение нельзя скрыть корректным именем файла или внешним паспортом. + + +def parse_sci8(data): # Разбирает только приложение ниже сектора A, не разрешая аппаратный переход ROM. + if len(data) < 24 or len(data) % 2 or data[:2] != b'\xaa\x08': # SCI8 имеет ключ 0x08AA, 22-октетный заголовок и чётный терминатор. + raise ValueError('Неверный заголовок или размер Flash SCI8') # Обычный бинарный дамп и COFF не являются таблицей адресных блоков TI. + def address(offset): # Адрес TI состоит из старшего 16-битного слова, затем младшего; каждое слово little endian. + high, low = struct.unpack_from(' len(data): # Адрес и все слова должны помещаться в текущем файле. + raise ValueError('Обрезанный блок Flash SCI8') # Не читает случайные байты за границей изображения. + start = address(offset) # Получает абсолютный адрес назначения очередного блока. + offset += 4 # Пропускает две половины абсолютного адреса. + if not APP_START <= start < start + count <= APP_STOP: # Сектор A и весь аппаратный boot исключены независимо от имени секции. + raise ValueError(f'Запрещённый Flash-диапазон 0x{start:06X}, {count} слов: загрузчик защищён') # Показывает точное пересечение до начала обновления. + values = struct.unpack_from('<' + 'H' * count, data, offset) # Читает только полностью проверенный блок. + if any(start + index in loaded for index in range(count)): # Дублирование адреса могло бы скрыть подмену заголовка поздним блоком. + raise ValueError('Перекрывающиеся блоки Flash SCI8') # Запрещает неоднозначный порядок программирования. + loaded.update((start + index, value) for index, value in enumerate(values)) # Сохраняет каждое слово по его физическому LOAD-адресу. + blocks.append((start, data[offset:offset + count * 2])) # Сохраняет исходные октеты без изменения порядка секций. + offset += count * 2 # Переходит к размеру следующего блока. + raise ValueError('Нет терминатора Flash SCI8') # Обрезанный файл не считается полным приложением. + + +def coff_sections(document): # Извлекает адреса и точные октеты из результата TI ofd2000 -x. + coff = document.find('.//ti_coff') # Рабочая прошивка F28335 использует COFF ABI. + if coff is None or coff.findtext('file_header/target_id') != '0x9d' or coff.findtext('file_header/exec') != 'true': # Проверяет процессор и признак связанного исполняемого файла. + raise ValueError('Требуется исполняемый COFF C2000') # Объектные модули и файлы другой архитектуры не программируются. + entry = int(coff.findtext('optional_file_header/entry_point', '0'), 0) # Entry задаёт запуск приложения через общий Flash boot. + sections, loaded = {}, {} # Отдельно хранит XML полей секций и адресное пространство программируемых слов. + for section in coff.findall('section'): # Рассматривает все секции, включая LOAD для функций, исполняемых из RAM. + sections[section.findtext('name')] = section # Служебный заголовок находится по стабильному имени .flash_app. + raw, start = section.findtext('raw_data'), int(section.findtext('virtual_addr', '0'), 0) # OFD называет virtual адресом LOAD, physical — RUN. + if raw is None or section.findtext('copy') == 'true': # Только явно незагружаемые COPY/отладочные секции и секции без данных исключаются из программирования. + continue # Их наличие не расширяет область разрешённого программирования. + payload = base64.b64decode(raw) # Получает точные октеты вместо доверия к соседней MAP. + if len(payload) != int(section.findtext('raw_data_size', '0'), 0) or len(payload) % 2 or not APP_START <= start < start + len(payload) // 2 <= APP_STOP: # Любая загружаемая секция обязана целиком находиться ниже A; RAM, OTP, CSM и несогласованный размер запрещены. + raise ValueError('COFF содержит запрещённую Flash-секцию: ' + str(section.findtext('name'))) # Старый самостоятельный codestart будет отклонён. + for index, value in enumerate(struct.unpack('<' + 'H' * (len(payload) // 2), payload)): # Восстанавливает 16-битное представление каждого слова C28x. + if start + index in loaded: # Две секции не должны программировать одно физическое слово. + raise ValueError('Перекрывающиеся LOAD-секции COFF') # Сохраняет единственность заголовка и однозначную контрольную сумму. + loaded[start + index] = value # Собирает ожидаемый Flash-образ для проверки CRC и конверсии SCI8. + return entry, loaded, sections # Метаданные нужны как подписанию, так и независимой проверке готового OUT. + + +def seal_coff(image, inspector): # Заполняет только заранее выделенный linker заголовок после успешной линковки. + image = Path(image) # Принимает путь текущей сборки без зависимости от рабочего каталога. + document = ET.fromstring(subprocess.check_output([str(inspector), '-x', str(image)])) # Доверяет размещению секций, подтверждённому официальным TI-инспектором. + entry, loaded, sections = coff_sections(document) # Отсекает любой LOAD в сектор A до изменения двоичного файла. + section = sections.get('.flash_app') # Секция размером 16 слов резервируется linker и не меняет адресов остальной программы. + if section is None or int(section.findtext('virtual_addr', '0'), 0) != APP_START or int(section.findtext('raw_data_size', '0'), 0) != HEADER_WORDS * 2: # Нельзя добавлять заголовок поверх машинного кода. + raise ValueError('Linker должен выделить .flash_app из 16 слов по адресу 0x300000') # Ошибка требует пересборки вместо небезопасного смещения программы. + offset = int(section.findtext('file_offsets/raw_data_ptr', '0'), 0) # OFD указывает точное файловое смещение содержимого секции COFF. + raw, signed = bytearray(image.read_bytes()), descriptor(entry, loaded) # Считает CRC уже окончательно связанных Flash LOAD-секций. + if offset <= 0 or offset + len(signed) > len(raw): # Проверяет размер файла до адресной записи заголовка. + raise ValueError('Неверное смещение заголовка COFF') # Повреждённые метаданные не могут изменить постороннюю часть OUT. + raw[offset:offset + len(signed)] = signed # Меняет только зарезервированные 32 октета, не трогая символы, адреса и отладочную информацию. + image.write_bytes(raw) # Сохраняет подписанный результат до конверсии в SCI8 и создания внешнего SHA-256. + loaded.update((APP_START + index, value) for index, value in enumerate(struct.unpack('<16H', signed))) # Приводит адресную модель к записанному заголовку. + validate_words(entry, loaded) # Независимо проверяет только что сформированный результат. diff --git a/python/protocan/protocan.py b/python/protocan/protocan.py index 74d832a..0c40a48 100644 --- a/python/protocan/protocan.py +++ b/python/protocan/protocan.py @@ -136,14 +136,25 @@ MSGTYPE_RU = { #: но не присваивает приборам имён. DEVICE_TYPE_NAMES = { 0x0: "Верхний уровень", + 0x1: "PERIPH 0–15", # Excel «Интерфейс протокола», C6/F6: первый тип содержит младшие 16 номеров периферии. + 0x2: "PERIPH 16–31", # Excel C7/F7: второй тип продолжает нумерацию, сохраняя четырёхбитный Device ID. 0x6: "Логические анализаторы", } DEVICE_ADDRESS_NAMES = { + (0x1, 0x5): "УМП1", # Excel B50/C50/F50 закрепляет отдельный адрес первого модуля нагрузки. + (0x1, 0x6): "УМП2", # Excel B51/C51/F51 отделяет второй модуль от первого и от задатчика. + (0x1, 0x8): "Задатчик", # Excel B53/C53/F53 задаёт адрес задатчика без сдвига старого CAN Mode на единицу. (0x6, 0xE): "Altera Logic", (0x7, 0xD): "configurator", } + +def periph_address(periph_id: int) -> tuple[int, int]: # Возвращает адрес ProtoCAN для номера из 32 строк обновлённой таблицы PERIPH. + if not 0 <= periph_id < 32: # Число 32 задаёт полный диапазон двух типов по 16 экземпляров; за его пределами адрес не назначается. + raise ValueError("ID PERIPH должен быть в диапазоне 0…31") # Запрещает незаметное оборачивание ошибочного номера на другую плату. + return 1 + periph_id // 16, periph_id % 16 # Старшая группа выбирает Type 1/2, младшие четыре бита — Device ID 0…15. + SETTINGS_RESULT_RU = { SettingsResult.OK: "успех", SettingsResult.INVALID_DLC: "неверный DLC", diff --git a/python/protocan/stm_invertor.py b/python/protocan/stm_invertor.py new file mode 100644 index 0000000..f1f9005 --- /dev/null +++ b/python/protocan/stm_invertor.py @@ -0,0 +1,28 @@ +import ctypes # Привязка передаёт готовые слова общему C-кодеку без повторения wire-формата на Python. +from .native import _load_library # Стандартный поиск сохраняет существующий механизм доставки SETProtocol. +class StmInvertorCodec: # Один экземпляр владеет только сигнатурами функций общей библиотеки. + def __init__(self, library=None): # Явная DLL позволяет новой панели не заменять библиотеку работающего приложения. + self.lib = library if library is not None else _load_library() # Нет Python fallback при отсутствии нового C-кодека. + self.lib.set_invertor_gas_limit.argtypes = [ctypes.c_uint] # Тип сообщения передаётся без вычисления геометрии карты в Python. + self.lib.set_invertor_gas_limit.restype = ctypes.c_uint # Границы определяются профилем C из Templates. + self.lib.set_invertor_gas_build.argtypes = [ctypes.c_uint, ctypes.c_uint, ctypes.POINTER(ctypes.c_uint16), ctypes.c_uint, ctypes.POINTER(ctypes.c_uint32), ctypes.POINTER(ctypes.c_uint8)] # Типы совпадают с публичным C ABI общего адаптера. + self.lib.set_invertor_gas_build.restype = ctypes.c_int # C возвращает фактический DLC либо отрицательную ошибку. + self.lib.set_invertor_gas_decode.argtypes = [ctypes.c_uint32, ctypes.c_uint, ctypes.POINTER(ctypes.c_uint8), ctypes.c_uint, ctypes.POINTER(ctypes.c_uint), ctypes.POINTER(ctypes.c_uint16)] # Декодер проверяет ID, тип, направление, длину и маску. + self.lib.set_invertor_gas_decode.restype = ctypes.c_int # Число принятых wire-слов приходит только из C. + def limit(self, message_type): # Интерфейс не хранит отдельную копию константы 250 или 750. + return int(self.lib.set_invertor_gas_limit(message_type)) # Передаём актуальную границу виджету адреса. + def build(self, message_type, address, words=()): # Пустой набор слов означает чтение DLC0 в обоих протоколах. + if not 0 <= address <= 0xFFFF or len(words) > 4 or any(not 0 <= word <= 0xFFFF for word in words): # Проверяем представимость Python-чисел перед сужением до типов ABI. + raise ValueError('Адрес или значение вне диапазона ABI') # Не допускаем тихого усечения и циклического переноса ctypes. + source = (ctypes.c_uint16 * len(words))(*words) if words else None # Значения остаются словами, endian выбирает общий кодек. + identifier = ctypes.c_uint32(); data = (ctypes.c_uint8 * 8)() # Локальные буферы имеют размеры Classic CAN и не переживают вызов. + length = self.lib.set_invertor_gas_build(message_type, address, source, len(words), ctypes.byref(identifier), data) # Ни CAN ID, ни маска не строятся здесь вручную. + if length < 0: # C отклоняет неверную геометрию, длину блока и маску. + raise ValueError('GAS: неверный адрес, длина блока или маска Word0') # Пользователь видит причину отказа до передачи на шину. + return identifier.value, bytes(data[:length]) # Транспорт получает полностью готовые ID и октеты. + def decode(self, identifier, flags, payload): # Входной кадр проверяется до публикации значений интерфейсу. + if not 0 <= identifier <= 0x1FFFFFFF or len(payload) > 8: # Не допускаем сужения большого CAN ID и переполнения временного буфера. + return None # Кадры другого транспорта не считаются ответом инвертора. + data = (ctypes.c_uint8 * 8)(*payload); metadata = (ctypes.c_uint * 2)(); words = (ctypes.c_uint16 * 4)() # ABI работает с фиксированными массивами без указателей на объекты Python. + count = self.lib.set_invertor_gas_decode(identifier, flags, data, len(payload), metadata, words) # Wire-разбор остаётся единственной C-реализацией. + return (metadata[0], metadata[1], tuple(words[:count])) if count > 0 else None # Недопустимый кадр не изменяет отображённые значения. diff --git a/python/set_devices/deif_controls.py b/python/set_devices/deif_controls.py new file mode 100644 index 0000000..440435b --- /dev/null +++ b/python/set_devices/deif_controls.py @@ -0,0 +1,52 @@ +"""Готовые операции DEIF для GUI без знания wire-разметки и адресных масок.""" # Все числовые правила реализованы единственным C99-ядром templates. +import ctypes as C # Преобразование фиксированных ABI-структур не является вторым кодеком. +from dataclasses import dataclass # Именованные поля исключают индексы метаданных в GUI. +from .deif_native import get_deif_native, Frame # Общий декодер и builders используются независимо от приложения. +from .can_transport import build_frame # Транспорт получает уже готовые CAN-кадры. +@dataclass(frozen=True) # Неизменяемые описания безопасно используются диагностикой и редакторами. +class SelectorInfo: # Это скалярный результат C, а не wire-структура. + node: int; index: int; subindex: int; dam: bool; legacy_key: str # Последний элемент сохраняет только формат прежних ключей настроек Desktop. +@dataclass(frozen=True) # Описание входного кадра отделено от его транспортного контейнера. +class PacketInfo: # GUI не обращается к смещениям payload. + kind: int; node: int; index: int; subindex: int; raw: int; status: int; dam: bool # Все значения получены из C-декодера. + @property # Диагностический ключ независим от адресного байта SAM/DAM. + def object_key(self): # Для TX-эхо достаточно индекса и подиндекса готового объекта. + return self.index, self.subindex # Это идентичность объекта, а не повторная распаковка CAN-data. +def selector_info(selector): # Редактор получает имена полей вместо ручных масок. + raw = bytes.fromhex(selector) if isinstance(selector, str) else bytes(selector) # HEX — только формат хранения пользовательской настройки. + if len(raw) != 4: return None # Буфер неправильного размера не передаётся C. + metadata = (C.c_int32 * 4)() # Node, index, subindex и DAM определены публичным ABI. + if not get_deif_native().selector_info(raw, metadata): return None # Некорректная привязка не становится источником на рисунке. + return SelectorInfo(metadata[0], metadata[1], metadata[2], bool(metadata[3]), raw[1:].hex()) # Срез используется только для совместимости непрозрачного старого ключа настроек. +def readdress_selector(selector, node, dam=None): # Меняет адрес пользовательской привязки общим алгоритмом C. + if not selector: return "" # Явно отключённое поле остаётся отключённым. + raw = bytes.fromhex(selector) if isinstance(selector, str) else bytes(selector) # Порт преобразует текст настройки в буфер ABI. + output = (C.c_uint8 * 4)() # Готовый селектор создаёт C-код. + if len(raw) != 4 or not get_deif_native().readdress(raw, node, 2 if dam is None else int(bool(dam)), output): raise ValueError("Неверный селектор или Node-ID DEIF") # Индекс не пересобирается в Python. + return bytes(output).hex(" ").upper() # Формат вывода совместим с прежним редактором HEX. +def route_parameters(node, mode, identifier, operation=0): # Согласует параметры редактора с C-правилами адресации. + output = (C.c_uint32 * 3)() # COB-ID, Node и адресный байт возвращаются одним вызовом. + if not get_deif_native().route(node, mode == "dam", identifier, operation, output): return None # Неверный диапазон не вызывает произвольную перенастройку привязок. + return tuple(output) # GUI хранит и отображает готовые значения. +def data_node(identifier, fallback=1): # Получает узел из CAN ID без повторения маски в GUI. + result = route_parameters(fallback or 1, "sam", identifier, 2) # Legacy SAM сохраняет явно выбранный источник. + return result[1] if result else fallback # Вне диапазона данных остаётся пользовательское исходное значение. +def packet_info(frame): # Метаданные для подтверждения команд и TX-эхо. + code, metadata = get_deif_native().inspect_frame(frame.can_id, frame.data, frame.ide, frame.rtr) # Wire-разбор находится в C. + return PacketInfo(metadata[0], metadata[1], metadata[2], metadata[3], metadata[4], metadata[7], bool(metadata[8])) if code > 0 else None # Некорректный кадр не получает выдуманных полей. +def heartbeat_description(identifier, data, extended=False, rtr=False): # Приложение не содержит собственного классификатора CANopen error control. + code, _ = get_deif_native().inspect_frame(identifier, data, extended, rtr) # Проверку COB-ID, DLC и состояния выполняет C. + if code not in (2, -3): return None # Обычные MPDO не попадают в поле heartbeat. + from .deif_xdi import decode # Общий локализованный formatter используется обоими CAN-мониторами и прибором. + return decode(build_frame(identifier, bytes(data), ide=extended, rtr=rtr)).summary # Готовая подпись не подтверждает получение конкретного измерения. +def _frame(output): # Общий адаптер переводит структуру C в существующий транспортный контейнер. + return build_frame(output.can_id, bytes(output.data[:output.dlc]), ide=False) # Идентификатор, длина и данные уже вычислены ядром. +def service_frame(node, value, nmt=False): # Строит heartbeat либо локальную NMT-команду через C. + output = Frame() # Память результата принадлежит Python-порту. + if not get_deif_native().service(bool(nmt), node, value, C.byref(output)): raise ValueError("Неверный Node-ID или CANopen-сервис") # Ни COB-ID, ни служебные байты не собираются в GUI. + return _frame(output) # Физическую отправку выполняет выбранный приложением транспорт. +def angle_setpoint_frame(actual): # Формирует отдельный кадр задания с тем же значением фактического азимута. + source, output = Frame(), Frame() # Оба контейнера имеют стабильный layout ABI. + source.can_id, source.dlc, source.data[:] = actual.can_id, len(actual.data), bytes(actual.data) # Это копирование готового CAN-кадра, не декодирование его полей. + if not get_deif_native().angle_command(C.byref(source), C.byref(output)): raise ValueError("Кадр не содержит поддерживаемый азимут DEIF") # Проверку семейства и сборку 0x07 выполняет C. + return _frame(output) # Штатный передатчик получает второй независимый MPDO. diff --git a/python/set_devices/deif_display.py b/python/set_devices/deif_display.py new file mode 100644 index 0000000..ebf5206 --- /dev/null +++ b/python/set_devices/deif_display.py @@ -0,0 +1,129 @@ +"""Независимая от GUI Python-модель индикатора поверх общего C99-ядра DEIF.""" # Настройки и транспортные имена остаются в порту, wire-правила находятся в C. +import ctypes as C # Обмен с ABI использует фиксированные массивы и caller-owned память. +from dataclasses import dataclass # Привязка является простой моделью пользовательской настройки. +from time import monotonic # Порт передаёт часы ядру явно в миллисекундах. +from .deif_native import get_deif_native, Frame # Единственная реализация кодека и автомата загружается без Qt. + +FIELDS = ("power", "rpm", "angle", "power_percent", "rpm_percent", "angle_setpoint") # Порядок полей публичного ABI C; это имена модели, не wire-селекторы. +STATUS = {1: "ниже диапазона", 2: "выше диапазона", 3: "ошибка данных"} # Локализованные подписи готовых статусов C. + + +@dataclass # Привязки можно сохранять в существующих пользовательских профилях JSON. +class Binding: # Четыре HEX-байта и коэффициент поступают из настроек либо C-каталога. + selector: str = "" # Пустая строка означает явно отключённое поле. + scale: float = 1.0 # Коэффициент применяется только в общем C-ядре. + + +def _milliseconds(now): # Перевод единиц системных часов относится к платформенному порту. + return max(0, round((monotonic() if now is None else now) * 1000)) # ABI использует целые монотонные миллисекунды для одинаковых границ на всех платформах. + + +def validate_deif_transmit(frame): # Сохраняет прежний публичный Python API ограниченного маршрута MASTER. + if not get_deif_native().validate(frame.can_id, bytes(frame.data), len(frame.data), int(bool(frame.ide)) | (int(bool(frame.rtr)) << 1), 0): # Проверка адреса, объектов и размеров полностью выполняется в C. + raise ValueError("DEIF: разрешены только данные, яркость, Color и heartbeat; команды настройки через Node-ID запрещены") # Текст остаётся локализованной ответственностью приложения. + + +def brightness_frame(node_id, group, percent, can_id=None, mode="sam"): # Готовит один кадр без отправки или изменения прибора. + return get_deif_native().make_frame(6, node_id, percent, 0 if can_id is None else can_id, mode, group) # Поле ABI 6 обозначает яркость, исходный COB-ID и U8 определяет C. + + +def colour_palette_frame(node_id, group, palette, can_id=None, mode="sam"): # Готовит независимый от яркости кадр палитры. + return get_deif_native().make_frame(7, node_id, palette, 0 if can_id is None else can_id, mode, group) # Поле ABI 7 обозначает Color; исходный COB-ID и кодирование Day/Night/Dusk находятся в C. + + +class DeifDisplay: # Пассивная модель пригодна для Desktop, CLI и тестов без Qt. + services = False # Наблюдатель не объявляет себя узлом CAN и никогда не выдаёт heartbeat. + expiry_ms = 5000 # Прежний режим наблюдения скрывает показания после пяти секунд без обновления. + + def __init__(self, source="DevBoard", can_id=0x201, power_unit="RAW", device_node=None, bindings=None, xdi_net=True, self_start=True, dam_pdo=2, dimmer_group=1, source_node=1): # Дополнительные параметры передаются серверным портом, прежние профили остаются совместимыми. + self.source, self.can_id, self.power_unit, self.device_node = source, can_id, power_unit, device_node # Только имя транспорта и UI-единица остаются вне C. + self.xdi_net, self.self_start, self.dam_pdo, self.dimmer_group, self._source_node = xdi_net, self_start, dam_pdo, dimmer_group, source_node # Параметры профиля передаются C без копии правил протокола. + self._api, self._context, self._route, self._bindings_signature = get_deif_native(), None, None, None # Один контекст на прибор исключает смешивание показаний MASTER и SLAVE. + self.bindings = {} # Контейнер поддерживает прямое редактирование существующим диалогом привязок. + self._ensure_context() # Исходные селекторы и коэффициенты создаются единственным C-каталогом. + if bindings is None: # Новый профиль получает штатные привязки, включая азимут. + for index, key in enumerate(FIELDS[:5]): # Отдельное задание угла автоматически производно от привязки азимута в C. + selector, factor = (C.c_uint8 * 4)(), C.c_double() # Порт принимает готовые значения без разбора endian. + self._api.get_binding(self._context, index, selector, C.byref(factor)) # Настройки по умолчанию читаются из C-профиля. + self.bindings[key] = Binding(bytes(selector).hex(" ").upper(), factor.value) # HEX нужен только редактору настроек. + else: # Существующая библиотека сохраняет пользовательские объекты и масштабы. + self.bindings = {key: Binding(item.selector, item.scale) for key, item in bindings.items()} # Словари двух приборов не должны делить изменяемые Binding. + + def _ensure_context(self): # Изменение адреса требует нового C-контекста, а смена имени транспорта — нет. + route = (self.can_id, self.device_node, self.xdi_net, self.self_start, self.dam_pdo, self.dimmer_group, self.services, self._source_node) # Изменение источника также требует согласованной переинициализации. + if route == self._route: # Повторное чтение снимка не переинициализирует данные. + return # Сохраняет сроки и очередь работающего узла. + size = self._api.state_size() # Размер private C-структуры сообщает библиотека. + self._context = (C.c_uint64 * ((size + 7) // 8))() # uint64 обеспечивает необходимое выравнивание на Windows и ARM. + source = self._source_node # Источник профиля не вычисляется из имени GUI или физического Node-ID SLAVE. + if not self._api.init(self._context, size, self.device_node or 0, source, bool(self.xdi_net), bool(self.self_start), self.dam_pdo, self.dimmer_group, bool(self.services), self.can_id): # C проверяет reserved Node, RPDO и сетевые группы. + raise ValueError("DEIF: неверный профиль SLAVE, Node-ID или RPDO") # Частично инициализированный узел не используется. + self._route, self._bindings_signature = route, None # Привязки повторно синхронизируются после изменения профиля. + + def _sync_bindings(self): # Прямые изменения словаря UI передаются в C только при фактическом изменении настройки. + self._ensure_context() # Проверяет, не был ли изменён физический адрес либо CAN ID наблюдения. + signature = tuple((key, binding.selector, binding.scale) for key, binding in self.bindings.items()) # Это сравнение настроек, а не интерпретация wire-формата. + if signature == self._bindings_signature: # Частые тики и приём кадров не должны сбрасывать значения. + return # Состояние C остаётся прежним. + for index, key in enumerate(FIELDS): # Порядок соответствует публичным field IDs ядра. + if index == 5 and key not in self.bindings: # Производное задание азимута настраивает C при изменении поля angle. + continue # Не отключает автоматически созданную независимую привязку 0x07. + binding = self.bindings.get(key, Binding()) # Отсутствующее поле явно отключается. + selector = bytes.fromhex(binding.selector) if binding.selector else None # HEX является форматом хранения настроек, а не CAN-декодером. + if selector is not None and len(selector) != 4: # Порт проверяет размер буфера до передачи указателя C. + raise ValueError("Селектор DEIF должен содержать четыре байта") # Некорректная пользовательская настройка не создаёт чтение за пределами буфера. + if not self._api.bind(self._context, index, selector, binding.scale): # Интерпретация селектора и применение масштаба находятся в C. + raise ValueError("DEIF: неверная привязка или масштаб") # Нечисловой коэффициент не скрывается как отсутствие пакета. + self._bindings_signature = signature # Последующая обработка кадра использует уже настроенный контекст. + + def bind_default_angle(self): # Миграция старого профиля с пустым азимутом не требует знания адресов в GUI. + self._sync_bindings() # Источник и режим берутся из уже настроенных остальных полей. + selector, factor = (C.c_uint8 * 4)(), C.c_double() # C возвращает готовую библиотечную привязку. + if not self._api.default_angle(self._context, selector, C.byref(factor)): # Ни SAM/DAM, ни индекс не вычисляются в Python. + raise ValueError("Не удалось восстановить привязку азимута DEIF") # Ошибка миграции остаётся видимой. + self.bindings["angle"] = Binding(bytes(selector).hex(" ").upper(), factor.value) # Обновляется только отсутствующая настройка азимута. + self._sync_bindings() # Новая привязка применяется сразу в текущем сеансе. + + def reset(self): # Сохраняет API очистки показаний при смене пользовательского канала. + self._sync_bindings() # Настройки должны соответствовать очищаемому контексту. + self._api.reset_values(self._context) # Очистка выполняется общим ядром. + + def accept(self, source, identifier, data, extended=False, rtr=False, now=None): # Порт связывает транспортное имя с независимой моделью прибора. + if source != self.source or not 0 <= identifier <= 0x1FFFFFFF or len(data) > 8: # Имя канала относится к приложению, границы — к безопасному ABI. + return False # Кадры другого транспорта не обновляют C-контекст. + self._sync_bindings() # Диалог мог изменить привязки с момента предыдущего кадра. + accepted = bool(self._api.accept(self._context, identifier, bytes(data), len(data), int(bool(extended)) | (int(bool(rtr)) << 1), _milliseconds(now))) # Единственное место протокольной обработки находится в C. + return accepted and (self.services or not self._api.inspect_frame(identifier, data, extended, rtr)[1][7]) # Пассивный API сохраняет прежний признак отказа только для текущего ошибочного I16, не для других полей. + + def _snapshots(self, now=None): # Снимок переводит готовые C-поля в контейнеры Python без повторения алгоритма. + self._sync_bindings() # Требуется также после прямого редактирования масштаба в настройках. + result, moment = {}, _milliseconds(now) # Все поля одного снимка читаются в один момент времени. + for index, key in enumerate(FIELDS): # Порядок ABI не зависит от порядка ключей пользовательского словаря. + value, metadata = C.c_double(), (C.c_int64 * 4)() # C выдаёт масштабированное значение и флаги seen/valid/stale. + self._api.read(self._context, index, moment, self.expiry_ms, C.byref(value), metadata) # Свежесть и служебные статусы вычисляются ядром. + result[key] = (value.value, metadata[0] / 1000, metadata[2], metadata[3]) # Деление переводит только единицы системных часов порта. + return result # Снимок не раскрывает внутренний layout C. + + @property # Совместимый read-only снимок прежнего словаря показаний. + def values(self): # Значения остаются в C, Python не хранит вторую копию состояния. + return {key: item[0] for key, item in self._snapshots().items() if item[3] & 2} # Готовый valid-флаг исключает служебные I16. + + @property # Временные отметки нужны существующей отрисовке и диагностике. + def received(self): # Даже invalid является принятым обновлением объекта, а не отсутствием связи. + return {key: item[1] for key, item in self._snapshots().items() if item[3] & 1} # Решение о наличии сообщения уже принято C-ядром. + + def value(self, key, now=None): # Сохраняет интерфейс получения одного свежего показания. + item = self._snapshots(now).get(key) # Масштаб и свежесть получены из общего C-снимка. + return item[0] if item and item[3] & 2 and not item[3] & 4 else None # Python лишь отображает valid/stale флаги ABI. + + def angle_selection(self, now=None): # Одно правило азимута используется и пассивным монитором, и активным SLAVE. + self._sync_bindings() # Профиль мог быть загружен из старого пользовательского файла. + value = C.c_double() # Владение выходным скаляром остаётся у порта. + kind = self._api.angle(self._context, _milliseconds(now), self.expiry_ms, C.byref(value)) # C выбирает фактический угол либо принятое сетевое задание. + return (value.value if kind else None, kind == 2) # Второй элемент нужен только для подписи «задание» в GUI. + + @property # Список источников нужен только заголовку прибора, не алгоритму приёма. + def sam_sources(self): # UI получает готовые адреса без масок и смещений селектора. + from .deif_controls import selector_info # Разбор адреса селектора делегируется общему C-порту. + descriptors = [selector_info(binding.selector) for binding in self.bindings.values() if binding.selector] # Сохраняет индивидуальные привязки каждого поля. + return sorted({item.node for item in descriptors if item is not None and not item.dam}) # DAM-получатель не выдаётся за источник SAM. diff --git a/python/set_devices/deif_emulator.py b/python/set_devices/deif_emulator.py new file mode 100644 index 0000000..5b29355 --- /dev/null +++ b/python/set_devices/deif_emulator.py @@ -0,0 +1,36 @@ +"""Регистровый контракт аппаратного эмулятора DEIF из set_emu_deif.h.""" # Один контракт используется всеми MCU и настольными клиентами. +from dataclasses import dataclass # Неизменяемый снимок отделяет подтверждённое состояние платы от редактируемой формы. + +DEIF_BASE = 0x1600 # Начало окна управления DEIF в set_emu_server.c, адрес измеряется в 16-битных словах. +DEIF_WORDS = 52 # SET_DEIF_WORDS версии 1 включает профиль, RAW, привязки OD и диагностику. +DEIF_FIELDS = ("Угол, RAW", "Обороты, RAW", "Обороты %, RAW", "Мощность, RAW", "Мощность %, RAW", "Задание угла, RAW") # Порядок соответствует raw[6] переносимой C-модели; физические единицы зависят от словаря прибора. +DEIF_INDICES = (0x3001, 0x3081, 0x3091, 0x3421, 0x3431, 0x3001) # Начальные OD экземпляра 1 взяты из set_deif_init; последний объект имеет подиндекс 7. + + +@dataclass(frozen=True) # Клиент публикует только целиком проверенный снимок без последующих изменений. +class DeifSnapshot: # Тип не зависит от Qt, HAL, конкретного MCU и способа доставки регистров. + words: tuple # Содержит 52 беззнаковых слова, прочитанных одной командой FC03. + mode: int # Режим из конфигурации STM: 4 Master, 5 Slave либо иной остановленный режим. + + @property # Роль берётся из ответа платы, а не из ранее выбранного пункта GUI. + def role(self): # Возвращает 1 Master либо 2 Slave согласно set_emu_deif.h. + return self.words[3] # Слово 3 не совпадает с номерами режимов 4 и 5 блока STM. + + @property # Проверка запущенного состояния нужна для запрета изменения сетевого профиля. + def running(self): # Возвращает логическое состояние модели без запуска либо остановки. + return bool(self.words[2]) # Слово 2 равно 1 только после подтверждённой команды пуска. + + @property # Знаковое представление сохраняет отрицательные RAW и служебные коды DEIF. + def raw(self): # Возвращает шесть значений I16 в порядке DEIF_FIELDS. + return tuple(value if value < 0x8000 else value - 0x10000 for value in self.words[16:22]) # Старший бит задаёт знак 16-битного дополнения до двух. + + +def decode_snapshot(words, mode): # Проверяет совместимость прошивки до разрешения любых записей DEIF. + values = tuple(words) # Не сохраняет ссылку на изменяемый транспортный буфер. + if len(values) != DEIF_WORDS or values[:2] != (0x4446, 1): # Сигнатура DF и версия 1 заданы set_deif_read, не совпадают с конфигурацией STM. + raise ValueError("Нужна прошивка с сервисом DEIF Master/Slave версии 1") # Старая прошивка не получает команд в неизвестное окно. + if values[2] not in (0, 1) or values[3] not in (1, 2): # Повреждённые running и role не должны превращаться в разрешение записи. + raise ValueError("STM вернула неверное состояние DEIF") # Отказ сохраняет форму неподтверждённой. + if mode in (4, 5) and values[3] != mode - 3: # Конфигурация и окно состояния должны описывать одну роль текущего экземпляра. + raise ValueError("Роль DEIF не совпадает с режимом STM; повторите чтение") # Между чтениями другая сессия могла изменить режим платы. + return DeifSnapshot(values, mode) # Единственная точка создания проверенного снимка для UI и тестов. diff --git a/python/set_devices/deif_native.py b/python/set_devices/deif_native.py new file mode 100644 index 0000000..cd5a311 --- /dev/null +++ b/python/set_devices/deif_native.py @@ -0,0 +1,75 @@ +"""Тонкий ctypes-порт единственного C99-ядра DEIF из templates/c/set-protocol.""" # В Python нет второго кодека или автомата NMT. +import ctypes as C # Фиксированные типы повторяют только публичный ABI. +import os # Путь дополнительной библиотеки передаёт приложение, не общая библиотека. +from pathlib import Path # Дополнительный нативный компонент может лежать рядом с основной библиотекой любого приложения. +from protocan.native import _load_library # Стандартный механизм загрузки используется при отсутствии явного пути DEIF. + + +class Frame(C.Structure): # Структура содержит готовые STD-кадры, а не wire-структуру транспорта. + _fields_ = [("can_id", C.c_uint32), ("dlc", C.c_uint32), ("data", C.c_uint8 * 8)] # Layout размером 16 байт совпадает с deif_xdi.h. + + +class NativeDeif: # Экземпляр владеет только сигнатурами C, состояние выделяется отдельными моделями. + def __init__(self): # Отсутствие общего ядра является ошибкой сборки, алгоритмического fallback нет. + self.lib = C.CDLL(os.environ["SETPROTOCOL_DEIF_LIBRARY"]) if os.environ.get("SETPROTOCOL_DEIF_LIBRARY") else _load_library() # Выбор пути относится к загрузке, не к протоколу. + if not hasattr(self.lib, "setp_deif_version"): # Во время обновления основная DLL может оставаться занятой работающим приложением. + primary = Path(self.lib._name) # Путь сообщает стандартный загрузчик, структура gui_desktop здесь неизвестна. + self.lib = C.CDLL(str(primary.with_name(primary.stem + "_deif" + primary.suffix))) # Это дополнительная сборка того же C-ядра, а не алгоритмический Python fallback. + signatures = { # Сигнатуры скалярного ABI не зависят от внутренних C-структур. + "version": ([], C.c_int), "state_size": ([], C.c_size_t), # Проверка версии и caller-owned памяти. + "catalog": ([C.c_uint, C.POINTER(C.c_int32)], C.c_int), # Каталог числовых индексов и разрешений. + "selector": ([C.c_uint, C.c_uint, C.c_uint, C.c_uint, C.c_void_p], C.c_int), # C формирует готовый селектор. + "inspect": ([C.c_uint32, C.c_void_p, C.c_size_t, C.c_uint, C.POINTER(C.c_int32)], C.c_int), # Единственный разбор входящего wire-кадра. + "make": ([C.c_uint, C.c_uint, C.c_uint, C.c_int32, C.c_uint32, C.c_uint, C.POINTER(Frame)], C.c_int), # Единственная сборка MPDO. + "master": ([C.c_uint, C.POINTER(C.c_int32), C.c_uint32, C.c_uint, C.c_uint, C.POINTER(Frame)], C.c_int), # Единственный порядок пяти объектов цикла. + "service": ([C.c_uint, C.c_uint, C.c_uint, C.POINTER(Frame)], C.c_int), "angle_command": ([C.POINTER(Frame), C.POINTER(Frame)], C.c_int), # Служебные кадры и задание азимута собираются общим C-кодом. + "selector_info": ([C.c_void_p, C.POINTER(C.c_int32)], C.c_int), "route": ([C.c_uint, C.c_uint, C.c_uint32, C.c_uint, C.POINTER(C.c_uint32)], C.c_int), # Редакторы не разбирают адресный байт или COB-ID самостоятельно. + "readdress": ([C.c_void_p, C.c_uint, C.c_uint, C.c_void_p], C.c_int), # Перенос селектора сохраняет ручной объект без масок и endian в UI. + "validate": ([C.c_uint32, C.c_void_p, C.c_size_t, C.c_uint, C.c_uint], C.c_int), # Изолированные выходы MASTER и SLAVE. + "init": ([C.c_void_p, C.c_size_t] + [C.c_uint] * 7 + [C.c_uint32], C.c_int), # Семь параметров профиля и отдельный CAN ID наблюдателя. + "bind": ([C.c_void_p, C.c_uint, C.c_void_p, C.c_double], C.c_int), # Селектор и библиотечный масштаб передаются без интерпретации. + "get_binding": ([C.c_void_p, C.c_uint, C.c_void_p, C.POINTER(C.c_double)], C.c_int), # Исходные значения профиля приходят из единственного C-каталога. + "default_angle": ([C.c_void_p, C.c_void_p, C.POINTER(C.c_double)], C.c_int), # Общая миграция отсутствующей привязки. + "start": ([C.c_void_p, C.c_uint64, C.c_uint], C.c_int), "stop": ([C.c_void_p], None), "reset_values": ([C.c_void_p], None), # Жизненный цикл без системных часов C. + "accept": ([C.c_void_p, C.c_uint32, C.c_void_p, C.c_size_t, C.c_uint, C.c_uint64], C.c_int), # C проверяет NMT, адресацию, объекты и длину. + "poll": ([C.c_void_p, C.c_uint64, C.POINTER(Frame), C.c_size_t], C.c_size_t), # Порт владеет выходным буфером событий. + "read": ([C.c_void_p, C.c_uint, C.c_uint64, C.c_uint, C.POINTER(C.c_double), C.POINTER(C.c_int64)], C.c_int), # Готовое значение и временные метаданные индикатора. + "lost": ([C.c_void_p, C.c_uint64], C.c_uint), # Маска устаревших входов вычисляется в C. + "angle": ([C.c_void_p, C.c_uint64, C.c_uint, C.POINTER(C.c_double)], C.c_int), "meta": ([C.c_void_p, C.POINTER(C.c_int64)], C.c_int), # Единый выбор азимута и снимок состояния. + } # Эти объявления описывают ABI, а не копию алгоритма. + for name, (arguments, result) in signatures.items(): # Все отсутствующие символы выявляются при загрузке расширения. + function = getattr(self.lib, "setp_deif_" + name) # Названия совпадают с публичным заголовком templates. + function.argtypes, function.restype = arguments, result # ctypes не должен угадывать размеры указателей и целых. + setattr(self, name, function) # Короткие имена оставляют порты моделей читаемыми. + if self.version() != 1: # Несовместимый ABI не используется с предположением о layout. + raise RuntimeError("Нужна общая библиотека DEIF ABI 1") # Сообщение указывает на необходимость пересборки нативного ядра. + + def selector_bytes(self, field, node, instance=1, dam=False): # Возвращает готовый C-селектор для настроек UI. + output = (C.c_uint8 * 4)() # Размер мультиплексора задан публичным контрактом. + if not self.selector(field, node, instance, bool(dam), output): # Проверка диапазонов находится в C. + raise ValueError("DEIF: неверный Node-ID, объект или экземпляр") # Недопустимая привязка не сохраняется в настройках. + return bytes(output) # Порт преобразует только тип контейнера. + + def inspect_frame(self, identifier, data, extended=False, rtr=False): # Передаёт целый CAN-кадр общему декодеру. + if not 0 <= identifier <= 0x1FFFFFFF or len(data) > 8: # Проверяет представимость на границе ABI до сужения Python-чисел. + return -1, [0] * 12 # Переполнение нельзя превратить в другой допустимый кадр. + output = (C.c_int32 * 12)() # Индексы метаданных определены в контракте C-декодера. + code = self.inspect(identifier, bytes(data), len(data), int(bool(extended)) | (int(bool(rtr)) << 1), output) # Флаги относятся к типу CAN-кадра, не к содержимому протокола. + return code, list(output) # Локализованный текст формируется поверх готовых полей C. + + def make_frame(self, field, node, value, identifier, mode="sam", instance=1): # Возвращает кадр существующего транспортного API. + from .can_transport import build_frame # Пакет транспорта не импортируется до фактической сборки кадра. + if mode not in ("sam", "dam") or type(instance) is not int or not 0 <= instance <= 4294967295 or type(value) is not int or not -2147483648 <= value <= 2147483647 or type(node) is not int or not 0 <= node <= 127 or type(identifier) is not int or not 0 <= identifier <= 0x1FFFFFFF: # Порт проверяет только типы и представимость ABI. + raise ValueError("DEIF: неверный Node-ID, режим, CAN ID или значение") # Значения не усекаются до вызова C. + output = Frame() # Память выходного CAN-кадра принадлежит Python. + if not self.make(field, node, instance, value, identifier, mode == "dam", C.byref(output)): # Wire-байты и границы протокола определяются исключительно C. + raise ValueError("DEIF: Node-ID, RPDO, экземпляр или значение вне диапазона") # Причина отклонения остаётся видимой в интерфейсе. + return build_frame(output.can_id, bytes(output.data[:output.dlc]), ide=False) # Транспорт AA55/адаптер получает уже готовые данные STD. + + +_native = None # Общая библиотека загружается один раз на процесс. +def get_deif_native(): # Ленивое получение не требует Qt и пригодно для CLI. + global _native # Экземпляр хранит сигнатуры, состояния приборов остаются раздельными. + if _native is None: # Первая реальная операция DEIF проверяет наличие нового нативного ядра. + _native = NativeDeif() # Отсутствие DLL или ABI не скрывается Python-реализацией протокола. + return _native # Все модели используют один и тот же проверенный C-код. diff --git a/python/set_devices/deif_slave.py b/python/set_devices/deif_slave.py new file mode 100644 index 0000000..dacd573 --- /dev/null +++ b/python/set_devices/deif_slave.py @@ -0,0 +1,56 @@ +"""Серверный Python-порт DEIF: протокольное состояние целиком принадлежит общему C99.""" # Пакет не импортирует gui_desktop и пригоден без Qt. +import ctypes as C # Структуры ABI содержат только готовые кадры и скаляры. +from time import monotonic # Порт поставляет монотонные часы, чтобы C оставался независим от ОС. +from .deif_display import DeifDisplay, FIELDS, STATUS, _milliseconds # Пассивный и активный режимы используют одинаковые снимки индикаторов. +from .deif_native import Frame, get_deif_native # Нет Python-копии адресации, NMT, сроков или SDO. + + +def validate_slave_transmit(frame, node): # Серверный маршрут имеет отдельный контракт по собственному Node-ID. + if type(node) is not int or not 1 <= node <= 127 or not get_deif_native().validate(frame.can_id, bytes(frame.data), len(frame.data), int(bool(frame.ide)) | (int(bool(frame.rtr)) << 1), node): # C разрешает только собственные heartbeat, EMCY и ответы SDO. + raise ValueError("Разрешены только heartbeat, EMCY и ответы SDO своего SLAVE") # Недопустимый кадр не попадёт в физический транспорт. + + +class DeifSlave(DeifDisplay): # Отличие от монитора состоит в включённых сервисах C и сохранении последнего числа при Data lost. + services, expiry_ms = True, 0 # Частоту heartbeat и срок Data lost определяет C, нулевой expiry сохраняет последнее показание. + + def __init__(self, node=11, source_node=1, xdi_net=True, self_start=True, dam_pdo=2, bindings=None, dimmer_group=1): # Сохраняет существующий Python API модели SLAVE. + if any(type(value) is not int for value in (node, source_node, dam_pdo, dimmer_group)): # Порт проверяет типы до преобразования unsigned ABI. + raise ValueError("Параметры профиля DEIF должны быть целыми") # Логические и дробные адреса не превращаются в другой узел. + super().__init__(source="Локальная симуляция", device_node=node, bindings=bindings, source_node=source_node, xdi_net=xdi_net, self_start=self_start, dam_pdo=dam_pdo, dimmer_group=dimmer_group) # Все ограничения и исходные привязки создаются C-ядром. + + def start(self, now=None, reset_values=True): # Явное включение не использует физический транспорт напрямую. + self._sync_bindings() # Последние параметры UI должны соответствовать создаваемому сеансу. + self._api.start(self._context, _milliseconds(monotonic() if now is None else now), bool(reset_values)) # Boot-up и self-start формируются общим автоматом C. + + def stop(self): # Выключение прекращает в том числе невыданные служебные события. + self._api.stop(self._context) # Никакого отдельного Python-таймера heartbeat здесь нет. + + def accept(self, source, identifier, data, extended=False, rtr=False, now=None): # Транспортное имя фильтруется базовым портом, байты принимает C. + return super().accept(source, identifier, data, extended, rtr, monotonic() if now is None else now) # Явные часы позволяют одинаково проверять границы Python и JNI. + + def tick(self, now=None): # Порт регулярно выгружает готовые события и передаёт их выбранному транспорту. + from .can_transport import build_frame # Формат транспорта не смешивается с форматом DEIF. + self._sync_bindings() # Прямое изменение профиля не должно оставлять старые привязки. + output = (Frame * 16)() # Вместимость соответствует ограниченному пакету событий публичного ABI. + count = self._api.poll(self._context, _milliseconds(monotonic() if now is None else now), output, len(output)) # Все сроки и NMT-переходы обслуживаются C. + return [build_frame(frame.can_id, bytes(frame.data[:frame.dlc]), ide=False) for frame in output[:count]] # Python меняет только тип контейнера готовых кадров. + + def lost_fields(self, now=None): # Локализованный список строится поверх готовой маски C. + self._sync_bindings() # Непривязанное поле не должно участвовать в предупреждении. + mask = self._api.lost(self._context, _milliseconds(monotonic() if now is None else now)) # Независимые сроки по 3000 мс определяются общим ядром. + return [key for index, key in enumerate(FIELDS) if mask & (1 << index)] # Соответствие field ID и имени не повторяет алгоритм свежести. + + def _meta(self): # Набор скаляров не раскрывает внутреннюю структуру C. + output = (C.c_int64 * 10)() # Число элементов закреплено в deif_xdi.h. + self._api.meta(self._context, output) # Состояние хранится только в одном месте. + return list(output) # Python-порт не пересчитывает NMT или периоды. + + active = property(lambda self: bool(self._meta()[0])) # Флаг нужен жизненному циклу страницы. + state = property(lambda self: self._meta()[1]) # Готовый CANopen NMT-код используется в локализованной подписи. + started = property(lambda self: self._meta()[2] / 1000) # Секунды сохраняют совместимость прежнего Python API. + last_heartbeat = property(lambda self: self._meta()[3] / 1000) # Преобразуется только единица системного времени. + heartbeat_ms = property(lambda self: self._meta()[4]) # Значение стандартного объекта 0x1017 выдаёт C. + accepted = property(lambda self: self._meta()[5]) # Счётчик принятия не имитируется количеством тиков GUI. + brightness = property(lambda self: self._meta()[7]) # Текущий процент подсветки из C-профиля. + palette = property(lambda self: self._meta()[8]) # Day/Night/Dusk хранится как код общего ядра. + invalid = property(lambda self: {key: STATUS[item[2]] for key, item in self._snapshots().items() if item[2]}) # Только текст статуса локализуется в Python. diff --git a/python/set_devices/deif_xdi.py b/python/set_devices/deif_xdi.py index 97733cd..74bbe56 100644 --- a/python/set_devices/deif_xdi.py +++ b/python/set_devices/deif_xdi.py @@ -1,159 +1,97 @@ -"""DEIF XDi-192 observations from CAN analysis dated 2026-10-03. +"""Локализованное представление DEIF поверх единственного C99-кодека templates.""" # Wire-формат, адресация и диапазоны не реализуются повторно в Python. +import ctypes as C # Преобразуются только структуры публичного ABI. +from protocan import protocan as pc # Существующие CAN-мониторы получают прежний тип Decoded. +from .deif_native import get_deif_native, Frame # C-каталог и готовые метаданные используются без Qt. -Based on DEIF 4189350066D, sections 3.2, 11 and appendix 9. -Angle and AC2 percent use the verified working-library resolution of 0.1. -Absolute AC2 power remains RAW until its physical unit is confirmed. -""" -from protocan import protocan as pc - -SELECTORS = { - bytes.fromhex("01 01 30 07"): "Азимут / руль — задание", - bytes.fromhex("01 81 30 02"): "RPM / обороты", - bytes.fromhex("01 91 30 02"): "Обороты винта, %", - bytes.fromhex("01 21 34 02"): "Электрическая мощность AC2", - bytes.fromhex("01 31 34 02"): "Электрическая мощность AC2, %", -} -MASTER_SELECTORS = tuple(SELECTORS) -SELECTORS[bytes.fromhex("01 01 30 02")] = "Азимут / руль — фактическое значение" - -OBJECTS = { - 0x3000: ("Азимут / руль", "°"), - 0x3080: ("Обороты винта", "rpm"), - 0x3090: ("Обороты винта, %", "%"), - 0x3420: ("Электрическая мощность AC2", None), - 0x3430: ("Электрическая мощность AC2, %", "%"), -} +_API = get_deif_native() # Отсутствие общего DEIF-ядра является явной ошибкой нативной сборки. +_FIELD_NAMES = (("Электрическая мощность AC2", None), ("Обороты винта", "rpm"), ("Азимут / руль", "°"), ("Электрическая мощность AC2, %", "%"), ("Обороты винта, %", "%"), ("Азимут / руль", "°")) # Это только локализованные подписи, числовые объекты определяет C-каталог. +_MASTER_FIELDS = (5, 1, 4, 0, 3) # Соответствие прежнего порядка редакторов ID полей ABI; сборку цикла выполняет C. +MASTER_SELECTORS = tuple(_API.selector_bytes(field, 1) for field in _MASTER_FIELDS) # Селекторы возвращает единый C-каталог. +SELECTORS = dict(zip(MASTER_SELECTORS, ("Азимут / руль — задание", "RPM / обороты", "Обороты винта, %", "Электрическая мощность AC2", "Электрическая мощность AC2, %"))) # Тексты не влияют на проверку или отправку кадра. +SELECTORS[_API.selector_bytes(2, 1)] = "Азимут / руль — фактическое значение" # Фактический угол имеет отдельный объект каталога. +OBJECTS = {} # Сохраняет публичное представление названий семейств для прежних потребителей. +for _field in range(5): # Пять семейств поддерживаемого профиля индикации. + _metadata = (C.c_int32 * 3)() # C возвращает base, subindex и разрешение. + _API.catalog(_field, _metadata) # Базовый индекс не дублируется числовой таблицей Python. + OBJECTS[_metadata[0]] = _FIELD_NAMES[_field] # Имена остаются локализованными данными представления. -def decode(frame): - result = pc.Decoded(pc.ProtoCanId(frame.can_id, 0, 0, 0, 0, 0, 0), - len(frame.data), bytes(frame.data), ide=frame.ide, - rtr=frame.rtr, protocol="DEIF XDi-192") - result.fields = [("Протокол", "DEIF XDi-net / CANopen SAM-MPDO"), - ("CAN ID", "0x%03X" % frame.can_id)] - def reject(message): - result.summary = message - result.warnings.append(message) - return result - if frame.ide or frame.rtr: - return reject("DEIF: ожидается STD data frame; EXT/RTR не интерпретируется") - if 0x701 <= frame.can_id <= 0x77F: - node = frame.can_id - 0x700 - result.device_label = "Node %d" % node - result.message_label = "Heartbeat / Boot-up" - result.fields.append(("Node-ID", str(node))) - if len(frame.data) != 1: - return reject("DEIF: Heartbeat Node %d — ожидается DLC=1" % node) - state = {0: "Boot-up", 5: "Operational"}.get(frame.data[0]) - if state is None: - state = "состояние 0x%02X (не описано в журнале)" % frame.data[0] - result.fields.append(("Состояние", state)) - result.summary = "Node %d: %s" % (node, state) - return result - if not 0x201 <= frame.can_id <= 0x57F: - result.summary = "DEIF: CAN ID не описан в журнале" - return result - node = frame.can_id - 0x200 - result.message_label = "XDi-net broadcast / SAM-MPDO" - result.fields.append(("COB-ID", "0x%03X" % frame.can_id)) - if len(frame.data) != 8: - return reject("DEIF RPDO1: ожидается DLC=8") - selector = frame.data[:4] - result.fields.append(("Селектор Byte0..3", selector.hex(" ").upper())) - source = frame.data[0] & 0x7F - index = int.from_bytes(frame.data[1:3], "little") - subindex = frame.data[3] - result.fields.extend([("Источник Node-ID", str(source)), - ("Индекс объекта", "0x%04X" % index), - ("Подиндекс", "0x%02X" % subindex)]) - dam = bool(frame.data[0] & 0x80) - if dam: - result.fields = [(key, value) for key, value in result.fields if key != "Источник Node-ID"] - result.fields.append(("Получатель Node-ID", str(source))) - result.message_label = "CANopen DAM-MPDO" - if not source or frame.can_id - source not in (0x200, 0x300, 0x400, 0x500): - return reject("DEIF: получатель не соответствует RPDO COB-ID") - elif not source or not 0x201 <= frame.can_id <= 0x27F or (node != 127 and source != node): - return reject("DEIF: источник не соответствует COB-ID") - result.device_label = ("Получатель Node %d" if dam else "Источник Node %d") % source - result.fields[0] = ("Протокол", "CANopen DAM-MPDO" if dam else "DEIF XDi-net / CANopen SAM-MPDO") - family, instance = index & 0xFFF0, index & 0xF - if family not in OBJECTS or not instance or subindex not in (2, 7): - return reject("DEIF: неизвестный объект/подиндекс 0x%04X:%02X" % (index, subindex)) - name, unit = OBJECTS[family] - kind = "фактическое значение" if subindex == 2 else "задание" - name = "%s №%d — %s" % (name, instance, kind) - raw = int.from_bytes(frame.data[4:6], "little", signed=True) - result.fields.extend([("Параметр", name), - ("RAW INT16 LE", str(raw)), - ("Byte6..7", frame.data[6:].hex(" ").upper())]) - result.summary = "Node %d · 0x%04X:%02X · %s: RAW=%d" % (source, index, subindex, name, raw) - if raw in (-32768, 32766, 32767): - status = {-32768: "ниже диапазона", 32766: "выше диапазона", 32767: "ошибка данных"}[raw] - result.fields.append(("Статус", status)) - result.summary += "; " + status - result.warnings.append(status) - elif unit and (subindex == 2 or family == 0x3000): - value = "%.1f %s" % (raw / 10, unit) - result.fields.append(("Значение", value)) - result.fields.append(("Масштаб", "RAW ×0.1")) - result.summary += "; " + value - elif family == 0x3420 and subindex == 2: - result.fields.append(("Масштаб / единицы", "RAW ×1; физическая единица не подтверждена")) - result.summary += "; RAW ×1 (физическая единица не подтверждена)" - else: - result.fields.append(("Масштаб / единицы", "не установлены")) - result.summary += "; масштаб и единицы не установлены" - if frame.data[6:] != b"\x00\x00": - result.warnings.append("Byte6..7: для I16 ожидается нулевое заполнение") - return result +def decode(frame): # Форматирует готовый результат C для обеих таблиц Desktop. + result = pc.Decoded(pc.ProtoCanId(frame.can_id, 0, 0, 0, 0, 0, 0), len(frame.data), bytes(frame.data), ide=frame.ide, rtr=frame.rtr, protocol="DEIF XDi-192") # Контейнер совместим со штатным монитором CAN. + result.fields = [("Протокол", "DEIF XDi-net / CANopen SAM-MPDO"), ("CAN ID", "0x%03X" % frame.can_id)] # Начальные подписи не зависят от структуры wire-полей. + code, metadata = _API.inspect_frame(frame.can_id, frame.data, frame.ide, frame.rtr) # Единственный разбор сообщения выполняется в C. + node, index, subindex, raw, field, instance, status, dam, padding, nmt = metadata[1:11] # Это поля документированного ABI, не смещения CAN-payload. + if code in (2, -2, -3): # C определяет принадлежность к CANopen Heartbeat/Boot-up. + result.device_label, result.message_label = "Node %d" % node, "Heartbeat / Boot-up" # Исходный тип пригоден также для ошибки DLC. + result.fields.append(("Node-ID", str(node))) # Номер уже вычислен общим кодеком. + if code != -2: # При корректной длине сохраняется исходный NMT-код, включая неизвестный. + states = {0: ("Boot-up", "запуск узла"), 4: ("Stopped", "узел остановлен"), 5: ("Operational", "рабочий режим"), 127: ("Pre-operational", "предоперационный режим")} # Локализация кодов состояния; допустимость уже проверена C. + state, meaning = states.get(nmt, ("состояние 0x%02X" % nmt, "неизвестное состояние NMT")) # Неизвестный байт не теряется в представлении. + message = "Boot-up" if nmt == 0 else "Heartbeat" if code == 2 else "Error control" # Подтверждённый тип heartbeat сообщает C-декодер. + result.message_label = "CANopen " + message # Отдельный тип исключает Boot-up из статистики периода HB. + result.fields[0] = ("Протокол", result.message_label) # Служебный кадр не маркируется как SAM-MPDO. + result.fields.extend([("COB-ID", "0x%03X = 0x700 + %d" % (frame.can_id, node)), ("NMT state", "0x%02X (%d)" % (nmt, nmt)), ("Состояние", "%s — %s" % (state, meaning))]) # Формулы выводятся для пояснения пользователю, а не для декодирования. + result.summary = "%s · Node %d: %s — %s" % (message, node, state, meaning) # Сводка остаётся полезной при скрытой колонке типа. + return result # Heartbeat не трактуется как измерение. + errors = {-1: "DEIF: ожидается STD data frame; EXT/RTR не интерпретируется", -2: "DEIF: Heartbeat Node %d — ожидается DLC=1" % node, -4: "DEIF RPDO1: ожидается DLC=8", -5: "DEIF: источник или получатель не соответствует COB-ID", -6: "DEIF: неизвестный объект/подиндекс 0x%04X:%02X" % (index, subindex)} # Причины задаёт C, здесь находятся только русские тексты. + if code in errors: # Неуспешный разбор не получает фиктивных RAW-полей. + result.summary = errors[code] # Понятная причина отказа видна в таблице без открытия подробностей. + result.warnings.append(result.summary) # Сохраняет существующий API диагностики. + return result # Порт не пытается повторно угадать формат байтов. + if code == 0: # COB-ID другого протокола не считается измерением DEIF. + result.summary = "DEIF: CAN ID не описан в журнале" # Исходный кадр сохраняется в raw-колонках монитора. + return result # Неизвестному ID не назначаются физические единицы. + result.message_label = "CANopen DAM-MPDO" if dam else "XDi-net broadcast / SAM-MPDO" # Режим уже определён общей проверкой адресации. + result.fields[0] = ("Протокол", "CANopen DAM-MPDO" if dam else "DEIF XDi-net / CANopen SAM-MPDO") # В подробностях показывается действующий режим. + result.device_label = ("Получатель Node %d" if dam else "Источник Node %d") % node # Node-ID получателя не подписывается источником SAM. + result.fields.extend([("COB-ID", "0x%03X" % frame.can_id), ("Селектор Byte0..3", bytes(frame.data[:4]).hex(" ").upper()), ("Получатель Node-ID" if dam else "Источник Node-ID", str(node)), ("Индекс объекта", "0x%04X" % index), ("Подиндекс", "0x%02X" % subindex)]) # Raw-байты показываются для проверки, алгоритм их не интерпретирует. + if code == 3: # C отделяет U8 диммера от переменных I16. + result.summary = "Node %d · 0x%04X:%02X · %s: %d" % (node, index, subindex, "Яркость, %" if field == 6 else "Color Day/Night/Dusk", raw) # Сохраняет понятную сводку команд подсветки. + return result # Диммер не получает ложный масштаб десятых долей RPM. + name, unit = _FIELD_NAMES[field] # Название выбирается по готовому field ID общего каталога. + kind = "фактическое значение" if subindex == 2 else "задание" # Тип значения показывается пользователю отдельно от физического числа. + parameter = "%s №%d — %s" % (name, instance, kind) # Номер экземпляра поступает из C-декодера. + result.fields.extend([("Параметр", parameter), ("RAW INT16 LE", str(raw)), ("Byte6..7", bytes(frame.data[6:]).hex(" ").upper())]) # Для диагностики сохраняется исходное значение и raw-хвост. + result.summary = "Node %d · 0x%04X:%02X · %s: RAW=%d" % (node, index, subindex, parameter, raw) # Формат совместим с прежними фильтрами и тестами. + if status: # Зарезервированный I16 проверен единственным C-кодеком. + text = {1: "ниже диапазона", 2: "выше диапазона", 3: "ошибка данных"}[status] # Статус локализуется без повторного сравнения raw-кодов. + result.fields.append(("Статус", text)) # Ошибка не выдаётся за огромную физическую величину. + result.warnings.append(text) # Сохраняет предупреждение для таблицы монитора. + result.summary += "; " + text # Причина видна без отдельного окна. + elif unit and (subindex == 2 or field == 2): # Физическое форматирование подтверждено для факта и азимутального задания рабочей библиотеки. + text = "%.1f %s" % (raw / 10, unit) # Это форматирование числа для человека, принятие и масштаб индикаторов выполняет C. + result.fields.extend([("Значение", text), ("Масштаб", "RAW ×0.1")]) # Подпись раскрывает используемое разрешение. + result.summary += "; " + text # Краткая сводка содержит единицу измерения. + elif field == 0 and subindex == 2: # Абсолютная POWER не имеет подтверждённой физической единицы. + result.fields.append(("Масштаб / единицы", "RAW ×1; физическая единица не подтверждена")) # Единица не достраивается по предположению. + result.summary += "; RAW ×1 (физическая единица не подтверждена)" # Сохраняет прежний смысл шкалы мощности. + else: # Разрешение иных set-point зависит от библиотеки прибора. + result.fields.append(("Масштаб / единицы", "не установлены")) # Неизвестный масштаб остаётся явным ограничением. + result.summary += "; масштаб и единицы не установлены" # Не назначает единицы неизвестному объекту. + if not padding: # C уже проверил старшие байты I16. + result.warnings.append("Byte6..7: для I16 ожидается нулевое заполнение") # Ненулевой хвост виден в диагностике и отклоняется моделью приёма. + return result # На выходе находится только представление результата C. -def master_frames(node_id, raw_values, can_id=None, mode="sam", angle_subindex=7): - """Build a five-parameter STD RPDO1 cycle, using signed INT16 LE values.""" - from .can_transport import build_frame - if not isinstance(node_id, int) or not 1 <= node_id <= 127: - raise ValueError("Node-ID должен быть от 1 до 127") - identifier = 0x200 + node_id if can_id is None else can_id - if mode not in ("sam", "dam"): - raise ValueError("Выберите SAM или DAM") - if angle_subindex not in (2, 7): - raise ValueError("Угол: 0x02 — фактический, 0x07 — задание") - if not isinstance(identifier, int) or not 0x201 <= identifier <= 0x57F: - raise ValueError("STD ID вне диапазона RPDO") - if mode == "sam" and identifier not in (0x200 + node_id, 0x27F): - raise ValueError("XDi-net STD ID: 0x200 + источник или 0x27F") - if mode == "dam" and identifier - node_id not in (0x200, 0x300, 0x400, 0x500): - raise ValueError("CANopen DAM: STD ID = база RPDO (200/300/400/500 hex) + получатель") - values = list(raw_values) - if len(values) != len(MASTER_SELECTORS): - raise ValueError("Нужны пять RAW-параметров") - frames = [] - for selector, value in zip(MASTER_SELECTORS, values): - if selector[1:] == bytes.fromhex("01 30 07"): - selector = selector[:3] + bytes([angle_subindex]) - if not isinstance(value, int) or not -32768 <= value <= 32767: - raise ValueError("RAW должен быть INT16: -32768…32767") - data = bytes([node_id | (0x80 if mode == "dam" else 0)]) + selector[1:] + value.to_bytes(2, "little", signed=True) + b"\x00\x00" - frames.append(build_frame(identifier, data, ide=False)) - return frames +def master_frames(node_id, raw_values, can_id=None, mode="sam", angle_subindex=7): # Совместимый API генерирует полный цикл через C. + from .can_transport import build_frame # Транспортный контейнер не задаёт правила DEIF. + values = list(raw_values) # Порт материализует входной iterable для фиксированного ABI. + if mode not in ("sam", "dam") or type(node_id) is not int or not 0 <= node_id <= 127 or len(values) != 5 or any(type(value) is not int or not -2147483648 <= value <= 2147483647 for value in values) or (can_id is not None and (type(can_id) is not int or not 0 < can_id <= 0x1FFFFFFF)): # Проверяются только представимость ABI и число аргументов цикла. + raise ValueError("DEIF: неверный Node-ID, режим, CAN ID или пять RAW-параметров") # Значения не усекаются ctypes незаметно. + source, output = (C.c_int32 * 5)(*values), (Frame * 5)() # Оба буфера имеют явный размер и принадлежат Python. + if _API.master(node_id, source, 0 if can_id is None else can_id, mode == "dam", angle_subindex, output) != 5: # Порядок объектов, I16 и адресацию проверяет общий C-код. + raise ValueError("DEIF: Node-ID, RPDO, подиндекс азимута или RAW вне диапазона") # Частично собранный цикл не передаётся. + return [build_frame(item.can_id, bytes(item.data[:item.dlc]), ide=False) for item in output] # Транспорт получает готовые wire-байты. -# Display binding catalogue. None means library-dependent resolution, not degrees/%. -DISPLAY_PRESETS = { - "power": ("POWER · AC2 (RAW)", 0x3420, 2, None), - "rpm": ("RPM · обороты (×0.1)", 0x3080, 2, 0.1), - "angle": ("Угол · задание (×0.1°)", 0x3000, 7, 0.1), - "angle_actual": ("Угол · фактический (×0.1°)", 0x3000, 2, 0.1), - "power_percent": ("POWER% · AC2 (×0.1%)", 0x3430, 2, 0.1), - "rpm_percent": ("RPM% (×0.1)", 0x3090, 2, 0.1), -} +_PRESET_FIELDS = {"power": 0, "rpm": 1, "angle": 5, "angle_actual": 2, "power_percent": 3, "rpm_percent": 4} # Совместимые имена редакторов связываются с field ID ABI. +_PRESET_NAMES = {"power": "POWER · AC2 (RAW)", "rpm": "RPM · обороты (×0.1)", "angle": "Угол · задание (×0.1°)", "angle_actual": "Угол · фактический (×0.1°)", "power_percent": "POWER% · AC2 (×0.1%)", "rpm_percent": "RPM% (×0.1)"} # Подписи относятся только к представлению. +DISPLAY_PRESETS = {} # Числовые индексы не дублируются таблицей Python. +for _key, _field in _PRESET_FIELDS.items(): # Значения каталога читаются из C при загрузке расширения. + _metadata = (C.c_int32 * 3)() # Публичный ABI выдаёт base/subindex/resolution. + _API.catalog(_field, _metadata) # Общая библиотека является источником объекта и разрешения. + DISPLAY_PRESETS[_key] = (_PRESET_NAMES[_key], _metadata[0], _metadata[1], None if _metadata[2] == 127 else 10.0 ** _metadata[2]) # Конвертация показателя степени нужна только существующему редактору коэффициента. -def display_preset(key, node, instance=1, dam=False): - """Return a catalogue selector and its known scale, or None for RAW.""" - if not 1 <= node <= 127 or not 1 <= instance <= 15: - raise ValueError("Node-ID: 1…127; instance: 1…15") - _, base, subindex, scale = DISPLAY_PRESETS[key] - selector = bytes([node | (0x80 if dam else 0)]) + (base + instance).to_bytes(2, "little") + bytes([subindex]) - return selector.hex(" ").upper(), scale +def display_preset(key, node, instance=1, dam=False): # Сохраняет прежний API выбора библиотечного объекта. + return _API.selector_bytes(_PRESET_FIELDS[key], node, instance, dam).hex(" ").upper(), DISPLAY_PRESETS[key][3] # Ни endian, ни арифметика индексов не повторяются в Python. diff --git a/python/set_devices/emulator_protocol.py b/python/set_devices/emulator_protocol.py new file mode 100644 index 0000000..ec56afb --- /dev/null +++ b/python/set_devices/emulator_protocol.py @@ -0,0 +1,140 @@ +"""SET v2/RTU session for emulator panels; no I/O or Qt dependencies. + +Only discovery may fall back to RTU. An application command is sent once; +failure after choosing v2 must never resend a write using another protocol. +""" +import secrets +import struct + +from setprotocol.core import (Frame, FrameFlag, FrameParser, MessageType, Status, + DeviceInfo, build_frame, decode_response) +from set_devices.tms_terminal import crc16_modbus +from set_devices.mcu_profiles import EMULATOR_PROFILES # Проверка DeviceInfo использует модель конкретной платы из общего аппаратного профиля. + +REG_REQUEST = 0x1000 +TMS_REQUEST = 0x1001 +WAVE_BLOCK = 0x1002 +MODEL = 'STM32F407-EMU-EXPERIMENT' + + +def with_crc(body): + return body + struct.pack('= 9 and raw[1] == 16: + return self._frame(WAVE_BLOCK, raw, raw[0]) + if len(raw) == 8 and raw[1] in (3, 6): + unit, fn, address, value = struct.unpack('>BBHH', raw[:6]) + return self._frame(REG_REQUEST, struct.pack('HH', raw[2:6]): + raise ValueError('SET v2: неверное подтверждение записи') + return raw + return with_crc(bytes([raw[0], 3, count * 2]) + struct.pack(f'>{count}H', *words)) diff --git a/python/set_devices/firmware_identity.py b/python/set_devices/firmware_identity.py index 453c21e..e8ff861 100644 --- a/python/set_devices/firmware_identity.py +++ b/python/set_devices/firmware_identity.py @@ -57,6 +57,29 @@ def decode_identity(words): raise ValueError("Некорректные данные версии: " + str(error)) from error +def validate_image_device(meta, expected_product, expected_target="TMS320F28335"): # Сопоставляет назначение в паспорте с настройкой загрузчика без обращения к подключённой плате. + product, target = meta.get('product', 'не указана'), meta.get('target', 'не указан') # Отсутствующее назначение тоже даёт понятный отказ, включая Flash RS, где KeyError не является пользовательской ошибкой. + if product == expected_product and target == expected_target: # Совпадение обоих полей сохраняет прежнее разрешение на дальнейшие проверки BIN. + return # Не заменяет проверку размера, SHA-256 и формата, которую вызывающий код выполняет отдельно. + models = {'Balsam-166-PM35': 'Бальзам-166 ПМ35', 'Balsam-167-PM35': 'Бальзам-167 ПМ35'} # Человекочитаемые названия соответствуют двум моделям из списка «Модель платы». + selected = models.get(str(expected_product), str(expected_product)) # Для других устройств сохраняет исходное обозначение, не выдавая неизвестную модель за 166 или 167. + actual = models.get(str(product), str(product)) # Показывает назначение из паспорта; ошибочный тип поля тоже не мешает вывести причину отказа. + differences = [] # Собирает только действительно различающиеся признаки, чтобы общий процессор не выглядел причиной отказа. + if product != expected_product: # Различие моделей проверяется независимо от процессора, который может совпадать у разных плат. + differences.append('модели платы') # Указывает на расхождение обозначений 166/167 даже при одинаковом TMS320F28335. + if target != expected_target: # Отдельно выявляет несовместимый процессор без ошибочного обвинения модели платы. + differences.append('процессора') # Дополняет причину вторым признаком, только если его значение отличается. + raise ValueError( # Блокирует загрузку с подробным объяснением; метаданные не доказывают аппаратное назначение содержимого BIN. + 'Назначение прошивки не совпадает с выбранным устройством. Загрузка заблокирована.\n' # Сразу сообщает результат проверки и его влияние на загрузку. + f'Выбрано в программе: {selected} ({expected_product}); процессор {expected_target}.\n' # Связывает ожидаемые значения с пользовательской настройкой, а не с результатом опроса платы. + f'В паспорте файла: {actual} ({product}); процессор {target}.\n' # Показывает фактические значения полей паспорта рядом с ожидаемыми. + f'Причина: несовпадение {" и ".join(differences)}. Модель подключённой платы этой проверкой не определялась.\n' # Разделяет установленное расхождение метаданных и неизвестное состояние оборудования. + f'Для платы {selected} выберите BIN с паспортом для этой модели и процессора {expected_target}. ' # Предлагает комплект для нужной платы, сохраняя выбранную пользователем модель. + f'Если эта прошивка собрана для {selected}, проверьте назначение в настройках сборки и заново сформируйте выпуск с паспортом. ' # Объясняет исправление ошибочной маркировки сборки без подмены значений готового паспорта. + 'Поле «Модель платы» меняйте, только если в программе выбрана не ваша плата.' # Не предлагает выбирать 167 ради обхода сообщения при реальной плате 166. + ) # Завершает единое сообщение, одинаковое для EEPROM BIN и Flash RS BIN. + + def inspect_image(path: Path, data: bytes | None = None, *, expected_eeprom=None, expected_product="Balsam-167-PM35", expected_target="TMS320F28335", max_image_size=MAX_IMAGE_SIZE): @@ -82,8 +105,7 @@ def inspect_image(path: Path, data: bytes | None = None, *, expected_eeprom=None if (meta['schema'] != 1 or meta['identity_contract'] != 1 or meta['identity_register_count'] != REGISTER_COUNT): raise ValueError("Неизвестный формат паспорта") - if meta['product'] != expected_product or meta['target'] != expected_target: - raise ValueError(f"Паспорт предназначен для другого устройства (ожидается {expected_product} / {expected_target})") + validate_image_device(meta, expected_product, expected_target) # При несовпадении показывает выбранные и паспортные модель/процессор с причиной отказа и способом исправления. if (type(meta['size_bytes']) is not int or meta['size_bytes'] != len(data) or meta['sha256'] != hashlib.sha256(data).hexdigest()): raise ValueError("BIN не соответствует паспорту: размер или SHA-256 не совпадает") diff --git a/python/set_devices/generator_data.py b/python/set_devices/generator_data.py index c18f667..9b02d96 100644 --- a/python/set_devices/generator_data.py +++ b/python/set_devices/generator_data.py @@ -8,6 +8,7 @@ import io import math import json from datetime import datetime +from functools import lru_cache # Таблица достижимых частот строится один раз для каждого аппаратного таймера MCU. from set_devices.waveform import Waveform, generate as interpolate, load_recipe as load_interpolated_recipe from set_devices.signal_reconstruction import dac12 @@ -15,13 +16,14 @@ from set_devices.signal_reconstruction import dac12 # TIM6 clock of the supported STM32F407 emulator firmware. The device protocol # does not currently expose its timer clock; keep this hardware profile explicit. F407_TIMER_HZ = 72_000_000 -F407_SAMPLE_RATES = tuple(sorted({ - rate - for divisor in range(1, math.isqrt(F407_TIMER_HZ) + 1) - if F407_TIMER_HZ % divisor == 0 - for rate in (divisor, F407_TIMER_HZ // divisor) - if 1 <= rate <= 1_000_000 -})) +@lru_cache(maxsize=16) # Небольшой кэш хранит аппаратные профили без повторного перебора делителей при построении сигнала. +def timer_sample_rates(timer_hz, sample_max=1_000_000): # Частоты задаются целочисленным делением TIM6 выбранного MCU, единицы обоих параметров — Гц. + if timer_hz <= 0 or sample_max <= 0: # Нулевые и отрицательные аппаратные параметры не описывают рабочий таймер. + raise ValueError("Частота таймера и предел выборок должны быть положительными") # Ошибка профиля выявляется до формирования таблицы DAC. + return tuple(sorted({rate for divisor in range(1, math.isqrt(timer_hz) + 1) if timer_hz % divisor == 0 for rate in (divisor, timer_hz // divisor) if 1 <= rate <= sample_max})) # Парные делители охватывают все точные частоты без перебора каждого значения до тактовой частоты. + + +F407_SAMPLE_RATES = timer_sample_rates(F407_TIMER_HZ) # Старый публичный экспорт сохраняет прежние результаты для профиля F407 72 МГц. def nearest_f407_sample_rate(rate): @@ -29,9 +31,9 @@ def nearest_f407_sample_rate(rate): return min(F407_SAMPLE_RATES, key=lambda candidate: (abs(candidate - rate), candidate)) -def generate(points, sample_rate=1000, vref=3.3, method="pchip", degree=2): +def generate(points, sample_rate=1000, vref=3.3, method="pchip", degree=2, *, backend="native"): # Прозрачно передаём выбранный настольный решатель общему генератору. if method != "samples": - return interpolate(points, sample_rate, vref, method, degree) + return interpolate(points, sample_rate, vref, method, degree, backend=backend) # Расчёт остаётся в нативном порте; обработчик готовых отсчётов не требует МНК. if type(sample_rate) is not int or not 1 <= sample_rate <= 1000000: raise ValueError("Частота отсчётов должна быть 1…1000000 Гц") if not math.isfinite(vref) or not 0 < vref <= 3.6: diff --git a/python/set_devices/mcu_profiles.py b/python/set_devices/mcu_profiles.py new file mode 100644 index 0000000..ff7f2d9 --- /dev/null +++ b/python/set_devices/mcu_profiles.py @@ -0,0 +1,46 @@ +TEMPLATE_MCUS = { # Каталог отражает конкретные MCU-порты закреплённого templates; значения загрузчиков совпадают с FirmwareTab. + "stm32": ( # Порядок сохраняет прежние F103/F407 и группирует добавленные варианты по семействам. + ("STM32F103C8T6", "DS18B20, CAN Sensor, RS-485 Boot, Firmware Info и LED Indicator.", 2), # Порты ds18b20/stm32f1 и rs485-boot/stm32f103 используют имеющийся UART ROM Boot, индекс 2. + ("STM32F407", "STM32F407VET6: SETProtocol, DevBoard V1, эмуляторы, генератор ЦАП, Parallel NAND и USB Boot.", 7), # Порты set-protocol/stm32f407-* и parallel-nand/stm32f407ve; индекс 7 относится только к USB-загрузчику F407. + ("STM32F103RCT6", "Parallel NAND через GPIO, SETProtocol, DS18B20, Firmware Info и LED Indicator.", None), # Отдельный порт parallel-nand/stm32f103rc учитывает отсутствие FSMC в корпусе LQFP64; None открывает обзор MCU. + ("STM32F103ZET6", "Parallel NAND через FSMC, SETProtocol, эмуляторы УМП / 2812 / IGBT / ЦАП / DEIF, DS18B20, Firmware Info и LED Indicator.", None), # Порт parallel-nand/stm32f103ze использует аппаратный FSMC, поэтому вариант показан отдельно от RCT6. + ("STM32G431", "DS18B20 / 1-Wire, Firmware Info и LED Indicator.", None), # Поддержка задана конфигурацией ds18b20/stm32g4/onewire_config.g431.template.h и общими портами G4. + ("STM32G474", "SETProtocol, DS18B20 / 1-Wire, Firmware Info, LED Indicator и генератор ЦАП.", None), # Общие порты stm32g4 и set-protocol/stm32g474-wavegen подходят семейству; конкретные платы перечислены ниже. + ("STM32G474CEU6", "Parallel NAND через GPIO, DS18B20 / 1-Wire, Firmware Info и LED Indicator.", None), # Порт parallel-nand/stm32g474ce предназначен для корпуса UFQFPN-48. + ("STM32G474RB", "SETProtocol, периферийный эмулятор, генератор ЦАП и порт USB Boot в templates.", None), # Порты set-protocol/stm32g474-periph и stm32g474-usb-boot описывают RB; USB-клиент F407 не назначается этому MCU. + ("STM32G474VET6", "HOPE: эмуляторы УМП / 2812 / IGBT / ЦАП / DEIF; CANdle CAN / UART BOOT, STM Invertor, DS18B20 / 1-Wire.", None), # CAN_BOOTLOADER_G474.md проекта CANdle подтверждает BOOT именно VET6, отдельно от USB BOOT платы RB. + ), # Завершаем список STM32 без автоматического поиска каталогов, недоступных внутри собранного EXE. + "k1921": ( # К1921 использует те же общие инструменты SETProtocol, что описаны в PROJECT_RELATIONS.md. + ("K1921VK028", "RTC Service, Firmware Info и обмен SETProtocol через UART.", None), # Источники возможностей — rtc-service/k1921vk028, firmware-info/k1921vk028 и транспорт приложения. + ), # Единственный конкретный MCU этого семейства в текущем templates. +} # Чистые данные не создают Qt-виджеты и сохраняют отложенное построение платформ. + +EMULATOR_MODES = { # Номера режимов совпадают с config[3] общего set_emu_server и не зависят от MCU. + 0: ("ump", "УМП — логгер и сигналы", "УМП: запись логгера и управление эмуляцией пуска."), # Режим по умолчанию после сброса MCU. + 1: ("tms2812", "2812 — BALZAM_7 / CMD_STD", "2812: пуск, останов и задание частоты через CMD_STD."), # Обмен 2812 использует собственный адрес, обычно 1. + 2: ("igbt", "IGBT / драйвер — Vin / Vstat", "IGBT: после выбора включите эмуляцию в панели драйвера."), # Физические GPIO зависят от платы, сама модель общая. + 3: ("wavegen", "Генератор сигналов — ЦАП / PA4", "ЦАП: загрузите таблицу, затем отдельно нажмите «Пуск ЦАП»."), # Запись таблицы не запускает аппаратный вывод. + 4: ("deif", "DEIF Master — передача CAN", "DEIF Master: настройте профиль и RAW, затем нажмите «Пуск DEIF»."), # Общая C-модель передаёт SAM/DAM через аппаратный CAN выбранного MCU. + 5: ("deif", "DEIF Slave — приём CAN", "DEIF Slave: настройте Node-ID и привязки, затем нажмите «Пуск DEIF»."), # Роль Slave принимает NMT/MPDO и передаёт Boot-up, heartbeat и EMCY. +} # Режим применяется отдельной подтверждаемой транзакцией STM, запуск выполняется в панели модели. +EMULATOR_TOOLS = { # Один набор инструментов используется каждым реализованным аппаратным портом. + "settings": "Настройки STM", # Адрес, скорость и режим читаются и проверяются общим клиентом. + "ump": "УМП", # Логгер и синтетические сигналы используют set_emu_ump. + "tms2812": "2812", # Обмен BALZAM_7 использует set_emu_tms. + "igbt": "IGBT / драйвер", # Логические входы и выходы используют set_emu_igbt. + "wavegen": "Подключение генератора", # Таблица передаётся общему генератору с таймером выбранной платы. + "deif": "DEIF Master / Slave", # Одна панель управляет обеими ролями set_emu_deif. +} # Приложение предоставляет существующие панели и использует общую панель DEIF из templates. +EMULATOR_MENU_TITLE = "Эмуляторы: УМП / 2812 / IGBT / ЦАП / DEIF" # Обзор MCU и общая навигация используют одинаковый список поддержанных моделей. +EMULATOR_PROFILES = { # Каталог содержит платы с реальной прошивкой stm32-emulator; дополнительные порты подключаются здесь. + "STM32F407": {"title": "STM32F407VET6", "timer_hz": 72_000_000, "sample_max": 1_000_000, "settings": "stm_ump", "model": "STM32F407-EMU-EXPERIMENT", "igbt_inputs": tuple("PB%d" % pin for pin in range(8)), "igbt_gpio": True, "wave_port": "stm32f407-periph", "tools": tuple(EMULATOR_TOOLS)}, # TIM6 72 МГц и прежний ключ stm_ump сохраняют совместимость F407. + "STM32F103ZET6": {"title": "STM32F103ZET6", "timer_hz": 72_000_000, "sample_max": 1_000_000, "settings": "stm_emulator/STM32F103ZET6", "model": "STM32F103ZE-EMU-EXPERIMENT", "igbt_inputs": ("PB0", "PB1", "PB2", "PB10", "PB11", "PB12", "PB13", "PB14"), "igbt_gpio": True, "wave_port": "stm32f103-periph", "tools": tuple(EMULATOR_TOOLS)}, # High-density F103ZE имеет DAC/TIM6 72 МГц, UART/GAS и bxCAN; малые F103 без DAC не объявляются совместимыми автоматически. + "STM32G474RB": {"title": "STM32G474RB", "timer_hz": 160_000_000, "sample_max": 1_000_000, "settings": "stm_emulator/STM32G474RB", "model": "STM32G474RB-EMU-EXPERIMENT", "igbt_inputs": ("PB0", "PB1", "PB2", "PB10", "PB11", "PB12", "PB13", "PB14"), "igbt_gpio": True, "wave_port": "stm32g474-periph", "tools": tuple(EMULATOR_TOOLS)}, # RB использует свой USB BOOT, FDCAN и TIM6 160 МГц. + "STM32G474VET6": {"title": "HOPE STM32G474VET6", "timer_hz": 160_000_000, "sample_max": 1_000_000, "settings": "stm_emulator/STM32G474VET6", "model": "STM32G474VE-HOPE-EMU", "igbt_inputs": ("PB0", "PB1", "PB2", "PB10", "PB11", "PB12", "PB13", "PB14"), "igbt_gpio": False, "wave_port": "stm32g474-periph", "tools": tuple(EMULATOR_TOOLS)}, # HOPE подтверждает собственную USB-модель, USART1 PA9/PA10 и CAN1 PD0/PD1; GPIO IGBT отключены из-за CAN2 на PB12/PB13. +} # Модели общие, а идентичность, GPIO, частоты и сохранённое подключение принадлежат выбранной плате. +CANDLE_G474_BOOT = { # Профиль воспроизводит CAN_BOOTLOADER_G474.md и boot_profile.h проекта CANdle_stm32. + "app_base": 0x08008000, "app_size": 480 * 1024, # Начальные 32 КиБ из 512 КиБ Flash заняты BOOT; приложение занимает оставшиеся 480 КиБ. + "stack_base": 0x20000000, "stack_end": 0x20014000, # Валидатор pcan_boot_stm32g474.c проекта CANdle принимает начальный MSP только внутри используемых linker-скриптом 80 КиБ SRAM. + "device_type": 7, "device": 15, "product": 0, "hardware": 0, # Идентичность ProtoCAN BOOT: Type 7, Device 15, Product 0 и аппаратная ревизия 0. + "can_bitrate": 500_000, "uart_baud": 512_000, # Classic CAN работает на 500 кбит/с, USART1 PA9/PA10 — на 512000 бод, 8N1. +} # Адреса и скорости относятся только к CANdle G474VET6 и не подменяют профиль USB BOOT G474RB. diff --git a/python/set_devices/plot_processing.py b/python/set_devices/plot_processing.py index 071c9ed..9805b1a 100644 --- a/python/set_devices/plot_processing.py +++ b/python/set_devices/plot_processing.py @@ -13,7 +13,7 @@ from bisect import bisect_left, bisect_right from .plot_decimation import PointTimes # Используем координаты X без копирования ряда и без недоступного в Python 3.8 параметра key. from dataclasses import dataclass from datetime import datetime, timezone -from .signal_reconstruction import METHODS, reconstruct +from .signal_reconstruction import BACKENDS, METHODS, reconstruct # Общие подписи решателей используются в легенде и CSV, чтобы различать результаты сравнения. class FrozenPoints(tuple): @@ -96,6 +96,7 @@ class Request: output_count: int degree: int x_range: tuple | None + backend: str = "native" # Вариант входит в равенство запросов, поэтому две расчётные кривые могут сосуществовать. @dataclass(frozen=True) @@ -106,6 +107,7 @@ class Curve: unique_count: int rmse: float pieces: tuple = () + elapsed_ms: float = 0.0 # Сохраняем полное время расчёта отдельно от геометрии и оценки точности. def piece_at(self, x): for piece in self.pieces: @@ -115,10 +117,11 @@ class Curve: @property def label(self): - return f"{self.request.series.label} · расчёт ({METHODS[self.request.method]})" + variant = " · " + BACKENDS[self.request.backend] if self.request.method == "polynomial" else "" # Дополняем название только у метода, имеющего альтернативный решатель. + return f"{self.request.series.label} · расчёт ({METHODS[self.request.method]}{variant})" # Подпись однозначно связывает слой графика и экспорт CSV с вариантом МНК. -def prepare(snapshot, key, method="pchip", output_count=1000, degree=2): +def prepare(snapshot, key, method="pchip", output_count=1000, degree=2, backend="native"): # Новый последний параметр не меняет существующие вызовы подготовки снимка. """Return a comparable request, or None when the source is not processable.""" if snapshot.blocked_reason: return None @@ -130,14 +133,14 @@ def prepare(snapshot, key, method="pchip", output_count=1000, degree=2): selected = Series(selected.key, selected.label, selected.points.between(left, right), y_unit=selected.y_unit) - return Request(selected, snapshot.axis, snapshot.source, method, output_count, degree, snapshot.x_range) + return Request(selected, snapshot.axis, snapshot.source, method, output_count, degree, snapshot.x_range, backend) # Включаем выбранный решатель в идентичность запроса и проверку устаревших результатов. def process(request): if request is None: raise ValueError("Нет доступного аналогового канала") - result = reconstruct(request.series.points, request.method, request.output_count, request.degree, with_model=True) - return Curve(request, tuple(result.points), result.input_count, result.unique_count, result.rmse, result.pieces) + result = reconstruct(request.series.points, request.method, request.output_count, request.degree, with_model=True, backend=request.backend) # Передаём явный выбор пользователя в общий тонкий порт без численных вычислений в UI. + return Curve(request, tuple(result.points), result.input_count, result.unique_count, result.rmse, result.pieces, result.elapsed_ms) # Результат сохраняет время и метрики, относящиеся к одному конкретному запуску. def write_csv(curve, stream): diff --git a/python/set_devices/qt_ports/circuit_parameters.py b/python/set_devices/qt_ports/circuit_parameters.py new file mode 100644 index 0000000..b659a8b --- /dev/null +++ b/python/set_devices/qt_ports/circuit_parameters.py @@ -0,0 +1,33 @@ +"""Необязательные известные элементы последовательного эквивалента RLC.""" # Ввод не смешивает номиналы реального RC-снаббера с параметрами идентифицируемых полюсов. +try: # Поддерживаем современные и совместимые Windows-сборки. + from PySide6.QtCore import Signal # Одно изменение любого элемента делает старый подбор моделей неактуальным. + from PySide6.QtWidgets import QDoubleSpinBox, QHBoxLayout, QLabel, QWidget # Используем стандартные числовые поля Qt6. +except ImportError: # Qt5 получает тот же интерфейс без дополнительных зависимостей. + from PySide2.QtCore import Signal # Контракт сигналов одинаков на Windows 7 и новых системах. + from PySide2.QtWidgets import QDoubleSpinBox, QHBoxLayout, QLabel, QWidget # Набор полей и единицы не зависят от версии Qt. + + +class CircuitParameters(QWidget): # Компонент можно встроить в подробные параметры любого вида сравнения. + changed = Signal() # Владелец решает, запускать ли автоматический пересчёт или ожидать кнопку. + + def __init__(self, parent=None): # По умолчанию ни один электрический элемент не предполагается известным. + super().__init__(parent) # Жизненным циклом компонента управляет родительская панель сравнения. + row = QHBoxLayout(self) # Три поля и пояснение занимают одну строку. + row.setContentsMargins(0, 0, 0, 0) # Сохраняем существующие отступы формы. + row.addWidget(QLabel('Эквивалентный последовательный RLC:')) # Явно называем топологию, к которой относятся формулы R/L и LC. + self.inductance, self.capacitance, self.resistance = QDoubleSpinBox(), QDoubleSpinBox(), QDoubleSpinBox() # Отдельное неизвестное значение разрешено у каждого элемента. + self.controls = (self.inductance, self.capacitance, self.resistance) # Общий список позволяет блокировать ввод во время рабочего задания. + for title, box, suffix in (('L', self.inductance, ' нГн'), ('C', self.capacitance, ' нФ'), ('R', self.resistance, ' Ом')): # Удобные единицы соответствуют обычным масштабам коммутационного контура. + row.addWidget(QLabel(title)) # Подпись отделяет физическую величину от единицы в поле. + box.setDecimals(6) # Дробные нГн, нФ и Ом сохраняются без грубого округления. + box.setRange(0., 1e12) # Ноль означает неизвестное значение; отрицательные пассивные элементы не допускаются. + box.setSpecialValueText('неизвестно') # Не скрываем отсутствие исходных электрических данных за произвольным номиналом. + box.setSuffix(suffix) # Единица видна при вводе любого положительного значения. + box.setMaximumWidth(170) # Ширина в логических пикселях оставляет место всем трём элементам. + box.setToolTip('Введите известный элемент последовательного эквивалента. Ноль — неизвестно. Это не автоматическая модель топологии RC-снаббера.') # Объяснение предотвращает неверную интерпретацию восстановленных номиналов. + box.valueChanged.connect(lambda _value: self.changed.emit()) # Любое изменение требует нового численного подбора и отчёта. + row.addWidget(box) # Поля располагаются в порядке L, C и R. + row.addStretch(1) # Свободная ширина не растягивает числовые поля. + + def values(self): # Снимок значений фиксируется до запуска фоновой идентификации. + return dict(inductance_h=self.inductance.value() * 1e-9, capacitance_f=self.capacitance.value() * 1e-9, resistance_ohm=self.resistance.value()) # нГн и нФ переводятся в СИ; Ом уже соответствует внутренним формулам. diff --git a/python/set_devices/qt_ports/deif_emulator.py b/python/set_devices/qt_ports/deif_emulator.py new file mode 100644 index 0000000..9077911 --- /dev/null +++ b/python/set_devices/qt_ports/deif_emulator.py @@ -0,0 +1,120 @@ +"""Асинхронное управление общим DEIF через SET v2 или RTU.""" # Обмен не зависит от приложения-потребителя и аппаратного порта MCU. +import struct # FC03 и FC06 используют порядок байтов Modbus big-endian внутри общего транспорта. +from .qt_compat import QObject, QTimer, Signal, QSerialPort # Поддерживает одинаковую машину обмена для Qt5 и Qt6. +from .emulator_serial import EmulatorSerialPort # Автомат обнаруживает протокол и проверяет модель выбранной платы. +from .stm_settings import request, decode_config # Настройки STM читаются тем же кодеком, что явный выбор эмулятора. +from set_devices.tms_terminal import crc16_modbus # CRC проверяется также при транспортировке RTU-команды внутри SET v2. +from set_devices.deif_emulator import DEIF_BASE, DEIF_WORDS, decode_snapshot # Адреса, сигнатура и интерпретация снимка общие для всех MCU. + + +class DeifEmulatorClient(QObject): # Каждая операция заканчивается закрытием COM, не удерживая общий порт между действиями. + finished = Signal(bool, str, object) # Возвращает подтверждённый снимок либо ошибку без ложного успеха записи. + + def __init__(self, parent=None, *, serial_factory=EmulatorSerialPort): # Подмена фабрики предназначена для проверки на реальном C-ядре без оборудования. + super().__init__(parent) # QObject освобождает таймеры вместе с владельцем панели. + self.serial = serial_factory(self) # Один адаптер хранит выбранный MCU и выполняет безопасный handshake. + self.serial.readyRead.connect(self._receive) # Разбор допускает произвольную фрагментацию USB/UART. + self.serial.errorOccurred.connect(self._error) # Ошибка открытия или передачи завершает только текущую операцию. + self.timeout = QTimer(self) # Ограничение ожидания применяется отдельно к каждому запросу. + self.timeout.setSingleShot(True) # Тайм-аут не создаёт повторных записей со сторонними эффектами. + self.timeout.timeout.connect(lambda: self._finish(False, "Тайм-аут DEIF; состояние записи проверьте повторным чтением")) # Потерянный ответ не означает, что команда не исполнилась. + self.delay = QTimer(self) # Следующий запрос отправляется вне стека readyRead. + self.delay.setSingleShot(True) # Каждое подтверждение разрешает ровно один следующий шаг. + self.delay.timeout.connect(self._next) # Последовательные FC06 не перемешиваются с финальной проверкой. + self.active = False # Новая операция разрешена только после полного завершения предыдущей. + + def start(self, port, unit, baud, timeout, writes=()): # Профиль связи передаётся потребителем явно, без глобального COM и адреса. + if self.active: # Повторное нажатие не должно сбросить ожидающую подтверждения запись. + return # Текущая операция сохраняет первоначальный профиль. + self.writes = tuple((int(offset), int(value) & 0xFFFF) for offset, value in writes) # RAW I16 кодируется теми же 16 битами без потери знака. + if any(offset not in (2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20) and not 32 <= offset < 44 for offset, _value in self.writes): # Только документированные writable слова версии 1 допускаются в очередь. + self.finished.emit(False, "Регистр DEIF недоступен для записи", None) # Локальная ошибка обнаруживается до открытия физического порта. + return # Чужие регистры и конфигурация STM не могут попасть в эту транзакцию. + self.unit, self.timeout_ms = unit, timeout # Адрес управления STM по умолчанию 16; тайм-аут задаётся в мс. + self.active, self.stage, self.rx = True, "config", bytearray() # Первая команда только читает действующий режим MCU. + self.serial.setPortName(port) # Выбор COM не открывает соединение до настройки формата. + self.serial.setBaudRate(baud) # USART использует выбранную скорость; для CDC это поле совместимости. + self.serial.setDataBits(QSerialPort.DataBits.Data8) # Восемь бит данных соответствуют аппаратным портам STM. + self.serial.setParity(QSerialPort.Parity.NoParity) # Проверку целостности выполняет CRC, формат UART без чётности. + self.serial.setStopBits(QSerialPort.StopBits.OneStop) # Один стоп-бит завершает формат 8N1. + self.serial.setFlowControl(QSerialPort.FlowControl.NoFlowControl) # RTS/CTS прошивкой не используются. + if not self.serial.open(QSerialPort.OpenModeFlag.ReadWrite): # COM может быть занят другой программой. + self._finish(False, self.serial.errorString()) # Ошибка сообщает реальную причину открытия. + return # Ни чтение, ни запись при закрытом порте не выполняются. + self._send(3, 0x1210, 10) # Адрес и длина блока настроек STM взяты из set_emu_server. + + def _send(self, function, address, value): # Запрос отправляется один раз; автоматического повтора записи нет. + self.packet = request(self.unit, function, address, value) # Общий кодек добавляет правильный CRC16. + self.rx.clear() # Байты предыдущего подтверждённого ответа не примешиваются к новому. + self.timeout.start(self.serial.response_timeout(self.timeout_ms)) # Первый обмен учитывает время определения SET v2/RTU. + if self.serial.write(self.packet) != len(self.packet): # Частичная постановка запроса в очередь не считается отправкой. + self._finish(False, "Не удалось передать запрос DEIF") # Операция останавливается без повторной передачи. + + def _receive(self): # Накапливает только ответ текущего FC03 или FC06. + chunk = bytes(self.serial.readAll()) # Готовые байты забираются даже при отменённой операции. + if not self.active or not self.timeout.isActive(): # Поздний ответ не возобновляет отменённую последовательность. + return # Команда остаётся завершённой до нового явного действия пользователя. + self.rx.extend(chunk) # USB может разрезать ответ по любым границам. + function = self.packet[1] # Функция текущего запроса определяет размер ответа. + while len(self.rx) >= 3: # Заголовок содержит unit, function и byte count либо exception code. + if self.rx[0] != self.unit or self.rx[1] not in (function, function | 0x80): # Чужие либо старые кадры не подтверждают текущую операцию. + del self.rx[0] # Сдвиг на байт позволяет восстановиться после шумового префикса. + continue # Повторно ищет подходящий заголовок в оставшихся байтах. + expected = self.packet[5] * 2 if function == 3 else 0 # Все чтения короче 256 слов, старший байт количества равен нулю. + size = 5 if self.rx[1] & 0x80 else expected + 5 if function == 3 else 8 # Exception имеет 5 байт, FC06 echo — 8, FC03 — данные плюс заголовок и CRC. + if len(self.rx) < size: # Незавершённый ответ остаётся в буфере до readyRead или тайм-аута. + return # Никаких записей до полного подтверждения не выполняется. + raw = bytes(self.rx[:size]) # Фиксирует кадр до удаления из транспортного буфера. + del self.rx[:size] # Следующий шаг начнёт новый обмен с чистым буфером. + self.timeout.stop() # Полный ответ больше не ожидает истечения тайм-аута. + try: # Ошибки протокола должны возвращаться через finished, не покидая слот Qt. + if crc16_modbus(raw): # Нулевая CRC полного кадра подтверждает целостность. + raise ValueError("Неверная CRC ответа DEIF") # Повреждённый кадр не подтверждает запись. + if raw[1] & 0x80: # Старая прошивка либо неверный режим возвращает Modbus exception. + raise ValueError("STM отклонила DEIF, код %d; проверьте режим и версию прошивки" % raw[2]) # Показывает реальный код без предположения об успешном исполнении. + if function == 6 and raw != self.packet or function == 3 and raw[2] != expected: # Echo и фактическая длина должны точно совпасть с запросом. + raise ValueError("Неверное подтверждение DEIF") # Ответ другой команды не продвигает очередь. + self._accept(raw) # Только проверенный ответ может разрешить следующий шаг. + except ValueError as error: # Локальная проверка сигнатуры или роли имеет тот же путь завершения. + self._finish(False, str(error)) # Все таймеры и COM закрываются одинаково при любой ошибке. + return # За один сигнал обрабатывается только текущий запрос последовательности. + + def _accept(self, raw): # Порядок: конфигурация, сигнатура DEIF, записи, итоговый снимок. + if self.stage == "config": # Чтение действующего режима предшествует любым командам DEIF. + self.mode = decode_config(raw)[8] # Общий декодер проверяет сигнатуру STM и допустимые режимы. + if self.writes and self.mode not in (4, 5): # Выбор режима выполняется отдельной явной транзакцией STM. + raise ValueError("Выберите DEIF Master или DEIF Slave в настройках STM и примените режим") # Чтение остаётся доступным для диагностики любой прошивки с DEIF. + self.stage = "probe" # Теперь нужно проверить версию и роль отдельного окна DEIF. + self.steps = [(3, DEIF_BASE, DEIF_WORDS)] # Одно чтение возвращает атомарный снимок 52 слов. + elif self.packet[1] == 3: # Окно читается перед записями и после них. + snapshot = decode_snapshot(struct.unpack(">%dH" % DEIF_WORDS, raw[3:-2]), self.mode) # Совместимость подтверждается данными реального MCU. + if self.stage == "probe" and self.writes: # Совместимый сервис разрешает подготовленные пользователем команды. + self.stage = "write" # С этой точки любой отказ может означать частично применённый профиль. + self.steps = [(6, DEIF_BASE + offset, value) for offset, value in self.writes] + [(3, DEIF_BASE, DEIF_WORDS)] # Финальное чтение обязательно даже после успешных echo. + else: # Чтение без записей и финальная проверка завершают транзакцию. + if any(snapshot.words[offset] != value for offset, value in dict(self.writes).items()): # Повторная запись того же регистра проверяется по последнему значению, включая временную сеть и нулевую маску при настройке. + raise ValueError("DEIF не подтвердил новые значения; повторите чтение состояния") # ACK передачи сам по себе не является проверкой применения. + self._finish(True, "Состояние DEIF прочитано и проверено", snapshot) # Только этот путь публикует подтверждённый снимок формы. + return # Завершённая операция не назначает следующий запрос. + self.delay.start(20) # Пауза 20 мс не блокирует GUI и совпадает с шагом клиента настроек STM. + + def _next(self): # Слот таймера продвигает ровно одну команду подтверждённой последовательности. + if self.active and self.steps: # Отмена удаляет разрешение последующих запросов. + self._send(*self.steps.pop(0)) # Следующая запись выполняется только после echo предыдущей. + + def _error(self, error): # Обрабатывает ошибки последовательного порта в том же GUI-потоке. + if self.active and error not in (QSerialPort.SerialPortError.NoError, QSerialPort.SerialPortError.TimeoutError): # Собственный таймер уже отвечает за тайм-аут транзакции. + self._finish(False, self.serial.errorString()) # Не скрывает причину отключения или отказа COM. + + def cancel(self): # Отмена доступна пользователю без смены режима на MCU. + if self.active: # Повторная отмена не создаёт повторных сигналов завершения. + self._finish(False, "Обмен DEIF отменён; проверьте состояние повторным чтением") # Уже подтверждённые записи не откатываются и не повторяются. + + def _finish(self, ok, message, snapshot=None): # Единое завершение используется при успехе, отмене и ошибке. + if not self.active: # Поздняя ошибка Qt после close не должна затронуть новую операцию. + return # finished публикуется ровно один раз за запуск. + self.active = False # Состояние сбрасывается раньше закрытия COM и внешних обработчиков. + self.timeout.stop() # Ожидание текущего ответа больше не действует. + self.delay.stop() # Следующие записи не отправляются после ошибки. + self.serial.close() # Общий COM освобождается для логгера и других панелей. + self.finished.emit(ok, message, snapshot) # UI получает результат после полного освобождения ресурсов. diff --git a/python/set_devices/qt_ports/deif_emulator_panel.py b/python/set_devices/qt_ports/deif_emulator_panel.py new file mode 100644 index 0000000..a2df214 --- /dev/null +++ b/python/set_devices/qt_ports/deif_emulator_panel.py @@ -0,0 +1,189 @@ +"""Общая панель аппаратного DEIF Master/Slave для всех реализованных MCU.""" # Приложение передаёт только параметры подключения и освобождение общего транспорта. +try: # Qt6 используется современными настольными приложениями. + from PySide6.QtWidgets import QWidget, QVBoxLayout, QFormLayout, QHBoxLayout, QLabel, QPushButton, QSpinBox, QComboBox, QCheckBox, QGroupBox, QScrollArea # Панель не импортирует виджеты конкретного приложения. +except ImportError: # На Windows 7 те же элементы предоставляет Qt5. + from PySide2.QtWidgets import QWidget, QVBoxLayout, QFormLayout, QHBoxLayout, QLabel, QPushButton, QSpinBox, QComboBox, QCheckBox, QGroupBox, QScrollArea # Состав и поведение управления сохраняются между версиями Qt. +from .qt_compat import Signal # Совместимый сигнал сообщает потребителю о занятости общего COM. +from .deif_emulator import DeifEmulatorClient # Обмен и проверка ответов принадлежат templates. +from set_devices.deif_emulator import DEIF_FIELDS, DEIF_INDICES # Порядок полей и OD взяты из переносимой C-модели. +from set_devices.mcu_profiles import EMULATOR_PROFILES # Строка модели USB и настройки MCU определяются единым каталогом. + + +class DeifEmulatorPanel(QWidget): # Единственный экземпляр панели обслуживает выбранную плату без дублирования моделей. + busy_changed = Signal(bool) # Приложение блокирует конфликтующие инструменты на время транзакции. + + def __init__(self, connection, prepare, parent=None): # Колбэки позволяют использовать панель вне SETGUI. + super().__init__(parent) # Владелец Qt управляет временем жизни панели и клиента. + self.connection, self.prepare = connection, prepare # connection возвращает COM, unit, baud, timeout; prepare освобождает транспорт либо возвращает причину отказа. + self.client = DeifEmulatorClient(self) # Общий клиент проверяет режим STM и сигнатуру DEIF перед записью. + self.client.finished.connect(self._finished) # Состояние формы обновляется только подтверждённым снимком. + self.snapshot = None # До первого чтения действия записи заблокированы. + outer = QVBoxLayout(self) # Внешняя компоновка оставляет статус доступным при прокрутке длинного профиля. + self.heading = QLabel() # Название платы меняется вместе с общим селектором MCU. + self.heading.setWordWrap(True) # Полное название HOPE не обрезается при узком окне. + outer.addWidget(self.heading) # Текущая аппаратная цель видна до любых команд. + note = QLabel("В «Настройки STM» выберите DEIF Master или DEIF Slave и примените режим. Управление платой идёт через выбранный COM; кадры DEIF передаются её CAN. Для изменения сетевого профиля сначала нажмите «Останов DEIF». Настройки действуют до сброса или смены роли.") # Объясняет пользователю разделение управления MCU и работы CAN без автоматического запуска. + note.setWordWrap(True) # Пояснение занимает доступную ширину. + outer.addWidget(note) # Инструкция остаётся рядом с кнопками даже после прокрутки профиля. + scroll = QScrollArea() # Настройки и шесть привязок должны помещаться при небольшом разрешении экрана. + scroll.setWidgetResizable(True) # Содержимое использует ширину панели. + content = QWidget() # Дочерний контейнер содержит только редактируемые параметры. + layout = QVBoxLayout(content) # Группы расположены последовательно без вложенных вкладок. + network = QGroupBox("Профиль CAN / DEIF") # Параметры соответствуют словам 4…15 окна 0x1600. + form = QFormLayout(network) # Подписи поясняют назначение каждого числа. + self.node = self._spin(1, 127, 1) # XDi-net разрешает узлы 1…126, CANopen дополнительно 127; firmware проверяет выбранную сеть. + self.peer = self._spin(1, 127, 11) # Для Master это DAM-получатель, для Slave — SAM-источник. + self.network = QComboBox() # Сеть задаёт способ адресации и допустимые RPDO. + self.network.addItems(("XDi-net / SAM", "CANopen / DAM")) # Значения индекса 0 и 1 совпадают с set_emu_deif.h. + self.pdo = self._spin(1, 4, 2) # RPDO2 — штатный профиль, RPDO1 разрешён только в чистом CANopen. + self.period = self._spin(1, 65535, 100) # Период цикла в мс: firmware хранит uint16, нулевой период запрещён. + self.period.setSuffix(" мс") # Единица времени указана непосредственно рядом со значением. + self.mask = self._spin(0, 255, 63, hexadecimal=True) # Биты 0…5 выбирают шесть измерений; 6…7 добавляют яркость и палитру Master. + self.group = self._spin(0, 9, 1) # DEIF поддерживает группы диммера 1…9; 0 означает локальный режим. + self.heartbeat = QCheckBox("Передавать heartbeat Master") # Slave передаёт heartbeat независимо от этого флага. + self.self_start = QCheckBox("Автозапуск Slave в CANopen") # В XDi-net самозапуск через 1 с обязателен по профилю. + self.self_start.setChecked(True) # Совпадает с начальной настройкой set_deif_init. + self.service_sam = QCheckBox("Сервисный SAM COB-ID 0x27F") # Специальный идентификатор включается только явным выбором. + for title, widget in (("Собственный Node-ID", self.node), ("DAM получатель / SAM источник", self.peer), ("Сеть", self.network), ("RPDO", self.pdo), ("Период Master", self.period), ("Маска объектов", self.mask), ("Группа диммера", self.group), ("Heartbeat", self.heartbeat), ("Запуск Slave", self.self_start), ("Сервисный SAM", self.service_sam)): # Группа содержит все изменяемые параметры сетевого профиля C-модели. + form.addRow(title, widget) # Числовые поля не скрываются в аппаратных настройках конкретной платы. + layout.addWidget(network) # Сетевые настройки одинаковы для bxCAN и FDCAN. + self.network_group = network # Запущенный эмулятор не разрешает менять сетевой профиль. + values = QGroupBox("Задания Master / показания Slave") # Одни и те же RAW показывают задания передатчика либо принятые значения. + value_form = QFormLayout(values) # Каждое поле сохраняет отдельную подпись и знак. + self.raw = [self._spin(-32768, 32767, 0) for _field in DEIF_FIELDS] # Весь диапазон I16 сохраняет служебные значения и отрицательные задания. + for title, widget in zip(DEIF_FIELDS, self.raw): # Порядок соответствует set_deif_emu.raw[6]. + value_form.addRow(title, widget) # Уставка угла Master отображается отдельно, но зеркалит фактический угол. + self.raw[5].setReadOnly(True) # Master передаёт одинаковый RAW угла для подиндексов 2 и 7; шестой RAW напрямую не записывается. + self.brightness = self._spin(0, 100, 100) # Яркость — U8 в процентах, допустимый диапазон проверяется firmware. + self.brightness.setSuffix(" %") # Единицы яркости не смешиваются с необработанными измерениями. + self.palette = QComboBox() # Палитра соответствует DEIF §11.3.2. + self.palette.addItems(("Day", "Night", "Dusk")) # Номера 0, 1 и 2 передаются без преобразования. + value_form.addRow("Яркость", self.brightness) # Master может изменять яркость во время работы. + value_form.addRow("Палитра", self.palette) # Slave показывает значения, полученные от CAN. + layout.addWidget(values) # Показания остаются доступными при запущенном эмуляторе. + bindings = QGroupBox("Привязки объектов Slave") # Привязки явно задают OD вместо предположений о словаре прибора. + binding_form = QFormLayout(bindings) # Шесть пар индекс/подиндекс соответствуют словам 32…43. + self.indices, self.subindices = [], [] # Пары сохраняются в порядке полей для чтения и записи. + for number, title in enumerate(DEIF_FIELDS): # Все шесть объектов могут настраиваться независимо. + row = QHBoxLayout() # Индекс и подиндекс располагаются рядом с общей подписью поля. + index = self._spin(0, 65535, DEIF_INDICES[number], hexadecimal=True) # Индекс OD хранится как uint16, семейство проверяет MCU. + sub = QComboBox() # Только поддерживаемые I16 подиндексы разрешены моделью. + sub.addItems(("2 — значение", "7 — задание")) # Подиндексы 2 и 7 заданы в set_deif_write. + sub.setCurrentIndex(int(number == 5)) # Последняя привязка соответствует уставке угла. + row.addWidget(index) # Значение OD отображается в привычном шестнадцатеричном виде. + row.addWidget(sub) # Назначение подиндекса видно без отдельной документации. + binding_form.addRow(title, row) # Подпись совпадает с таблицей показаний. + self.indices.append(index) # Сохраняет редактируемый индекс нужного поля. + self.subindices.append(sub) # Сохраняет подиндекс того же поля. + self.bindings_group = bindings # Привязки недоступны при работе и в роли Master. + layout.addWidget(bindings) # Пользователь может настроить словарь перед запуском Slave. + scroll.setWidget(content) # Область прокрутки принимает владение контейнером. + outer.addWidget(scroll) # Высота формы ограничивается размером окна. + buttons = QHBoxLayout() # Основные команды остаются видимыми независимо от прокрутки. + self.read = QPushButton("Прочитать DEIF") # Чтение не запускает передачу CAN. + self.apply = QPushButton("Применить профиль") # Настройки отправляются отдельным явным действием при остановке. + self.send_raw = QPushButton("Записать RAW / подсветку") # Живые задания разрешены только Master. + self.start = QPushButton("Пуск DEIF") # Пуск не совмещается с применением профиля либо выбором роли. + self.stop = QPushButton("Останов DEIF") # Останавливает модель и её фоновые CAN-события. + self.cancel = QPushButton("Отменить обмен") # Отмена относится к транзакции COM, а не к уже работающей модели MCU. + for button, action in ((self.read, lambda: self._request()), (self.apply, self._apply), (self.send_raw, self._write_raw), (self.start, lambda: self._request(((2, 1),))), (self.stop, lambda: self._request(((2, 0),))), (self.cancel, self.client.cancel)): # Кнопки привязаны к единственному клиенту без повторяющихся обработчиков протокола. + button.clicked.connect(action) # Нажатие является единственным источником команд, опрос таймером не запускается. + buttons.addWidget(button) # Все действия имеют видимые названия и одинаковое расположение для любого MCU. + outer.addLayout(buttons) # Команды находятся под прокручиваемым профилем. + self.status = QLabel("Сначала прочитайте состояние DEIF выбранной платы.") # Непрочитанное устройство не выглядит подключённым. + self.status.setWordWrap(True) # Ошибки связи и диагностика не обрезаются. + outer.addWidget(self.status) # После операции результат остаётся видимым. + self.set_mcu("STM32F407") # Начальная модель совпадает с прежней рабочей областью эмуляторов. + + @staticmethod # Создание однотипных числовых полей не зависит от состояния панели. + def _spin(minimum, maximum, value, hexadecimal=False): # Диапазоны берутся из описания регистров C-модели. + spin = QSpinBox() # Qt выполняет базовую проверку числового ввода. + spin.setRange(minimum, maximum) # Допустимый размер поля задаётся до начального значения. + spin.setValue(value) # Штатный профиль можно использовать после явного применения. + if hexadecimal: # Маски и индексы OD удобнее читать как hex. + spin.setDisplayIntegerBase(16) # Меняет только отображение, числовое значение остаётся целым. + spin.setPrefix("0x") # Основание видно рядом с вводимыми цифрами. + return spin # Поле встраивается в нужную группу общей формы. + + def set_mcu(self, key): # Смена цели не открывает порт и не запускает CAN. + self.client.serial.set_mcu(key) # Проверяемая USB-модель выбирается до следующего handshake. + self.snapshot = None # Состояние предыдущего устройства не разрешает запись новому. + self.heading.setText("DEIF Master / Slave · " + EMULATOR_PROFILES[key]["title"]) # Полное название аппаратного профиля всегда видно оператору. + self.status.setText("Выберите режим DEIF в настройках STM, затем прочитайте состояние.") # Явно сбрасывает прежнее подтверждение платы. + self._controls() # Новая цель требует нового чтения перед пуском и настройкой. + + def _controls(self): # Разрешения кнопок зависят только от подтверждённого снимка и текущей транзакции. + busy, snapshot = self.client.active, self.snapshot # Не доверяет вручную отредактированным полям роли. + verified = snapshot is not None and snapshot.mode in (4, 5) # Наличие сервиса не означает, что он выбран активным эмулятором. + self.read.setEnabled(not busy) # Чтение разрешено также до выбора роли для диагностики прошивки. + self.cancel.setEnabled(busy) # Отменять можно только выполняющийся обмен. + self.apply.setEnabled(not busy and verified and not snapshot.running) # Сетевой профиль меняется только у остановленной выбранной модели. + self.start.setEnabled(not busy and verified and not snapshot.running) # Первое чтение и выбор роли обязательны перед пуском. + self.stop.setEnabled(not busy and verified) # Повторная остановка допускается и не запускает новый сценарий. + master = verified and snapshot.role == 1 # Живые задания и подсветка принадлежат только Master. + self.send_raw.setEnabled(not busy and master) # Slave получает эти значения из CAN и не допускает подмены входов. + self.network_group.setEnabled(not busy and verified and not snapshot.running) # Заблокированные поля не создают впечатление применяемого на ходу профиля. + self.bindings_group.setEnabled(not busy and verified and not snapshot.running and not master) # Master использует заданные спецификацией OD, его привязки не изменяют формируемые кадры. + for widget in self.raw[:5] + [self.brightness, self.palette]: # Шестой RAW всегда является показанием либо зеркалом угла. + widget.setEnabled(not busy and master) # Во время операции запрещает редактирование отправляемых значений. + + def _request(self, writes=()): # Все действия используют один путь подготовки, блокировки и проверки. + if self.client.active: # Двойное нажатие не отменяет уже отправленную команду. + return # Дождаться завершения можно по статусу панели. + connection = self.connection() # Параметры берутся из текущей формы STM непосредственно перед действием. + if not connection[0]: # Без выбранного COM невозможно установить физическую цель. + self.status.setText("Выберите COM во вкладке «Настройки STM».") # Сообщает конкретное место выбора. + return # Остальные инструменты не отключаются при пустом профиле. + reason = self.prepare() # Потребитель проверяет конфликтующие операции и освобождает общий порт. + if reason: # Незавершённый обмен другого инструмента сохраняет исходную цель. + self.status.setText(reason) # Причина отказа видна рядом с кнопкой. + return # Конкурирующий COM не открывается. + self.busy_changed.emit(True) # Потребитель блокирует смену STM и конфликтующие панели до открытия COM. + self.status.setText("Обмен с DEIF…") # Начало операции не выдаётся за подтверждение записи. + self.client.start(*connection, writes=writes) # Очередь выполняется последовательно с финальным чтением. + self._controls() # Синхронная ошибка открытия также корректно обновляет состояние кнопок. + + def _apply(self): # Формирует явный набор сетевых настроек остановленной модели. + if self.snapshot is None: # Снимок мог быть сброшен сменой MCU. + return # Без подтверждения роли профиль не отправляется. + if self.network.currentIndex() == 0 and (self.node.value() > 126 or self.pdo.value() < 2): # XDi-net резервирует Node 127 и RPDO1 для служебных функций. + self.status.setText("Для XDi-net выберите Node-ID 1…126 и RPDO2…4.") # Проверка предшествует любой записи. + return # Неверный сетевой профиль не применяется частично. + if self.snapshot.role == 2 and (self.peer.value() > 126 or self.mask.value() > 63) or self.mask.value() & 0xC0 and not self.group.value(): # Источник SAM Slave ограничен 126, Slave использует шесть измерений, сетевой диммер требует группу. + self.status.setText("Проверьте SAM источник, маску объектов Slave и группу диммера.") # Сообщает ограничения переносимой C-модели. + return # Профиль остаётся только в форме до исправления. + writes = [(6, 1), (9, 0), (4, self.node.value()), (5, self.peer.value()), (7, self.pdo.value()), (6, self.network.currentIndex()), (8, self.period.value()), (10, int(self.heartbeat.isChecked())), (11, int(self.self_start.isChecked())), (12, self.group.value()), (15, int(self.service_sam.isChecked())), (9, self.mask.value())] # Временный CANopen и нулевая маска позволяют безопасно менять Node 127, RPDO1 и группу 0 в любом исходном профиле. + if self.snapshot.role == 2: # Привязки используются только принимающей ролью C-модели. + for number, (index, sub) in enumerate(zip(self.indices, self.subindices)): # Пары задают шесть независимых входов Slave. + family = index.value() & 0xFFF0 # Семейство OD исключает младший номер экземпляра. + if not index.value() & 15 or family not in (0x3000, 0x3080, 0x3090, 0x3420, 0x3430): # set_deif_write разрешает экземпляры 1…15 пяти измерительных семейств. + self.status.setText("Привязки DEIF должны использовать измерительные OD 300x/308x/309x/342x/343x, экземпляр 1…15.") # Локальный отказ не меняет часть профиля на MCU. + return # Проверяются все поля до передачи первого запроса. + writes.extend(((32 + 2 * number, index.value()), (33 + 2 * number, 7 if sub.currentIndex() else 2))) # Последовательность совпадает с парами индекс/подиндекс регистров 32…43. + self._request(writes) # Настройка не содержит команды пуска. + + def _write_raw(self): # Живое изменение заданий не меняет сетевой профиль либо состояние запуска. + writes = [(16 + number, widget.value()) for number, widget in enumerate(self.raw[:5])] # Пять RAW Master, угол задания firmware зеркалит автоматически. + self._request(writes + [(13, self.brightness.value()), (14, self.palette.currentIndex())]) # Подсветка и палитра подтверждаются итоговым снимком вместе с RAW. + + def _finished(self, ok, message, snapshot): # Единственный обработчик освобождает блокировки и обновляет форму. + self.snapshot = snapshot if ok else None # После ошибки неизвестно, какие команды уже применены; новое чтение обязательно. + if ok: # Только проверенные данные реального MCU заменяют значения формы. + words = snapshot.words # Все индексы взяты из set_deif_read версии 1. + for widget, offset in ((self.node, 4), (self.peer, 5), (self.pdo, 7), (self.period, 8), (self.mask, 9), (self.group, 12), (self.brightness, 13)): # Обновляет числовые настройки выбранной роли. + widget.setValue(words[offset]) # Снимок сохраняет фактически применённые значения, а не отправленные пожелания. + self.network.setCurrentIndex(words[6]) # Сеть определяет интерпретацию последующего профиля. + self.palette.setCurrentIndex(words[14]) # Slave может получить новую палитру по CAN. + for widget, offset in ((self.heartbeat, 10), (self.self_start, 11), (self.service_sam, 15)): # Флаги читаются независимо от текущего разрешения редактирования. + widget.setChecked(bool(words[offset])) # Правильная роль отображает собственные настройки. + for number, widget in enumerate(self.raw): # Знаковые RAW нужны также для служебных кодов и отрицательной частоты вращения. + widget.setValue(snapshot.raw[number]) # Показывает входы Slave либо задания Master. + self.indices[number].setValue(words[32 + 2 * number]) # Сохраняет явный словарь каждого поля. + self.subindices[number].setCurrentIndex(int(words[33 + 2 * number] == 7)) # Фактическое значение и задание остаются разными привязками. + received = words[26] | words[27] << 16 # RX счётчик состоит из младшего и старшего 16-битных слов. + transmitted = words[28] | words[29] << 16 # TX означает постановку в аппаратную CAN-очередь. + rejected = words[30] | words[31] << 16 # Ошибочные кадры показываются отдельно от успешно принятых. + message += f" · {'Master' if snapshot.role == 1 else 'Slave'} · {'работает' if snapshot.running else 'остановлен'} · NMT {words[22]} · RX {received} / TX {transmitted} / отклонено {rejected} · seen 0x{words[23]:02X} / invalid 0x{words[24]:02X} / lost 0x{words[25]:02X}" # Диагностика позволяет проверить поток без предположения, что ACK COM подтверждает физический CAN. + self.status.setText(message) # Ошибка либо подтверждение остаются видимыми после закрытия порта. + self._controls() # Права редактирования пересчитываются по новому проверенному состоянию. + self.busy_changed.emit(False) # Потребитель освобождает остальные инструменты после завершения клиента. diff --git a/python/set_devices/qt_ports/emulator_serial.py b/python/set_devices/qt_ports/emulator_serial.py new file mode 100644 index 0000000..21fcd61 --- /dev/null +++ b/python/set_devices/qt_ports/emulator_serial.py @@ -0,0 +1,181 @@ +"""Async COM adapter for direct RTU or automatic emulator discovery. + +Panels retain their register/TMS decoders. Only this boundary translates them +to SET v2 on the wire. No protocol cache survives closing/reopening a port. +""" +import time + +from .qt_compat import QObject, QTimer, Signal, QSerialPort # Общий порт не зависит от импортов SETGUI и поддерживает Qt6/Qt5. +from set_devices.emulator_protocol import EmulatorProtocol # Автомат SET v2/RTU находится рядом с остальными переносимыми моделями templates. + + +def response_timeout(port, milliseconds): + return port.response_timeout(milliseconds) if isinstance(port, EmulatorSerialPort) else milliseconds + + +def cancel_pending(port): + if isinstance(port, EmulatorSerialPort): + port.cancel_pending() + + +class EmulatorSerialPort(QObject): + readyRead = Signal() + errorOccurred = Signal(object) + protocolChanged = Signal(str) + wireEvent = Signal(str, bytes) + PROBE_MS = 300 + + def __init__(self, parent=None, port=None, *, protocol_mode='auto', rtu_suffix=b'', mcu="STM32F407"): # Профиль MCU фиксирует проверяемую модель прошивки, сохраняя все старые параметры порта. + super().__init__(parent) + self._port = port if port is not None else QSerialPort(self) + self._port.readyRead.connect(self._receive) + self._port.errorOccurred.connect(self.errorOccurred.emit) + self._probe = QTimer(self) + self._probe.setSingleShot(True) + self._probe.timeout.connect(self._probe_timeout) + self._protocol_mode = protocol_mode + self._rtu_suffix = bytes(rtu_suffix) + self._mcu = mcu # Аппаратная привязка сохраняется между закрытием и повторным открытием того же COM-адаптера. + self.protocol = EmulatorProtocol(protocol_mode, mcu=mcu) # Первичная конфигурация использует ожидаемую модель выбранного MCU. + self._rx = bytearray() + self._error = '' + self._deadline = 0 + + def __getattr__(self, name): + port = self.__dict__.get('_port') + if port is None: + raise AttributeError(name) + return getattr(port, name) + + def open(self, mode): + self._probe.stop() + self._deadline = 0 + self.protocol = EmulatorProtocol(self._protocol_mode, mcu=self._mcu) # Повторное открытие начинает новый handshake с той же аппаратной привязкой. + self._rx.clear() + self._error = '' + return self._port.open(mode) + + def configure_protocol(self, mode, *, rtu_suffix=b''): + """Choose the wire format before opening a new connection.""" + if self.isOpen(): + raise ValueError('Сначала отключите COM-порт для смены протокола') + protocol = EmulatorProtocol(mode, mcu=self._mcu) # Смена wire-формата не должна сбрасывать выбранный MCU на F407. + self.cancel_pending() + self._protocol_mode = mode + self._rtu_suffix = bytes(rtu_suffix) + self.protocol = protocol + self._rx.clear() + + def close(self): + self.cancel_pending() + self._port.close() + self._rx.clear() + + def set_mcu(self, mcu): # Профиль разрешается менять только до открытия физического соединения. + if self.isOpen(): # Открытая транзакция должна завершиться с первоначальной идентичностью устройства. + raise ValueError("Сначала отключите COM-порт для смены MCU") # Предотвращаем подмену цели незавершённого обмена. + protocol = EmulatorProtocol(self._protocol_mode, mcu=mcu) # Неизвестный профиль отвергается до изменения сохранённых параметров. + self._mcu = mcu # Следующее открытие порта проверит DeviceInfo именно этой платы. + self.protocol = protocol # Старое состояние обнаружения не переносится на другой MCU. + + def cancel_pending(self): + self._probe.stop() + self._deadline = 0 + self.protocol.cancel() + + def response_timeout(self, milliseconds): + return milliseconds + (2 * self.PROBE_MS if self.protocol.mode == 'auto' else 0) + + def errorString(self): + return self._error or self._port.errorString() + + def clear(self, *args): + self.cancel_pending() + self._rx.clear() + return self._port.clear(*args) + + def bytesAvailable(self): + return len(self._rx) + + @property + def supports_wave_blocks(self): + return self.protocol.mode == 'v2' + + def readAll(self): + result = bytes(self._rx) + self._rx.clear() + return result + + def write(self, data): + self._error = '' + self._rx.clear() + try: + packet = self.protocol.begin(bytes(data)) + return len(data) if self._send(packet) else -1 + except ValueError as error: + self._fail(str(error)) + return -1 + + def _send(self, packet): + self._probe.stop() + self._deadline = 0 + if self.protocol.phase in ('ping', 'info'): + self._deadline = time.monotonic() + self.PROBE_MS / 1000 + self._probe.start(self.PROBE_MS) + if self.protocol.mode == 'rtu': + packet += self._rtu_suffix + written = self._port.write(packet) + if written > 0: + self.wireEvent.emit('TX', packet[:written]) + if written != len(packet): + self._fail('Не удалось передать запрос целиком') + return False + return True + + def _receive(self): + raw = bytes(self._port.readAll()) + if not raw: + return + self.wireEvent.emit('RX', raw) + try: + old_mode = self.protocol.mode + outgoing, incoming = self.protocol.feed(raw) + if self.protocol.mode != old_mode: + self.protocolChanged.emit('SET v2') + if outgoing and not self._send(outgoing): + return + if incoming: + self._rx.extend(incoming) + self.readyRead.emit() + except ValueError as error: + self._fail(str(error)) + + def _probe_timeout(self): + if not self._deadline: + return + if time.monotonic() < self._deadline: + self._probe.start(max(1, int((self._deadline-time.monotonic())*1000)+1)) + return + try: + packet = self.protocol.fallback() + self.protocolChanged.emit('RTU') + self._send(packet) + except ValueError as error: + self._fail(str(error)) + + def _fail(self, message): + self._error = message + self.cancel_pending() + self.errorOccurred.emit(QSerialPort.SerialPortError.ReadError) + + def waitForReadyRead(self, milliseconds): + # Used only in WaveTransfer's worker. No GUI event loop is blocked. + deadline = time.monotonic() + milliseconds / 1000 + while not self._rx and not self._error and time.monotonic() < deadline: + if self._deadline and time.monotonic() >= self._deadline: + self._probe_timeout() + remaining = max(1, int((deadline-time.monotonic())*1000)) + self._port.waitForReadyRead(min(remaining, 20)) + if self._error: + raise OSError(self._error) + return bool(self._rx) diff --git a/python/set_devices/qt_ports/emulator_workspace.py b/python/set_devices/qt_ports/emulator_workspace.py new file mode 100644 index 0000000..fa8adbe --- /dev/null +++ b/python/set_devices/qt_ports/emulator_workspace.py @@ -0,0 +1,36 @@ +from .qt_compat import Signal # Общий сигнал Qt работает в портах PySide6 и PySide2 без зависимости от SETGUI. +try: # Настольные потребители могут использовать любую из поддерживаемых версий Qt. + from PySide6.QtWidgets import QComboBox, QTabWidget # Qt6 предоставляет контейнер общих панелей и явный выбор MCU. + from PySide6.QtCore import Qt, QSignalBlocker # Блокировка сигнала предотвращает рекурсивное переключение профиля. +except ImportError: # Порт Windows 7 использует тот же API поверх PySide2. + from PySide2.QtWidgets import QComboBox, QTabWidget # Состав и поведение панелей сохраняются в Qt5. + from PySide2.QtCore import Qt, QSignalBlocker # Оба поколения Qt поддерживают блокировку сигналов комбобокса. +from set_devices.mcu_profiles import EMULATOR_PROFILES, EMULATOR_TOOLS # Модели и аппаратные привязки задаёт общая библиотека. + + +class EmulatorWorkspace(QTabWidget): # Потребитель предоставляет UI-панели, а templates выбирает их состав для конкретного MCU. + mcu_changed = Signal(str) # Приложение обновляет локальные настройки и подписи после явного выбора аппаратного профиля. + + def __init__(self, parent=None): # Контейнер не открывает COM/CAN и не создаёт экземпляров аппаратных моделей. + super().__init__(parent) # Qt владеет переданными страницами в течение жизни рабочей области. + self.mcu = "STM32F407" # Сохраняем профиль прежнего эмулятора для существующих пользователей и вызовов. + self.mcu_selector = QComboBox(self) # Общая панель явно показывает MCU, которому предназначены команды. + for key, profile in EMULATOR_PROFILES.items(): # В списке появляются только платы с реализованными портами set_emu_server. + self.mcu_selector.addItem(profile["title"], key) # Стабильный ключ отделяет совместимость устройства от отображаемой подписи. + self.setCornerWidget(self.mcu_selector, Qt.Corner.TopRightCorner) # Выбор MCU доступен рядом с вкладками общих инструментов. + self.mcu_selector.currentIndexChanged.connect(lambda index: self.select_mcu(self.mcu_selector.itemData(index))) # Пользовательский выбор проходит тот же метод, что переход из меню конкретного MCU. + self._emulator_pages = {} # Реестр хранит единственные экземпляры переданных панелей, сохраняя общие транспорты приложения. + + def add_emulator_page(self, key, widget): # Приложение связывает собственный виджет с публичным ключом общего сервиса. + self._emulator_pages[key] = widget # Повторное использование панели не копирует её обработчики или состояние модели. + self.addTab(widget, EMULATOR_TOOLS[key]) # Название инструмента берётся из общего каталога templates. + + def select_mcu(self, key): # Смена профиля меняет только UI и настройки; команды активации остаются явными действиями пользователя. + profile = EMULATOR_PROFILES[key] # Неизвестный MCU отвергается до изменения текущей рабочей области. + self.mcu = key # Текущий ключ используется потребителем для выбора настроек и аппаратных параметров. + with QSignalBlocker(self.mcu_selector): # Программный переход из раздела MCU не вызывает повторный вход через комбобокс. + self.mcu_selector.setCurrentIndex(self.mcu_selector.findData(key)) # Видимый выбор всегда совпадает с применённым профилем. + for name, widget in self._emulator_pages.items(): # Доступность каждого инструмента определяется сервисами выбранного порта. + self.setTabVisible(self.indexOf(widget), name in profile["tools"]) # Новая плата может подключать подмножество тех же панелей без изменения их реализации. + self.mcu_changed.emit(key) # Локальный адаптер обновляет настройки после завершения общего переключения. + return True # Вызывающая навигация может отличить выполненный переход от отказа занятого адаптера. diff --git a/python/set_devices/qt_ports/igbt_client.py b/python/set_devices/qt_ports/igbt_client.py new file mode 100644 index 0000000..ab544f1 --- /dev/null +++ b/python/set_devices/qt_ports/igbt_client.py @@ -0,0 +1,138 @@ +"""Asynchronous IGBT register transactions with probe and readback.""" +import struct + +from .qt_compat import QObject, QTimer, Signal, QSerialPort # Клиент общий для Qt6 и Qt5 и не импортирует приложение-потребитель. +from set_devices.qt_ports.stm_settings import request +from set_devices.tms_terminal import crc16_modbus +from .emulator_serial import EmulatorSerialPort, response_timeout # Тот же транспорт SET v2/RTU обслуживает эмуляторы всех поддержанных MCU. + + +class IgbtClient(QObject): + finished = Signal(bool, str, object) + + def __init__(self, parent=None): + super().__init__(parent) + self.serial = EmulatorSerialPort(self) + self.serial.readyRead.connect(self._receive) + self.serial.errorOccurred.connect(self._error) + self.timer = QTimer(self) + self.timer.setSingleShot(True) + self.timer.timeout.connect(lambda: self._finish(False, 'Тайм-аут ответа IGBT')) + self.active = False + self.rx = bytearray() + + def start(self, port, unit, baud, timeout, writes=()): + if self.active: + return + limits = {2: (0, 1), 6: (0, 255), 7: (0, 1000), 8: (1, 255), + 9: (0, 0), 12: (0, 1), 13: (0, 255), 14: (1, 255)} + channel_limits = [(0, 7), (0, 3), (0, 1000), (1, 1000), (0, 1000), + (1, 1000), (1, 60000), (0, 3), (0, 60000)] + for ch in range(8): + for field, bounds in enumerate(channel_limits): + limits[16 + ch * 12 + field] = bounds + self.writes = list(writes) + if any(off not in limits or not limits[off][0] <= value <= limits[off][1] + for off, value in self.writes): + self.finished.emit(False, 'Недопустимые параметры IGBT', None) + return + self.unit, self.timeout_ms = unit, timeout + self.active, self.write_sent = True, False + self.stage = 'probe' + self.serial.setPortName(port) + self.serial.setBaudRate(baud) + self.serial.setDataBits(QSerialPort.DataBits.Data8) + self.serial.setParity(QSerialPort.Parity.NoParity) + self.serial.setStopBits(QSerialPort.StopBits.OneStop) + self.serial.setFlowControl(QSerialPort.FlowControl.NoFlowControl) + if not self.serial.open(QSerialPort.OpenModeFlag.ReadWrite): + self._finish(False, self.serial.errorString()) + return + self._send(3, 0x1400, 16) + + def _send(self, function, register, value): + self.rx.clear() + self.packet = request(self.unit, function, register, value) + self.write_sent |= function == 6 + self.timer.start(response_timeout(self.serial, self.timeout_ms)) + if self.serial.write(self.packet) != len(self.packet): + self._finish(False, 'Ошибка передачи IGBT') + + def _receive(self): + chunk = bytes(self.serial.readAll()) + if not self.active: + return + self.rx.extend(chunk) + function = self.packet[1] + while len(self.rx) >= 3: + if self.rx[0] != self.unit or self.rx[1] not in (function, function | 0x80): + del self.rx[0] + continue + size = 5 if self.rx[1] & 0x80 else (5 + self.rx[2] if function == 3 else 8) + if len(self.rx) < size: + return + raw = bytes(self.rx[:size]) + self.timer.stop() + if crc16_modbus(raw): + self._finish(False, 'Неверная CRC ответа IGBT') + return + if raw[1] & 0x80: + self._finish(False, f'Устройство отклонило запрос IGBT, код {raw[2]}') + return + if function == 6: + if raw != self.packet: + self._finish(False, 'Неверное подтверждение записи IGBT') + return + self._next() + return + count = int.from_bytes(self.packet[4:6], 'big') + if len(raw) != 5 + count * 2 or raw[2] != count * 2: + self._finish(False, 'Неверная длина состояния IGBT') + return + words = struct.unpack(f'>{count}H', raw[3:-2]) + if words[:2] != (0x4947, 3) or words[10:12] != (8, 1) or words[15] != 12: + self._finish(False, 'Требуется новая прошивка с IGBT версии 3 и настройкой каналов') + return + if self.stage == 'probe': + self.stage = 'state' + self._send(3, 0x1400, 112) + return + if self.stage == 'state' and self.writes: + self.pending = list(self.writes) + self.stage = 'write' + self._next() + else: + # The edge counter may advance immediately after being reset. + expected = dict(self.writes) + if any(words[off] != value for off, value in expected.items() if off not in (9, 14)): + self._finish(False, 'Записанные параметры IGBT не подтвердились') + else: + self._finish(True, 'IGBT: параметры записаны и проверены' if self.writes + else 'IGBT: состояние прочитано', words) + return + + def _next(self): + if self.pending: + off, value = self.pending.pop(0) + self._send(6, 0x1400 + off, value) + else: + self.stage = 'verify' + self._send(3, 0x1400, 112) + + def _error(self, error): + if self.active and error not in (QSerialPort.SerialPortError.NoError, + QSerialPort.SerialPortError.TimeoutError): + self._finish(False, self.serial.errorString()) + + def cancel(self): + self._finish(False, 'Обмен IGBT отменён') + + def _finish(self, ok, message, words=None): + if not self.active: + return + self.active = False + self.timer.stop() + self.serial.close() + if not ok and self.write_sent: + message += '. Часть настроек могла примениться; прочитайте состояние повторно.' + self.finished.emit(ok, message, words) diff --git a/python/set_devices/qt_ports/plot_dual_axis.py b/python/set_devices/qt_ports/plot_dual_axis.py index 70f6f23..5defb37 100644 --- a/python/set_devices/qt_ports/plot_dual_axis.py +++ b/python/set_devices/qt_ports/plot_dual_axis.py @@ -25,11 +25,11 @@ def small_amplitude(values, threshold=30): return magnitude is not None and magnitude <= threshold -def split_amplitudes(series, threshold=30): +def split_amplitudes(series, threshold=30, *, include_hidden=False): # Порог 30 в единицах канала разделяет шкалы; файловый canvas может сохранить в них скрытые ряды. """Channels with finite peak magnitude <= 30 use the right amplitude axis.""" result = set() for channel in series: - if not channel.visible or channel.discrete: + if (not channel.visible and not include_hidden) or channel.discrete: # По умолчанию скрытые каналы исключены; независимая политика границ может учитывать их для сохранения масштаба. continue if small_amplitude(channel.values, threshold): result.add(channel.key) @@ -51,8 +51,8 @@ class DualAxisPlot: super().__init__(*args, **kwargs) def _sync_bounds(self): - keys = split_amplitudes(self._series) - if keys != self.right_axis_keys: + keys = split_amplitudes(self._bounds_series(), include_hidden=True) # Выбираем правые каналы из того же набора, что задаёт общие границы: LogsPlot сохраняет в нём скрытые источники. + if not keys.intersection(self.right_axis_keys): # Сохраняем масштаб при добавлении или временном пересоздании эталона, пока на правой Y остаётся хотя бы один прежний канал. self.right_viewport = Viewport() self.right_axis_keys = keys super()._sync_bounds() @@ -60,8 +60,8 @@ class DualAxisPlot: def set_plot_bounds(self, bounds, has_data=True, x_origin=0): if self.right_axis_keys and self.has_left_axis(): groups = [[], []] - for series in self._series: - if series.visible and not series.discrete: + for series in self._bounds_series(): # Обе независимые Y соблюдают политику canvas, чтобы снятие флажка не подменяло диапазон токов диапазоном напряжений. + if not series.discrete: # Дискретные дорожки не имеют общей амплитудной шкалы и не участвуют в её пределах. groups[series.key in self.right_axis_keys].extend( getattr(series.values, "finite_extent", None) or (v for v in series.values if math.isfinite(v))) @@ -74,8 +74,8 @@ class DualAxisPlot: super().set_plot_bounds(bounds, has_data, x_origin) def has_left_axis(self): - return any(s.visible and not s.discrete and s.values and s.key not in self.right_axis_keys - for s in self._series) + return any(not s.discrete and s.values and s.key not in self.right_axis_keys # Наличие левой координатной системы определяется теми же рядами, что и её границы. + for s in self._bounds_series()) # Файловый график сохраняет обе шкалы при скрытии линий; живой график учитывает только видимые каналы. @property def right_visible_bounds(self): diff --git a/python/set_devices/qt_ports/plot_processing.py b/python/set_devices/qt_ports/plot_processing.py index a328bd2..d4aba63 100644 --- a/python/set_devices/qt_ports/plot_processing.py +++ b/python/set_devices/qt_ports/plot_processing.py @@ -21,7 +21,7 @@ except ImportError: QVBoxLayout, QWidget, ) -from set_devices.signal_reconstruction import MAX_OUTPUT_POINTS, METHODS +from set_devices.signal_reconstruction import BACKENDS, MAX_OUTPUT_POINTS, METHODS # Используем единый список вариантов расчёта для панели и подписей результатов. from set_devices.plot_processing import Snapshot, prepare, process, write_csv RESULT_COLORS = ("#FF70D0", "#50D5FF", "#FFD166", "#83E377", "#B99AFF", "#FF9870") @@ -78,6 +78,11 @@ class SignalProcessingPanel(QWidget): self.method.addItem(title, key) self.method.setCurrentIndex(2) row.addWidget(self.method) + self.backend = QComboBox() # Явный переключатель позволяет сравнить прежний МНК и новый Eigen на одном снимке данных. + for key, title in BACKENDS.items(): # Порядок оставляет исходный решатель значением по умолчанию. + self.backend.addItem(title, key) # В данных элемента хранится стабильный ключ, независимый от русского названия. + self.backend.setToolTip("Вариант полиномиального МНК. Рассчитайте оба: кривые сохранятся вместе, подписи и время помогут сравнению.") # Объясняем практический способ сравнения непосредственно рядом с выбором. + row.addWidget(self.backend) # Располагаем вариант рядом с методом, к которому он относится. row.addStretch(1) layout.addLayout(row) row = QHBoxLayout() @@ -110,15 +115,18 @@ class SignalProcessingPanel(QWidget): "Полином МНК — сглаживание шумных данных. Линейная — отрезки между точками.\n" "PCHIP — сохранение формы без выбросов. Сплайн — гладкая кривая, возможны выбросы.\n" "Восстановление — оценка между измерениями; утраченные детали не определяются однозначно.") - for widget in (self.channel, self.method): - widget.currentIndexChanged.connect(self._parameters_changed) + for widget in (self.channel, self.method, self.backend): # Смена решателя делает текущий запрос новым, сохраняя предыдущие слои. + widget.currentIndexChanged.connect(self._parameters_changed) # Общая проверка предотвращает принятие результата для уже изменённого выбора. for widget in (self.degree, self.count): widget.valueChanged.connect(self._parameters_changed) self._update_actions() def _signature(self): return prepare(self._snapshot, self.channel.currentData(), self.method.currentData(), - self.count.value(), self.degree.value()) + self.count.value(), self.degree.value(), self._backend()) # Вариант участвует в идентичности снимка и результата. + + def _backend(self): # Для методов без альтернативы всегда используем исходный алгоритм, сохраняя последний выбор МНК в списке. + return self.backend.currentData() if self.method.currentData() == "polynomial" else "native" # Переключение на интерполяцию не выдаёт её за расчёт Eigen. def _current_request_for(self, signature): if not self.preserve_on_view_change or signature is None: @@ -126,7 +134,7 @@ class SignalProcessingPanel(QWidget): # Validate the original calculation domain, independently of navigation. return prepare(replace(self._snapshot, x_range=signature.x_range), self.channel.currentData(), self.method.currentData(), - self.count.value(), self.degree.value()) + self.count.value(), self.degree.value(), self._backend()) # Сохранённое окно проверяется вместе с текущим вариантом решателя. def set_snapshot(self, snapshot): previous = self._job.signature if self._job is not None else self._signature() @@ -154,7 +162,7 @@ class SignalProcessingPanel(QWidget): # depend on samples/units, not the source curve's checkbox. source = replace(source, series=tuple(replace(series, visible=True) for series in source.series)) - if self.preserve_on_data_change or prepare(source, request.series.key, request.method, request.output_count, request.degree) == request: + if self.preserve_on_data_change or prepare(source, request.series.key, request.method, request.output_count, request.degree, request.backend) == request: # Проверяем каждый слой с его собственным решателем, чтобы оба варианта оставались на графике. retained.append(result) if len(retained) != len(self._results): self._results = retained @@ -173,6 +181,7 @@ class SignalProcessingPanel(QWidget): def _update_actions(self): self.degree.setEnabled(self.method.currentData() == "polynomial") + self.backend.setEnabled(self.method.currentData() == "polynomial") # Выбор решателя доступен только для метода МНК, где есть два разных алгоритма. request = self._signature() self.apply_button.setEnabled(self._job is None and request is not None and len(request.series.points) >= 2) @@ -250,9 +259,12 @@ class SignalProcessingPanel(QWidget): duplicates = result.input_count - result.unique_count self.status.setText( f"{self.channel.currentText()}: {result.unique_count} исходных → {len(result.points)} расчётных точек; " - f"СКО на измерениях: {result.rmse:.6g}. " + f"СКО на измерениях: {result.rmse:.6g}; расчёт: {result.elapsed_ms:.3f} мс. " # Показываем точность и время одного и того же результата, включая преобразование буферов. + (f"Повторы X усреднены: {duplicates}. " if duplicates else "") + f"Расчётных кривых: {len(self._results)}. Исходные данные сохранены.") + comparable = [curve for curve in self._results if replace(curve.request, backend=signature.backend) == signature] if signature.method == "polynomial" else [] # Сопоставляем только одинаковые данные, степень, сетку и окно; различается исключительно решатель. + if len(comparable) > 1: # Сравнение появляется после явного расчёта обоих вариантов на одном наборе данных. + self.status.setText(self.status.text() + "\n" + " | ".join(f"{BACKENDS[curve.request.backend]}: СКО {curve.rmse:.6g}, {curve.elapsed_ms:.3f} мс" for curve in comparable)) # Сохраняем метрики обоих запусков рядом, не объявляя победителя по единичному замеру. self._update_actions() self.changed.emit() diff --git a/python/set_devices/qt_ports/reference_comparison.py b/python/set_devices/qt_ports/reference_comparison.py new file mode 100644 index 0000000..33e55ea --- /dev/null +++ b/python/set_devices/qt_ports/reference_comparison.py @@ -0,0 +1,375 @@ +"""Переиспользуемые Qt-панель и диалог сравнения с CSV-эталоном.""" # График, контейнер кривой и папки передаются потребителем. +import json # Отчёт сохраняет показатели и параметры сравнения в переносимом формате. +from pathlib import Path # Имя файла используется в статусе, полный путь — при записи отчёта. +import re # Единицы в скобках проверяются до сравнения каналов. + +try: # Один порт поддерживает современные и совместимые Windows-сборки. + from PySide6.QtCore import QThread, Qt, Signal # Qt6 доставляет результаты рабочего потока в интерфейс. + from PySide6.QtWidgets import QApplication, QCheckBox, QComboBox, QDialog, QDoubleSpinBox, QFileDialog, QHBoxLayout, QHeaderView, QLabel, QPushButton, QSplitter, QTableWidget, QVBoxLayout, QWidget # Используем стандартные элементы Qt6; создание ячеек с единицами и подсказками выполняет общий заполнитель таблицы. +except ImportError: # Qt5 доступен на системах, где Qt6 не поддерживается. + from PySide2.QtCore import QThread, Qt, Signal # Сохраняем тот же контракт сигналов и отмены на Qt5. + from PySide2.QtWidgets import QApplication, QCheckBox, QComboBox, QDialog, QDoubleSpinBox, QFileDialog, QHBoxLayout, QHeaderView, QLabel, QPushButton, QSplitter, QTableWidget, QVBoxLayout, QWidget # Qt5 использует тот же заполнитель ячеек с единицами и подсказками, что современный порт. + +from set_devices.signal_reference import compare, read_reference, trace_from_pairs # Единственное вычислительное ядро работает по всем исходным отсчётам. +from set_devices.qt_ports.circuit_parameters import CircuitParameters # Необязательные известные R/L/C ограничивают идентификацию электрического эквивалента. +from protocan.plot import Viewport # Общий контейнер области просмотра не зависит от конкретного виджета графика. +from set_devices.qt_ports.reference_results import ComparisonAnalysis, populate_comparison_table # Анализ, единицы показателей и подсказки одинаковы в отдельном и встроенном виде. + + +def _model_channels(sources, references, cache, cancel): # Подготовка связанных физических каналов выполняется только в рабочем потоке. + measured = {} # Сохраняем исходные временные метки для совместной проверки Uce/Uge/Ic. + for index, (signal, points) in enumerate(sources): # Истории и преобразования соответствуют одному снимку измерительной записи. + if re.match(r'^\s*(uce|uge|ic)\b', signal.name, re.IGNORECASE): # Не копируем произвольные дополнительные каналы, не участвующие в электрической модели. + if not points: # Отсутствующий связанный канал не должен ломать корректное сравнение выбранного измерения. + continue # Совместный анализ сообщит недостаточный набор физических наблюдений. + trace = cache.get(index) # Выбранный канал уже подготовлен основным сравнением. + if trace is None: # Остальные физические каналы преобразуются только при первом использовании. + trace = trace_from_pairs(signal.name, points, signal.display_value, cancel) # Множители применяются в точности как на исходном графике. + cache[index] = trace # Следующая настройка RLC не требует повторной копии полной истории. + measured[str(index)] = trace # Индекс сохраняет неоднозначные одинаковые имена для проверки, не затирая их словарём. + return dict(measured=measured, reference=references) # Сдвиг и общие начала координат добавляет независимое вычислительное ядро. + + +def _stop_owned_worker(state): # Уничтожение родителя QWidget может обойти closeEvent вложенной панели. + worker = state[0] # Состояние не обращается к уже уничтожаемой Python-обёртке виджета. + if worker is not None: # Завершённые задания удаляются из держателя заранее. + worker.requestInterruption() # Операция увидит отмену через штатный callback QThread. + worker.wait() # QObject удаляет дочерний QThread только после выхода его run. + + +class ComparisonWorker(QThread): # Чтение CSV и численный проход выполняются вне главного потока Qt. + result = Signal(object) # Готовый результат передаётся интерфейсу без изменения исходных данных. + failed = Signal(str) # Ошибка передаётся текстом и не оставляет частичный отчёт. + + def __init__(self, operation, parent): # Операция принимает callback проверки отмены. + super().__init__(parent) # Диалог владеет временем жизни рабочего потока. + self.operation = operation # Одинаковый worker обслуживает загрузку и расчёт. + + def run(self): # Qt вызывает этот метод в отдельном потоке. + try: # Любая ошибка должна вернуться в UI, а не прервать главный цикл событий. + self.result.emit(self.operation(self.isInterruptionRequested)) # Передаём операции штатный запрос отмены QThread. + except (ValueError, OSError, InterruptedError) as error: # Ошибки данных, файлов и отмена уже содержат понятную причину. + self.failed.emit(str(error)) # Показываем исходную причину без дополнительной обёртки. + except Exception as error: # Неожиданная ошибка также должна завершить состояние занятости. + self.failed.emit(f'Ошибка сравнения: {error}') # Уточняем источник неизвестной ошибки для пользователя. + + +class _ReferenceComparisonView: # Панель и отдельный диалог используют одну реализацию параметров, worker и результата. + def __init__(self, sources, parent=None, source_path='', *, plot_factory, series_factory, path_provider=None): # sources содержит пары объекта с name/display_value и неизменяемой полной истории. + super().__init__(parent) # Родитель определяет окно и владение диалогом. + self._series_factory = series_factory # Фабрика адаптирует общие Trace к кривым графика потребителя. + self._dialog_path = path_provider or (lambda filename: filename) # Без callback используем стандартные относительные имена файлов. + self.setWindowTitle('Сравнение с эталоном') # Заголовок одинаков для всех приложений, использующих порт. + self.sources = sources # История фиксируется вызывающей стороной на время жизни диалога. + self.source_path = source_path # Происхождение измерения включается в JSON-отчёт. + self.references = {} # Каналы эталона появятся после успешного чтения CSV. + self.reference_path = '' # Путь изменяется только после принятия загруженного эталона. + self._source_cache = {} # Повторный расчёт не должен повторно применять множители к измерению. + self._worker = None # Одновременно допускается только одна загрузка или вычисление. + self._worker_state = [None] # Независимый держатель доступен обработчику destroyed без обращения к self. + self.destroyed.connect(lambda *_args, state=self._worker_state: _stop_owned_worker(state)) # Останавливаем поток до удаления C++-детей даже при deleteLater родителя. + self._closing = False # Флаг откладывает закрытие до завершения отменённого worker. + self.comparison = None # До расчёта отчёт и график результата отсутствуют. + root = QVBoxLayout(self) # Вертикальный макет объединяет параметры, результат и экспорт. + row = QHBoxLayout() # Первая строка отвечает за выбор файлов и каналов. + self.load_button = QPushButton('Открыть эталон CSV…') # Эталон загружается отдельно от исходного измерения. + self.load_button.clicked.connect(self._open_reference) # Выбор файла запускает фоновое чтение. + self.source_combo, self.reference_combo = QComboBox(), QComboBox() # Каналы измерения и эталона выбираются независимо. + for signal, _ in sources: # Показываем все переданные каналы с непустой историей. + self.source_combo.addItem(signal.name) # Имя берётся из общего контракта источника. + row.addWidget(self.load_button) # Кнопка открытия предшествует выбору каналов. + for label, control in (('Измерение', self.source_combo), ('Эталон', self.reference_combo)): # Подписи явно различают обе стороны сравнения. + row.addWidget(QLabel(label)) # Подпись относится к следующему списку каналов. + row.addWidget(control, 1) # Оба списка делят свободное место поровну. + root.addLayout(row) # Завершаем строку выбора данных. + row = QHBoxLayout() # Вторая строка задаёт временное совмещение и допуски. + self.align_start = QCheckBox('Совместить начала записей') # Позволяет сравнивать записи с разными абсолютными началами. + self.align_start.setChecked(True) # По умолчанию сравниваем форму от начала каждой записи. + self.align_start.setToolTip('Совмещает первые отсчёты. Задержка самого переключения сохраняется.') # Объясняем отличие совмещения начала от поиска фронта. + self.shift = self._number(-1e12, 1e12, 6) # Диапазон ±10^12 мкс и шесть знаков сохраняет прежнюю точность ввода сдвига. + self.shift.setSuffix(' мкс') # В интерфейсе время вводится в микросекундах. + self.shift.setToolTip('Положительное значение сдвигает эталон вправо') # Явно задаём знак временного сдвига. + self.absolute = self._number(0., 1e12, 6) # Абсолютный допуск неотрицателен и измеряется в единицах канала. + self.relative = self._number(0., 10000., 4) # Относительная часть допуска задаётся в процентах с четырьмя знаками. + self.relative.setSuffix(' %') # Единица отделяет проценты от абсолютной амплитуды. + row.addWidget(self.align_start) # Опция совмещения находится рядом со сдвигом. + for label, control in (('Сдвиг эталона', self.shift), ('Допуск ±', self.absolute), ('+ от |эталона|', self.relative)): # Подписи отражают сумму абсолютной и процентной частей. + row.addWidget(QLabel(label)) # Связываем пояснение с соответствующим полем. + row.addWidget(control) # Ограниченные по ширине поля оставляют место всем параметрам. + root.addLayout(row) # Добавляем настройки совмещения в общий макет. + row = QHBoxLayout() # Третья строка управляет интервалом, расчётом и видом результата. + self.limit_interval = QCheckBox('Только интервал, мкс') # Флажок включает ограничение расчёта по времени. + self.start, self.stop = self._number(-1e12, 1e12, 6), self._number(-1e12, 1e12, 6) # Границы используют ту же шкалу мкс и точность, что сдвиг. + self.stop.setValue(300.) # Начальный интервал 0–300 мкс сохраняет прежнее поведение диалога. + self.visible_button = QPushButton('Из видимого участка') # Текущий масштаб графика можно использовать как интервал расчёта. + self.visible_button.clicked.connect(self._visible_interval) # Переводим границы графика из мс в мкс. + self.calculate_button = QPushButton('Сравнить') # Расчёт запускается явно после выбора параметров. + self.calculate_button.clicked.connect(self._calculate) # Параметры фиксируются перед запуском worker. + self.cancel_button = QPushButton('Отмена расчёта') # Длинную загрузку или расчёт можно прервать. + self.cancel_button.clicked.connect(self._cancel) # Используем кооперативную отмену без остановки потока извне. + self.mode = QComboBox() # Режим отображения не меняет уже вычисленные показатели. + self.mode.addItems(['Наложение', 'Отклонение: измерение − эталон']) # Сначала показываем две кривые в общем масштабе. + self.mode.currentIndexChanged.connect(self._show_plot) # Переключаем кривые без повторного численного прохода. + for control in (self.limit_interval, self.start, QLabel('…'), self.stop, self.visible_button, self.calculate_button, self.cancel_button, self.mode): # Сохраняем порядок интервал → расчёт → вид. + row.addWidget(control) # Каждый элемент относится к одной строке управления результатом. + root.addLayout(row) # Завершаем область параметров. + self.status = QLabel('Откройте эталон. Сравниваются все отсчёты выбранного канала после преобразования амплитуды.') # Общий порт не предполагает конкретный формат преобразования источника. + self.status.setWordWrap(True) # Длинные ошибки CSV не расширяют окно. + root.addWidget(self.status) # Состояние видно над графиком. + self.circuit = CircuitParameters(self) # Неизвестные элементы по умолчанию не подменяются учебными номиналами. + self.circuit.changed.connect(self._invalidate) # Изменение электрического ограничения делает прежние параметры модели неактуальными. + root.addWidget(self.circuit) # Опциональные R/L/C доступны перед строкой анализа и результатами. + self.analysis = ComparisonAnalysis(self) # Строка возможной причины и подробный отчёт повторяют подход Android GUI. + root.addWidget(self.analysis) # Анализ располагается рядом с результатом, не изменяя исходные кривые. + self.legend = QLabel() # Цветная легенда поясняет текущие кривые. + root.addWidget(self.legend) # Легенда отделена от численной таблицы. + splitter = QSplitter(Qt.Orientation.Horizontal) # Пользователь меняет соотношение ширины графика и таблицы. + self.plot = plot_factory() # Конкретный canvas создаётся и настраивается адаптером приложения. + splitter.addWidget(self.plot) # QSplitter принимает любой совместимый QWidget графика. + self.table = QTableWidget(0, 2) # Каждому показателю соответствует название и значение. + self.table.setHorizontalHeaderLabels(['Показатель', 'Значение']) # Заголовки поясняют две колонки отчёта. + self.table.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers) # Показатели расчёта недоступны для ручной правки. + self.table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents) # Названия и числа видны полностью по содержимому. + self.table.setMinimumWidth(370) # Минимум 370 логических пикселей сохраняет читаемость показателей. + splitter.addWidget(self.table) # Таблица располагается справа от кривых. + splitter.setSizes([920, 380]) # Начальные ширины в логических пикселях отдают большую часть окна графику. + root.addWidget(splitter, 1) # Результат получает всё свободное место по высоте. + row = QHBoxLayout() # Нижняя строка содержит экспорт и пояснение алгоритма. + self.report_button = QPushButton('Сохранить отчёт JSON…') # Экспорт доступен только для актуального результата. + self.report_button.clicked.connect(self._save_report) # Имя файла предлагает внедрённый provider путей. + row.addWidget(self.report_button) # Кнопка экспорта расположена перед пояснением. + note = QLabel('Δ = измерение − эталон. Линейная интерполяция эталона; без экстраполяции и заполнения пропусков.') # Формула и ограничения относятся ко всем приложениям-потребителям. + note.setWordWrap(True) # Текст остаётся читаемым при изменении размера окна. + row.addWidget(note, 1) # Пояснение занимает оставшуюся ширину строки. + root.addLayout(row) # Завершаем макет экспорта. + self._inputs = [self.load_button, self.source_combo, self.reference_combo, self.align_start, self.shift, self.absolute, self.relative, self.limit_interval, self.start, self.stop, self.visible_button] # Во время расчёта входные данные не меняются. + self._inputs.extend(self.circuit.controls) # Электрические ограничения также фиксируются на время рабочего задания. + for control in (self.shift, self.absolute, self.relative, self.start, self.stop): # Любое числовое изменение делает результат устаревшим. + control.valueChanged.connect(self._invalidate) # Сбрасываем старые кривые и отчёт до следующего расчёта. + for control in (self.align_start, self.limit_interval): # Флажки также влияют на вычисляемую временную сетку. + control.toggled.connect(self._invalidate) # Показатели не должны относиться к прежним условиям. + self.source_combo.currentIndexChanged.connect(self._match_reference) # При смене измерения ищем одноимённый эталон. + self.reference_combo.currentIndexChanged.connect(self._invalidate) # Смена эталонного канала требует нового расчёта. + self._busy(False) # Настраиваем начальную доступность кнопок. + QApplication.instance().aboutToQuit.connect(self._shutdown) # Завершение приложения дожидается отмены рабочего потока. + + @staticmethod # Фабрика числового поля не зависит от состояния диалога. + def _number(low, high, decimals): # Границы и число десятичных знаков задаются для конкретной величины. + box = QDoubleSpinBox() # Штатный элемент проверяет числовой ввод. + box.setDecimals(decimals) # Сохраняем требуемую точность времени или допуска. + box.setRange(low, high) # Ограничиваем значения допустимым диапазоном параметра. + box.setMaximumWidth(150) # Ширина 150 логических пикселей сохраняет компактную строку параметров. + return box # Вызывающий код задаёт единицы и обработчик изменений. + + def _busy(self, busy): # Единый переход состояния используется загрузкой и расчётом. + for control in self._inputs: # Все параметры относятся к одному снимку задания. + control.setEnabled(not busy) # Исключаем изменение входа работающего worker. + self.calculate_button.setEnabled(not busy and bool(self.references) and bool(self.sources)) # Без измерения или эталона расчёт невозможен. + self.cancel_button.setEnabled(busy) # Отменять можно только существующее задание. + self.report_button.setEnabled(not busy and self.comparison is not None) # Отчёт относится исключительно к завершённому результату. + + def _start_work(self, operation, receive): # Операция и получатель отделяют чтение файла от численного расчёта. + self._busy(True) # Блокируем параметры до запуска потока. + worker = ComparisonWorker(operation, self) # Диалог сохраняет владение worker до его завершения. + self._worker = worker # Ссылка используется для отмены и отложенного закрытия. + self._worker_state[0] = worker # Сигнал уничтожения владельца получает актуальную задачу. + worker.result.connect(receive) # Результат применяется в главном потоке Qt. + worker.failed.connect(self.status.setText) # Ошибка появляется в общей строке состояния. + worker.finished.connect(self._finished) # Освобождение worker восстанавливает доступность элементов. + worker.start() # Начинаем фоновое чтение или расчёт. + + def _finished(self): # Вызывается после штатного завершения и после отмены. + worker, self._worker = self._worker, None # Снимаем состояние занятости до возможного закрытия диалога. + self._worker_state[0] = None # Уничтожение родителя больше не обращается к завершённому worker. + if worker is None: # Синхронное закрытие могло уже очистить поток до доставки queued-сигнала. + return # Не повторяем удаление и не обновляем закрытую панель. + worker.deleteLater() # Qt безопасно удаляет завершившийся поток через очередь событий. + self._busy(False) # Разрешаем новый расчёт либо экспорт принятого результата. + if self._closing: # Запрос закрытия во время работы должен завершиться автоматически. + self.close() # Повторное закрытие уже не встречает активный worker. + + def _cancel(self): # Отмена кооперативна и проверяется вычислительным ядром. + if self._worker is not None: # Не обращаемся к уже завершённому потоку. + self._worker.requestInterruption() # Ядро увидит запрос в ближайшей контрольной точке. + self.status.setText('Остановка расчёта…') # Пользователь видит, что запрос принят. + + def _shutdown(self): # Перед выходом процесса нельзя уничтожать работающий QThread. + self._closing = True # Поздние сигналы не должны публиковать результат в закрывающемся интерфейсе. + if self._worker is not None: # Ожидание требуется только при активном задании. + worker = self._worker # Сохраняем объект до очистки общего держателя. + worker.requestInterruption() # Просим ядро прервать чтение или расчёт. + worker.wait() # Дожидаемся остановки до уничтожения объектов Qt. + self._worker = None # Смена записи может немедленно удалить закрытую панель. + self._worker_state[0] = None # Сигнал destroyed не обращается к удалённому потоку повторно. + worker.deleteLater() # Завершённый QThread безопасно освобождается очередью Qt. + + def _invalidate(self, *_): # Аргументы сигналов Qt не нужны для сброса результата. + self.comparison = None # Старые показатели больше не соответствуют выбранным параметрам. + self.analysis.set_result(None) # После изменения ввода прежняя гипотеза больше не является актуальной. + self.table.setRowCount(0) # Убираем устаревшие численные значения. + self.report_button.setEnabled(False) # Запрещаем экспорт прежнего результата. + self.plot._series = [] # Старые кривые также не должны выглядеть актуальными. + self.legend.clear() # Легенда очищается вместе с кривыми. + self.plot._sync_bounds() # Адаптер графика пересчитывает пустую область просмотра. + self.plot.update() # Запрашиваем перерисовку в главном потоке. + if self.references: # После загрузки эталона подсказываем следующий шаг. + self.status.setText('Параметры изменены — нажмите «Сравнить».') # Новый результат получается только явным расчётом. + + def _match_reference(self, *_): # Смена канала измерения ищет одноимённый столбец эталона. + name = self.source_combo.currentText().strip().casefold() # Регистр и крайние пробелы не мешают совпадению имён. + for index in range(self.reference_combo.count()): # Проверяем доступные каналы текущего эталона. + if self.reference_combo.itemText(index).strip().casefold() == name: # Сопоставляем полное имя вместе с единицами. + self.reference_combo.setCurrentIndex(index) # Предлагаем канал, соответствующий измерению. + break # Уникальные имена не требуют дальнейшего поиска. + self._invalidate() # Даже без совпадения старые показатели должны быть удалены. + + def _open_reference(self): # Правила начальной папки задаёт callback приложения. + path, _ = QFileDialog.getOpenFileName(self, 'Открыть эталон', self._dialog_path(''), 'CSV (*.csv)') # Общая библиотека не создаёт каталоги самостоятельно. + if path: # Отмена выбора файла сохраняет текущий эталон. + self.load_reference(path) # Чтение выполняется отдельным worker. + + def load_reference(self, path): # Публичный вход позволяет потребителю открыть эталон программно. + self._invalidate() # Новая загрузка не должна показывать старый отчёт как актуальный. + self.status.setText('Загрузка эталона…') # Состояние обновляется до запуска чтения. + def receive(traces): # Этот обработчик выполняется в потоке интерфейса. + if self._closing: # Синхронное закрытие могло опередить доставку готового чтения. + return # Не обновляем элементы закрываемой панели поздним результатом. + self.references = traces # Принимаем только полностью прочитанный набор каналов. + self.reference_path = str(path) # Путь отчёта соответствует принятому файлу. + self.reference_combo.clear() # Удаляем имена каналов предыдущего эталона. + self.reference_combo.addItems(list(traces)) # Сохраняем порядок столбцов CSV. + self._match_reference() # Автоматически выбираем одноимённый канал при наличии. + self.status.setText(f'Эталон: {Path(path).name}. Выберите каналы и нажмите «Сравнить».') # Подтверждаем успешную загрузку файла. + self._start_work(lambda cancel: read_reference(path, cancel), receive) # Ядро получает callback отмены чтения. + + def _visible_interval(self): # Видимая область графика задаёт границы расчёта. + bounds = self.plot.visible_bounds # Контракт графика возвращает время в миллисекундах. + left, right = bounds.left * 1000, bounds.right * 1000 # Множитель 1000 переводит миллисекунды в микросекунды UI. + self.limit_interval.setChecked(True) # Явно включаем использование выбранных границ. + self.start.setValue(left) # Левая граница отсчитывается от начала измерения. + self.stop.setValue(right) # Правая граница выражена в той же шкале. + + def _calculate(self): # Фиксируем параметры до передачи задания в поток. + if not self.references or not self.sources or self._worker is not None: # Не запускаем неполное или параллельное сравнение. + return # Сохраняем существующее задание и состояние входов. + source_index = self.source_combo.currentIndex() # Индекс связывает выбранное имя с исходным снимком. + signal, points = self.sources[source_index] # Полная история не зависит от экранного окна. + reference = self.references[self.reference_combo.currentText()] # Выбираем один канал загруженного эталона. + units = [re.search(r'\(([^()]*)\)\s*$', name) for name in (signal.name, reference.name)] # Единицы распознаются по конечным скобкам имени. + if all(units) and units[0].group(1) != units[1].group(1): # Явно разные единицы нельзя сравнивать как одинаковые амплитуды. + self._invalidate() # Предыдущий результат не относится к новому сочетанию каналов. + self.status.setText('Единицы каналов различаются. Выберите каналы с одинаковыми единицами.') # Пользователь выбирает корректную пару. + return # Не выполняем численный проход с несовместимыми единицами. + options = dict(align_start=self.align_start.isChecked(), shift_ms=self.shift.value() / 1000., # Деление на 1000 переводит микросекунды UI в миллисекунды ядра. + absolute_tolerance=self.absolute.value(), relative_tolerance_pct=self.relative.value(), # Допуски уже заданы в единицах ядра. + interval=(self.start.value() / 1000., self.stop.value() / 1000.) if self.limit_interval.isChecked() else None) # Ограничение времени также переводится из мкс в мс. + self._invalidate() # До расчёта удаляем старые кривые и показатели. + self.status.setText('Сравнение всех отсчётов…') # Явно указываем работу с полной записью. + options['circuit'] = self.circuit.values() # Значения GUI переводятся в СИ до перехода в рабочий поток. + sources, references = self.sources, self.references # Сохраняем единый снимок связанных каналов и выбранного CSV. + def operation(cancel): # Подготовка амплитуд и сравнение выполняются в worker. + measured = self._source_cache.get(source_index) # Кэш привязан к неизменяемому снимку канала. + if measured is None: # Преобразуем исходные значения только при первом использовании канала. + measured = trace_from_pairs(signal.name, points, signal.display_value, cancel) # Применяем предоставленное источником преобразование амплитуд. + self._source_cache[source_index] = measured # Повторные настройки допуска не требуют новой подготовки измерения. + channels = _model_channels(sources, references, self._source_cache, cancel) # Синхронные Uce/Uge/Ic подготавливаются теми же преобразованиями амплитуд. + return compare(measured, reference, cancel=cancel, channels=channels, **options) # Общее ядро выполняет полную статистику и идентификацию электрических моделей. + self._start_work(operation, self._received) # Получатель публикует целый результат в главном потоке. + + def _received(self, result): # Таблица и график обновляются из одного результата. + if self._closing: # Готовый результат мог стоять в очереди во время смены записи. + return # Закрытая панель не должна публиковать устаревшие метрики. + self.comparison = result # Сохраняем данные для переключения вида и экспорта. + self.analysis.set_result(result) # Краткий вывод обновляется вместе с полной таблицей сравнения. + populate_comparison_table(self.table, result) # Единицы и подсказки названий и чисел совпадают с боковой таблицей исходного графика. + self.status.setText(f'{result.measured.name} ↔ {Path(self.reference_path).name}: {result.reference.name}. ' # Статус указывает фактически сравниваемые каналы и файл. + 'Время от начала измерения; абсолютные ошибки — в единицах выбранного канала.') # Поясняем шкалу и единицы результата. + self._show_plot() # Показываем текущий режим кривых без повторного расчёта. + + def _show_plot(self, *_): # Сигнал выбора режима может передавать неиспользуемый индекс. + if self.comparison is None: # До успешного расчёта график результата отсутствует. + return # Не создаём кривые из устаревших данных. + result = self.comparison # Кривые и остаток принадлежат одному расчёту. + curves = [(result.measured, 'Измерение', '#2f91ff'), (result.reference, 'Эталон', '#ffae42')] # Синий и оранжевый различают стороны наложения. + self.legend.setText('━━ Измерение   ' # Цвет легенды совпадает с измеренной кривой. + '━━ Эталон — общий масштаб Y') # Адаптер обязан сохранить единую амплитудную шкалу. + if self.mode.currentIndex() == 1: # Второй режим показывает только рассчитанную разность. + curves = [(result.difference, 'Δ', '#ff7b7b')] # Красноватый цвет отделяет остаток от исходных кривых. + self.legend.setText('━━ Δ = измерение − эталон') # Формула фиксирует знак ошибки. + self.plot._series = [self._series_factory(str(i), f'{label}: {trace.name}', color=color, timestamps=trace.times, values=trace.values) # Фабрика создаёт контейнер конкретного canvas без импорта приложения. + for i, (trace, label, color) in enumerate(curves)] # Передаём полные массивы без экранного сокращения. + self.plot.reset_interaction() # Новый вид начинает с нейтрального состояния навигации. + self.plot.axis_lock_x.setChecked(False) # Освобождаем X для корректного показа нового результата. + self.plot.axis_lock_y.setChecked(False) # Общий масштаб Y не наследует ручную фиксацию предыдущего режима. + self.plot.axis_limits = None # Удаляем прежние ручные границы осей. + self.plot._sync_bounds() # Адаптер рассчитывает общую область кривых. + interval = result.metrics['interval_ms'] # При ограниченном расчёте показываем выбранный интервал. + if interval is not None: # Полная запись остаётся видимой при отсутствии ограничения. + bounds = self.plot.visible_bounds # После сброса границы соответствуют полной области результата. + span = bounds.right - bounds.left # Нормируем миллисекунды в долю общей длительности. + self.plot.viewport = Viewport(x=(interval[0] - bounds.left) / span, width=(interval[1] - interval[0]) / span) # Масштаб X соответствует выбранному интервалу ядра. + self.plot.update() # Отложенная перерисовка выполняется главным потоком Qt. + + def report(self): # Структуру можно получить программно без диалога сохранения. + if self.comparison is None: # Экспортировать устаревший или отсутствующий результат запрещено. + return None # Отсутствие результата обозначается явно. + return dict(measured_file=self.source_path, measured_channel=self.comparison.measured.name, # Источник измерения сохраняется рядом с выбранным каналом. + reference_file=self.reference_path, reference_channel=self.comparison.reference.name, # Эталонный файл и канал определяют вторую сторону сравнения. + time_unit='ms from first measured sample', # Машиночитаемый отчёт использует миллисекунды ядра. + interpolation='linear; no extrapolation; gaps excluded', # Ограничения интерполяции сохраняются вместе с результатом. + tolerance='absolute + relative_pct / 100 * abs(reference)', # Формула позволяет воспроизвести коридор допуска. + metrics=self.comparison.metrics, analysis=self.comparison.analysis) # Отчёт сохраняет также гипотезы, признаки и ограничения анализа. + + def _save_report(self): # Сохранение файла выполняется только по явному действию пользователя. + if self.comparison is None: # Защищаемся от программного вызова без расчёта. + return # Не создаём пустой отчёт. + path, _ = QFileDialog.getSaveFileName(self, 'Отчёт сравнения', self._dialog_path('reference_comparison.json'), 'JSON (*.json)') # Provider определяет начальную папку приложения. + if path: # Отмена выбора не меняет состояние результата. + try: # Файловые ошибки должны отображаться без закрытия диалога. + Path(path).write_text(json.dumps(self.report(), ensure_ascii=False, indent=2) + '\n', encoding='utf-8') # UTF-8 и отступ в два пробела сохраняют читаемость русских имён. + self.status.setText(f'Отчёт сохранён: {path}') # Подтверждаем фактический путь записанного отчёта. + except OSError as error: # Недоступный каталог или файл не уничтожает рассчитанные данные. + self.status.setText(str(error)) # Пользователь может выбрать другое место и повторить сохранение. + + +class ReferenceComparisonPanel(_ReferenceComparisonView, QWidget): # Встроенный вид занимает область существующего графика без отдельного окна. + back_requested = Signal() # Потребитель решает, какую страницу показать при возврате к записи. + + def __init__(self, *args, **kwargs): # Контракт данных и фабрик совпадает с отдельным диалогом. + super().__init__(*args, **kwargs) # Создаём общие параметры, таблицу и график через QWidget. + self.back_button = QPushButton('К записи') # Возврат сохраняет загруженный эталон и параметры скрытой панели. + self.back_button.clicked.connect(self.back_requested.emit) # Не связываем общую библиотеку с компоновкой конкретной вкладки. + row = QHBoxLayout() # Отдельная короткая строка не сжимает параметры сравнения. + row.addWidget(self.back_button) # Кнопка размещается у начала панели. + row.addStretch(1) # Свободная ширина остаётся справа от кнопки возврата. + self.layout().insertLayout(0, row) # Навигация предшествует выбору файлов и каналов. + + def closeEvent(self, event): # Родитель может удалить панель сразу после close при смене записи. + self._closing = True # Сигнал завершения worker больше не должен возобновлять использование панели. + self._shutdown() # Синхронно отменяем и дожидаемся потока перед возможным deleteLater родителя. + self.plot.close() # Освобождаем ресурсы графика после завершения вычислений. + super().closeEvent(event) # QWidget принимает закрытие встроенной панели. + + +class ReferenceComparisonDialog(_ReferenceComparisonView, QDialog): # Отдельное окно остаётся доступным другим потребителям общего модуля. + def __init__(self, *args, **kwargs): # Используем тот же контракт источников и внедряемых фабрик. + super().__init__(*args, **kwargs) # Общая реализация строит элементы внутри QDialog. + self.setWindowModality(Qt.WindowModality.WindowModal) # Модальность ограничивается родительским окном. + self.resize(1350, 880) # Размер в логических пикселях сохраняет прежний макет отдельного окна. + + def reject(self): # Escape и программное закрытие откладываются до остановки worker. + if self._worker is not None: # Работающий поток должен закончиться раньше удаления диалога. + self._closing = True # Запоминаем запрос закрытия до сигнала finished. + self._cancel() # Кооперативно прерываем операцию ядра. + return # Слот _finished завершит закрытие после остановки. + self.plot.close() # Освобождаем ресурсы конкретного canvas. + super().reject() # Сохраняем стандартный API и сигналы QDialog. + + def closeEvent(self, event): # Системная кнопка закрытия соблюдает тот же порядок отмены. + if self._worker is not None: # Не уничтожаем QThread во время операции. + self._closing = True # Запоминаем отложенное закрытие. + self._cancel() # Запрос будет замечен ядром в контрольной точке. + event.ignore() # Диалог существует до завершения worker. + else: # Завершённый расчёт не препятствует закрытию. + self.plot.close() # График завершает собственную фоновую работу. + super().closeEvent(event) # Передаём QDialog штатное закрытие. diff --git a/python/set_devices/qt_ports/reference_overlay.py b/python/set_devices/qt_ports/reference_overlay.py new file mode 100644 index 0000000..852c7a1 --- /dev/null +++ b/python/set_devices/qt_ports/reference_overlay.py @@ -0,0 +1,299 @@ +"""Компактные параметры эталона для наложения на существующий график.""" # Порт не создаёт canvas и не меняет компоновку исходного графика. +import json # Показатели можно сохранить независимо от используемого рендерера. +from pathlib import Path # Файл эталона и отчёт используют пути, предоставленные потребителем. +import re # Явно разные единицы каналов нельзя накладывать на общую шкалу. +try: # Поддерживаем обе настольные версии Qt. + from PySide6.QtCore import QSignalBlocker, QTimer, Signal # Таймер объединяет последовательные изменения сдвига в один расчёт. + from PySide6.QtWidgets import QApplication, QCheckBox, QComboBox, QDoubleSpinBox, QFileDialog, QHBoxLayout, QLabel, QPushButton, QSizePolicy, QVBoxLayout, QWidget # Панель содержит только параметры, без второго графика. +except ImportError: # Qt5 работает непосредственно без слоя совместимости приложения. + from PySide2.QtCore import QSignalBlocker, QTimer, Signal # Контракт сигналов и отложенного пересчёта совпадает с Qt6. + from PySide2.QtWidgets import QApplication, QCheckBox, QComboBox, QDoubleSpinBox, QFileDialog, QHBoxLayout, QLabel, QPushButton, QSizePolicy, QVBoxLayout, QWidget # Используем тот же компактный набор элементов. +from set_devices.signal_reference import Trace, compare, read_reference, trace_from_pairs # Чтение, преобразование амплитуд и показатели остаются общими. +from set_devices.qt_ports.reference_comparison import ComparisonWorker, _model_channels, _stop_owned_worker # Рабочий поток и подготовка физических каналов имеют общую реализацию. +from set_devices.qt_ports.circuit_parameters import CircuitParameters # Известные параметры последовательного эквивалента задаются независимо от выбранного графика. +from set_devices.qt_ports.reference_results import ComparisonAnalysis, ComparisonResults # Общая строка анализа и таблица используют один результат сравнения. + + +class TracePoints: # Представление кривой парами не копирует полные массивы в список кортежей. + def __init__(self, trace): # Временная шкала уже совмещена с исходной записью потребителя. + self.timestamps, self.values = trace.times, trace.values # Сохраняем прямые ссылки на подготовленные столбцы. + def __len__(self): # Рендереру и легенде нужно знать количество исходных точек. + return len(self.timestamps) # Оба столбца имеют одинаковую длину. + def __iter__(self): # Обычный график может последовательно читать пары отсчётов. + return iter(zip(self.timestamps, self.values)) # Пары создаются только по мере обхода. + def __getitem__(self, index): # В частности, легенда читает последнюю амплитуду по индексу -1. + return self.timestamps[index], self.values[index] # Возвращаем время и значение одной и той же точки. + + +class ReferenceOverlayPanel(QWidget): # Этот компонент добавляет только параметры к уже существующему графику. + changed = Signal() # Владелец добавляет или обновляет одну эталонную кривую в своём canvas. + remove_requested = Signal() # Удаление эталона не затрагивает исходную запись и её график. + results_requested = Signal() # Владелец показывает подробные показатели в прежней боковой области. + RESULT_KEY = '__reference_overlay__' # Стабильный ключ отделяет эталон от измерений и вычисленных интерполяций. + DIFFERENCE_KEY = '__reference_overlay__difference' # Остаток имеет отдельный ключ, поэтому его можно показывать вместе с оригиналом и эталоном. + + def __init__(self, sources, parent=None, source_path='', path_provider=None): # Источники содержат имя, преобразование амплитуды и полную историю. + super().__init__(parent) # Панель принадлежит той же странице, что исходный график. + self.sources, self.source_path = sources, source_path # Сохраняем происхождение измерения для расчёта и отчёта. + self._path = path_provider or (lambda name: name) # Правила папок остаются политикой приложения. + self.references, self.reference_path = {}, '' # Эталон появляется после успешного чтения CSV. + self.trace, self.comparison, self.difference = None, None, None # Полные кривые эталона и остатка отделены от исходного измерения владельца. + self._source_cache = {} # Множитель измерения применяется один раз к неизменяемой истории. + self._worker, self._worker_state = None, [None] # Независимый держатель позволяет остановить поток при уничтожении родителя. + self._closing, self._pending = False, False # Не применяем поздние результаты и объединяем изменения параметров. + self.destroyed.connect(lambda *_args, state=self._worker_state: _stop_owned_worker(state)) # QObject останавливает поток до удаления C++-детей. + self.setSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) # Панель занимает только высоту своих строк и не отнимает свободное место у графика. + root = QVBoxLayout(self) # Две основные строки располагаются непосредственно над исходным canvas. + root.setContentsMargins(0, 0, 0, 0) # Используем уже имеющиеся отступы страницы графика. + row = QHBoxLayout() # Первая строка содержит файл, каналы и совмещение времени. + self.load_button = QPushButton('Эталон CSV…') # Повторный выбор файла меняет только эталонную кривую. + self.load_button.clicked.connect(self._open_reference) # Запускаем штатный выбор файла. + row.addWidget(self.load_button) # Кнопка находится рядом с каналами сравнения. + self.source_combo, self.reference_combo = QComboBox(), QComboBox() # Измерение и столбец эталона выбираются независимо. + self.source_combo.addItems([source.name for source, _ in sources]) # Имена соответствуют исходным каналам графика. + for title, control in (('Измерение', self.source_combo), ('Эталон', self.reference_combo)): # Компактные подписи поясняют обе стороны наложения. + row.addWidget(QLabel(title)) # Подпись располагается непосредственно перед списком. + control.setMinimumWidth(110) # Минимум 110 логических пикселей оставляет читаемое имя канала. + row.addWidget(control) # Списки не растягиваются на ширину всего окна. + self.align_start = QCheckBox('Совместить начала') # Опция сдвигает эталон к первому отсчёту выбранного измерения. + self.align_start.setChecked(True) # По умолчанию накладываем форму от начала каждой записи. + row.addWidget(self.align_start) # Совмещение времени доступно без дополнительного диалога. + row.addWidget(QLabel('Сдвиг')) # Единица задаётся суффиксом следующего поля. + self.shift = self._number(-1e12, 1e12, ' мкс') # ±10^12 мкс сохраняет прежний диапазон временного сдвига. + row.addWidget(self.shift) # Положительный сдвиг перемещает эталон вправо. + self.details_button = QPushButton('Допуски и отчёт') # Второстепенные настройки не занимают высоту графика постоянно. + self.details_button.setCheckable(True) # Повторное нажатие сворачивает ту же строку параметров. + row.addWidget(self.details_button) # Детали находятся рядом с основными действиями. + self.results_button = QPushButton('Расчёты') # Полная таблица доступна явно, независимо от краткой строки RMSE. + self.results_button.clicked.connect(self.results_requested.emit) # Потребитель выбирает вкладку результатов рядом с исходным canvas. + row.addWidget(self.results_button) # Не прячем подробные расчёты внутри настроек допуска. + self.remove_button = QPushButton('Убрать эталон') # Удаление относится только к дополнительной кривой. + self.remove_button.clicked.connect(self.remove_requested.emit) # Владелец удаляет панель и обновляет существующий график. + row.addWidget(self.remove_button) # Исходная запись остаётся на месте после нажатия. + row.addStretch(1) # Свободная ширина остаётся справа, не раздвигая параметры. + root.addLayout(row) # Основная строка не содержит второго canvas или отдельной таблицы. + self.details = QWidget(self) # Дополнительная строка скрыта до явного запроса пользователя. + row = QHBoxLayout(self.details) # Допуски и экспорт располагаются в одной компактной строке. + row.setContentsMargins(0, 0, 0, 0) # Не создаём лишние поля вокруг скрываемой строки. + self.absolute, self.relative = self._number(0., 1e12), self._number(0., 10000., ' %') # Допуск состоит из абсолютной части и процента модуля эталона. + for title, control in (('Допуск ±', self.absolute), ('+ от |эталона|', self.relative)): # Формула подписей соответствует общему численному ядру. + row.addWidget(QLabel(title)) # Подпись определяет смысл следующего поля. + row.addWidget(control) # Оба допуска неотрицательны. + self.report_button = QPushButton('Отчёт JSON…') # Отчёт доступен после получения показателей. + self.report_button.clicked.connect(self._save_report) # Сохраняем показатели без отдельного рабочего окна. + self.report_button.setEnabled(False) # До сравнения экспортировать нечего. + row.addWidget(self.report_button) # Экспорт относится к той же паре каналов и допускам. + row.addStretch(1) # Дополнительная строка также остаётся компактной. + root.addWidget(self.details) # Детали добавляются без изменения положения исходного графика в splitter. + self.details.hide() # По умолчанию графику доступны все свободные пиксели. + self.details_button.toggled.connect(self.details.setVisible) # Пользователь сам раскрывает подробные параметры. + self.status = QLabel('Выберите эталон: он будет наложен на исходный график.') # Измерение продолжает отображаться уже до чтения CSV. + self.status.setWordWrap(True) # Длинное имя или ошибка файла не расширяет окно. + root.addWidget(self.status) # Краткие показатели остаются над canvas, полный отчёт размещается в боковой области. + self.circuit = CircuitParameters(self) # Поля доступны вместе с подробными параметрами сравнения. + self.circuit.changed.connect(self._parameters_changed) # Новый известный элемент автоматически обновляет физический эквивалент и JSON. + root.addWidget(self.circuit) # Отдельная строка предотвращает чрезмерную минимальную ширину основных контролов. + self.circuit.hide() # При обычном просмотре необязательные элементы не отнимают высоту графика. + self.details_button.toggled.connect(self.circuit.setVisible) # Кнопка «Допуски и отчёт» раскрывает также настройки математических моделей. + self.analysis = ComparisonAnalysis(self) # Строка возможной неисправности видна непосредственно над исходным графиком. + root.addWidget(self.analysis) # Android-подобный анализ не требует перехода на другую вкладку. + self.results = ComparisonResults(self) # Таблица принадлежит тому же результату, но может быть размещена в боковой области владельца. + self.results.hide() # До встраивания не показываем дочерний виджет поверх компактных параметров. + self.results.export_requested.connect(self._save_report) # Боковая таблица и кнопка над графиком сохраняют один и тот же JSON. + self.results.delta_curve.toggled.connect(lambda _checked: self.changed.emit()) # Отбрасываем булево значение флажка: сигнал обновления слоя не принимает аргументов. + self._timer = QTimer(self) # Изменения числовых полей объединяются перед фоновым расчётом. + self._timer.setSingleShot(True) # Одно завершённое редактирование запускает одно задание. + self._timer.setInterval(120) # Пауза 120 мс не запускает проход по всей записи на каждый шаг ввода. + self._timer.timeout.connect(self._calculate) # Готовые параметры применяются автоматически. + self.source_combo.currentIndexChanged.connect(self._match_reference) # Одноимённый эталон выбирается при смене измерения. + self.reference_combo.currentIndexChanged.connect(self._parameters_changed) # Смена канала обновляет наложение автоматически. + self.align_start.toggled.connect(self._parameters_changed) # Совмещение начал влияет на временные метки эталона. + for control in (self.shift, self.absolute, self.relative): # Изменение сдвига и допусков не требует отдельного нажатия «Сравнить». + control.valueChanged.connect(self._parameters_changed) # Исходная кривая остаётся видимой во время пересчёта. + QApplication.instance().aboutToQuit.connect(self._shutdown) # Выход приложения отменяет фоновые операции до удаления Qt-объектов. + + @staticmethod # Фабрика не зависит от состояния панели. + def _number(low, high, suffix=''): # Границы и единицы задаются для конкретного параметра. + box = QDoubleSpinBox() # Используем штатную проверку числового ввода Qt. + box.setDecimals(6) # Шесть десятичных знаков сохраняют точность прежних параметров сравнения. + box.setRange(low, high) # Запрещаем значения вне диапазона параметра. + box.setSuffix(suffix) # Время вводится в мкс, относительный допуск — в процентах. + box.setMaximumWidth(145) # Не растягиваем поле на ширину рабочей области. + return box # Обработчик изменений подключается после создания всех элементов. + + def _parameters_changed(self, *_): # Параметры могут меняться сигналом Qt или программно. + self.comparison = None # Старые показатели больше не соответствуют текущему вводу. + self.analysis.set_result(None) # Смена канала, файла, сдвига или допуска сразу удаляет прежнюю гипотезу. + self.difference = None # Кривая старого остатка не относится к изменённым параметрам. + self.results.set_result(None, 'Параметры изменены. Выполняется пересчёт…') # Полная таблица сразу очищает устаревшие числа. + self.report_button.setEnabled(False) # Не разрешаем экспорт устаревшего отчёта. + if self.references and not self._closing: # До загрузки эталона пересчитывать нечего. + self.status.setText('Обновление эталона…') # Прежние показатели не должны выглядеть актуальными после изменения источника или сдвига. + self._pending = True # Изменение не теряется, даже если worker ещё читает файл. + self._timer.start() # Объединяем последовательные изменения одного поля. + + def _match_reference(self, *_): # Имя измерения помогает автоматически выбрать подходящий столбец CSV. + index = self.reference_combo.findText(self.source_combo.currentText()) # Сопоставляем полное имя, включая единицы. + if index >= 0: # При отсутствии совпадения сохраняем явно выбранный канал эталона. + self.reference_combo.setCurrentIndex(index) # Одноимённые каналы не требуют второго ручного выбора. + self._parameters_changed() # Новое измерение требует новых показателей и временного совмещения. + + def set_sources(self, sources): # Прибор может обновить исходный кадр, сохранив тот же файл эталона. + if len(sources) == len(self.sources) and all(old_signal == signal and old_points is points for (old_signal, old_points), (signal, points) in zip(self.sources, sources)): # Настройки и идентичность историй однозначно определяют прежний снимок. + return # Навигация по тому же графику не требует повторной подготовки измерения. + selected = self.source_combo.currentText() # Сохраняем выбранное пользователем имя при замене истории. + self.sources, self._source_cache = sources, {} # Новому снимку соответствует отдельный кэш преобразованных амплитуд. + blocker = QSignalBlocker(self.source_combo) # Промежуточный пустой список не запускает расчёт с индексом -1. + self.source_combo.clear() # Удаляем состав каналов старого кадра. + self.source_combo.addItems([signal.name for signal, _ in sources]) # Новые имена берутся из фактической записи владельца. + self.source_combo.setCurrentIndex(max(0, self.source_combo.findText(selected))) # При наличии прежнего имени продолжаем сравнивать тот же канал. + del blocker # Возвращаем обработку пользовательского выбора после целостного обновления. + self._parameters_changed() # Эталон сохраняется и пересчитывается относительно нового оригинала. + + def _start_work(self, operation, receive): # Загрузка и расчёт используют один кооперативно отменяемый поток. + worker = ComparisonWorker(operation, self) # Владелец сохраняет worker до штатного завершения. + self._worker = self._worker_state[0] = worker # Независимый держатель обеспечивает безопасное уничтожение родителя. + for control in (self.load_button, self.source_combo, self.reference_combo, self.align_start, self.shift, self.absolute, self.relative, *self.circuit.controls): # Полный снимок включает также известные элементы контура. + control.setEnabled(False) # Исключаем параллельную загрузку и изменение активного ввода. + worker.result.connect(receive) # Результат применяется в главном потоке Qt. + worker.failed.connect(self._failed) # Ошибка отображается и в кратком статусе, и в подробной таблице. + worker.finished.connect(self._finished) # Завершение запускает отложенный пересчёт при необходимости. + worker.start() # Файловые операции и полная статистика не выполняются в обработчике кнопки. + + def _finished(self): # Обрабатываем также завершение после запроса отмены. + worker, self._worker = self._worker, None # Поток больше не считается активным. + self._worker_state[0] = None # Обработчик destroyed не обращается к удаляемому QThread повторно. + if worker is None or self._closing: # Закрытие могло синхронно очистить задачу до доставки сигнала. + return # Не обновляем элементы уничтожаемой панели. + worker.deleteLater() # Завершённый поток удаляется очередью событий. + for control in (self.load_button, self.source_combo, self.reference_combo, self.align_start, self.shift, self.absolute, self.relative, *self.circuit.controls): # После подбора снова доступны каналы, допуски и электрические ограничения. + control.setEnabled(True) # Исходный график всё время оставался доступным. + self.report_button.setEnabled(self.comparison is not None) # Экспорт относится только к актуальной статистике. + if self._pending: # Успешное чтение и изменения параметров автоматически обновляют эталон. + self._calculate() # Отдельная кнопка запуска сравнения не требуется. + + def _failed(self, message): # Недоступный файл или ошибка вычислений не должны оставлять прежние показатели. + if self._closing: # Поздний сигнал не обновляет закрытую панель. + return # Ресурсы исходного графика не принадлежат этому worker. + self.comparison, self.difference = None, None # Удаляем только устаревший численный результат и его остаток. + self.status.setText(message) # Причина остаётся видимой над исходным графиком. + self.results.set_result(None, message) # Та же причина поясняет отсутствие строк в подробной таблице. + self.analysis.set_result(None) # Ошибка чтения или расчёта удаляет также прежнюю гипотезу над графиком. + self.report_button.setEnabled(False) # Ошибку нельзя экспортировать как успешный отчёт. + self.changed.emit() # Снимаем прежнюю кривую остатка, сохраняя оригинал и последний загруженный эталон. + + def _open_reference(self): # Потребитель может вызвать выбор файла из своей кнопки рядом с графиком. + path, _ = QFileDialog.getOpenFileName(self, 'Наложить эталон CSV', self._path(''), 'CSV (*.csv)') # Начальная папка задаётся приложением. + if path: # Отмена выбора не удаляет прежний эталон и измерение. + self.load_reference(path) # После чтения кривая добавляется автоматически. + + def load_reference(self, path): # Программный вход также сохраняет исходный график на время загрузки. + if self._worker is not None or self._closing: # Не заменяем ссылку на ещё работающий QThread. + return # Новое чтение доступно после завершения текущего. + self.status.setText('Загрузка эталона…') # Строка состояния показывает текущую фоновую операцию. + self.comparison = None # Предыдущий отчёт не относится к выбираемому файлу. + self.difference = None # Остаток предыдущего эталона не должен выглядеть актуальным. + self.results.set_result(None, 'Загрузка эталона…') # Подробная таблица объясняет временное отсутствие показателей. + self.analysis.set_result(None) # Во время чтения другого файла анализ старого эталона не показывается. + self.report_button.setEnabled(False) # Блокируем экспорт до нового расчёта. + def receive(traces): # Qt доставляет полностью прочитанный CSV в интерфейс. + if self._closing: # Уничтожение панели могло опередить доставку результата. + return # Не меняем состояние после закрытия. + self.references, self.reference_path = traces, str(path) # Принимаем файл вместе с его каналами. + blocker = QSignalBlocker(self.reference_combo) # Наполнение списка не запускает промежуточный расчёт. + self.reference_combo.clear() # Удаляем имена предыдущего эталона. + self.reference_combo.addItems(list(traces)) # Сохраняем порядок каналов CSV. + index = self.reference_combo.findText(self.source_combo.currentText()) # Предпочитаем одноимённый канал. + self.reference_combo.setCurrentIndex(max(0, index)) # При отсутствии совпадения предлагаем первый столбец. + del blocker # Восстанавливаем обработку ручного выбора после целостного обновления списка. + self._pending = True # После завершения чтения автоматически подготавливаем кривую и показатели. + self._start_work(lambda cancel: read_reference(path, cancel), receive) # Чтение поддерживает отмену на больших файлах. + + def _calculate(self): # Формируем эталон в той же временной шкале, что исходные данные графика. + if self._worker is not None or self._closing or not self.references or not self.sources: # Расчёт ждёт окончания чтения и полного набора входа. + return # Флаг pending сохраняет необходимость следующего задания. + self._timer.stop() # Запланированный таймер не должен повторить уже начатый расчёт. + self._pending = False # Текущее задание соответствует последнему снимку параметров. + source_index = self.source_combo.currentIndex() # Индекс связывает выбор с полной исходной историей. + signal, points = self.sources[source_index] # Преобразование амплитуды предоставляется потребителем. + reference = self.references[self.reference_combo.currentText()] # Выбранный столбец не копируется повторно. + units = [re.search(r'\(([^()]*)\)\s*$', name) for name in (signal.name, reference.name)] # Сверяем явные единицы общей амплитудной оси. + if all(units) and units[0].group(1) != units[1].group(1): # Разные единицы нельзя представить как количественное наложение. + self.trace = None # Предыдущий эталон не должен выглядеть результатом нового несовместимого выбора. + self.results.set_result(None, 'Единицы каналов различаются. Выберите каналы с одинаковыми единицами.') # Полная таблица не сохраняет показатели другой пары каналов. + self.analysis.set_result(None) # Разные единицы не должны сохранять вывод предыдущего корректного сравнения. + self.changed.emit() # Убираем только дополнительную кривую, сохраняя оригинальное измерение. + self.status.setText('Единицы каналов различаются. Выберите каналы с одинаковыми единицами.') # Измерение при этом продолжает отображаться. + return # Не добавляем кривую с несовместимыми амплитудами. + options = dict(align_start=self.align_start.isChecked(), shift_ms=self.shift.value() / 1000., absolute_tolerance=self.absolute.value(), relative_tolerance_pct=self.relative.value()) # Переводим микросекунды UI в миллисекунды ядра. + options['circuit'] = self.circuit.values() # Рабочий поток получает значения элементов в СИ, не обращаясь к виджетам. + cache = self._source_cache # Активный worker не должен записать старый снимок в кэш уже обновлённого кадра. + sources, references = self.sources, self.references # Смена кадра не должна смешивать новые связанные каналы со старым измерением. + self.status.setText('Подготовка наложения эталона…') # Исходная кривая не очищается во время обработки. + def operation(cancel): # Подготовка полной записи выполняется в рабочем потоке. + measured = cache.get(source_index) # Повторный сдвиг не требует повторного применения множителя. + if measured is None: # Первый расчёт готовит неизменяемый снимок амплитуд. + measured = trace_from_pairs(signal.name, points, signal.display_value, cancel) # Используем все исходные точки с теми же единицами, что оригинал. + cache[source_index] = measured # Кэш принадлежит конкретной истории, переданной при создании панели. + origin = reference.times[0] if options['align_start'] else measured.times[0] # Совмещение начал не обнуляет координаты исходного графика. + trace = Trace(reference.name, [stamp - origin + options['shift_ms'] + measured.times[0] for stamp in reference.times], reference.values) # Добавляем эталон непосредственно в исходной временной шкале измерения. + try: # Отсутствие перекрытия мешает статистике, но не показу двух исходных кривых. + channels = _model_channels(sources, references, cache, cancel) # Подготавливаем совместный снимок Uce/Uge/Ic без дополнительных экранных графиков. + result = compare(measured, reference, cancel=cancel, channels=channels, **options) # Полная статистика и электрические модели используют одно совмещение, допуски и параметры RLC. + difference = Trace(result.difference.name, [stamp + measured.times[0] for stamp in result.difference.times], result.difference.values) # Подготавливаем остаток в той же исходной временной шкале без большого прохода в UI. + return trace, result, '', difference # Эталон, остаток и показатели относятся к одному снимку параметров. + except ValueError as error: # Например, эталон сдвинут за пределы времени измерения. + return trace, None, str(error), None # Показываем эталон и честно сообщаем отсутствие статистики и остатка. + self._start_work(operation, self._received) # Готовая кривая попадёт в существующий canvas через сигнал changed. + + def _received(self, payload): # Получатель не создаёт новый график и не меняет исходные серии. + if self._closing or self._pending: # Поздний результат уже не соответствует состоянию панели. + return # Следующее задание применит актуальные параметры. + self.trace, self.comparison, error, self.difference = payload # Дополнительные кривые не заменяют исходное измерение владельца. + self.results.set_result(self.comparison, error) # Подробная таблица автоматически показывает все показатели завершённого расчёта. + self.analysis.set_result(self.comparison) # Краткий анализ и подробности относятся к той же паре кривых, что таблица. + if self.comparison is None: # Кривую можно показать даже при отсутствии пересечения по времени. + self.status.setText(f'Эталон: {Path(self.reference_path).name}. {error}') # Ошибка статистики не скрывает ни оригинал, ни эталон. + else: # Краткая строка дополняет полный набор показателей в боковой области. + m = self.comparison.metrics # Все значения относятся к полным исходным отсчётам. + self.status.setText(f'Эталон: {Path(self.reference_path).name} · RMSE {m["rmse"]:.7g} · max |Δ| {m["max_abs"]:.7g} · за допуском {m["outside_tolerance"]}/{m["count"]}') # Единицы ошибки совпадают с выбранным измерением. + self.changed.emit() # Владелец добавляет эталон и при выбранном флажке кривую остатка к исходным рядам. + + def overlay(self): # Потребитель объединяет результат с собственными кривыми и легендой. + if self.trace is None: # До загрузки эталона исходный график не меняется. + return [], {} # Пустой дополнительный слой не означает очистку измерений. + label = f'Эталон: {self.trace.name}' # Подпись отличает эталон от одноимённого оригинального канала. + specs, data = [(self.RESULT_KEY, label, False, '#ffae42', True)], {self.RESULT_KEY: TracePoints(self.trace)} # Эталон сохраняет оранжевый цвет на общих осях исходного canvas. + if self.results.delta_curve.isChecked() and self.difference is not None: # Остаток показывается только по явному выбору пользователя и для актуального результата. + specs.append((self.DIFFERENCE_KEY, 'Δ: измерение − эталон', False, '#ff7b7b', True)) # Красноватая подпись отличает разность от двух исходных кривых. + data[self.DIFFERENCE_KEY] = TracePoints(self.difference) # Значения остатка не пересчитываются и используют исходную временную шкалу графика. + return specs, data # Потребитель отображает все выбранные дополнительные кривые вместе с оригиналом. + + def report(self): # Программный экспорт использует тот же формат, что отдельный диалог библиотеки. + if self.comparison is None: # Отсутствующая или устаревшая статистика не экспортируется. + return None # Явно обозначаем отсутствие актуального отчёта. + return dict(measured_file=self.source_path, measured_channel=self.comparison.measured.name, reference_file=self.reference_path, reference_channel=self.comparison.reference.name, time_unit='ms from first measured sample', interpolation='linear; no extrapolation; gaps excluded', tolerance='absolute + relative_pct / 100 * abs(reference)', metrics=self.comparison.metrics, analysis=self.comparison.analysis) # JSON сохраняет численные показатели, наблюдаемые признаки и возможные причины неисправности. + + def _save_report(self): # Экспорт не открывает отдельный рабочий график. + if self.comparison is None: # Защищаемся от программного вызова до получения статистики. + return # Не записываем пустой отчёт. + path, _ = QFileDialog.getSaveFileName(self, 'Отчёт сравнения', self._path('reference_comparison.json'), 'JSON (*.json)') # Начальный каталог предоставляет приложение. + if path: # Отмена выбора не влияет на показ кривых. + try: # Ошибка доступа к файлу не должна удалять готовое наложение. + Path(path).write_text(json.dumps(self.report(), ensure_ascii=False, indent=2) + '\n', encoding='utf-8') # UTF-8 сохраняет русские имена каналов в читаемом виде. + except OSError as error: # Пользователь может выбрать другое место для отчёта. + self.status.setText(str(error)) # Объясняем причину неуспешного сохранения. + + def _shutdown(self): # Перед удалением панели прекращаем обращение worker к её источникам. + self._closing = True # Поздние queued-сигналы больше не применяются. + self._timer.stop() # Отложенный пересчёт не запускается после закрытия. + if self._worker is not None: # Синхронное ожидание необходимо только при активной задаче. + worker = self._worker # Сохраняем поток до очистки держателя. + worker.requestInterruption() # Чтение и сравнение проверяют штатный запрос отмены. + worker.wait() # Родитель может безопасно удалить панель сразу после close. + self._worker = self._worker_state[0] = None # Повторное уничтожение не обращается к старому QThread. + worker.deleteLater() # Завершённый поток освобождается очередью Qt. + + def closeEvent(self, event): # Закрытие удаляет только параметры и слой эталона у владельца. + self._shutdown() # Исходный canvas не принадлежит панели и не закрывается здесь. + super().closeEvent(event) # QWidget завершает собственный жизненный цикл. diff --git a/python/set_devices/qt_ports/reference_results.py b/python/set_devices/qt_ports/reference_results.py new file mode 100644 index 0000000..9dc0bd3 --- /dev/null +++ b/python/set_devices/qt_ports/reference_results.py @@ -0,0 +1,155 @@ +"""Общая таблица отклонений и показателей сравнения без собственного графика.""" # Потребитель размещает её рядом с исходным canvas. +import re # Извлекаем обозначение единицы из конечных скобок имени канала по тому же правилу, что проверка совместимости каналов. +try: # Поддерживаем современные и совместимые настольные сборки. + from PySide6.QtCore import Qt, Signal # Сигналы и режим обычного текста поддерживают локальный отчёт без внешних сервисов. + from PySide6.QtWidgets import QCheckBox, QDialog, QDialogButtonBox, QHBoxLayout, QHeaderView, QLabel, QPlainTextEdit, QPushButton, QSizePolicy, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget # Таблица и подробный текст используют штатные элементы Qt6. +except ImportError: # Qt5 использует тот же контракт таблицы и сигналов. + from PySide2.QtCore import Qt, Signal # Qt5 сохраняет те же сигналы и режим обычного текста. + from PySide2.QtWidgets import QCheckBox, QDialog, QDialogButtonBox, QHBoxLayout, QHeaderView, QLabel, QPlainTextEdit, QPushButton, QSizePolicy, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget # Набор элементов анализа совпадает с современным портом. + + +class ComparisonAnalysis(QWidget): # Как в Android, краткий анализ дополняется кнопкой открытия подробного отчёта. + def __init__(self, parent=None): # Компонент одинаково работает над графиком и рядом с таблицей. + super().__init__(parent) # Владелец сравнения управляет размещением и уничтожением строки. + self._analysis, self._dialog = {}, None # До завершения сравнения подробности отсутствуют. + row = QHBoxLayout(self) # Одна строка не отнимает значительную высоту у графика. + row.setContentsMargins(0, 0, 0, 0) # Используем отступы содержащей панели. + self.summary = QLabel() # Краткий вывод остаётся виден без открытия полной таблицы. + self.summary.setTextFormat(Qt.TextFormat.PlainText) # Диагностическая строка всегда является обычным текстом. + self.summary.setSizePolicy(QSizePolicy.Policy.Ignored, QSizePolicy.Policy.Preferred) # Длинная гипотеза не увеличивает минимальную ширину окна. + row.addWidget(self.summary, 1) # Подпись получает свободную ширину, сохраняя кнопку доступной. + self.report_button = QPushButton('Отчёт анализа…') # Название отличает подробности гипотезы от сохранения JSON. + self.report_button.clicked.connect(self._show_report) # Открываем текст только по явному действию пользователя. + row.addWidget(self.report_button) # Кнопка находится справа, как в панели Android. + self.set_result(None) # Начальное состояние не содержит ложного диагноза. + + def set_result(self, result): # Любое изменение параметров удаляет прежнюю гипотезу вместе с численными показателями. + self._analysis = result.analysis if result is not None else {} # Принимаем только анализ актуального сравнения. + text = 'Анализ: ' + self._analysis.get('summary', 'нет актуального сравнения с эталоном.') # Общая подпись объясняет пустое состояние. + self.summary.setText(text) # Строка обновляется одновременно с результатом worker. + self.summary.setToolTip(text) # Полный вывод доступен даже при узком окне и обрезанной подписи. + self.summary.setStyleSheet('color: #ef9a73;' if self._analysis.get('attention') else '') # Цвет замечания различает требующий проверки результат, не меняя общую тему. + self.report_button.setEnabled(bool(self._analysis)) # Нельзя открыть пустые или устаревшие подробности. + if self._dialog is not None: # Открытый отчёт не должен оставаться текущим после нового расчёта. + self._dialog.close() # Смена результата закрывает окно со старым снимком. + self._dialog.deleteLater() # Освобождаем скрытые текстовые окна при многократных пересчётах. + self._dialog = None # Следующее открытие создаст отчёт по актуальным данным. + + def _show_report(self): # Подробности не запускают повторного анализа и не требуют подключения к сети. + if not self._analysis: # Защищаем программный вызов при отсутствии результата. + return # Не открываем пустое окно. + if self._dialog is not None: # Повторное нажатие возвращает существующее окно текущего отчёта. + self._dialog.show() # Повторно показываем скрытое окно с тем же результатом. + self._dialog.raise_() # Поднимаем готовое окно без дублирования виджетов. + return # Текст относится к тому же актуальному сравнению. + dialog = QDialog(self) # Родитель уничтожает подробности вместе со строкой анализа. + dialog.setWindowTitle('Анализ сравнения с эталоном') # Заголовок обозначает источник диагностических гипотез. + dialog.resize(1020, 740) # Размер в логических пикселях оставляет место таблице конкурирующих моделей и подробным параметрам. + root = QVBoxLayout(dialog) # Текст занимает свободную высоту над кнопкой закрытия. + report = self._analysis.get('model_report', {}) # Старые или неполные результаты могут не содержать идентифицированных моделей. + models = report.get('models', []) # В одну таблицу входят только конкуренты на общей сетке; отдельные RLC-окна описаны ниже. + if models: # Не создаём пустую таблицу при ошибке выбора каналов или недостатке точек. + caption = QLabel(f'Сравнение моделей: {report.get("sampled_points", 0)} точек. RMSE — в единицах канала; большее ΔBIC означает преимущество над эталоном. * — выполнены критерии поддержки модели.') # Подпись объясняет величины и отметку подтверждения без зависимости от шрифтов специальных символов. + caption.setWordWrap(True) # Пояснение не расширяет окно при небольшом экране. + root.addWidget(caption) # Критерии видны перед подробным техническим текстом. + table = QTableWidget(len(models), 5, dialog) # Каждый кандидат имеет собственные показатели ошибки и подтверждения. + table.setHorizontalHeaderLabels(['Модель', 'RMSE', 'Контроль RMSE', 'ΔBIC', 'Ошибка описана, %']) # Критерий сложности отделён от амплитудной погрешности. + table.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers) # Пользователь не изменяет результаты численного подбора вручную. + table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch) # Колонки используют всю доступную ширину окна отчёта. + table.setMaximumHeight(260) # До 260 логических пикселей оставляют место формулам и ограничениям ниже. + names = dict(reference='Исходный эталон', offset='Смещение', gain='Масштаб и ноль', drift='Линейный дрейф', timing='Задержка', slow_switching='Растяжение фронтов', constant='Постоянный уровень', contact_bounce='Прерывания контакта') # Русские названия сохраняют стабильные машинные коды в JSON. + for row, model in enumerate(models): # Порядок уже соответствует возрастанию BIC на общей обучающей выборке. + name = names.get(model['code'], model['code']) + (' *' if model['supported'] else '') # Обычная звёздочка означает выполнение критериев модели и корректно отображается в системных шрифтах Qt5 и Qt6. + values = [name, f'{model["rmse"]:.6g}', f'{model["validation_rmse"]:.6g}', f'{model["delta_bic"]:.6g}', f'{model["explained_error_pct"]:.4g}'] # Числа сохраняют достаточно значащих цифр для сравнения близких кандидатов. + for column, value in enumerate(values): # Каждая ячейка относится к тому же снимку параметров worker. + item = QTableWidgetItem(value) # Текстовая ячейка поддерживает штатное выделение таблицы Qt. + item.setToolTip(f'{model["formula"]}\n{model["parameters"]}') # Формула и оценённые параметры доступны без прокрутки полного текста. + table.setItem(row, column, item) # Устанавливаем готовое значение без повторного расчёта модели. + root.addWidget(table) # Таблица дополняет существующий подробный отчёт, не подменяя основной график. + details = QPlainTextEdit(self._analysis['details'], dialog) # Обычный текст поддерживает выделение и копирование без HTML. + details.setReadOnly(True) # Пользователь не меняет автоматически рассчитанный отчёт. + root.addWidget(details, 1) # Длинный отчёт прокручивается внутри окна. + buttons = QDialogButtonBox(QDialogButtonBox.StandardButton.Close) # Стандартная кнопка сохраняет поведение Qt5 и Qt6. + buttons.button(QDialogButtonBox.StandardButton.Close).setText('Закрыть') # Русская подпись не зависит от наличия переводчика стандартных строк Qt. + buttons.rejected.connect(dialog.reject) # Кнопка закрывает только подробный отчёт. + root.addWidget(buttons) # Действие доступно под текстом независимо от прокрутки. + self._dialog = dialog # Сохраняем окно для повторного открытия и сброса устаревших подробностей. + dialog.show() # Немодальный отчёт позволяет продолжать просмотр кривых. + + +def comparison_rows(metrics, *channel_names): # Имена измерения и эталона позволяют обеим таблицам показывать фактическую единицу амплитудных ошибок. + units = [re.search(r'\(([^()]*)\)\s*$', name) for name in channel_names] # Проверяем конечные скобки сначала у измерения, затем у эталона, если измерение не содержит единицы. + unit = next((match.group(1).strip() for match in units if match and match.group(1).strip()), 'ед. канала') # При отсутствии явной единицы сохраняем честное общее обозначение без догадки о физической величине. + fmt = lambda value: '—' if value is None else f'{value:.7g}' # Семь значащих цифр сохраняют читаемость; None означает отсутствие определённого значения. + return [('Сравнено отсчётов', str(metrics['count'])), ('Покрытие интервала, %', fmt(metrics['coverage_pct'])), # Показываем число корректных сравнений и долю покрытия записи. + ('Вне времени эталона, отсчётов', str(metrics['outside_reference'])), ('Пропуски, отсчётов', str(metrics['invalid_points'])), # Единица количества отличает отсутствие покрытия и пропуски от длительности в микросекундах. + (f'Среднее Δ (смещение), {unit}', fmt(metrics['bias'])), (f'Среднее |Δ| (MAE), {unit}', fmt(metrics['mae'])), # Среднее смещение и средний модуль ошибки имеют ту же единицу амплитуды, что выбранный канал. + (f'СКЗ Δ (RMSE), {unit}', fmt(metrics['rmse'])), (f'СКО Δ без смещения, {unit}', fmt(metrics['error_std'])), # Корень среднего квадрата и стандартное отклонение выражаются в единицах канала, а не в квадрате этих единиц. + (f'Максимум |Δ|, {unit}', fmt(metrics['max_abs'])), ('Время max |Δ|, мкс', fmt(metrics['max_abs_time_ms'] * 1000)), # Максимальная ошибка сохраняет единицу амплитуды; множитель 1000 переводит время из миллисекунд ядра в микросекунды интерфейса. + ('RMSE / размах эталона, %', fmt(metrics['nrmse_span_pct'])), # Постоянный эталон не имеет размаха, поэтому нормированная ошибка может отсутствовать. + ('За допуском, отсчётов', str(metrics['outside_tolerance'])), ('За допуском, %', fmt(metrics['outside_tolerance_pct'])), # Количество и процент превышений относятся к корректным сравнениям. + ('Первый выход, мкс', fmt(None if metrics['first_outside_time_ms'] is None else metrics['first_outside_time_ms'] * 1000))] # None означает отсутствие превышения, иначе время выводится в микросекундах. + + +def populate_comparison_table(table, result): # Обе формы сравнения получают одинаковые единицы и подсказки для названия и значения каждого показателя. + descriptions = ( # Порядок пояснений соответствует строкам comparison_rows и сохраняет привычное расположение показателей. + 'Число отсчётов выбранного интервала, для которых корректны и измерение, и эталон.', # Счётчик включает только точки, вошедшие в расчёт ошибок. + 'Доля отсчётов выбранного интервала, которые удалось сравнить с эталоном. Пропуски и точки вне времени эталона уменьшают покрытие.', # Знаменатель включает все выбранные точки измерения. + 'Число отсчётов выбранного интервала вне временных границ эталона после совмещения и сдвига. Эти точки не сравниваются.', # Отличаем отсутствие эталона по времени от некорректной амплитуды. + 'Число точек в общей области времени с отсутствующим или некорректным измерением либо эталоном. Они исключены из расчёта ошибок.', # Разрыв интерполяции также считается пропуском. + 'Средняя разность «измерение − эталон» со знаком. Положительное значение означает, что измерение в среднем выше эталона.', # Среднее отклонение оценивает постоянное смещение. + 'Среднее абсолютное отклонение от эталона (MAE). Показывает среднюю величину ошибки без учёта её знака.', # Модули не позволяют положительным и отрицательным ошибкам взаимно сократиться. + 'Корень из среднего квадрата отклонения (RMSE). Крупные ошибки влияют на него сильнее, чем на среднее абсолютное отклонение.', # После извлечения корня единица совпадает с единицей канала. + 'Стандартное отклонение ошибки относительно её среднего. Показывает разброс после исключения постоянного смещения.', # Расчёт характеризует всю сравниваемую запись, без выборочной поправки. + 'Наибольший модуль разности между измерением и эталоном среди всех корректно сравнённых отсчётов.', # Экстремум относится к полной записи, а не к экранной выборке. + 'Время наибольшей абсолютной ошибки от начала измерения, в микросекундах. При повторении максимума указано первое время.', # Ноль времени не переносится на начало выбранного интервала. + 'RMSE в процентах от разности максимума и минимума эталона на сравниваемом участке. Прочерк означает нулевой размах эталона.', # Постоянный эталон не позволяет определить нормированную ошибку. + 'Число отсчётов, где |измерение − эталон| строго больше допуска: абсолютный допуск + относительный допуск / 100 × |эталон|.', # Равенство границе коридора считается допустимым. + 'Доля отсчётов за допуском в процентах от числа корректно сравнённых отсчётов.', # Пропуски и отсутствие временного покрытия не входят в знаменатель. + 'Время первого превышения допуска от начала измерения, в микросекундах. Прочерк означает, что превышений не было.', # Отсутствие события не подменяется нулём времени. + ) # Все четырнадцать показателей имеют отдельное краткое пояснение. + rows = comparison_rows(result.metrics, result.measured.name, result.reference.name) if result is not None else [] # Единицы относятся к актуальной паре каналов; сброс результата удаляет прежние строки и подсказки. + table.setRowCount(len(rows)) # Размер обеих таблиц точно соответствует доступному набору показателей. + for row, (label, value) in enumerate(rows): # Сохраняем единый порядок показателей и пояснений во всех формах. + for column, text in enumerate((label, value)): # Одинаковая подсказка доступна при наведении как на название, так и на число. + item = QTableWidgetItem(text) # Каждая ячейка хранит свой текст и стандартную подсказку Qt. + item.setToolTip(descriptions[row]) # Краткое объяснение появляется при наведении без открытия отдельного окна. + table.setItem(row, column, item) # Таблица принимает владение ячейкой и заменяет прежнюю подсказку при пересчёте. + + +class ComparisonResults(QWidget): # Панель сохраняет все подробные расчёты рядом с прежним графиком. + export_requested = Signal() # Запись отчёта использует пути и актуальное сравнение владельца. + + def __init__(self, parent=None): # Компонент не требует фабрики canvas и не меняет состав исходных кривых. + super().__init__(parent) # Родитель управляет размещением таблицы в боковой области. + root = QVBoxLayout(self) # Короткая строка действий располагается над полной таблицей. + root.setContentsMargins(0, 0, 0, 0) # Используем пространство прежней правой панели без лишних внешних полей. + self.description = QLabel('Загрузите эталон для расчёта отклонений.') # До чтения файла таблица не содержит устаревших чисел. + self.description.setWordWrap(True) # Имена каналов и ошибки не расширяют исходное окно. + root.addWidget(self.description) # Подпись объясняет знак ошибки и единицы результата. + self.analysis = ComparisonAnalysis(self) # Возможная причина доступна и на вкладке полных расчётов. + root.addWidget(self.analysis) # Строка гипотезы предшествует численным показателям. + row = QHBoxLayout() # График отклонения и экспорт доступны без раскрытия параметров над canvas. + self.delta_curve = QCheckBox('Показать кривую Δ') # Флажок добавляет остаток к оригиналу и эталону на существующих осях. + self.delta_curve.setEnabled(False) # Остаток отсутствует до завершения корректного сравнения. + row.addWidget(self.delta_curve) # Управление кривой располагается рядом с подробными показателями. + self.export_button = QPushButton('Отчёт JSON…') # Сохраняем полный набор расчётов вместе с параметрами сравнения. + self.export_button.clicked.connect(self.export_requested.emit) # Файловый диалог открывает владелец численного результата. + self.export_button.setEnabled(False) # Нельзя экспортировать отсутствующую или устаревшую статистику. + row.addWidget(self.export_button) # Кнопка остаётся видимой рядом с таблицей. + row.addStretch(1) # Не растягиваем действия на всю ширину боковой области. + root.addLayout(row) # Действия занимают одну строку независимо от числа показателей. + self.table = QTableWidget(0, 2) # Каждый показатель имеет отдельную строку с численным значением. + self.table.setHorizontalHeaderLabels(['Показатель', 'Значение']) # Две колонки сохраняют привычный формат полного отчёта. + self.table.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers) # Пользователь не должен вручную менять вычисленные значения. + self.table.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeMode.ResizeToContents) # Названия показателей остаются читаемыми. + self.table.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeMode.Stretch) # Колонка значений использует оставшуюся ширину. + self.table.verticalHeader().setDefaultSectionSize(22) # Высота 22 логических пикселя позволяет показать полный набор в обычной боковой области. + root.addWidget(self.table, 1) # Таблица получает свободную высоту и при необходимости прокручивается. + + def set_result(self, result, message=''): # Все строки обновляются из одного результата или очищаются при его утрате. + self.analysis.set_result(result) # Гипотезы очищаются при тех же условиях, что таблица и экспорт. + populate_comparison_table(self.table, result) # Общий заполнитель обновляет единицы и подсказки обеих колонок либо полностью очищает устаревший результат. + self.delta_curve.setEnabled(result is not None) # Кривую отклонения можно включить только при наличии общих корректных точек. + self.export_button.setEnabled(result is not None) # Экспорт относится только к актуальному численному результату. + self.description.setText(f'Δ = измерение − эталон: {result.measured.name} ↔ {result.reference.name}. Ошибки — в единицах канала; время — в мкс.' if result is not None else message or 'Нет актуального результата сравнения.') # Явно различаем роли одноимённых каналов и показываем причину отсутствия результата. diff --git a/python/set_devices/qt_ports/stm_settings.py b/python/set_devices/qt_ports/stm_settings.py index 3f41bee..bfa0f8b 100644 --- a/python/set_devices/qt_ports/stm_settings.py +++ b/python/set_devices/qt_ports/stm_settings.py @@ -7,6 +7,7 @@ import struct from .qt_compat import QObject, QTimer, Signal from .qt_compat import QSerialPort +from set_devices.mcu_profiles import EMULATOR_MODES # Допустимые номера режимов берутся из общего каталога, включая обе роли DEIF. from set_devices.tms_terminal import crc16_modbus BAUDRATES = (9600, 19200, 38400, 57600, 115200) @@ -24,7 +25,7 @@ def decode_config(raw): if words[0] != 0x5343 or words[1] not in (2, 3): raise ValueError("Прошивка STM не поддерживает настройку связи (нужна новая версия)") address, tms, rate = words[2:5] - if not 1 <= address <= 247 or not 1 <= tms <= 255 or address == tms or rate >= len(BAUDRATES) or words[8] > (3 if words[1] == 3 else 1) or words[9] > (3 if words[1] == 3 else 1): + if not 1 <= address <= 247 or not 1 <= tms <= 255 or address == tms or rate >= len(BAUDRATES) or words[8] not in (EMULATOR_MODES if words[1] == 3 else (0, 1)) or words[9] not in (EMULATOR_MODES if words[1] == 3 else (0, 1)): # Версия 3 C-сервера поддерживает режимы 0…5; версия 2 сохраняет только УМП и 2812. raise ValueError("STM вернула неверные параметры связи") return words @@ -52,7 +53,7 @@ class StmSettingsClient(QObject): return if desired is not None: addr, tms, rate, mode = desired - if not 1 <= addr <= 247 or not 1 <= tms <= 255 or addr == tms or rate not in BAUDRATES or mode not in (0, 1, 2, 3): + if not 1 <= addr <= 247 or not 1 <= tms <= 255 or addr == tms or rate not in BAUDRATES or mode not in EMULATOR_MODES: # Номера 4 и 5 выбирают DEIF Master/Slave того же общего C-сервера. self.finished.emit(False, "Адреса УМП и 2812 должны различаться; проверьте диапазоны и скорость", None) return self.unit, self.baud, self.timeout_ms = unit, baud, timeout @@ -120,7 +121,7 @@ class StmSettingsClient(QObject): return addr, tms, baud, mode = self.desired if mode >= 2 and words[1] < 3: - raise ValueError("Обновите прошивку STM: для отдельных режимов IGBT и ЦАП нужна версия настроек 3") + raise ValueError("Обновите прошивку STM: для IGBT, ЦАП и DEIF нужна версия настроек 3") # Сообщение учитывает обе роли DEIF и возможное применение настроек при потере ответа. self.staged = (addr, tms, BAUDRATES.index(baud), mode) self.steps = [(6, 0x1218, 0), (6, 0x1215, addr), (6, 0x1216, tms), (6, 0x1217, self.staged[2]), (6, 0x1219, mode), (3, 0x1210, 10)] @@ -173,5 +174,5 @@ class StmSettingsClient(QObject): if self.serial.isOpen(): self.serial.close() if not ok and self.committed: - message += " Возможно, STM уже применила новые значения: адрес УМП %d, адрес 2812 %d, %d бод, режим %d (0=УМП, 1=2812, 2=IGBT, 3=ЦАП). Повторите чтение по ним или перезагрузите плату." % self.desired + message += " Возможно, STM уже применила новые значения: адрес УМП %d, адрес 2812 %d, %d бод, режим %d (0=УМП, 1=2812, 2=IGBT, 3=ЦАП, 4=DEIF Master, 5=DEIF Slave). Повторите чтение по ним или перезагрузите плату." % self.desired # Сообщение учитывает обе роли DEIF и возможное применение настроек при потере ответа. self.finished.emit(ok, message, values) diff --git a/python/set_devices/qt_ports/viewport_navigation.py b/python/set_devices/qt_ports/viewport_navigation.py index 8f60e41..f872b0e 100644 --- a/python/set_devices/qt_ports/viewport_navigation.py +++ b/python/set_devices/qt_ports/viewport_navigation.py @@ -25,10 +25,13 @@ class ViewportNavigation(QObject): self._navigation_timer.setInterval(180) self._navigation_timer.timeout.connect(self._navigation_finished) + def needs_worker(self): # Общая нагрузка всех каналов определяет допустимость синхронного расчёта, а не длина самого длинного ряда. + return sum(len(series.values) for series in self.chart.plot._series) > 20000 # Бюджет 20000 исходных значений сохраняет быстрый путь малых записей и отправляет многоканальные окна в фон. + def _navigation_changed(self): self._navigation_revision += 1 self._navigation_cancel.set() # Сразу отменяем статистику предыдущего окна, чтобы она не конкурировала с новой отрисовкой миллионов отсчётов. - if max((len(s.values) for s in self.chart.plot._series), default=0) <= 20000: + if not self.needs_worker(): # Проверяем суммарный объём тем же правилом, что используют панель измерений и легенда. self.chart._scope_measurements() self.chart._refresh_processing() self.chart._refresh_legend() @@ -38,7 +41,7 @@ class ViewportNavigation(QObject): def _navigation_finished(self): if False: return - if max((len(s.values) for s in self.chart.plot._series), default=0) <= 20000: + if not self.needs_worker(): # После задержки повторно проверяем текущие данные: источник мог измениться во время ожидания. self.chart._scope_measurements() self.chart._refresh_processing() return diff --git a/python/set_devices/signal_diagnostics.py b/python/set_devices/signal_diagnostics.py new file mode 100644 index 0000000..a071da4 --- /dev/null +++ b/python/set_devices/signal_diagnostics.py @@ -0,0 +1,131 @@ +"""Локальные гипотезы неисправностей по сравнению осциллограмм с эталоном.""" # Правила не требуют сети, модели ИИ или знания имени файла. +import math # Конечность отсчётов и масштабы защищают признаки от пропусков и нулевого размаха. +import re # Обозначения физических каналов позволяют отделить Uce, Uge и Ic. +from set_devices.signal_fault_models import identify_fault_models # Параметрические модели конкурируют по BIC и ошибке контрольных наблюдений. + + +def _role(name): # Название файла не используется как доказательство неисправности. + match = re.match(r'^\s*(uce|uge|ic)\b', name, re.IGNORECASE) # Узнаём только явные обозначения напряжений ключа, затвора и тока. + return match.group(1).lower() if match else '' # Неизвестные обозначения получают только общие статистические гипотезы. + + +class _Edges: # Гистерезис отделяет полное повторное переключение от небольшого звона и шума. + def __init__(self, low, high): # Пороги задаются относительно размаха эталона в единицах канала. + self.low, self.high = low, high # Нижняя и верхняя границы определяют устойчивые состояния. + self.state, self.start, self.previous = None, None, None # Начальное состояние и разрыв не считаются фронтами. + self.events, self.count = [], 0 # Полный счётчик дополняется ограниченным списком для оценки задержки. + + def reset(self): # Через NaN или большой разрыв нельзя восстанавливать ненаблюдавшееся переключение. + self.state, self.start, self.previous = None, None, None # После разрыва ждём нового устойчивого состояния. + + def add(self, stamp, value): # Последовательный обход не создаёт дополнительную копию многомиллионной записи. + state = 0 if value <= self.low else 1 if value >= self.high else None # Зона между порогами сохраняет предыдущее устойчивое состояние. + if self.state is None: # Первая наблюдаемая полка задаёт исходное состояние. + self.state = state # Попадание только в середину фронта ещё не определяет направление. + elif state == self.state: # Возврат к прежней полке отменяет незавершённый переход. + self.start = None # Шум внутри полосы не накапливает ложную длительность фронта. + else: # Сигнал покинул прежнюю полку и может достичь противоположной. + if self.start is None: # Запоминаем начало только один раз на каждый фронт. + self.start = self.previous if self.previous is not None else stamp # Шаг дискретизации ограничивает точность начала перехода. + if state is not None: # Полное пересечение гистерезиса подтверждает переключение. + self.count += 1 # Считаем все наблюдаемые фронты независимо от длины записи. + if len(self.events) < 256: # Первых 256 переходов достаточно для сводки; память остаётся ограниченной. + self.events.append(((self.start + stamp) / 2., stamp - self.start, state)) # Сохраняем середину, длительность в мс и направление фронта. + self.state, self.start = state, None # Новая полка становится исходной для следующего перехода. + self.previous = stamp # Предыдущая временная метка нужна для оценки длительности на дискретной сетке. + + +def analyze_comparison(result, cancel=lambda: False, *, circuit=None, channels=None): # Подбор получает необязательные параметры электрического эквивалента и связанные физические каналы. + metrics = result.metrics # Покрытие и допуски уже рассчитаны по полным исходным данным. + measured_role, reference_role = _role(result.measured.name), _role(result.reference.name) # Физические роли важнее совпадения единицы «В». + findings, notes = [], [] # Несколько одновременно наблюдаемых признаков сохраняются в одном отчёте. + features = {} # Численные признаки экспортируются для проверки и воспроизведения решения. + model_report = {} # До проверки входных данных никакая математическая модель не считается идентифицированной. + def finish(summary, attention=True): # Краткая строка и подробности всегда относятся к одному результату. + details = [summary, f'Каналы: {result.measured.name} ↔ {result.reference.name}.', # Обозначаем фактически выбранные измерение и эталон. + f'Сравнено {metrics["count"]} отсчётов; покрытие {metrics["coverage_pct"]:.4g}%; за допуском {metrics["outside_tolerance"]}.', # Не смешиваем непокрытые точки с превышениями. + f'RMSE {metrics["rmse"]:.7g}; максимум |Δ| {metrics["max_abs"]:.7g} в единицах канала.', # Ошибка сохраняет физические единицы выбранной пары. + *[item['text'] for item in findings if item['text'] != summary], *notes, # Совместные причины и ограничения сохраняются без повторения единственного краткого вывода. + 'Диагностические гипотезы основаны на параметрических моделях. BIC и контрольная ошибка оценивают согласие модели с данными, но не доказывают отказ конкретного элемента.'] # Отделяем идентификацию динамики от причинного диагноза оборудования. + if features: # Наблюдаемые численные признаки доступны только после полного прохода по данным. + details.insert(4, f'Полных переходов: эталон {features["reference_edges"]}, измерение {features["measured_edges"]}; смен знака после выключения {features["turn_off_reversals"]}; выброс после выключения {features["turn_off_overshoot"]:.7g} в единицах канала.') # Объясняем гипотезы дребезга и снаббера фактическими числами. + for model in model_report.get('models', []): # Подробности показывают также конкурентов выбранного объяснения. + details.append(f'Модель {model["code"]}: {model["formula"]}\nПараметры: {model["parameters"]}\nRMSE={model["rmse"]:.6g}; контроль={model["validation_rmse"]:.6g}; BIC={model["bic"]:.6g}; ΔBIC={model["delta_bic"]:.6g}; объяснено ошибки {model["explained_error_pct"]:.3g}%.') # Каждый вывод сопровождается фактическими параметрами и штрафом за сложность. + for pair in model_report.get('ringing', []): # Отклики измерения и эталона имеют отдельные динамические оценки. + for side in ('measured', 'reference'): # Не выдаём качество одного сигнала за проверку другой стороны сравнения. + model = pair.get(side) # Эталон может не содержать пригодного колебательного участка. + if model: # Отсутствующая оценка не форматируется как нулевая частота или затухание. + details.append(f'RLC {side}: {model["parameters"]}\nR²={model["r_squared"]}; контроль RMSE={model["validation_rmse"]:.6g}; ΔBIC={model["delta_bic"]:.6g}; модель подтверждена: {model["supported"]}.') # Приводим качество именно подбора затухающего отклика. + details.append(f'Эквивалентный контур: {pair["equivalent"]}') # Введённые элементы, восстановленные значения и неопределённость сохраняются в отчёте. + joint = model_report.get('joint', {}) # Совместная электрическая проверка не должна теряться в одном только JSON. + if joint: # Даже отсутствие каналов является существенным ограничением модели. + details.append(f'Совместные модели Uce/Uge/Ic: {joint}') # Сохраняем результаты ВАХ, остаточного тока, совпадения провалов и причины неидентифицируемости. + details.extend(model_report.get('assumptions', [])) # Предположения BIC, выборки и эквивалентной топологии видны рядом с результатами. + if model_report.get('criteria'): # Критерии поддержки модели не должны оставаться неявными константами кода. + details.append(f'Начальные критерии принятия моделей: {model_report["criteria"]}. Это настройки анализа, не паспортные нормы оборудования.') # Отделяем математическую идентификацию от выбранной чувствительности диагностического решения. + return dict(summary=summary, details='\n\n'.join(details), attention=attention, findings=findings, features=features, model_report=model_report, version=2) # Новый отчёт сохраняет совместимые поля и добавляет структурированные математические модели. + def finding(code, text): # Коды не зависят от русской формулировки и позволяют проверять сценарии. + findings.append(dict(code=code, text=text)) # Сохраняем причину вместе с объясняющим наблюдением. + if measured_role and reference_role and measured_role != reference_role: # Uce и Uge нельзя диагностировать как один физический сигнал даже при одинаковых единицах. + return finish('Выбраны разные физические каналы; сопоставьте одинаковые Uce, Uge или Ic.') # Не выдаём ложную неисправность при ошибке выбора на экране. + units = [re.search(r'\(([^()]*)\)\s*$', trace.name) for trace in (result.measured, result.reference)] # Проверяем явные единицы также при независимом вызове ядра без Qt. + if all(units) and units[0].group(1) != units[1].group(1): # Одинаковые обозначения с разными единицами не позволяют строить аппаратные гипотезы. + return finish('Единицы каналов различаются; сопоставьте сигналы с одинаковыми единицами.') # Численные показатели доступны, но физическая причина не определяется. + if metrics['coverage_pct'] < 100.: # Любое неполное покрытие ограничивает вывод областью реально наблюдаемых данных. + notes.append('Покрытие неполное: пропуски и время вне эталона исключены; состояние всей записи не определено.') # Даже нулевая ошибка на остатке не подтверждает исправность всей записи. + if metrics['count'] < 16: # Минимум 16 общих точек нужен для распознавания формы, а не для вычисления RMSE. + return finish('Недостаточно общих отсчётов для гипотезы неисправности.') # Короткий набор не должен давать уверенное заключение. + low, high = metrics['reference_min'], metrics['reference_max'] # Пределы относятся к интерполированному эталону выбранного интервала. + span = high - low # Размах определяет относительные пороги переключения. + scale = max(span, abs(low), abs(high), 1e-12) # Для постоянной ненулевой полки используем её уровень; 10^-12 исключает деление на ноль. + switching_span = span >= .5 * scale # Полный переход должен занимать не менее половины масштаба; малый звон около 400 В не является включением ключа. + expected_edges = _Edges(low + .3 * span, low + .7 * span) # Уровни 30% и 70% подавляют малые колебания на полках. + measured_edges = _Edges(expected_edges.low, expected_edges.high) # Одинаковые пороги позволяют сравнивать число и длительность переходов. + minimum, maximum, step = math.inf, -math.inf, math.inf # Границы измерения и минимальный шаг рассчитываются без дополнительного массива. + previous, residual_sign, reversals = None, 0, 0 # Знак значимого остатка нужен для распознавания затухающего звона. + off_sign, off_reversals, off_overshoot = 0, 0, 0. # Снаббер проверяется по колебаниям после выключения Uce, отдельно от помех на включённой полке. + band = max(.02 * scale, metrics['absolute_tolerance']) # 2% масштаба и абсолютный допуск отсекают небольшую погрешность и фоновый шум. + for index, (stamp, expected, delta) in enumerate(zip(result.difference.times, result.expected, result.difference.values)): # Анализируем каждый сравниваемый отсчёт без экранного прореживания. + if index % 16384 == 0 and cancel(): # Проверка отмены порциями по 16384 точки сохраняет отзывчивость больших записей. + raise InterruptedError('Анализ отменён') # Устаревшие гипотезы не публикуются после смены записи. + if not math.isfinite(expected) or not math.isfinite(delta): # Пропуск обрывает и фронт, и последовательность знаков остатка. + expected_edges.reset(); measured_edges.reset() # Обе стороны имеют общую область достоверного наблюдения. + previous, residual_sign = None, 0 # Через NaN нельзя считать смену знака или длительность фронта. + off_sign = 0 # Пропуск также прерывает подтверждение звона после выключения. + continue # Некорректные значения не влияют на признаки. + if previous is not None: # Первый корректный отсчёт ещё не определяет шаг времени. + distance = stamp - previous # Внутренняя единица времени — миллисекунда. + if distance > 5. * step: # Разрыв более пяти минимальных шагов не интерполируется диагностикой. + expected_edges.reset(); measured_edges.reset() # Не считаем фронт через ненаблюдавшийся промежуток времени. + residual_sign = 0 # Звон после большого разрыва начинается новой последовательностью. + off_sign = 0 # Колебания по разные стороны временного разрыва не образуют одну последовательность. + step = min(step, distance) # Минимальный наблюдаемый шаг задаёт нижнюю границу временной точности. + value = expected + delta # Восстанавливаем амплитуду на общей сетке без поиска по исходному массиву. + minimum, maximum = min(minimum, value), max(maximum, value) # Выброс сравнивается с огибающей эталона. + if switching_span: # Небольшие колебания отдельной полки не должны считаться полными переключениями транзистора. + expected_edges.add(stamp, expected); measured_edges.add(stamp, value) # Считаем переходы обеих кривых на одной временной сетке. + sign = 1 if delta > band else -1 if delta < -band else 0 # Малая ошибка внутри полосы не образует новую полуволну звона. + if sign: # Нулевая зона между полуволнами сохраняет последний значимый знак. + reversals += int(residual_sign != 0 and residual_sign != sign) # Смена положительного и отрицательного отклонения подтверждает колебание. + residual_sign = sign # Следующая значимая полуволна сравнивается с текущей. + if expected_edges.count and expected_edges.state == 1 and expected >= expected_edges.high: # Для Uce высокая полка после наблюдаемого фронта соответствует выключенному транзистору. + off_overshoot = max(off_overshoot, value - high, low - value) # Выброс на включённой полке не является признаком неисправности снаббера. + if sign: # Для звона учитываем только значимые знакопеременные отклонения на выключенной полке. + off_reversals += int(off_sign != 0 and off_sign != sign) # Пересчитываем смены знака отдельно от всех помех записи. + off_sign = sign # Последняя полуволна сохраняется до следующего выключенного отсчёта. + else: # Включённая полка и область фронта прерывают проверяемую последовательность звона. + off_sign = 0 # Шум между переключениями не связывается со следующим выключением. + previous = stamp # Временная непрерывность проверяется только по корректным точкам. + if cancel(): # Проверяем отмену также после последней неполной порции. + raise InterruptedError('Анализ отменён') # Не возвращаем результат закрытой панели. + features.update(reference_edges=expected_edges.count, measured_edges=measured_edges.count, residual_reversals=reversals, # Количественные признаки объясняют гипотезы дребезга и звона. + overshoot=max(0., maximum - high, low - minimum), turn_off_reversals=off_reversals, turn_off_overshoot=off_overshoot, sample_step_ms=step if math.isfinite(step) else None) # Общий выброс отделён от признаков после выключения; шаг выражен в мс. + physical = bool(measured_role and measured_role == reference_role) # Электрические гипотезы допустимы только для одинаковых явно обозначенных физических каналов. + model_report, findings = identify_fault_models(result, expected_edges.events, features, physical, measured_role, circuit, channels, cancel) # Конкуренты подбираются по данным и проверяются на отложенных точках. + if metrics['outside_tolerance'] == 0 and not findings: # Совпадение выбранного Uce не скрывает нарушение, подтверждённое другими синхронными каналами. + summary = 'Отклонений от эталона в заданных допусках не обнаружено.' if metrics['absolute_tolerance'] > 0. or metrics['relative_tolerance_pct'] > 0. else 'Сигнал совпадает с эталоном; допуски не заданы.' # Совпадение формы не является полной проверкой исправности устройства. + return finish(summary + (' Покрытие неполное.' if notes else ''), bool(notes)) # Сохраняем ограничение неполного покрытия и параметры найденных моделей. + if metrics['absolute_tolerance'] == 0. and metrics['relative_tolerance_pct'] == 0.: # Нулевой коридор должен быть явно отличим от заданного норматива. + notes.append('Допуски не заданы: любое ненулевое отклонение считается превышением; задайте погрешность измерения.') # Обычный шум не должен восприниматься как доказанный аппаратный отказ. + summary = ' '.join(item['text'] for item in findings) # Разные модели совместного дефекта остаются видимыми в одной строке. + return finish(summary + (' Покрытие неполное.' if metrics['coverage_pct'] < 100. else '')) # Краткий вывод связан с тем же покрытием, что полный математический отчёт. diff --git a/python/set_devices/signal_eigen.py b/python/set_devices/signal_eigen.py new file mode 100644 index 0000000..b821216 --- /dev/null +++ b/python/set_devices/signal_eigen.py @@ -0,0 +1,18 @@ +import ctypes as C # Загружаем необязательный настольный модуль через стабильный C ABI. +from functools import lru_cache # Удерживаем DLL и её функции, пока расчётные задачи используют указатели. +import os # Разрешаем явно выбрать альтернативную библиотеку в тестах или нестандартной установке. +from pathlib import Path # Ищем модуль рядом с уже выбранной основной SETProtocol DLL. +import sys # Расширение нативного модуля соответствует текущей настольной ОС. + +@lru_cache(maxsize=1) # Один экземпляр DLL безопасно обслуживает независимые расчёты без глобальных рабочих буферов. +def library(core_path): # Путь основной библиотеки задаёт согласованный каталог установки обоих модулей. + name = {"win32": "setsignal_eigen.dll", "darwin": "libsetsignal_eigen.dylib"}.get(sys.platform, "libsetsignal_eigen.so") # Отдельное имя сохраняет возможность запуска с прежней основной DLL. + path = Path(os.environ.get("SETSIGNAL_EIGEN_LIBRARY", str(Path(core_path).resolve().with_name(name)))) # Явный путь окружения имеет приоритет над соседним компонентом приложения. + try: # Отсутствующий или несовместимый компонент показывается пользователю как ошибка выбранного варианта. + result = C.CDLL(str(path)) # Загружаем только явно вычисленный путь, не подбирая случайную DLL из PATH. + pointer = C.POINTER(C.c_double) # Входные и выходные массивы содержат значения double общего алгоритма. + result.set_signal_reconstruct_eigen.argtypes = [pointer, pointer, C.c_size_t, C.c_int, C.c_uint, C.c_size_t, C.c_int, pointer, pointer, pointer, pointer, C.c_size_t] # Сигнатура повторяет исходную реконструкцию и сохраняет размер size_t для x86/x64. + result.set_signal_reconstruct_eigen.restype = C.c_int # Ошибки ранга и нехватки памяти возвращаются целочисленным кодом. + return result # Удерживаем объект DLL для всего времени жизни привязанной функции. + except (AttributeError, OSError) as error: # Отдельно обрабатываем отсутствие экспорта и невозможность загрузки библиотеки. + raise ValueError("Eigen QR недоступен: соберите модуль cpp/signal-eigen/build.py для разрядности приложения") from error # Не подменяем явно выбранный Eigen текущим МНК. diff --git a/python/set_devices/signal_fault_models.py b/python/set_devices/signal_fault_models.py new file mode 100644 index 0000000..97a644e --- /dev/null +++ b/python/set_devices/signal_fault_models.py @@ -0,0 +1,396 @@ +"""Подбор конкурирующих моделей отклонения и эквивалентного колебательного контура.""" # Численный модуль использует стандартную библиотеку и не зависит от Qt. +from bisect import bisect_left # Поиск соседних отсчётов сохраняет реальные, в том числе неравномерные временные сетки. +import math # Экспоненты, тригонометрия и логарифмы задают динамические модели и критерий BIC. +from statistics import median # Робастные начальные оценки уменьшают влияние отдельных выбросов. + +MAX_FIT_POINTS = 2048 # Ограничение относится только к подбору моделей; исходные метрики и поиск событий сохраняют все точки. + + +def checkpoint(cancel): # Подбор нелинейных параметров обязан прерываться при смене записи или закрытии окна. + if cancel(): # Callback передаётся из существующего рабочего потока сравнения. + raise InterruptedError('Анализ моделей отменён') # Не публикуем незавершённый подбор как достоверный результат. + + +def bounded_minimum(operation, left, right, iterations=24): # Ограниченный золотой поиск уточняет одну нелинейную координату без внешнего оптимизатора. + ratio = (math.sqrt(5.) - 1.) / 2. # Золотое сечение переиспользует одну оценку функции на каждом шаге. + a, b = right - ratio * (right - left), left + ratio * (right - left) # Две внутренние точки определяют следующую область поиска. + fa, fb = operation(a), operation(b) # Операция возвращает модель с обучающей ошибкой или отсутствие допустимого решения. + error = lambda model: model['training_sse'] if model else math.inf # Некорректный кандидат не может выигрывать ограниченную оптимизацию. + for _ in range(iterations): # Фиксированное число итераций ограничивает время и задаёт воспроизводимую точность. + if error(fa) < error(fb): # Минимум остаётся в левой части текущей области. + right, b, fb = b, a, fa # Правая внутренняя точка переиспользует уже вычисленное значение. + a = right - ratio * (right - left) # Новая точка лежит внутри уменьшенного интервала. + fa = operation(a) # Пересчитываем только одну модель за итерацию. + else: # Лучшее направление лежит справа или обе оценки одинаковы. + left, a, fa = a, b, fb # Левая точка также переиспользуется без повторного подбора. + b = left + ratio * (right - left) # Вычисляем новую внутреннюю правую точку. + fb = operation(b) # Контрольные наблюдения по-прежнему не участвуют в целевой функции. + return fa if error(fa) < error(fb) else fb # Возвращаем лучший допустимый набор параметров найденного интервала. + + +def interpolate(times, values, stamp): # Интерполяция для моделей не продолжает кривую за границы записи. + index = bisect_left(times, stamp) # Находим первую опору не левее запрошенного времени. + if index < len(times) and times[index] == stamp: # Точное попадание не зависит от соседнего пропуска. + return values[index] if math.isfinite(values[index]) else None # Неконечная опора остаётся отсутствующим наблюдением. + if index == 0 or index == len(times): # За границами данных экстраполяция запрещена. + return None # Модель с отсутствующей опорой не получает искусственного крайнего значения. + left, right = values[index - 1], values[index] # Две соседние амплитуды определяют отрезок интерполяции. + if not math.isfinite(left) or not math.isfinite(right): # Через явный разрыв NaN модель не строится. + return None # Невалидный участок будет исключён до сравнения моделей. + return left + (right - left) * (stamp - times[index - 1]) / (times[index] - times[index - 1]) # Вес вычисляется по фактическому времени, а не номеру точки. + + +def least_squares(columns, values): # Небольшой QR-решатель избегает неустойчивых нормальных уравнений при разном масштабе параметров. + count, size = len(values), len(columns) # Число наблюдений и неизвестных определяет размеры ортогональной системы. + if count <= size or not size: # Для оценки ошибки нужны наблюдения сверх числа параметров. + return None # Недоопределённую модель нельзя использовать для аппаратной гипотезы. + q, upper = [], [[0.] * size for _ in range(size)] # Храним только малую треугольную матрицу и ортогональные столбцы. + scales = [math.sqrt(sum(value * value for value in column)) for column in columns] # Нормируем столбцы перед проверкой независимости параметров. + for index, column in enumerate(columns): # Модифицированный Грамм–Шмидт выполняется отдельно для каждого неизвестного. + if scales[index] <= 1e-30: # Нулевой столбец означает, что параметр не наблюдается в выбранных данных. + return None # Не выдаём произвольный коэффициент для ненаблюдаемого воздействия. + vector = [value / scales[index] for value in column] # Безразмерная нормировка снижает влияние единиц В, А и мкс на численную устойчивость. + for _ in range(2): # Повторная ортогонализация уменьшает потерю точности у почти зависимых столбцов. + for previous, basis in enumerate(q): # Удаляем уже описанные направления изменения сигнала. + projection = sum(a * b for a, b in zip(basis, vector)) # Скалярное произведение определяет долю предыдущего базиса. + upper[previous][index] += projection # Обе ортогонализации относятся к одной треугольной системе. + vector = [value - projection * base for value, base in zip(vector, basis)] # Остаток содержит только новое независимое направление. + norm = math.sqrt(sum(value * value for value in vector)) # Длина остатка показывает идентифицируемость следующего параметра. + if norm < 1e-9: # Относительная независимость меньше 10^-9 считается численно вырожденной. + return None # Например, постоянный ток не позволяет раздельно определить U0 и сопротивление. + upper[index][index] = norm # Диагональ задаёт масштаб нового ортогонального направления. + q.append([value / norm for value in vector]) # Единичный столбец сохраняет устойчивую проекцию правой части. + target = [sum(a * b for a, b in zip(basis, values)) for basis in q] # Проецируем измерение на полученный ортонормированный базис. + coefficients = [0.] * size # Обратный ход начинается с последнего неизвестного. + for index in reversed(range(size)): # Верхнетреугольная система решается без дополнительной факторизации. + coefficients[index] = (target[index] - sum(upper[index][j] * coefficients[j] for j in range(index + 1, size))) / upper[index][index] # Вычитаем уже найденные параметры справа от диагонали. + return [value / scale for value, scale in zip(coefficients, scales)] # Возвращаем параметры в исходных физических единицах столбцов. + + +def evaluate(columns, coefficients): # Одна формула вычисляет прогноз как для обучающих, так и для контрольных точек. + return [sum(column[index] * value for column, value in zip(columns, coefficients)) for index in range(len(columns[0]))] # Сумма базисных функций не обращается к измеренной амплитуде. + + +def fit_model(code, formula, columns, values, names, extra_parameters=0, params=None): # Каждый кандидат оценивается на одних и тех же наблюдениях. + training = [index for index in range(len(values)) if index % 3 != 1] # Каждая третья точка оставляется для проверки интерполяционного прогноза. + coefficients = least_squares([[column[i] for i in training] for column in columns], [values[i] for i in training]) # Контрольные амплитуды не участвуют в оценке линейных коэффициентов. + if coefficients is None: # Вырожденная модель не должна выигрывать из-за произвольных параметров. + return None # Вызывающая сторона честно сообщает отсутствие идентифицируемой оценки. + prediction = evaluate(columns, coefficients) # Один набор параметров применяется также к отложенным точкам. + parameters = dict(zip(names, coefficients)) # Имена отражают физический смысл оценённых коэффициентов. + parameters.update(params or {}) # Нелинейные параметры включаются в тот же машиночитаемый отчёт. + return score_model(code, formula, values, prediction, len(columns) + extra_parameters, parameters) # BIC учитывает и линейные, и нелинейные степени свободы. + + +def score_model(code, formula, values, prediction, parameters, params): # Показатели качества имеют одинаковое определение для всех конкурентов. + residuals = [value - fitted for value, fitted in zip(values, prediction)] # Остаток всегда сохраняет знак «измерение минус модель». + square = sum(value * value for value in residuals) # SSE измеряется в квадрате единиц анализируемого канала. + validation = [value for index, value in enumerate(residuals) if index % 3 == 1] # Считаем ошибку только по точкам, не использованным для линейного подбора. + training_square = sum(value * value for index, value in enumerate(residuals) if index % 3 != 1) # Нелинейный поиск оптимизирует только обучающую часть. + training_count = len(values) - len(validation) # BIC вычисляется на тех же наблюдениях, на которых оценивались параметры модели. + mean = sum(values) / len(values) # Среднее определяет постоянную модель для вычисления R². + variance = sum((value - mean) ** 2 for value in values) # Полный разброс нужен только для описания качества, а не для постановки диагноза. + residual_mean = sum(residuals) / len(residuals) # Среднее остатка вычисляем один раз, сохраняя линейную сложность оценки кандидата. + centered = [value - residual_mean for value in residuals] # Автокорреляция оценивается после удаления среднего остатка. + denominator = sum(value * value for value in centered) # Нулевой остаток не имеет определённой автокорреляции. + floor = max(1e-24, max(abs(value) for value in values) ** 2 * 1e-24) # Численный пол 10^-12 амплитудного масштаба не является допуском исправности. + return dict(code=code, formula=formula, parameters=params, parameter_count=parameters, count=len(values), sse=square, training_sse=training_square, # Сохраняем параметры и число степеней свободы для независимого воспроизведения. + rmse=math.sqrt(square / len(values)), validation_rmse=math.sqrt(sum(value * value for value in validation) / max(1, len(validation))), # Контрольная ошибка отделена от ошибки по всей выборке. + bic=training_count * math.log(max(training_square / training_count, floor)) + parameters * math.log(training_count), bic_count=training_count, # Для гауссовой ошибки сравниваем BIC обучения, сохраняя контрольные точки вне оценки параметров и критерия. + r_squared=1. - square / variance if variance > floor else None, residual_lag1=sum(a * b for a, b in zip(centered, centered[1:])) / denominator if denominator > floor else None) # Корреляция остатка показывает неописанную динамику и ограничение гауссового критерия. + + +def _samples(result, maximum=MAX_FIT_POINTS, cancel=lambda: False): # Стратифицированная выборка сохраняет экстремумы ошибки каждого временного блока и поддерживает отмену. + count = len(result.difference.times) # Метрики и старые признаки уже рассчитаны по всем исходным отсчётам. + width = max(1, math.ceil(count / max(1, maximum // 4))) # В каждом блоке оставляем начало, конец и два экстремума остатка. + selected = set() # Совпадающие индексы не должны менять вес отдельного наблюдения. + for start in range(0, count, width): # Число выбранных точек ограничено независимо от размера исходного CSV. + checkpoint(cancel) # Подготовка многомиллионной записи прерывается между небольшими временными блоками. + stop = min(count, start + width) # Последний неполный блок также участвует в подборе. + valid = [i for i in range(start, stop) if math.isfinite(result.expected[i]) and math.isfinite(result.difference.values[i])] # Пропуски остаются исключёнными из подбора. + if valid: # Пустой блок не создаёт фиктивного измерения. + selected.update((valid[0], valid[-1], min(valid, key=lambda i: result.difference.values[i]), max(valid, key=lambda i: result.difference.values[i]))) # Узкие импульсы сохраняются даже при длинной записи. + return [(result.difference.times[i] * 1000., result.expected[i], result.expected[i] + result.difference.values[i]) for i in sorted(selected)] # Модели используют микросекунды и исходные единицы амплитуды. + + +def fit_reference_models(result, events, cancel=lambda: False): # Конкурируют нормальный эталон, калибровка, дрейф, задержка, растяжение и разрывы. + samples = _samples(result, cancel=cancel) # Подбор ограничен по объёму и не меняет полную статистику сравнения. + if len(samples) < 24: # Трёхчастное разбиение требует достаточно обучающих и контрольных точек. + return dict(models=[], best=None, sampled_points=len(samples), sampling='стратифицированные экстремумы остатка') # Не называем короткую запись пригодной для идентификации модели. + duration = samples[-1][0] - samples[0][0] # Длительность выражена в микросекундах. + margin = .1 * duration if events else 0. # Общий интервал опор исключает экстраполяцию при поиске задержки до 10% длительности. + reference_times = result.reference.times # Повторно используем полную миллисекундную сетку без многомиллионной дополнительной копии. + samples = [point for point in samples if reference_times[0] * 1000. + margin <= point[0] <= reference_times[-1] * 1000. - margin] # Все глобальные модели сравниваются на строго одинаковой области поддержки в мкс. + if len(samples) < 24: # Слишком короткое перекрытие не позволяет честно сравнивать кандидатов. + return dict(models=[], best=None, sampled_points=len(samples), sampling='нет общего интервала моделей') # Не подменяем отсутствующие точки экстраполяцией. + times, reference, measured = map(list, zip(*samples)) # Параллельные массивы имеют одинаковую длину и порядок. + ones = [1.] * len(times) # Свободный член описывает смещение нуля в единицах канала. + models = [score_model('reference', 'y(t)=r(t)', measured, reference, 0, {})] # Исходный эталон является обязательной нулевой гипотезой. + offset = fit_model('offset', 'y(t)=r(t)+b', [ones], [value - base for value, base in zip(measured, reference)], ['offset']) # Смещение подбирается по остатку при фиксированном единичном усилении. + if offset: # Ошибки остатка совпадают с ошибками исходной аддитивной модели. + models.append(offset) # Не вводим лишний коэффициент усиления для постоянного смещения. + for code, formula, columns, names in [('gain', 'y(t)=a*r(t)+b', [reference, ones], ['gain', 'offset']), # Аффинная модель отделяет масштаб измерения от аппаратной динамики. + ('drift', 'y(t)=a*r(t)+b+c*(t-t0)', [reference, ones, [stamp - times[0] for stamp in times]], ['gain', 'offset', 'drift_per_us']), # Линейный дрейф описывает изменение питания или нуля по времени. + ('constant', 'y(t)=b', [ones], ['level'])]: # Постоянная модель проверяет отсутствие ожидаемого переключения. + candidate = fit_model(code, formula, columns, measured, names) # Линейные коэффициенты получают независимую контрольную ошибку. + if candidate: # Вырожденные варианты не входят в рейтинг. + models.append(candidate) # Все допустимые кандидаты сохраняются для полного отчёта. + centers = [event[0] * 1000. for event in events] # Центры эталонных переходов задают локальное растяжение без изменения паузы между импульсами. + if centers and len(centers) <= 32 and margin > 0. and result.metrics['outside_tolerance']: # Не подбираем сложную динамику для допустимого сигнала или более 32 неоднозначных переходов. + def temporal(lag, stretch, code): # Нелинейные параметры подбираются отдельно от линейных усиления и нуля. + checkpoint(cancel) # Каждый кандидат проверяет отмену до большого прохода интерполяции. + warped = [] # Прогноз эталона строится на той же сетке всех глобальных моделей. + for stamp in times: # Сдвиг и растяжение не меняют метки фактического измерения. + center = min(centers, key=lambda value: abs(stamp - lag - value)) # Ближайший фронт определяет локальную систему времени. + query = center + (stamp - lag - center) / stretch # Положительный lag задерживает измерение, stretch>1 растягивает фронт. + value = interpolate(reference_times, result.reference.values, query / 1000.) # Перевод мкс в мс сохраняет исходную полную сетку без копирования. + if value is None: # Отсутствующая опора делает именно этого кандидата недопустимым. + return None # Нельзя улучшать SSE уменьшением числа контрольных точек. + warped.append(value) # Временная модель сохраняет все наблюдения общей области. + return fit_model(code, 'y(t)=a*r(te+(t-delay-te)/stretch)+b', [warped, ones], measured, ['gain', 'offset'], 1 if code == 'timing' else 2, dict(delay_us=lag, stretch=stretch)) # BIC штрафует оба нелинейных параметра растяжения. + best_delay = None # Чистая задержка конкурирует с изменением формы фронта. + for index in range(21): # Грубая сетка из 21 точки охватывает ±10% общей длительности. + candidate = temporal(-margin + 2. * margin * index / 20., 1., 'timing') # Растяжение фиксировано единицей для отдельной модели задержки. + if candidate and (best_delay is None or candidate['training_sse'] < best_delay['training_sse']): # Нелинейный поиск использует только обучающие остатки. + best_delay = candidate # Контрольные точки не выбирают оптимальную задержку. + if best_delay: # При наличии перекрытия уточняем задержку последовательным уменьшением шага. + step = margin / 10. # Начальный шаг равен расстоянию между грубыми кандидатами. + for _ in range(9): # Девять уточнений дают разрешение существенно меньше исходного шага фронта. + for lag in (best_delay['parameters']['delay_us'] - step / 2., best_delay['parameters']['delay_us'] + step / 2.): # Симметричный поиск допускает опережение и запаздывание. + candidate = temporal(lag, 1., 'timing') # Линейные параметры заново оптимизируются для каждой задержки. + if candidate and candidate['training_sse'] < best_delay['training_sse']: # Контрольная ошибка остаётся независимой от решения. + best_delay = candidate # Принимаем только реальное улучшение обучающего описания. + step /= 2. # Локальный шаг уменьшается геометрически. + models.append(best_delay) # Чистая задержка получает самостоятельную строку отчёта. + best_stretch = best_delay # Единичное растяжение служит допустимой исходной точкой. + for stretch in (.4, .6, .8, 1., 1.3, 1.7, 2.3, 3., 4.): # Диапазон 0,4–4 охватывает ускоренные и замедленные фронты без неограниченного переобучения. + candidate = temporal(best_delay['parameters']['delay_us'], stretch, 'slow_switching') # Одновременное уточнение задержки выполняется следующим координатным проходом. + if candidate and candidate['training_sse'] < best_stretch['training_sse']: # Выбираем старт по обучающим точкам. + best_stretch = candidate # Лучший локальный масштаб определяет следующую область поиска. + lag_step, scale_step = margin / 10., .5 # Начальные интервалы координатного уточнения заданы в мкс и безразмерном масштабе. + for _ in range(9): # Ограниченное число шагов сохраняет предсказуемое время работы. + lag, stretch = best_stretch['parameters']['delay_us'], best_stretch['parameters']['stretch'] # Обе координаты уточняются относительно текущего решения. + for next_lag, next_stretch in ((lag - lag_step, stretch), (lag + lag_step, stretch), (lag, max(.25, stretch - scale_step)), (lag, min(5., stretch + scale_step))): # Ограничения 0,25–5 исключают вырожденное сжатие времени. + candidate = temporal(next_lag, next_stretch, 'slow_switching') # Для каждой комбинации коэффициенты a и b оцениваются QR-методом. + if candidate and candidate['training_sse'] < best_stretch['training_sse']: # Контрольные точки не участвуют в поиске. + best_stretch = candidate # Сохраняем лучшее согласование динамики фронтов. + lag_step /= 2.; scale_step /= 2. # Обе сетки последовательно уточняются. + if best_stretch['code'] == 'slow_switching': # Совпадение с чистой задержкой не создаёт дублирующую модель. + models.append(best_stretch) # Штраф за дополнительное растяжение учитывается при окончательном выборе BIC. + span = result.metrics['reference_max'] - result.metrics['reference_min'] # Масштаб состояния берётся из полного сравниваемого эталона. + if span > 0.: # Для постоянной полки невозможно определить противоположное состояние контакта. + active, intervals = None, [] # Кусочная модель оценивает границы каждого дополнительного переключения. + training = [index for index in range(len(times)) if index % 3 != 1] # Моменты разрывов ищутся только на обучающих точках. + for index in training: # Принадлежность состоянию определяется относительно двух эталонных полок. + target = result.metrics['reference_max'] if reference[index] < (result.metrics['reference_min'] + result.metrics['reference_max']) / 2. else result.metrics['reference_min'] # Противоположная полка соответствует прерыванию нормального состояния. + contact = abs(measured[index] - target) < .3 * span and abs(measured[index] - reference[index]) > .5 * span # Пространство состояний ограничено наблюдаемым полным размахом. + if contact and active is None: # Новый интервал начинается с первого подтверждённого противоположного состояния. + active = index # Сохраняем индекс, а не округлённое время. + elif not contact and active is not None: # Возврат завершает кусок неправильного состояния. + if times[index] > times[active] and len(intervals) < 12: # Максимум 12 сегментов ограничивает сложность и вычислительную стоимость модели. + intervals.append((times[active], times[index])) # Длительность измеряется по исходной временной сетке. + active = None # Следующий разрыв подбирается отдельно. + if intervals: # Без завершённых прерываний кусочная модель отсутствует. + boxes = [[float(left <= stamp < right) for stamp in times] for left, right in intervals] # Границы, найденные по обучению, применяются также к контрольным временам. + candidate = fit_model('contact_bounce', 'y(t)=a*r(t)+b+sum(cj*I[tj0,tj1])', [reference, ones, *boxes], measured, ['gain', 'offset', *[f'event_{i}_amplitude' for i in range(len(boxes))]], 2 * len(boxes), dict(events=[dict(start_us=left, stop_us=right, duration_us=right - left) for left, right in intervals])) # BIC включает амплитуду и обе границы каждого прерывания. + if candidate: # Линейно зависимые сегменты не должны попадать в рейтинг. + models.append(candidate) # Совместный дефект может оставить звон в остатке этой кусочной модели. + baseline = models[0] # Исходный эталон задаёт общую точку отсчёта улучшения. + floor = max(1e-24, max(abs(value) for value in measured) ** 2 * 1e-24) # Все глобальные модели используют один численный пол дисперсии даже при подгонке аддитивного остатка. + for model in models: # Единый масштаб предотвращает искусственное преимущество модели при почти нулевой численной ошибке. + count = model['bic_count'] # Число обучающих точек одинаково для всех глобальных конкурентов. + model['bic'] = count * math.log(max(model['training_sse'] / count, floor)) + model['parameter_count'] * math.log(count) # Штраф и дисперсия оцениваются на одной и той же обучающей выборке. + for model in models: # Все показатели сравнения моделей вычисляются на одном наборе времён. + model['delta_bic'] = baseline['bic'] - model['bic'] # Положительное значение означает преимущество относительно неизменённого эталона. + model['explained_error_pct'] = 100. * (1. - model['sse'] / baseline['sse']) if baseline['sse'] > 0. else 0. # Показываем, какую долю исходной ошибки описала модель. + model['supported'] = model['delta_bic'] >= 10. and model['validation_rmse'] < .8 * baseline['validation_rmse'] and model['explained_error_pct'] > 50. # Решение требует штрафованного улучшения и снижения контрольной ошибки минимум на 20%. + models.sort(key=lambda model: model['bic']) # Рейтинг показывает конкурентов, а не единственный заранее выбранный диагноз. + best = models[0] if models[0]['supported'] else baseline # При недостатке доказательств сохраняем исходную гипотезу без аппаратного вывода. + return dict(models=models, best=best['code'], sampled_points=len(times), interval_us=[times[0], times[-1]], sampling='до 2048 стратифицированных точек, включая экстремумы; контроль — каждая третья точка') # Отчёт честно отделяет полную статистику от ограниченного подбора. + + +def fit_damped_ring(times_us, values, cancel=lambda: False): # Свободный отклик второго порядка описывается экспонентой и синусом с неизвестной фазой. + if len(values) < 24 or times_us[-1] <= times_us[0]: # Короткая или нулевая временная область не позволяет идентифицировать колебание. + return None # Отсутствующая оценка не заменяется произвольной частотой. + full_level = median(values[-max(8, len(values) // 4):]) # Начальную частоту оцениваем до прореживания, чтобы не принять алиас за реальный резонанс. + full_amplitude = max(abs(value - full_level) for value in values) # Полоса переходов задаётся полным наблюдаемым откликом. + full_crossings, previous = [], 0 # Сначала используем полную временную сетку для оценки доступной частоты. + for index, (stamp, value) in enumerate(zip(times_us, values)): # Исходные пересечения уровня не зависят от ограниченной выборки нелинейного подбора. + if index % 16384 == 0: # Подготовку большого окна также можно прервать. + checkpoint(cancel) # Не ждём окончания длинного прохода после запроса отмены. + sign = 1 if value - full_level > .05 * full_amplitude else -1 if value - full_level < -.05 * full_amplitude else 0 # Гистерезис подавляет поздний шум относительно начального колебания. + if sign and previous and sign != previous: # Противоположные значимые полуволны определяют половину периода. + full_crossings.append(stamp) # Время сохраняется до любой децимации. + if sign: # Промежуточная зона не меняет последнюю подтверждённую полуволну. + previous = sign # Дальнейшее пересечение сравнивается с наблюдаемым знаком. + if len(full_crossings) < 4: # Короткий звон или одиночный выброс не дают устойчивой начальной частоты. + return None # Не создаём резонансную модель без нескольких наблюдаемых полупериодов. + initial_frequency = .5 / median(b - a for a, b in zip(full_crossings, full_crossings[1:])) # Частота определяется до возможного понижения частоты дискретизации. + full_step = median(b - a for a, b in zip(times_us, times_us[1:])) # Фактический шаг исходных наблюдений задаёт допустимую децимацию. + if full_step <= 0.: # Невозрастающая сетка не имеет физически определённой частоты выборки. + return None # Не исправляем повреждённые метки времени молча. + maximum_stride = max(1, int(.2 / (initial_frequency * full_step))) # Сохраняем минимум пять отсчётов на исходно наблюдаемый период. + stride = min(maximum_stride, max(1, math.ceil(len(values) / 512))) # Ограничение памяти не должно создавать ложную низкочастотную модель из высокочастотного звона. + times = [stamp - times_us[0] for stamp in times_us[::stride][:512]] # Если безопасная децимация недостаточна, сокращаем окно, сохраняя разрешение периода. + measured = list(values[::stride][:512]) # Подбор получает не более 512 реально наблюдаемых амплитуд без алиасного понижения частоты. + duration = times[-1] - times[0] # Длительность участка выражена в мкс. + step = median(b - a for a, b in zip(times, times[1:])) # Медианный шаг устойчив к отдельным неравномерным промежуткам. + if max(b - a for a, b in zip(times, times[1:])) > 5. * step: # Через большой ненаблюдавшийся промежуток колебание не подбирается. + return None # Спектральная интерпретация разорванного участка была бы неоднозначной. + level = median(measured[-max(8, len(measured) // 4):]) # Хвост задаёт начальную оценку установившегося уровня. + amplitude = max(abs(value - level) for value in measured) # Оценка амплитуды нужна только для устойчивого поиска начальной частоты. + previous, crossings = 0, [] # Переходы через небольшой гистерезис задают начальную частоту, но не сам диагноз. + for stamp, value in zip(times, measured): # Анализируем обе полуволны колебания относительно хвостовой полки. + sign = 1 if value - level > .05 * amplitude else -1 if value - level < -.05 * amplitude else 0 # Полоса 5% начальной амплитуды подавляет шум после затухания. + if sign and previous and sign != previous: # Между противоположными полуволнами проходит приблизительно половина периода. + crossings.append(stamp) # Сохраняем времена для робастной начальной оценки периода. + if sign: # Нулевая полоса не создаёт дополнительных смен знака. + previous = sign # Последняя значимая полуволна остаётся опорной. + if len(crossings) < 4: # Менее двух наблюдаемых периодов недостаточно для уверенной идентификации затухания. + return None # Одиночный выброс не объявляется резонансом. + initial = .5 / median(b - a for a, b in zip(crossings, crossings[1:])) # Частота в циклах/мкс соответствует МГц. + ones, best = [1.] * len(times), None # Постоянный уровень подбирается вместе с двумя фазовыми компонентами. + def candidate(frequency, alpha): # Метод переменной проекции отделяет нелинейные частоту/затухание от линейных коэффициентов. + checkpoint(cancel) # Длительный перебор можно кооперативно отменить. + if not 1.5 / duration <= frequency <= .2 / step or alpha < 0.: # Требуем наблюдаемые периоды и минимум пять отсчётов на период, сохраняя запас до границы Найквиста. + return None # Неоднозначные или нарастающие решения этой пассивной модели отклоняются. + cosine = [math.exp(-alpha * stamp) * math.cos(math.tau * frequency * stamp) for stamp in times] # Первая фазовая компонента затухающего отклика. + sine = [math.exp(-alpha * stamp) * math.sin(math.tau * frequency * stamp) for stamp in times] # Вторая компонента допускает произвольную начальную фазу. + return fit_model('damped_rlc', 'v(t)=Vinf+exp(-alpha*t)*(A*cos(2*pi*f*t)+B*sin(2*pi*f*t))', [ones, cosine, sine], measured, ['level', 'cosine', 'sine'], 2, dict(frequency_hz=frequency * 1e6, alpha_per_us=alpha)) # BIC учитывает пять оцениваемых параметров. + for fi in range(17): # Начальная частота уточняется в диапазоне ±35% оценки по переходам через уровень. + frequency = initial * (.65 + .7 * fi / 16.) # Ограниченный диапазон снижает риск выбора гармоники вместо основного колебания. + for alpha in [0.] + [10. ** (-1.5 + index * 3. / 10.) / duration for index in range(11)]: # Логарифмическая сетка охватывает слабое и быстрое затухание относительно окна наблюдения. + model = candidate(frequency, alpha) # Линейные параметры подбираются QR-методом для каждой пары частоты и затухания. + if model and (best is None or model['training_sse'] < best['training_sse']): # Контрольные точки не выбирают параметры нелинейного поиска. + best = model # Сохраняем лучшее объяснение обучающих наблюдений. + if best is None: # Частота могла оказаться выше разрешения исходной записи. + return None # Недостаточная дискретизация не компенсируется выдуманными параметрами. + frequency_step, alpha_step = .05 * initial, max(best['parameters']['alpha_per_us'] * .5, 1. / duration) # Локальное уточнение начинается с масштаба грубой сетки. + for _ in range(10): # Десять координатных уточнений дают воспроизводимое ограниченное время подбора. + frequency, alpha = best['parameters']['frequency_hz'] / 1e6, best['parameters']['alpha_per_us'] # Возвращаем текущие параметры к внутренним мкс. + for next_frequency, next_alpha in ((frequency - frequency_step, alpha), (frequency + frequency_step, alpha), (frequency, max(0., alpha - alpha_step)), (frequency, alpha + alpha_step)): # Частота и затухание уточняются независимо с неотрицательным ограничением потерь. + model = candidate(next_frequency, next_alpha) # Линейные коэффициенты пересчитываются при каждом изменении динамики. + if model and model['training_sse'] < best['training_sse']: # Принимаем только улучшение на обучающей части. + best = model # Контрольный остаток остаётся показателем проверки модели. + frequency_step /= 2.; alpha_step /= 2. # Постепенно уменьшаем обе области поиска. + for _ in range(4): # Повторное точное уточнение снимает взаимное влияние ошибки частоты и оценённого затухания. + frequency, alpha = best['parameters']['frequency_hz'] / 1e6, best['parameters']['alpha_per_us'] # Исходная точка уже найдена грубой сеткой и локальными шагами. + refined = bounded_minimum(lambda value: candidate(value, alpha), frequency * .97, frequency * 1.03) # Частота уточняется внутри локального диапазона ±3%. + if refined and refined['training_sse'] < best['training_sse']: # Золотой поиск не должен ухудшать уже полученное решение. + best = refined # Новая частота уменьшает систематическую ошибку фазы по всему окну. + frequency = best['parameters']['frequency_hz'] / 1e6 # Следующее уточнение затухания использует уже исправленную частоту. + refined = bounded_minimum(lambda value: candidate(frequency, value), 0., max(3. * alpha, 5. / duration)) # Неотрицательное затухание уточняется независимо от положения грубой логарифмической сетки. + if refined and refined['training_sse'] < best['training_sse']: # Сохраняем только реальное улучшение обучающего описания. + best = refined # Время затухания больше не наследует грубую ошибку предыдущей сетки частоты. + params = best['parameters'] # Дополнительные физические параметры вычисляются из найденных полюсов второго порядка. + omega = math.tau * params['frequency_hz'] # Угловая частота затухающего колебания выражается в рад/с. + alpha = params['alpha_per_us'] * 1e6 # Переводим скорость затухания из 1/мкс в 1/с. + natural = math.hypot(omega, alpha) # Для недодемпфированного отклика omega0²=omega_d²+alpha². + params.update(amplitude=math.hypot(params['cosine'], params['sine']), decay_time_us=1e6 / alpha if alpha > 0. else None, damping_ratio=alpha / natural, # Амплитуда относится к началу выбранного участка; отсутствие потерь не создаёт Infinity в JSON. + natural_frequency_hz=natural / math.tau, quality_factor=natural / (2. * alpha) if alpha > 0. else None, lc_product=1. / natural ** 2, r_over_l=2. * alpha) # LC и R/L идентифицируются без задания отдельного R, L или C для последовательного эквивалента. + constant = fit_model('constant', 'v(t)=Vinf', [ones], measured, ['level']) # Проверяем, что сложный отклик лучше простой постоянной полки. + best.update(delta_bic=constant['bic'] - best['bic'], interval_us=[times_us[0], times_us[0] + times[-1]], frequency_resolution_hz=1e6 / duration, input_points=len(values), decimation_stride=stride) # Отчёт сохраняет фактическое укороченное окно и безопасный шаг подбора. + best['supported'] = best['delta_bic'] >= 10. and best['r_squared'] is not None and best['r_squared'] >= .8 and best['validation_rmse'] < .5 * constant['validation_rmse'] # Пригодность отклика проверяется штрафом сложности, R² и контрольной ошибкой. + return best # Возвращаем также неподтверждённый подбор, чтобы отчёт показывал причину отказа от гипотезы. + + +def equivalent_rlc(model, circuit=None): # Параметры относятся только к явно выбранному последовательному эквиваленту второго порядка. + if not model or not model.get('supported'): # По плохо описанному колебанию нельзя вычислять электрические элементы. + return dict(identifiable=False, reason='Затухающий отклик не подтверждён данными.') # Честно сохраняем отсутствие физической оценки. + supplied = {key: float(value) for key, value in (circuit or {}).items() if key in ('inductance_h', 'capacitance_f', 'resistance_ohm') and math.isfinite(value) and value > 0.} # Нулевые значения означают неизвестные элементы, единицы — СИ. + product, ratio = model['parameters']['lc_product'], model['parameters']['r_over_l'] # Найденные полюса определяют только LC и R/L без дополнительного ограничения. + if 'inductance_h' in supplied: # Известная индуктивность однозначно задаёт оставшиеся параметры эквивалента. + inductance = supplied['inductance_h'] # Используем явно введённое значение в генри. + elif 'capacitance_f' in supplied: # Известная ёмкость позволяет восстановить L из произведения LC. + inductance = product / supplied['capacitance_f'] # Произведение LC имеет единицу с². + elif 'resistance_ohm' in supplied and ratio > 0.: # При ненулевом затухании известное сопротивление определяет индуктивность. + inductance = supplied['resistance_ohm'] / ratio # Деление R на R/L возвращает генри. + else: # Одна осциллограмма без дополнительного элемента не определяет все три неизвестных. + return dict(identifiable=False, lc_product=product, r_over_l=ratio, supplied=supplied, reason='Нужен хотя бы один известный R, L или C; по отклику определяются только LC и R/L.') # Не выдаём произвольные значения отдельных элементов. + estimated = dict(inductance_h=inductance, capacitance_f=product / inductance, resistance_ohm=ratio * inductance) # Это эквивалентные параметры полюсов, а не автоматически номиналы RC-снаббера. + mismatch = {key: (estimated[key] / value - 1.) * 100. for key, value in supplied.items()} # Несколько известных элементов позволяют проверить согласованность предположенной топологии. + return dict(identifiable=True, topology='последовательный эквивалент RLC', estimated=estimated, supplied=supplied, deviation_pct=mismatch) # Отделяем введённые значения от восстановленных и не скрываем противоречия. + + +def fit_ringing_pair(result, events, circuit=None, cancel=lambda: False, delay_us=0.): # Компенсируем оценённую задержку перед сравнением полюсов, чтобы сдвиг фронта не выглядел отказом снаббера. + rising = [event for event in events if event[2] == 1][-4:] # Не более четырёх последних выключений ограничивают стоимость нелинейного подбора. + pairs = [] # Каждый участок имеет собственные границы, качество и параметры. + low, high = result.metrics['reference_min'], result.metrics['reference_max'] # Огибающая взята только из реально сравниваемого эталона. + for center, width, _ in rising: # Время и длительность события выражены во внутренних миллисекундах. + checkpoint(cancel) # Смена записи может отменить подбор между отдельными выключениями. + start = bisect_left(result.difference.times, center + width / 2.) # Начинаем поиск установившейся полки после пересечения верхнего порога фронта. + stop_time = min(result.difference.times[-1], result.measured.times[-1] - delay_us / 1000., center + max(40. * width, .002)) # Ограничиваем обе стороны реальными опорами после компенсации задержки без экстраполяции. + stop = bisect_left(result.difference.times, stop_time) # Конечный индекс не выходит за реально наблюдаемое перекрытие. + for index in range(max(1, start), min(stop - 1, len(result.expected) - 1)): # Ищем первый максимум эталона после завершения основного роста напряжения. + if result.expected[index] > low + .85 * (high - low) and result.expected[index - 1] <= result.expected[index] > result.expected[index + 1]: # Первый пик на высокой полке отделяет колебательный отклик от незавершённого фронта. + start = index # Неизвестная фаза синуса допускает начало подбора с любого пика. + break # Последующие колебания не должны сдвигать начало до почти нулевой амплитуды. + indices = range(start, stop) # Обе кривые подбираются на строго одинаковом временном интервале. + if stop - start < 24 or any(not math.isfinite(result.expected[i]) or not math.isfinite(result.difference.values[i]) for i in indices): # Разрыв внутри окна не маскируется удалением отдельных отсчётов колебания. + continue # Такому выключению не приписываем достоверный резонансный контур. + times = [result.difference.times[i] * 1000. for i in indices] # Подбор использует микросекунды без потери дробной части. + reference = [result.expected[i] for i in indices] # Эталон уже интерполирован на фактическую сетку измерения. + measured = [interpolate(result.measured.times, result.measured.values, result.difference.times[i] + delay_us / 1000.) for i in indices] # Положительная задержка сдвигает окно измерения к соответствующему выключению. + if any(value is None for value in measured): # Через пропуск или отсутствие опоры после сдвига отклик не подбирается. + continue # Окно не уменьшается отдельно для одной из сравниваемых моделей. + fitted_reference = fit_damped_ring(times, reference, cancel) # Затухание исправного отклика определяется по данным, а не фиксированной константой. + fitted_measured = fit_damped_ring(times, measured, cancel) # Частота, затухание и фаза измерения подбираются независимо. + if fitted_measured: # Сохраняем также неудачное по качеству согласование для объяснения неопределённости. + pair = dict(measured=fitted_measured, reference=fitted_reference, equivalent=equivalent_rlc(fitted_measured, circuit), compensated_delay_us=delay_us) # Эквивалент и компенсация времени сохраняются рядом с качеством подбора. + if fitted_reference and fitted_reference['supported']: # Без пригодного эталонного колебания нельзя оценить отношение затуханий. + a, b = fitted_measured['parameters'], fitted_reference['parameters'] # Параметры имеют одинаковое начало выбранного участка и одинаковые единицы. + pair.update(amplitude_ratio=a['amplitude'] / b['amplitude'] if b['amplitude'] > 1e-12 else None, # Отношение амплитуд не зависит от единицы напряжения. + decay_ratio=a['decay_time_us'] / b['decay_time_us'] if a['decay_time_us'] is not None and b['decay_time_us'] else None, frequency_change_pct=(a['frequency_hz'] / b['frequency_hz'] - 1.) * 100.) # Показываем рост длительности звона и изменение резонансной частоты относительно эталона. + pairs.append(pair) # Отдельные выключения остаются доступны в JSON для проверки устойчивости оценки. + return pairs # Отсутствие пригодных окон является явным отсутствием модели, а не нормальным состоянием снаббера. + + +def identify_fault_models(result, events, features, physical, role, circuit=None, channels=None, cancel=lambda: False): # Формируем гипотезы из подтверждённых моделей, а не только из фиксированных порогов формы. + from set_devices.signal_joint_models import fit_joint_channels # Ленивый импорт устраняет цикл между совместными моделями и общими численными методами. + checkpoint(cancel) # Не начинаем дорогой подбор после отмены исходного сравнения. + report = fit_reference_models(result, events, cancel) # Все глобальные конкуренты оцениваются на одинаковых временах. + best = next((model for model in report['models'] if model['code'] == report['best']), None) # Временная модель нужна также для корректного выбора окна выключения. + delay = best['parameters'].get('delay_us', 0.) if best and best['supported'] else 0. # Компенсируем только подтверждённый по BIC и контролю временной сдвиг. + rings = fit_ringing_pair(result, events, circuit, cancel, delay) if physical and role == 'uce' else [] # Электрическая интерпретация колебания допустима только для силового напряжения. + report.update(ringing=rings, assumptions=['BIC — сравнительный критерий при предположении гауссовой ошибки, не вероятность неисправности.', 'Контрольные точки чередуются во времени; это проверка интерполяционного прогноза, не независимый эксперимент.', 'Подвыборка сохраняет экстремумы: статистические показатели условны относительно выбранных точек.', 'RLC — последовательный эквивалент полюсов; номиналы реального RC-снаббера автоматически не определяются.']) # Ограничения метода сохраняются рядом с численными результатами. + report['criteria'] = dict(delta_bic_min=10., validation_improvement_min_pct=20., explained_error_min_pct=50., ring_r_squared_min=.8, ring_amplitude_or_decay_ratio=1.5, ring_frequency_change_pct=15., stretch_min=1.15) # Начальные критерии принятия модели явно доступны пользователю и не выдаются за паспортные нормы транзистора. + report['circuit_supplied_si'] = dict(circuit or {}) # Известные элементы сохраняются даже при отсутствии пригодного колебательного участка. + contact_events = best['parameters'].get('events', []) if best and best['code'] == 'contact_bounce' else [] # Сегменты кусочной модели проверяются независимыми физическими каналами. + joint, joint_findings = fit_joint_channels(result, channels, contact_events, cancel) if physical else (dict(available=False, reason='Физическая роль канала не определена.'), []) # Не выполняем электрические расчёты по произвольному неизвестному каналу. + report['joint'] = joint # Совместная идентификация проводимости, утечки и провалов управления экспортируется вместе с глобальным рейтингом. + findings = list(joint_findings) # Несколько моделей могут описывать разные участки совместного дефекта. + if result.metrics['outside_tolerance'] == 0: # Даже хорошее улучшение на малом шуме не отменяет пользовательский критерий допустимости. + return report, findings # Допустимый выбранный канал не отменяет отдельно подтверждённые совместные гипотезы. + if best and best['supported']: # Аппаратная формулировка требует проверки качества, а не только наличия признака. + code, params = best['code'], best['parameters'] # Параметры выбранной модели будут показаны в подробном отчёте. + if code == 'contact_bounce' and physical and features['measured_edges'] >= features['reference_edges'] + 2: # Кусочное объяснение подтверждается полными переходами на всей записи. + text = f'Модель прерываний: {len(params["events"])} эпизода; возможны плохой контакт (дребезг) или нестабильное управление затвором.' # Длительности каждого эпизода доступны в параметрах модели. + findings.append(dict(code=code, text=text, model=code)) # Причина ссылается на конкретный численно проверенный кандидат. + elif code == 'slow_switching' and physical and params['stretch'] > 1.15: # Замедление должно превышать 15% при уже доказанном модельном улучшении. + findings.append(dict(code=code, text=f'Модель растяжения фронтов: ×{params["stretch"]:.3g}; возможны ослабленный драйвер или изменение цепи затвора.', model=code)) # Формулируем гипотезу через фактически оценённый масштаб времени. + elif code in ('timing', 'slow_switching') and abs(params['delay_us']) > 3. * (features['sample_step_ms'] or 0.) * 1000.: # Задержка должна превышать три исходных шага, даже если BIC чувствителен к малому шуму. + findings.append(dict(code='timing', text=f'Модель задержки: {params["delay_us"]:+.4g} мкс; проверьте синхронизацию записей и задержку управления.', model=code)) # Отдельная причина аппаратной задержки по одному каналу не доказывается. + elif code == 'constant' and physical and features['reference_edges']: # Постоянная амплитуда выигрывает у динамического эталона с ожидаемыми переходами. + state = 'высоким' if params['level'] > (result.metrics['reference_min'] + result.metrics['reference_max']) / 2. else 'низким' # Середина эталонных состояний определяет тип отсутствующего переключения. + text = f'Модель постоянного уровня: {result.measured.name} остаётся {state}; возможны отказ ключа, обрыв или ошибка управления.' # Направление неисправности остаётся возможной причиной, а не доказанным компонентом. + findings.append(dict(code='no_switching', text=text, model=code)) # Сохраняем совместимый код группы отсутствия переключения. + elif code in ('offset', 'gain', 'drift'): # Калибровочные и медленные изменения конкурируют с аппаратной динамикой. + texts = dict(offset=f'Модель смещения: Δ0={params.get("offset", 0.):+.4g}; проверьте ноль датчика, общую точку и режим питания.', # Постоянное смещение задано в единицах выбранного канала. + gain=f'Модель масштаба: коэффициент {params.get("gain", 1.):.5g}, смещение {params.get("offset", 0.):+.4g}; возможна ошибка измерительного тракта или изменение режима.', # Усиление является безразмерной оценкой соответствия эталону. + drift=f'Модель дрейфа: {params.get("drift_per_us", 0.):+.4g} ед./мкс; возможны нестабильность питания или уход нуля измерения.') # Производная уровня явно содержит единицу времени. + findings.append(dict(code=code, text=texts[code], model=code)) # Сохраняем идентифицированный вид отклонения отдельно от аппаратной причины. + gain = abs(best['parameters'].get('gain', 1.)) if best else 1. # Общий масштаб измерительного тракта не должен ошибочно удваивать амплитуду «неисправного» снаббера. + for pair in rings: # Разные выключения могут подтверждать дополнительный резонансный дефект поверх дребезга. + measured, reference = pair['measured'], pair['reference'] # Каждая сторона имеет собственные показатели качества подбора. + ratio = pair.get('amplitude_ratio') # Без пригодного эталонного отклика относительная амплитуда не определена. + worse = ratio is not None and ratio / max(gain, 1e-9) > 1.5 or pair.get('decay_ratio') is not None and pair['decay_ratio'] > 1.5 or abs(pair.get('frequency_change_pct', 0.)) > 15. # Параметры должны измениться заметно, а не только улучшить микроскопический остаток. + if measured['supported'] and reference and reference['supported'] and worse: # Аппаратная гипотеза требует пригодных моделей обеих осциллограмм. + params = measured['parameters'] # Оценённые частота и затухание делают вывод проверяемым. + text = f'Модель звона RLC: f={params["frequency_hz"] / 1e6:.3g} МГц, τ={params["decay_time_us"]:.3g} мкс; изменилось демпфирование — возможны нарушение снаббера или паразитного контура.' if params['decay_time_us'] is not None else f'Модель звона RLC: f={params["frequency_hz"] / 1e6:.3g} МГц, затухание не разрешено; проверьте снаббер и паразитный контур.' # Нулевое оценённое затухание не превращается в бесконечность JSON. + findings.append(dict(code='snubber', text=text, model='damped_rlc')) # Привязываем причину к параметрической модели второго порядка. + break # Несколько выключений не дублируют одинаковую строку неисправности. + if not findings: # Недостаточно описанная форма должна оставаться неопределённой. + code = 'noise' if features['residual_reversals'] >= 5 else 'deviation' # Остаточные колебания обозначают помеху без приписывания конкретного электрического отказа. + text = 'Остаток не объяснён проверенными моделями: возможны шум, помехи или неучтённая динамика.' if code == 'noise' else 'Ни одна модель не дала достаточного подтверждения причины отклонения; проверьте режим и измерительный тракт.' # Отсутствие подходящей модели не считается доказательством исправности. + findings.append(dict(code=code, text=text, model=None)) # Явная неопределённость сохраняется в краткой строке и JSON. + return report, findings # Численные результаты и текстовые гипотезы принадлежат одному снимку данных. diff --git a/python/set_devices/signal_joint_models.py b/python/set_devices/signal_joint_models.py new file mode 100644 index 0000000..b5f8d13 --- /dev/null +++ b/python/set_devices/signal_joint_models.py @@ -0,0 +1,79 @@ +"""Совместные электрические модели Uce, Uge и Ic на общей временной сетке.""" # Наличие трёх каналов даёт дополнительные проверяемые ограничения аппаратных гипотез. +import math # Корни дисперсий задают оценку неопределённости коэффициентов проводящего состояния. +import re # Физические каналы определяются по явным обозначениям, а не имени CSV. +from statistics import median # Медианные уровни и MAD устойчивы к отдельным коммутационным выбросам. +from set_devices.signal_fault_models import checkpoint, fit_model, interpolate # Переиспользуем численные методы без зависимости от GUI и циклического импорта ядра. + + +def _channels(traces): # Дублирующиеся обозначения нельзя выбирать произвольно для физических расчётов. + found = {} # Для каждой физической роли разрешён только один однозначный канал. + for trace in traces.values(): # Имена и значения предоставляются снимком исходной записи. + match = re.match(r'^\s*(uce|uge|ic)\s*\((V|A)\)\s*$', trace.name, re.IGNORECASE) # Требуем явные единицы В для напряжений и А для тока. + if match and match.group(2).lower() == ('a' if match.group(1).lower() == 'ic' else 'v'): # Не используем ток в мА как амперы без явного преобразования. + role = match.group(1).lower() # Внутренние обозначения не зависят от регистра заголовка. + found[role] = trace if role not in found else None # Повторная роль помечается неоднозначной и не участвует в выводе. + return {role: trace for role, trace in found.items() if trace is not None} # Неоднозначность не маскируется выбором первого столбца. + + +def fit_joint_channels(result, channels, events=None, cancel=lambda: False): # Все связанные каналы интерполируются на общую фактическую сетку сравнения. + if not channels: # Синхронные осциллограммы могут отсутствовать у одиночного источника. + return dict(available=False, reason='Для совместной проверки нужны Uce (V), Uge (V) и Ic (A) измерения и эталона.'), [] # Не подменяем отсутствующий ток или затвор выдуманными данными. + measured, reference = _channels(channels.get('measured', {})), _channels(channels.get('reference', {})) # Две стороны сравнения проверяются независимо. + if any(role not in measured or role not in reference for role in ('uce', 'uge', 'ic')): # Физические ограничения требуют полного набора каналов с однозначными единицами. + return dict(available=False, reason='Недостаточно однозначных синхронных каналов Uce/Uge/Ic в В/А.'), [] # Пропущенный канал остаётся ограничением диагностического вывода. + count = len(result.difference.times) # Общая область уже ограничена интервалом и временем эталона. + stride = max(1, math.ceil(count / 4096)) # До 4096 точек ограничивают дополнительную стоимость совместной электрической модели. + points = [] # Каждая строка содержит синхронные тройки фактического измерения и эталона. + for index in range(0, count, stride): # Изменение масштаба графика не влияет на используемую область записи. + if index % 1024 == 0: # Порционная проверка отмены поддерживает отзывчивость на больших записях. + checkpoint(cancel) # Не продолжаем подготовку после смены источника. + stamp = result.difference.times[index] # Время отсчитывается от первого измеренного отсчёта в миллисекундах. + a = {role: interpolate(trace.times, trace.values, stamp + channels['measured_origin_ms']) for role, trace in measured.items()} # Сохраняем временное взаимное положение измеренных каналов. + b = {role: interpolate(trace.times, trace.values, stamp + channels['reference_origin_ms'] - channels['shift_ms']) for role, trace in reference.items()} # К эталону применяется тот же пользовательский сдвиг, что в основном сравнении. + if all(value is not None for value in (*a.values(), *b.values())): # Только полностью наблюдаемые тройки пригодны для совместной физической проверки. + points.append((stamp * 1000., a, b)) # Человеко-читаемое время событий хранится в микросекундах. + if len(points) < 30: # Дополнительные модели требуют не менее 30 совместных наблюдений. + return dict(available=False, reason='Недостаточно общих наблюдений трёх физических каналов.'), [] # Число точек явно ограничивает возможность идентификации. + low = min(point[2]['uce'] for point in points) # Низкая полка эталона определяет проводящее состояние транзистора. + high = max(point[2]['uce'] for point in points) # Высокая полка соответствует выключенному ключу. + gate_high = max(point[2]['uge'] for point in points) # Опорный высокий уровень затвора определяется по данным эталона. + on = [point for point in points if point[2]['uce'] < low + .02 * (high - low) and point[1]['uce'] < low + .25 * (high - low) and min(point[1]['uge'], point[2]['uge']) > .98 * gate_high] # ВАХ оценивается на устойчивой эталонной полке с высоким затвором и фактически проводящим измеренным ключом. + off = [point for point in points if min(point[1]['uce'], point[2]['uce']) > low + .85 * (high - low) and max(point[1]['uge'], point[2]['uge']) < .3 * gate_high] # Утечка допустима как модель только при высоком Uce и низком Uge с обеих сторон; пробой с низким Uce рассматривается отдельно. + report, findings = dict(available=True, count=len(points), on_count=len(on), off_count=len(off), contact_events=[]), [] # Совместные выводы сохраняют фактическую область подтверждения. + fits = {} # Две модели проводимости отдельно оценивают исправный и измеренный ключ. + for side, position in (('measured', 1), ('reference', 2)): # Коэффициенты U0 и Rd вычисляются из собственных тока и напряжения каждой стороны. + if len(on) < 30: # Мало наблюдений проводящего состояния не позволяет оценить наклон ВАХ. + continue # Не выдаём эквивалентное сопротивление по одному значению тока. + currents = [point[position]['ic'] for point in on] # Ток задаётся в амперах, напряжение — в вольтах. + if max(currents) - min(currents) < .1 * max(max(abs(value) for value in currents), 1e-12): # Размах менее 10% уровня не разделяет надёжно U0 и дифференциальное сопротивление. + continue # Почти постоянная нагрузка не даёт идентифицировать две независимые величины. + model = fit_model('conduction', 'Uce=Rdiff*Ic+U0', [currents, [1.] * len(on)], [point[position]['uce'] for point in on], ['resistance_ohm', 'voltage_offset_v']) # Модель является локальной линейной ВАХ, а не постоянным сопротивлением IGBT во всех режимах. + if model: # QR-решатель дополнительно проверяет независимость тока и свободного члена. + training_current = [value for index, value in enumerate(currents) if index % 3 != 1] # Оценка неопределённости использует только наблюдения, участвовавшие в подборе коэффициентов. + average = sum(training_current) / len(training_current) # Центр обучающей выборки определяет ковариацию наклона и свободного члена. + spread = sum((value - average) ** 2 for value in training_current) # Знаменатель ковариации имеет единицу А² и не увеличивается отложенными контрольными точками. + model['slope_standard_error_ohm'] = math.sqrt(model['training_sse'] / max(1, len(training_current) - 2) / spread) # Стандартная ошибка оценивается по обучающим остаткам при независимом шуме и не покрывает систематическую ошибку датчика. + fits[side] = model # Сохраняем полные параметры и контрольную ошибку каждой ВАХ. + report['conduction'] = fits or dict(identifiable=False, reason='Нужны устойчивое включённое состояние и заметное изменение тока нагрузки.') # Неидентифицируемый наклон явно отличим от нулевого сопротивления. + if len(fits) == 2: # Сравнение деградации требует оценок обеих сторон на одном режиме нагрузки. + delta = fits['measured']['parameters']['resistance_ohm'] - fits['reference']['parameters']['resistance_ohm'] # Изменение дифференциального сопротивления измеряется в омах. + uncertainty = math.hypot(fits['measured']['slope_standard_error_ohm'], fits['reference']['slope_standard_error_ohm']) # Независимые статистические ошибки наклонов складываются по дисперсии. + report['conduction_change_ohm'] = delta # Численная разница доступна даже при недостаточной статистической значимости. + if delta > max(5. * uncertainty, 1e-9): # Порог пяти стандартных ошибок ограничивает реакции на один только случайный шум. + findings.append(dict(code='conduction', text=f'Совместная модель ВАХ: дифференциальное сопротивление выросло на {delta:.4g} Ом; возможны деградация ключа или сопротивление силового контакта.', model='Uce=Rdiff*Ic+U0')) # Обе физические причины дают похожий наклон и остаются альтернативами. + if len(on) >= 30 and len(off) >= 30: # Разность токов включённого и выключенного состояний отделяет утечку от постоянного нуля датчика. + on_error = [point[1]['ic'] - point[2]['ic'] for point in on] # Ошибка тока во включённом состоянии служит проверкой общей калибровки. + off_error = [point[1]['ic'] - point[2]['ic'] for point in off] # Остаточный ток при низком затворе является кандидатом модели утечки. + on_level, off_level = median(on_error), median(off_error) # Медианы подавляют отдельные импульсы коммутации. + noise = max(1e-9, 1.4826 * median([abs(value - on_level) for value in on_error] + [abs(value - off_level) for value in off_error])) # Множитель 1,4826 переводит MAD в оценку СКО нормального шума. + report['leakage'] = dict(formula='ΔIc_off=Ileak+b; ΔIc_on=b', off_current_a=off_level, on_offset_a=on_level, contrast_a=off_level - on_level, noise_sigma_a=noise) # Двухрежимная модель явно оценивает постоянную ошибку датчика b. + if off_level > 5. * noise and off_level - on_level > 5. * noise: # Одновременно нужен положительный ток выключения и отличие от общей ошибки нуля. + findings.append(dict(code='leakage', text=f'Совместная модель остаточного тока: при низком Uge дополнительный Ic≈{off_level - on_level:.4g} А; возможны утечка ключа или параллельная токовая цепь.', model='off_current')) # Посторонняя ветвь тока остаётся альтернативой утечке самого транзистора. + for event in events or []: # Сегменты предполагаемого дребезга проверяются по синхронным затвору и току. + interval = [point for point in points if event['start_us'] <= point[0] < event['stop_us']] # Проверяем только реально наблюдаемые точки внутри найденного прерывания. + if not interval: # Слишком короткий эпизод может не попасть в ограниченную совместную выборку. + continue # Отсутствие наблюдений не считается отсутствием провала. + gate_ratio = sum(point[1]['uge'] < .5 * point[2]['uge'] for point in interval) / len(interval) # Доля одновременного провала управления количественно проверяет причину повторного выключения. + current_ratio = sum(abs(point[1]['ic']) < .5 * abs(point[2]['ic']) for point in interval) / len(interval) # Провал тока ключа дополнительно подтверждает прерывание проводимости. + report['contact_events'].append(dict(**event, gate_drop_fraction=gate_ratio, current_drop_fraction=current_ratio, supported=gate_ratio >= .8 and current_ratio >= .8)) # Подтверждение требует совпадения обоих провалов хотя бы в 80% наблюдений эпизода. + return report, findings # Одновременные нарушения проводимости, утечки и контакта не скрывают друг друга. diff --git a/python/set_devices/signal_reconstruction.py b/python/set_devices/signal_reconstruction.py index cbaadc0..81b82b9 100644 --- a/python/set_devices/signal_reconstruction.py +++ b/python/set_devices/signal_reconstruction.py @@ -8,8 +8,10 @@ import ctypes as C from dataclasses import dataclass from functools import lru_cache from protocan.native import NativeProtocol +from time import perf_counter # Измеряем полное время обработки запроса, включая преобразование входных и выходных буферов. MAX_OUTPUT_POINTS = 1_000_000 +BACKENDS = {"native": "Текущий МНК", "eigen": "Eigen QR"} # Стабильные ключи сохраняются в запросах и рецептах, а подписи показываются в GUI. METHODS = {"polynomial": "Аппроксимация: полином МНК", "linear": "Интерполяция: линейная", "pchip": "Интерполяция: PCHIP", "spline": "Восстановление: кубический сплайн"} @@ -21,6 +23,8 @@ class Reconstruction: unique_count: int rmse: float pieces: tuple = () + backend: str = "native" # Сохраняем выбранный вариант расчёта для сравнения и подписей результатов. + elapsed_ms: float = 0.0 # Время полного вызова в миллисекундах позволяет оценивать стоимость преобразований вместе с решателем. @lru_cache(maxsize=1) def library(): @@ -36,7 +40,10 @@ def library(): except (AttributeError, OSError, RuntimeError) as error: raise ValueError("Пересоберите SETProtocol с set_signal.c и set_wavegen.c") from error -def reconstruct(points, method="pchip", output_count=1000, degree=2, *, endpoint=True, with_model=False): +def reconstruct(points, method="pchip", output_count=1000, degree=2, *, endpoint=True, with_model=False, backend="native"): # Новый именованный параметр сохраняет все существующие позиционные вызовы. + started = perf_counter() # Начинаем замер до подготовки ctypes-массивов, одинаковой для двух решателей. + if backend not in BACKENDS or (backend == "eigen" and method != "polynomial"): # Eigen предлагается только для полиномиального МНК, а неизвестные ключи отклоняются явно. + raise ValueError("Eigen QR доступен только для полинома МНК; выберите корректный вариант расчёта") # Исключаем скрытое использование другого метода при сравнении. if method not in METHODS or type(output_count) is not int or not 2 <= output_count <= MAX_OUTPUT_POINTS: raise ValueError(f"Неизвестный метод или число выходных точек вне 2…{MAX_OUTPUT_POINTS}") count = len(points) @@ -45,20 +52,25 @@ def reconstruct(points, method="pchip", output_count=1000, degree=2, *, endpoint x, y = (C.c_double * count)(*(p[0] for p in points)), (C.c_double * count)(*(p[1] for p in points)) ox, oy, meta = (C.c_double * output_count)(), (C.c_double * output_count)(), (C.c_double * 3)() work = (C.c_double * (14 * count + 128))() - code = library().set_signal_reconstruct(x, y, count, list(METHODS).index(method), degree, - output_count, int(endpoint), ox, oy, meta, work, len(work)) + core = library() # Существующая библиотека остаётся источником базового алгоритма и каталога установленного модуля. + operation = core.set_signal_reconstruct # По умолчанию сохраняем исходный C99-решатель и его бинарный контракт. + if backend == "eigen": # Загружаем дополнительный компонент только после явного выбора пользователя. + from .signal_eigen import library as eigen_library # Ленивый импорт не требует наличия Eigen при обычной работе и в прошивках. + operation = eigen_library(core._name).set_signal_reconstruct_eigen # Соседняя DLL реализует тот же контракт входов, выходов и work. + code = operation(x, y, count, list(METHODS).index(method), degree, output_count, int(endpoint), ox, oy, meta, work, len(work)) # Оба решателя получают одинаковые данные и настройки сетки. if code: raise ValueError({1: "Недостаточно точек для выбранной степени или неверные параметры", 2: "Нужны конечные значения и минимум две различные временные точки", - 3: "Неустойчивая аппроксимация: уменьшите степень"}.get(code, "Ошибка расчёта")) + 3: "Неустойчивая аппроксимация: уменьшите степень", 5: "Недостаточно памяти или ошибка решателя Eigen"}.get(code, "Ошибка расчёта")) # Дополнительная настольная ошибка не меняет прежние коды C99. pieces = () if with_model: from .plot_formula import reconstruction_pieces if method == 'polynomial' and output_count <= degree: - pieces = reconstruct(points, method, degree + 1, degree, with_model=True).pieces + pieces = reconstruct(points, method, degree + 1, degree, endpoint=endpoint, with_model=True, backend=backend).pieces # Короткий выход требует отдельной сетки для формулы; сохраняем решатель и режим конечной точки. else: pieces = reconstruction_pieces(work, count, int(meta[1]), method, degree, oy, endpoint) - return Reconstruction(list(zip(ox, oy)), int(meta[0]), int(meta[1]), meta[2], pieces) + result_points = list(zip(ox, oy)) # Включаем формирование выходных Python-точек в отображаемое время обработки. + return Reconstruction(result_points, int(meta[0]), int(meta[1]), meta[2], pieces, backend, (perf_counter() - started) * 1000) # Переводим секунды монотонного таймера в миллисекунды без влияния изменения системных часов. def dac12(volts, vref=3.3): data = (C.c_double * len(volts))(*volts) diff --git a/python/set_devices/signal_reference.py b/python/set_devices/signal_reference.py new file mode 100644 index 0000000..f61049d --- /dev/null +++ b/python/set_devices/signal_reference.py @@ -0,0 +1,168 @@ +"""Сравнение полной записи с CSV-эталоном независимо от Qt и приложения.""" # Ядро сохраняет все исходные отсчёты. +from array import array # Массивы double компактно хранят амплитуды без потери точности. +from dataclasses import dataclass, field # Контейнеры связывают кривые, показатели и независимый словарь анализа каждого результата. +from set_devices.signal_diagnostics import analyze_comparison # Общий локальный анализ работает без GUI и выполняется вместе со сравнением в worker. +import csv # Потоковый parser поддерживает разделители и кавычки CSV. +from datetime import datetime # Абсолютное ISO-время переводится в миллисекунды. +import math # Проверки конечности отделяют корректные измерения от пропусков. + + +@dataclass # Создаём конструктор независимого от GUI контейнера кривой. +class Trace: # Временная шкала каждого канала измеряется в миллисекундах. + name: str # Имя канала используется в выборе, легенде и отчёте. + times: list # Строго возрастающие метки могут быть общими для каналов CSV. + values: array # Амплитуды в единицах канала; NaN обозначает разрыв записи. + + +@dataclass # Передаём вычисленный результат между слоями приложения единым объектом. +class Comparison: # Полные кривые отделены от экранной огибающей. + measured: Trace # Измерение со временем относительно первого отсчёта. + reference: Trace # Эталон после совмещения начал и временного сдвига. + difference: Trace # Остаток на общей части временной сетки измерения. + expected: array # Интерполированный эталон на сетке остатка, включая пропуски. + metrics: dict # Показатели ошибки и параметры воспроизводимого расчёта. + analysis: dict = field(default_factory=dict) # Необязательное поле сохраняет совместимость прежнего конструктора с пятью аргументами. + + +def checkpoint(cancel): # Callback позволяет прерывать расчёт без зависимости от потоковой библиотеки. + if cancel(): # Проверяем запрос в контрольных точках прохода по данным. + raise InterruptedError('Расчёт отменён') # Не публикуем частичный результат после отмены. + + +def trace_from_pairs(name, points, transform=float, cancel=lambda: False): # Преобразование амплитуд задаёт потребитель, например множитель и IQ. + times, values = [], array('d') # Сохраняем время списком, амплитуды — 64-битными double. + previous = -math.inf # Первая конечная метка допустима независимо от её знака. + for index, (stamp, value) in enumerate(points): # Обходим полную историю без экранного сокращения. + if index % 16384 == 0: # Проверяем отмену порциями по 16384 точки для снижения накладных расходов. + checkpoint(cancel) # Прерываем подготовку по запросу вызывающей стороны. + if not math.isfinite(stamp) or stamp <= previous: # Повторы и обратный ход времени делают интерполяцию неоднозначной. + raise ValueError('Время должно строго возрастать, без повторов') # Не исправляем исходную сетку молча. + times.append(stamp) # Дробное время сохраняется без округления. + values.append(transform(value)) # Применяем масштаб до сравнения ровно один раз. + previous = stamp # Следующая точка должна находиться строго правее текущей. + if not times: # Пустая запись не имеет начала для совмещения. + raise ValueError('В канале нет отсчётов') # Сообщаем отсутствие исходных данных. + return Trace(name, times, values) # Возвращаем снимок, независимый от изменяемого живого буфера. + + +def read_reference(path, cancel=lambda: False): # Путь задаётся потребителем без правил хранения конкретного приложения. + """Читает CSV потоково, сохраняя пустые ячейки и NaN как пропуски.""" # Разрывы впоследствии исключаются из статистики. + with open(path, encoding='utf-8-sig', newline='') as stream: # Поддерживаем UTF-8 с необязательным BOM и штатную обработку CSV-переносов. + first = stream.readline() # Заголовок определяет разделитель столбцов. + delimiter = ';' if ';' in first else '\t' if '\t' in first else ',' # Принимаем точку с запятой, табуляцию и запятую. + stream.seek(0) # Заголовок должен также попасть в CSV-parser. + rows = csv.reader(stream, delimiter=delimiter) # Читаем построчно без хранения текста всего файла. + header = [s.strip() for s in next(rows, [])] # Пробелы вокруг имён не являются частью имени канала. + if len(header) < 2 or header[0] not in ('time_ms', 'timestamp'): # Требуем явную единицу времени и хотя бы один канал. + raise ValueError('Эталон: первый столбец должен быть time_ms или timestamp') # Не угадываем шкалу неизвестного формата. + names = header[1:] # Остальные столбцы содержат амплитуды каналов. + if any(not name for name in names) or len(set(names)) != len(names): # Имена должны однозначно определять столбец. + raise ValueError('Эталон: требуются непустые уникальные имена каналов') # Предотвращаем потерю повторного столбца в словаре. + times = [] # Одна временная сетка разделяется всеми каналами файла. + traces = {name: Trace(name, times, array('d')) for name in names} # Каждый канал получает собственный массив амплитуд. + for index, row in enumerate(rows, 2): # Первая строка данных имеет номер 2 после заголовка. + if index % 16384 == 0: # Проверяем отмену раз в 16384 строки большого CSV. + checkpoint(cancel) # Закрытие окна не требует дочитывать весь файл. + if len(row) != len(header): # Каждая строка должна соответствовать заявленным столбцам. + raise ValueError(f'Эталон, строка {index}: неверное число столбцов') # Номер строки помогает найти повреждение. + if header[0] == 'time_ms': # Относительное время уже выражено во внутренних миллисекундах. + stamp = float(row[0]) # Сохраняем дробные доли миллисекунды. + else: # timestamp задаёт абсолютное ISO-время с часовым поясом. + date = datetime.fromisoformat(row[0].replace('Z', '+00:00')) # Суффикс UTC нормализуется также для Python 3.8. + if date.tzinfo is None: # Время без пояса зависит от настроек компьютера. + raise ValueError('timestamp эталона должен содержать часовой пояс') # Исключаем неоднозначное абсолютное время. + stamp = date.timestamp() * 1000 # Множитель 1000 переводит UNIX-секунды в миллисекунды. + if not math.isfinite(stamp) or (times and stamp <= times[-1]): # Сетка обязана быть конечной и строго возрастающей. + raise ValueError(f'Эталон, строка {index}: время должно строго возрастать') # Не сортируем и не удаляем отсчёты автоматически. + times.append(stamp) # Добавляем общую метку всех каналов текущей строки. + for trace, text in zip(traces.values(), row[1:]): # Порядок каналов соответствует порядку заголовка. + value = float(text) if text.strip() else math.nan # Пустая ячейка обозначает разрыв, а не нулевую амплитуду. + if math.isinf(value): # Бесконечность считается повреждением данных, в отличие от NaN. + raise ValueError(f'Эталон, строка {index}: бесконечное значение') # Указываем строку недопустимой амплитуды. + trace.values.append(value) # Сохраняем каждое значение без децимации. + if len(times) < 2: # Для линейной интерполяции необходим хотя бы один отрезок. + raise ValueError('Эталон должен содержать хотя бы две временные точки') # Одноточечный эталон не публикуется. + checkpoint(cancel) # Проверяем отмену и для короткого файла перед возвратом. + return traces # Выбор конкретного канала остаётся вызывающей стороне. + + +def compare(measured, reference, *, align_start=True, shift_ms=0., # Положительный сдвиг задерживает эталон на заданные миллисекунды. + interval=None, absolute_tolerance=0., relative_tolerance_pct=0., # Интервал отсчитывается от начала измерения; допуск состоит из двух частей. + cancel=lambda: False, circuit=None, channels=None): # Необязательные параметры контура и связанные каналы расширяют анализ без изменения прежних вызовов. + """Интерполирует эталон на сетку измерения без экстраполяции и заполнения NaN.""" # Статистика использует все корректные исходные точки. + if not measured.times or len(reference.times) < 2: # Нужны начало измерения и две опоры эталона. + raise ValueError('Недостаточно данных для сравнения') # Пустые данные не должны давать нулевую ошибку. + if any(not math.isfinite(x) for x in (shift_ms, absolute_tolerance, relative_tolerance_pct)): # Неконечные параметры нарушают координаты и допуск. + raise ValueError('Параметры сравнения должны быть конечными числами') # Сообщаем причину до начала прохода. + if absolute_tolerance < 0 or relative_tolerance_pct < 0: # Коридор допуска имеет неотрицательную ширину. + raise ValueError('Допуск должен быть неотрицательным') # Отрицательный допуск не имеет физического смысла. + if interval is not None and (not all(math.isfinite(x) for x in interval) or interval[0] >= interval[1]): # Обе границы должны образовывать конечный непустой интервал. + raise ValueError('Начало интервала должно быть меньше конца') # Не переставляем ошибочно введённые границы. + origin = measured.times[0] # Начало измерения задаёт ноль результирующей шкалы времени. + ref_origin = reference.times[0] if align_start else origin # Опция совмещения отделяет относительное сравнение от абсолютного. + mt = [t - origin for t in measured.times] # Нормализуем временную сетку измерения без изменения амплитуд. + rt = [t - ref_origin + shift_ms for t in reference.times] # Совмещаем начало и применяем сдвиг эталона вправо. + left, right = interval if interval is not None else (mt[0], mt[-1]) # По умолчанию используем полную длительность измерения. + times, differences, expected = [], array('d'), array('d') # Остаток и интерполированный эталон получают общую сетку. + count = candidates = outside = invalid = beyond = 0 # Считаем сравнения, выбранные точки, отсутствие покрытия, пропуски и превышения. + mean = m2 = mean_abs = mean_square = 0. # Потоковые накопители среднего, дисперсии, MAE и среднего квадрата. + peak, peak_time, first_outside = -1., None, None # Начальный максимум ниже нуля регистрирует и полностью совпадающие кривые. + ref_min, ref_max = math.inf, -math.inf # Размах определяется на реально сравниваемой части эталона. + j = 0 # Указатель отрезка эталона перемещается только вперёд. + rv = reference.values # Локальная ссылка уменьшает накладные расходы основного прохода. + for index, (stamp, value) in enumerate(zip(mt, measured.values)): # Перебираем каждый исходный отсчёт измерения. + if index % 16384 == 0: # Проверка раз в 16384 точки ограничивает стоимость поддержки отмены. + checkpoint(cancel) # Прерываем устаревший или отменённый расчёт. + if stamp < left or stamp > right: # Границы интервала включаются, внешние точки исключаются. + continue # Посторонние участки записи не влияют на статистику. + candidates += 1 # Покрытие относится ко всем выбранным точкам измерения. + if stamp < rt[0] or stamp > rt[-1]: # Вне временной сетки эталона экстраполяция запрещена. + outside += 1 # Отдельно учитываем отсутствие покрытия по времени. + continue # Не подставляем крайнее значение за пределами записи. + while j + 1 < len(rt) and rt[j + 1] <= stamp: # Находим левую опору без повторного поиска с начала. + j += 1 # Однонаправленное продвижение сохраняет линейную сложность. + target = rv[j] # Точное совпадение с узлом не зависит от соседних пропусков. + if stamp != rt[j]: # Между узлами используем две соседние опоры. + fraction = (stamp - rt[j]) / (rt[j + 1] - rt[j]) # Доля положения внутри временного отрезка безразмерна. + target = target + fraction * (rv[j + 1] - target) # NaN любой опоры сохраняет разрыв интерполяции. + times.append(stamp) # Сохраняем общую временную сетку, включая пропуски. + expected.append(target) # Интерполированные амплитуды доступны для дальнейшего анализа. + if not math.isfinite(value) or not math.isfinite(target): # Некорректные значения любой кривой исключаются из показателей. + invalid += 1 # Пропуски уменьшают процент покрытия интервала. + differences.append(math.nan) # График остатка сохраняет разрыв на этом месте. + continue # Не загрязняем численные накопители значениями NaN. + difference = value - target # Знак ошибки всегда означает измерение минус эталон. + differences.append(difference) # Каждая корректная точка получает собственный остаток. + count += 1 # Число сравнений служит знаменателем средних показателей. + delta = difference - mean # Алгоритм Уэлфорда использует предыдущее среднее. + mean += delta / count # Обновляем среднее смещение без накопления большой суммы. + m2 += delta * (difference - mean) # Центральный момент устойчиво оценивает разброс остатка. + magnitude = abs(difference) # Модуль нужен для MAE, максимума и допуска. + mean_abs += (magnitude - mean_abs) / count # Потоково обновляем среднюю абсолютную ошибку. + mean_square += (difference * difference - mean_square) / count # Средний квадрат затем преобразуется в RMSE. + ref_min, ref_max = min(ref_min, target), max(ref_max, target) # Нормализация использует фактический размах эталона. + if magnitude > peak: # При равных максимумах оставляем время первого. + peak, peak_time = magnitude, stamp # Величина и время максимума относятся к одной точке. + if magnitude > absolute_tolerance + relative_tolerance_pct * .01 * abs(target): # Множитель 0,01 переводит процент в долю модуля эталона. + beyond += 1 # Равенство границе допустимо; учитываем строгое превышение. + if first_outside is None: # Время первого выхода не заменяется последующими. + first_outside = stamp # Сохраняем миллисекунды от начала измерения. + checkpoint(cancel) # Не публикуем результат, отменённый в последней порции. + if not count: # Без корректного перекрытия показатели не определены. + raise ValueError('Нет общих корректных отсчётов в выбранном интервале') # Вызывающая сторона сбрасывает старые показатели. + rmse = math.sqrt(max(0., mean_square)) # Защита от отрицательного округления перед извлечением корня. + metrics = dict(count=count, selected_points=candidates, outside_reference=outside, # Различаем использованные, выбранные и непокрытые точки. + invalid_points=invalid, coverage_pct=100. * count / candidates, # Покрытие выражается в процентах от выбранных точек. + bias=mean, mae=mean_abs, rmse=rmse, error_std=math.sqrt(max(0., m2 / count)), # СКО характеризует всю сравниваемую запись. + max_abs=peak, max_abs_time_ms=peak_time, # Максимум хранится в единицах канала, время — в миллисекундах. + nrmse_span_pct=100. * rmse / (ref_max - ref_min) if ref_max > ref_min else None, # Постоянный эталон не имеет ненулевого размаха для нормализации. + outside_tolerance=beyond, outside_tolerance_pct=100. * beyond / count, # Превышения считаются только среди корректных сравнений. + first_outside_time_ms=first_outside, # None явно означает отсутствие выхода за допуск. + absolute_tolerance=absolute_tolerance, relative_tolerance_pct=relative_tolerance_pct, # Сохраняем параметры коридора для отчёта. + align_start=align_start, shift_ms=shift_ms, interval_ms=interval, reference_min=ref_min, reference_max=ref_max) # Настройки и пределы сравниваемого эталона обеспечивают воспроизводимость анализа. + result = Comparison(Trace(measured.name, mt, measured.values), # Повторно используем полный массив амплитуд измерения. + Trace(reference.name, rt, reference.values), # Полный эталон доступен для наложения на график. + Trace('Измерение − эталон', times, differences), expected, metrics) # Остаток и показатели относятся ко всем корректным исходным точкам. + context = dict(channels, measured_origin_ms=origin, reference_origin_ms=ref_origin, shift_ms=shift_ms) if channels else None # Связанные каналы сохраняют взаимное положение относительно выбранного измерения и единого сдвига эталона. + result.analysis = analyze_comparison(result, cancel, circuit=circuit, channels=context) # Идентификация моделей использует тот же снимок данных и явно заданные электрические ограничения. + return result # Публикуем только целое сравнение вместе с завершёнными гипотезами. diff --git a/python/set_devices/waveform.py b/python/set_devices/waveform.py index 6660730..c42a428 100644 --- a/python/set_devices/waveform.py +++ b/python/set_devices/waveform.py @@ -17,7 +17,7 @@ class Waveform: vref: float period_ms: float -def generate(points, sample_rate=1000, vref=3.3, method="pchip", degree=2): +def generate(points, sample_rate=1000, vref=3.3, method="pchip", degree=2, *, backend="native"): # Именованный выбор решателя сохраняет прежние вызовы генератора. """One cyclic period, last endpoint excluded (no duplicated seam sample).""" if type(sample_rate) is not int or not 1 <= sample_rate <= 1000000: raise ValueError("Частота отсчётов должна быть 1…1000000 Гц") @@ -36,23 +36,23 @@ def generate(points, sample_rate=1000, vref=3.3, method="pchip", degree=2): raise ValueError("Период × частота должны давать от 2 до 4096 отсчётов") if abs(exact_count - count) > 1e-7: raise ValueError("Период должен содержать целое число отсчётов при выбранной частоте") - result = reconstruct(points, method, count, degree, endpoint=False) + result = reconstruct(points, method, count, degree, endpoint=False, backend=backend) # Формируем циклическую таблицу выбранным пользователем вариантом МНК. # Check the endpoint too: polynomial fitting can move its value. - checked = reconstruct(points, method, count + 1, degree) + checked = reconstruct(points, method, count + 1, degree, backend=backend) # Конечную точку проверяем тем же решателем, исключая расхождение проверки диапазона ЦАП и результата. dac12([p[1] for p in checked.points], vref) codes = dac12([p[1] for p in result.points], vref) return Waveform(tuple(result.points), codes, sample_rate, vref, period) -def recipe(points, sample_rate, vref, method, degree): +def recipe(points, sample_rate, vref, method, degree, *, backend="native"): # Новый необязательный параметр сохраняет совместимость ранее записанных рецептов версии 1. return {"version": 1, "points_ms_volts": [list(pair) for pair in points], "sample_rate": sample_rate, - "vref": vref, "method": method, "degree": degree} + "vref": vref, "method": method, "degree": degree, "backend": backend} # Сохраняем выбранный решатель для воспроизводимого восстановления сигнала. def load_recipe(text): data = json.loads(text) if not isinstance(data, dict) or data.get("version") != 1: raise ValueError("Неизвестная версия задания генератора") points = tuple((float(x), float(y)) for x, y in data["points_ms_volts"]) - generate(points, data["sample_rate"], data["vref"], data["method"], data["degree"]) + generate(points, data["sample_rate"], data["vref"], data["method"], data["degree"], backend=data.get("backend", "native")) # Старые рецепты без варианта используют прежний алгоритм, новые проверяют именно сохранённый решатель. return points, data def c_header(wave): diff --git a/python/tests/test_can_boot_services.py b/python/tests/test_can_boot_services.py index 268050f..ede386f 100644 --- a/python/tests/test_can_boot_services.py +++ b/python/tests/test_can_boot_services.py @@ -68,3 +68,19 @@ def test_confirm_and_progress_status_correlate_session(): assert reply['status'] == 0 and reply['command'] == 8 and reply['next_block'] == 123 assert service.decode(frame, discovery=True) is None assert CanBootServices(CanBootTarget(device_type=3, device=7, session_id=6)).decode(frame) is None + + +@pytest.mark.parametrize("code,expected", [(0, 0), (0, 8), (0, 16), (8, 0), (8, 8), (8, 16)]) # Проверяет повторные и запоздалые OK/SEQUENCE_ERROR после подтверждённого первого окна. +def test_duplicate_data_status_does_not_resend_or_rewind_window(code, expected): # Один поздний ответ не должен порождать дополнительные 16 кадров в очереди MCU. + target = CanBootTarget(device_type=1, device=8, product_type=0x2833) # Использует адрес задатчика, на котором наблюдалось зависание передачи. + client = CanBootTransfer(SimpleNamespace(data=bytes(512), version=1, crc32=0), target) # Несколько окон позволяют проверить ответ до завершения передачи. + def status_frame(command, status_code=0, next_block=0): # Формирует тестовый STATUS в той же сессии, что запрос клиента. + return build_frame(ProtoCanId.build(1, 1, 1, 8, 12, 0x100 | command), struct.pack("