From 5cc733f4d2fb1fea9eb8a3f1b812ad929d4c6fbd Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Mon, 30 Jun 2025 19:00:42 +0300 Subject: [PATCH] =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B8=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D0=B2=D1=81=D0=B5=D0=B9=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B8=D1=84=D0=B5=D1=80=D0=B8=D0=B8=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20OW=20=D0=B2=20Dallas=5FBusFirstInit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit можно выбрать дефолтную периферию, передав в фукнию NULL, а можно и свою кастомную, типа Dallas_BusFirstInit(&hdallas, GPIOA, GPIO_PIN_2); надо теперь расписать все в ридми --- DS18B20/dallas_tools.c | 28 +++++++++++++++++++++------- DS18B20/onewire.h | 1 + DS18B20/ow_port.c | 7 ++++--- DS18B20/ow_port.h | 30 +++++++++++++++++------------- 4 files changed, 43 insertions(+), 23 deletions(-) diff --git a/DS18B20/dallas_tools.c b/DS18B20/dallas_tools.c index b12d232..3603f08 100644 --- a/DS18B20/dallas_tools.c +++ b/DS18B20/dallas_tools.c @@ -102,16 +102,30 @@ HAL_StatusTypeDef Dallas_BusFirstInit(DALLAS_HandleTypeDef *hdallas, UART_Handle return HAL_ERROR; #ifndef UART_Driver - if(GPIOx == NULL) - return HAL_ERROR; - OW_TIM->CR1 |= TIM_CR1_CEN; - hdallas->onewire.DataPin = GPIO_Pin; - hdallas->onewire.DataPort = GPIOx; + if(GPIOx == NULL) + { + hdallas->onewire.DataPin = OW_Pin; + hdallas->onewire.DataPort = OW_GPIO_Port; + } + else + { + hdallas->onewire.DataPin = GPIO_Pin; + hdallas->onewire.DataPort = GPIOx; + } + for (uint32_t i = 0; i < 16; i++) + { + if (hdallas->onewire.DataPin & (1 << i)) + { + hdallas->onewire.DataPinNumb = i; + break; + } + } #else if(huart == NULL) - return HAL_ERROR; - hdallas->onewire.huart = huart; + hdallas->onewire.huart = &OW_UART_Handle; + else + hdallas->onewire.huart = huart; #endif /* Инициализация onewire и поиск датчиков*/ OneWire_Init(&hdallas->onewire); diff --git a/DS18B20/onewire.h b/DS18B20/onewire.h index 7871140..60d008b 100644 --- a/DS18B20/onewire.h +++ b/DS18B20/onewire.h @@ -50,6 +50,7 @@ typedef struct #if defined(UART_Driver) UART_HandleTypeDef *huart; #else + uint16_t DataPinNumb; uint16_t DataPin; GPIO_TypeDef *DataPort; #endif diff --git a/DS18B20/ow_port.c b/DS18B20/ow_port.c index b4b0d8c..7603b92 100644 --- a/DS18B20/ow_port.c +++ b/DS18B20/ow_port.c @@ -7,7 +7,6 @@ #include "ow_port.h" #include "onewire.h" #include "tim.h" -uint32_t pin_pos = (OW_Pin_Numb < 8) ? (OW_Pin_Numb * 4) : ((OW_Pin_Numb - 8) * 4); /** * @brief The internal function is used as gpio pin mode @@ -18,7 +17,8 @@ void OneWire_Pin_Mode(OneWire_t* OW, PinMode Mode) { #if defined(UART_Driver) #elif defined(CMSIS_Driver) -volatile uint32_t *config_reg = (OW_Pin_Numb < 8) ? &(OW->DataPort->CRL) : &(OW->DataPort->CRH); + volatile uint32_t *config_reg = (OW->DataPinNumb < 8) ? &(OW->DataPort->CRL) : &(OW->DataPort->CRH); + uint32_t pin_pos = (OW->DataPinNumb < 8) ? (OW->DataPinNumb * 4) : ((OW->DataPinNumb - 8) * 4); // —брос текущих 4 бит (CNF + MODE) *config_reg &= ~(0xF << pin_pos); @@ -27,7 +27,7 @@ volatile uint32_t *config_reg = (OW_Pin_Numb < 8) ? &(OW->DataPort->CRL) : &(OW- // ¬ход с подт¤жкой или без Ц например, CNF = 0b01, MODE = 0b00 // «десь устанавливаем вход с подт¤жкой: *config_reg |= (0x8 << pin_pos); // CNF=10, MODE=00 (вход с подт¤жкой) - OW->DataPort->ODR |= (1 << OW_Pin_Numb); // ¬ключить подт¤жку вверх + OW->DataPort->ODR |= (1 << OW->DataPinNumb); // ¬ключить подт¤жку вверх } else { @@ -118,3 +118,4 @@ void OneWire_Delay_us(uint32_t us) prev = curr; } } + diff --git a/DS18B20/ow_port.h b/DS18B20/ow_port.h index f0c9cb2..32035d0 100644 --- a/DS18B20/ow_port.h +++ b/DS18B20/ow_port.h @@ -13,49 +13,53 @@ #include "stm32f1xx_hal.h" /* I/O Port ------------------------------------------------------------------*/ -//#define UART_Driver ///< использовтаь UART (onewire_uart.c/.h) +#define UART_Driver ///< использовтаь UART (onewire_uart.c/.h) //#define LL_Driver ///< использовать CMSIS для управления ножкой #define CMSIS_Driver ///< использовать CMSIS для управления ножкой // если ничего не выбрано - используется HAL +/** + * @defgroup DEFAULT_SETTINGS Дефолтные параметры для OW + * @details Определены дефолтные параметры для OW, применятся если передать NULL в Dallas_BusFirstInit. + * @{ + */ + +/** + * @brief Порт вывода для шины 1-Wire. + * @details Указывает порт GPIO, к которому подключена линия данных 1-Wire (например, для DS18B20). + */ +#define OW_UART_Handle huart1 /** - * @def OW_GPIO_Port * @brief Порт вывода для шины 1-Wire. * @details Указывает порт GPIO, к которому подключена линия данных 1-Wire (например, для DS18B20). */ #define OW_GPIO_Port GPIOA /** - * @def OW_Pin_Numb - * @brief Номер пина в порту OW_GPIO_Port. - * @details Используется для формирования маски пина и настройки ввода/вывода. - */ -#define OW_Pin_Numb 9 - -/** - * @def OW_Pin * @brief Маска пина, соответствующая номеру OW_Pin_Numb. * @details Используется при доступе к регистрам порта для управления состоянием линии 1-Wire. */ -#define OW_Pin (1<