101 lines
5.6 KiB
Markdown
101 lines
5.6 KiB
Markdown
# Новый проект на переносимых библиотеках
|
||
|
||
Этот репозиторий содержит два разных типа кода:
|
||
|
||
1. `c/<library>/include` и `c/<library>/src` — переносимое ядро;
|
||
2. `c/<library>/ports/<family>` — небольшой аппаратный порт конкретного
|
||
семейства микроконтроллеров.
|
||
|
||
Привязка выводов, частоты шин и выбранной периферии принадлежит плате и всегда
|
||
остаётся в проекте в `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/<family>/onewire_<family>.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/`.
|