diff --git a/NEW_PROJECT.md b/NEW_PROJECT.md new file mode 100644 index 0000000..8e5bc49 --- /dev/null +++ b/NEW_PROJECT.md @@ -0,0 +1,100 @@ +# Новый проект на переносимых библиотеках + +Этот репозиторий содержит два разных типа кода: + +1. `c//include` и `c//src` — переносимое ядро; +2. `c//ports/` — небольшой аппаратный порт конкретного + семейства микроконтроллеров. + +Привязка выводов, частоты шин и выбранной периферии принадлежит плате и всегда +остаётся в проекте в `app_config.h` либо в узком конфигурационном заголовке +библиотеки, например `onewire_config.h`. + +## Рекомендуемая структура прошивки + +```text +my-device/ + app/ логика изделия + include/ + src/ + board/ одна конкретная плата + app_config.h выводы, частоты, адреса, возможности платы + port/ связь библиотек с SDK выбранного МК + display_port.c + keypad_port.c + eeprom_port.c + can_port.c + vendor/ CMSIS, startup, linker script или Cube-generated код + lib/templates/ git submodule этого репозитория +``` + +Не следует помещать `stm32xxxx.h`, `HAL_*`, регистры, IRQ handlers и номера +выводов в `app/` или в ядро библиотеки. Тогда при переходе на другой МК +заменяются только `board/`, `port/`, startup и linker script. + +## Выбор готового порта DS18B20 + +| Целевой МК | Файл порта | Шаблон конфигурации | +|---|---|---| +| STM32F103 | `c/ds18b20/ports/stm32f1/onewire_stm32f1.c` | `onewire_config.f103.template.h` | +| STM32G431 | `c/ds18b20/ports/stm32g4/onewire_stm32g4.c` | `onewire_config.g431.template.h` | +| STM32G474 | `c/ds18b20/ports/stm32g4/onewire_stm32g4.c` | `onewire_config.g474.template.h` | + +В сборку добавляются ровно три файла: + +```text +c/ds18b20/src/onewire.c +c/ds18b20/src/ds18b20.c +c/ds18b20/ports//onewire_.c +``` + +Пути включения: + +```text +c/ds18b20/include +board +``` + +Нужный шаблон копируется в `board/onewire_config.h`; после этого в нём +меняются только порт, номер вывода и бит тактирования GPIO. + +G431 и G474 намеренно используют один исходник порта: GPIO, RCC и DWT для +этой задачи совместимы. Раздельными остаются конфигурация платы, startup, +linker script и выбранный CMSIS device define. + +Рабочий пример полноценного G474-порта находится в соседнем проекте +`candleLight_fw`: `src/device/device_g4.c` отвечает за clock/GPIO, +`src/can/m_can.c` — за FDCAN, а `include/config.h` — за привязку платы +STM32G474VET6. Эти файлы остаются в прошивке, поскольку зависят от STM32 HAL, +USB gs_usb и конкретной разводки адаптера; переносимая логика протоколов +остаётся в `templates`. + +## Какие части KONOR уже общие + +| Возможность | Переносимое ядро | Что остаётся в `port/` проекта | +|---|---|---| +| DS18B20/1-Wire | `c/ds18b20` | готовый порт выбранного семейства и вывод | +| дисплей ST7789 | `c/st7789` | SPI, DC, CS, RESET, подсветка и задержка | +| кнопки | `c/keypad` | настройка GPIO и чтение уровней | +| меню | `c/menu` | только привязка painter к дисплею | +| EEPROM FT24C256 | `c/eeprom-ft24c256` | I2C write/write-read и задержка | +| CAN SETTINGS | `c/can-sensor` | bxCAN для F103 либо FDCAN для G431/G474 | + +Порт дисплея, EEPROM и CAN нельзя честно сделать только по названию МК: +нужно знать экземпляр периферии, альтернативную функцию и выводы конкретной +платы. Поэтому библиотеки принимают таблицы обратных вызовов, а короткие +адаптеры лежат в проекте рядом с `app_config.h`. + +## Порядок создания проекта + +1. Создать проект в CubeMX/Keil либо добавить CMSIS, startup и linker script. +2. Подключить `templates` сабмодулем. +3. Добавить только ядра нужных библиотек. +4. Выбрать готовый 1-Wire порт по таблице выше. +5. Создать `board/app_config.h` с выводами и частотами. +6. Реализовать короткие адаптеры SPI/GPIO/I2C/CAN в `port/`. +7. Сначала прогнать host-тесты библиотек, затем проверить аппаратные порты + логическим анализатором или осциллографом. + +Так новый проект не является копией старого: он использует общие ядра одной +версии, а аппаратные отличия видны в одном небольшом каталоге `port/`. diff --git a/README.md b/README.md index e4003dc..49e837c 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,9 @@ templates/ python/ модули на чистом Python 3.9+, только stdlib ``` +Пошаговая раскладка нового проекта и выбор портов для STM32F103, STM32G431 +и STM32G474 описаны в [`NEW_PROJECT.md`](NEW_PROJECT.md). + ## Что лежит ### C @@ -26,7 +29,7 @@ templates/ | [`c/menu`](c/menu) | экранное меню: стек экранов, курсор, прокрутка, тема | `stdint.h` | заливка прямоугольника, вывод строки | | [`c/eeprom-ft24c256`](c/eeprom-ft24c256) | EEPROM 24Cxx по I²C с нарезкой записи по страницам | `stdint.h` | две I²C-транзакции, задержка | | [`c/can-sensor`](c/can-sensor) | передача 64-битных ROM датчиков парой CAN-кадров | `stdint.h` | отправка и приём CAN-кадра | -| [`c/ds18b20`](c/ds18b20) | термометры DS18B20 поверх программной 1-Wire | `stdint.h` | Init, DelayUs, Reset, WriteBit, ReadBit — **порт STM32F1 в комплекте** | +| [`c/ds18b20`](c/ds18b20) | термометры DS18B20 поверх программной 1-Wire | `stdint.h` | Init, DelayUs, Reset, WriteBit, ReadBit — **порты STM32F103, STM32G431 и STM32G474 в комплекте** | | [`c/protocan-transport`](c/protocan-transport) | транспорт ProtoCAN: кадр, канал, CRC, общее адресное пространство, каталог GUI | `stdint.h` | запись в поток и запрос свободного места — **порт STM32F4 в комплекте** | | [`c/protocan-boot`](c/protocan-boot) | адресная прошивка по ProtoCAN: A/B-слоты, сессия, CRC32, verify и rollback-контракт | C99 | CAN TX, erase/write Flash, boot metadata, проверка образа и reboot | | [`c/set-protocol`](c/set-protocol) | единый SET protocol v2: управление, real-time телеметрия и обновление прошивки через UART/CAN/USB/Ethernet | C99 | доставка целого stream/datagram-кадра, часы, backend карты и загрузчика | @@ -74,6 +77,7 @@ git subtree pull --prefix lib/templates https://git.rd12.ru/Andrey/templates.git | `KONOR_ds18b20` | st7789, keypad, menu, eeprom-ft24c256, can-sensor, ds18b20 | | `OpticalTester` | st7789, keypad, menu, eeprom-ft24c256 | | `CAN_to_RS485` | protocan-transport, python/protocan | +| `candleLight_fw` | эталон разделения общей логики и G431/G474 FDCAN-порта; общий ProtoCAN Boot переносится по контракту `protocan-boot` | | `SETGUI` | python/protocan | | новые устройства SET и `SETGUI` v2 | set-protocol | | `k1921vk028` | rtc-service | diff --git a/c/ds18b20/README.md b/c/ds18b20/README.md index 2ba9c5a..72d880b 100644 --- a/c/ds18b20/README.md +++ b/c/ds18b20/README.md @@ -23,7 +23,7 @@ |---|---|---| | `include/ds18b20.h`, `src/ds18b20.c` | перечень датчиков, измерения, запись TH/TL/разрешения | `onewire.h`, `stdint.h` | | `include/onewire.h`, `src/onewire.c` | байты и блоки, CRC8 Dallas/Maxim, обход SEARCH ROM | `stdint.h` | -| `ports/stm32f1/` | тайминги Maxim, вывод с открытым стоком, задержки по DWT | CMSIS `stm32f10x.h` | +| `ports/stm32f1/` | STM32F103: тайминги Maxim, открытый сток, задержки по DWT | CMSIS `stm32f10x.h` | | `ports/stm32g4/` | то же для STM32G431 и STM32G474 | CMSIS `stm32g4xx.h` | | `ports/stm32f4/` | то же для STM32F407VET6 и родственных F4 | CMSIS `stm32f4xx.h` | | `tests/` | симулятор шины с виртуальными датчиками и host-тесты | — | @@ -50,7 +50,7 @@ uint8_t OneWire_ReadBit(void); микросекундных задержек — счётчик тактов ядра `DWT->CYCCNT`. Привязку вывода порт берёт из `onewire_config.h`, который предоставляет -приложение — шаблон лежит рядом: +приложение — шаблон `onewire_config.f103.template.h` лежит рядом: ```c #include "stm32f10x.h" diff --git a/c/ds18b20/ports/stm32f1/onewire_config.template.h b/c/ds18b20/ports/stm32f1/onewire_config.f103.template.h similarity index 86% rename from c/ds18b20/ports/stm32f1/onewire_config.template.h rename to c/ds18b20/ports/stm32f1/onewire_config.f103.template.h index edbd1ca..4cabc38 100644 --- a/c/ds18b20/ports/stm32f1/onewire_config.template.h +++ b/c/ds18b20/ports/stm32f1/onewire_config.f103.template.h @@ -1,6 +1,6 @@ /** - * @file onewire_config.template.h - * @brief Шаблон привязки шины 1-Wire для порта STM32F1. + * @file onewire_config.f103.template.h + * @brief Шаблон привязки шины 1-Wire для STM32F103 (порт stm32f1). * * Скопируйте в своё приложение под именем onewire_config.h и положите на * путь поиска заголовков. Библиотека сама этот файл не подставляет: diff --git a/c/ds18b20/ports/stm32f1/onewire_stm32f1.c b/c/ds18b20/ports/stm32f1/onewire_stm32f1.c index 5a8e605..b95929f 100644 --- a/c/ds18b20/ports/stm32f1/onewire_stm32f1.c +++ b/c/ds18b20/ports/stm32f1/onewire_stm32f1.c @@ -8,7 +8,8 @@ * терять байты USART во время обмена. * * Привязка вывода приходит из onewire_config.h, который предоставляет - * приложение. Шаблон - onewire_config.template.h рядом с этим файлом. + * приложение. Шаблон для STM32F103 — + * onewire_config.f103.template.h рядом с этим файлом. */ #include "onewire.h"