сделана инициализация всей периферии для OW в Dallas_BusFirstInit
можно выбрать дефолтную периферию, передав в фукнию NULL, а можно и свою кастомную, типа Dallas_BusFirstInit(&hdallas, GPIOA, GPIO_PIN_2); надо теперь расписать все в ридми
This commit is contained in:
@@ -102,15 +102,29 @@ 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;
|
||||
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 = &OW_UART_Handle;
|
||||
else
|
||||
hdallas->onewire.huart = huart;
|
||||
#endif
|
||||
/* Инициализация onewire и поиск датчиков*/
|
||||
|
||||
@@ -50,6 +50,7 @@ typedef struct
|
||||
#if defined(UART_Driver)
|
||||
UART_HandleTypeDef *huart;
|
||||
#else
|
||||
uint16_t DataPinNumb;
|
||||
uint16_t DataPin;
|
||||
GPIO_TypeDef *DataPort;
|
||||
#endif
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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<<OW_Pin_Numb)
|
||||
#define OW_Pin (GPIO_PIN_9)
|
||||
|
||||
/**
|
||||
* @def OW_TIM
|
||||
* @brief Аппаратный таймер для формирования временных интервалов протокола 1-Wire.
|
||||
* @details Применяется для создания точных задержек при обмене данными по шине 1-Wire.
|
||||
*/
|
||||
#define OW_TIM TIM3
|
||||
|
||||
/**
|
||||
* @def OW_TIM_1US_PERIOD
|
||||
* @brief Количество тактов таймера OW_TIM, соответствующее 1 микросекунде.
|
||||
* @details Вычисляется на основе частоты таймера. Например, для таймера с частотой 24 МГц значение будет равно 24.
|
||||
*/
|
||||
#define OW_TIM_1US_PERIOD 72
|
||||
|
||||
|
||||
/** DEFAULT_SETTINGS
|
||||
* @}
|
||||
*/
|
||||
|
||||
/* OneWire Timings -----------------------------------------------------------*/
|
||||
void OneWire_Delay_us(uint32_t us);
|
||||
/* Common Register -----------------------------------------------------------*/
|
||||
|
||||
Reference in New Issue
Block a user