docs(porting): опиши структуру проектов STM32
This commit is contained in:
100
NEW_PROJECT.md
Normal file
100
NEW_PROJECT.md
Normal file
@@ -0,0 +1,100 @@
|
||||
# Новый проект на переносимых библиотеках
|
||||
|
||||
Этот репозиторий содержит два разных типа кода:
|
||||
|
||||
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/`.
|
||||
@@ -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 |
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 и положите на
|
||||
* путь поиска заголовков. Библиотека сама этот файл не подставляет:
|
||||
@@ -8,7 +8,8 @@
|
||||
* терять байты USART во время обмена.
|
||||
*
|
||||
* Привязка вывода приходит из onewire_config.h, который предоставляет
|
||||
* приложение. Шаблон - onewire_config.template.h рядом с этим файлом.
|
||||
* приложение. Шаблон для STM32F103 —
|
||||
* onewire_config.f103.template.h рядом с этим файлом.
|
||||
*/
|
||||
|
||||
#include "onewire.h"
|
||||
|
||||
Reference in New Issue
Block a user