Portable DS18B20
Переносимое ядро для поиска DS18B20 на шине 1-Wire, запуска преобразования, чтения температуры, настройки разрешения и записи alarm/user bytes. Ядро не зависит от STM32 HAL, не выделяет память динамически и поддерживает несколько независимых экземпляров шин.
Подтверждённые неблокирующие операции TH/TL с Copy/Recall/readback находятся
во внутреннем модуле Libraries/DS18B20/Modules/UserByte. Основной core предоставляет ему
низкоуровневые операции scratchpad и optional callback strong_pullup.
Подтверждённые EEPROM-байты
Официальный datasheet Analog Devices/Maxim DS18B20
определяет TH=scratchpad[2] и TL=scratchpad[3] как два независимо
программируемых alarm-регистра. Write Scratchpad принимает TH, TL и
configuration (scratchpad[4]), Copy Scratchpad сохраняет все три байта в
EEPROM, а Recall E2 возвращает их в scratchpad. Заводские значения после
сброса: TH +75 (0x4B), TL +70 (0x46), configuration 0x7F.
Scratchpad[5..7] зарезервированы/read-only и пользовательскими не считаются.
На реальном датчике пользователь отдельно прочитал TH 14, TL 128 и config
31, подтвердив, что поля GUI должны оставаться независимыми. Проверка
сохранения после полного power-cycle и parasite-power всё ещё требует отдельной
аппаратной приёмки.
Документация
- HELP.md — публичный API, инициализация, примеры, коды ошибок, диагностика, ограничения и тесты.
- PORTING.md — перенос на другой MCU/проект и checklist порта.
- PROJECT_RELATIONS.md — слои, зависимости, владение памятью и связи с текущей прошивкой.
Структура
DS18B20/
├── Inc/ публичный API и конфигурация
├── Src/ переносимое ядро 1-Wire/DS18B20
├── Port/STM32F4_HAL/Inc/ публичный API STM32F4-порта
├── Port/STM32F4_HAL/Src/ реализация GPIO/таймера STM32F4
├── README.md точка входа
├── HELP.md справочник API
├── PORTING.md руководство по переносу
└── PROJECT_RELATIONS.md место библиотеки в проекте
Адаптер текущего приложения находится отдельно:
climate_control_f407vet6_f4/Core/Src/dallas_tools.c.
Минимальное подключение
#include ds18b20.h
#include ds18b20_stm32f4_hal.h
#define DS_CAPACITY 8U
static ds18b20_t bus;
static uint8_t roms[DS_CAPACITY][DS18B20_ROM_SIZE];
static ds18b20_stm32f4_hal_t port = {
.port = GPIOE, .pin = GPIO_PIN_2,
.timer = TIM2, .timer_ticks_per_us = 72U
};
if (ds18b20_stm32f4_hal_init(&port) == DS18B20_OK &&
ds18b20_init(&bus, &ds18b20_stm32f4_hal_ops, &port,
roms, DS_CAPACITY) == DS18B20_OK) {
(void)ds18b20_search(&bus);
}
Пошаговый поиск для GUI и Modbus
Для приложения с постоянно работающими сервисами используйте
ds18b20_search_begin() и ds18b20_search_step(). Один вызов step
обрабатывает не более одного кандидата ROM. DS18B20_E_BUSY означает, что
нужно вызвать функцию в следующем проходе цикла; DS18B20_OK завершает поиск.
DS18B20_E_BUSY также включает внутренние повторы и переходы между проходами.
Все остальные статусы терминальные; CRC_ERROR после исчерпания повторов
нельзя продолжать вызывать в цикле. Подробности — в HELP.md.
Таймер должен быть заранее запущен и считать непрерывно. Значение
timer_ticks_per_us задаётся частотой счёта таймера, а не частотой ядра.
Преобразование температуры выполняйте неблокирующей парой
ds18b20_start_all() / ds18b20_conversion_ready(); полный сценарий приведён
в HELP.md.
Опрос по сохранённым ID
ds18b20_add_known_rom(bus, rom) добавляет проверенный ROM без обращения к
линии. Повторное добавление не создаёт дубликат. См. HELP.md.
Shared source
Canonical source: templates/c/ds18b20/instance. Used by home/climate; its old paths are compatibility includes. Board-specific ports remain in the application. Change this library, not the forwarding files.