добавлена реализация onewire через uart и переделана структуруа шины OneWire и инциализация

Теперь при выборе UART, в функцию Dallas_BusFirstInit передается hdallas, huart, ow, ds

А при выборе GPIO ножки: hdallas, gpiox, gpio_pin, ow, ds

но надо как-то структуруизировать дальше
This commit is contained in:
2025-06-30 18:34:17 +03:00
parent 175bcd539f
commit fa32d653e8
14 changed files with 373 additions and 61 deletions

View File

@@ -86,30 +86,61 @@ DALLAS_HandleTypeDef hdallas;
/* Functions ---------------------------------------------------------------*/ /* Functions ---------------------------------------------------------------*/
/** /**
* @brief Функция для иниицализации шины OW для датчиков * @brief Функция для иниицализации структуры dallas и шины OW для датчиков
* @param hdallas Указатель на хендл для общения с датчиками
* @param OW Указатель на структуру OneWire (если NULL — используется по умолчанию)
* @param DS Указатель на структуру драйвера DS18B20 (если NULL — используется по умолчанию)
* @retval HAL Status * @retval HAL Status
*/ */
HAL_StatusTypeDef Dallas_BusFirstInit(TIM_HandleTypeDef *htim) #ifndef UART_Driver
HAL_StatusTypeDef Dallas_BusFirstInit(DALLAS_HandleTypeDef *hdallas, GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin, OneWire_t *OW_Ptr, DS18B20_Drv_t *DS_Ptr)
#else
HAL_StatusTypeDef Dallas_BusFirstInit(DALLAS_HandleTypeDef *hdallas, UART_HandleTypeDef *huart, OneWire_t *OW_Ptr, DS18B20_Drv_t *DS_Ptr)
#endif
{ {
if(htim == NULL) if(hdallas == NULL)
return HAL_ERROR; return HAL_ERROR;
HAL_StatusTypeDef result;
if(OW_Ptr == NULL)
hdallas->onewire = &OW;
HAL_TIM_Base_Start(htim); if(DS_Ptr == NULL)
hdallas->ds_devices = &DS;
hdallas.onewire = &OW; #ifndef UART_Driver
hdallas.ds_devices = &DS; if(GPIOx == NULL)
OW.DataPin = OW_Pin; return HAL_ERROR;
OW.DataPort = OW_GPIO_Port;
OW_TIM->CR1 |= TIM_CR1_CEN;
hdallas->onewire->DataPin = GPIO_Pin;
hdallas->onewire->DataPort = GPIOx;
#else
if(huart == NULL)
return HAL_ERROR;
hdallas->onewire->huart = huart;
#endif
/* Инициализация onewire и поиск датчиков*/ /* Инициализация onewire и поиск датчиков*/
OneWire_Init(&OW); OneWire_Init(hdallas->onewire);
return DS18B20_Search(&DS, &OW) != HAL_OK; return Dallas_Search(hdallas);
} }
/**
* @brief Поиск датчиков на шине onewire
* @param hdallas Указатель на хендл для общения с датчиками
* @retval HAL Status
*/
HAL_StatusTypeDef Dallas_Search(DALLAS_HandleTypeDef *hdallas)
{
if(hdallas == NULL)
return HAL_ERROR;
return DS18B20_Search(hdallas->ds_devices, hdallas->onewire) != HAL_OK;
}
/** /**
* @brief Функция для иниицализации нового датчика в структуре * @brief Функция для иниицализации нового датчика в структуре
@@ -153,7 +184,7 @@ HAL_StatusTypeDef Dallas_ReplaceLostedSensor(DALLAS_SensorHandleTypeDef *sensor)
if(sensor->isLost) if(sensor->isLost)
{ {
if(DS18B20_Search(sensor->hdallas->ds_devices, sensor->hdallas->onewire) != HAL_OK) if(Dallas_Search(sensor->hdallas) != HAL_OK)
return HAL_ERROR; return HAL_ERROR;
if(sensor->Init.init_func(sensor->hdallas, sensor) != HAL_OK) if(sensor->Init.init_func(sensor->hdallas, sensor) != HAL_OK)

View File

@@ -130,8 +130,14 @@ typedef enum
/* Functions ---------------------------------------------------------------*/ /* Functions ---------------------------------------------------------------*/
/* Функция для иниицализации структуры dallas и шины OW для датчиков */
HAL_StatusTypeDef Dallas_BusFirstInit(TIM_HandleTypeDef *htim); #ifndef UART_Driver
HAL_StatusTypeDef Dallas_BusFirstInit(DALLAS_HandleTypeDef *hdallas, GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin, OneWire_t *OW, DS18B20_Drv_t *DS);
#else
HAL_StatusTypeDef Dallas_BusFirstInit(DALLAS_HandleTypeDef *hdallas, UART_HandleTypeDef *huart, OneWire_t *OW, DS18B20_Drv_t *DS);
#endif
/* Поиск датчиков на шине onewire */
HAL_StatusTypeDef Dallas_Search(DALLAS_HandleTypeDef *hdallas);
/* Функция для иниицализации нового датчика в структуре */ /* Функция для иниицализации нового датчика в структуре */
HAL_StatusTypeDef Dallas_AddNewSensors(DALLAS_HandleTypeDef *hdallas, DALLAS_SensorHandleTypeDef *sensor); HAL_StatusTypeDef Dallas_AddNewSensors(DALLAS_HandleTypeDef *hdallas, DALLAS_SensorHandleTypeDef *sensor);
/* Инициализирует структуру датчика по ROM */ /* Инициализирует структуру датчика по ROM */

View File

@@ -49,7 +49,7 @@ void OneWire_WriteBit(OneWire_t* OW, uint8_t bit)
} }
__enable_irq(); __enable_irq();
#else #else
OneWireUART_ProcessBit(onewire_uart, bit); OneWireUART_ProcessBit(OW->huart, bit);
#endif #endif
} }
@@ -82,7 +82,7 @@ uint8_t OneWire_ReadBit(OneWire_t* OW)
OneWire_Delay_us(ONEWIRE_COMMAND_SLOT_US - ONEWIRE_READ_CMD_US - ONEWIRE_READ_DELAY_US); OneWire_Delay_us(ONEWIRE_COMMAND_SLOT_US - ONEWIRE_READ_CMD_US - ONEWIRE_READ_DELAY_US);
__enable_irq(); __enable_irq();
#else #else
bit = OneWireUART_ProcessBit(onewire_uart, 1); bit = OneWireUART_ProcessBit(OW->huart, 1);
#endif #endif
/* Return bit value */ /* Return bit value */
return bit; return bit;
@@ -107,7 +107,7 @@ void OneWire_WriteByte(OneWire_t* OW, uint8_t byte)
byte >>= 1; byte >>= 1;
} }
#else #else
OneWireUART_ProcessByte(onewire_uart, byte); OneWireUART_ProcessByte(OW->huart, byte);
#endif #endif
} }
@@ -129,7 +129,7 @@ uint8_t OneWire_ReadByte(OneWire_t* OW)
byte |= (OneWire_ReadBit(OW) << 7); byte |= (OneWire_ReadBit(OW) << 7);
} }
#else #else
byte = OneWireUART_ProcessByte(onewire_uart, 0xFF); byte = OneWireUART_ProcessByte(OW->huart, 0xFF);
#endif #endif
return byte; return byte;
@@ -163,7 +163,7 @@ uint8_t OneWire_Reset(OneWire_t* OW)
#else #else
uint8_t rslt = 0; uint8_t rslt = 0;
if(OneWireUART_Reset(onewire_uart) == HAL_OK) if(OneWireUART_Reset(OW->huart) == HAL_OK)
rslt = 0; rslt = 0;
else else
rslt = 1; rslt = 1;
@@ -314,6 +314,7 @@ void OneWire_GetDevRom(OneWire_t* OW, uint8_t *ROM)
*/ */
void OneWire_Init(OneWire_t* OW) void OneWire_Init(OneWire_t* OW)
{ {
#ifndef UART_Driver
OneWire_Pin_Mode(OW, Output); OneWire_Pin_Mode(OW, Output);
OneWire_Pin_Level(OW, 1); OneWire_Pin_Level(OW, 1);
OneWire_Delay_us(1000); OneWire_Delay_us(1000);
@@ -321,7 +322,7 @@ void OneWire_Init(OneWire_t* OW)
OneWire_Delay_us(1000); OneWire_Delay_us(1000);
OneWire_Pin_Level(OW, 1); OneWire_Pin_Level(OW, 1);
OneWire_Delay_us(2000); OneWire_Delay_us(2000);
#endif
/* Reset the search state */ /* Reset the search state */
OW->LastDiscrepancy = 0; OW->LastDiscrepancy = 0;
OW->LastDeviceFlag = 0; OW->LastDeviceFlag = 0;

View File

@@ -14,10 +14,8 @@
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include "ow_port.h" #include "ow_port.h"
/* Driver Selection ----------------------------------------------------------*/ /* Driver Selection ----------------------------------------------------------*/
//#define LL_Driver
//#define CMSIS_Driver
/* OneWire Timings -----------------------------------------------------------*/ /* OneWire Timings -----------------------------------------------------------*/
#define ONEWIRE_RESET_PULSE_US 480 // Длительность импульса сброса #define ONEWIRE_RESET_PULSE_US 480 // Длительность импульса сброса
#define ONEWIRE_PRESENCE_WAIT_US 70 // Ожидание ответа от датчика #define ONEWIRE_PRESENCE_WAIT_US 70 // Ожидание ответа от датчика
@@ -49,8 +47,12 @@ typedef struct
uint8_t LastDeviceFlag; uint8_t LastDeviceFlag;
uint8_t RomByte[8]; uint8_t RomByte[8];
uint8_t RomCnt; uint8_t RomCnt;
#if defined(UART_Driver)
UART_HandleTypeDef *huart;
#else
uint16_t DataPin; uint16_t DataPin;
GPIO_TypeDef *DataPort; GPIO_TypeDef *DataPort;
#endif
} OneWire_t; } OneWire_t;
/* External Function ---------------------------------------------------------*/ /* External Function ---------------------------------------------------------*/

158
DS18B20/onewire_uart.c Normal file
View File

@@ -0,0 +1,158 @@
/**
******************************************************************************
* @file : onewire_uart.c
* @brief : Драйвер для работы с шиной 1-Wire через UART
* @author : MicroTechnics (microtechnics.ru)
******************************************************************************
@details
Этот файл реализует базовые функции для работы с 1-Wire через UART.
Он включает в себя методы для передачи и приёма битов и байтов, а также
выполнение reset-команды для устройств 1-Wire.
UART передает специально сформированные импульсы, эмулируя 1-Wire.
*****************************************************************************/
/* Includes ----------------------------------------------------------------*/
#include "onewire_uart.h"
/* Declarations and definitions --------------------------------------------*/
/* Functions ---------------------------------------------------------------*/
/**
* @brief Устанавливает скорость передачи данных для UART.
* @param huart Указатель на структуру UART
* @param baudrate Требуемая скорость передачи (бит/с)
* @details Функция изменяет скорость передачи UART в зависимости от используемой шины
* (PCLK1 или PCLK2). Это важно для эмуляции временных параметров 1-Wire.
*/
static void UARTSetBaudrate(UART_HandleTypeDef *huart, uint32_t baudrate)
{
uint32_t pclk = 0;
huart->Init.BaudRate = baudrate;
#if defined(USART6) && defined(UART9) && defined(UART10)
if ((huart->Instance == USART1) || (huart->Instance == USART6) ||
(huart->Instance == UART9) || (huart->Instance == UART10))
{
pclk = HAL_RCC_GetPCLK2Freq();
}
#elif defined(USART6)
if ((huart->Instance == USART1) || (huart->Instance == USART6))
{
pclk = HAL_RCC_GetPCLK2Freq();
}
#else
if (huart->Instance == USART1)
{
pclk = HAL_RCC_GetPCLK2Freq();
}
#endif /* USART6 */
else
{
pclk = HAL_RCC_GetPCLK1Freq();
}
#if defined(USART_CR1_OVER8)
if (huart->Init.OverSampling == UART_OVERSAMPLING_8)
{
huart->Instance->BRR = UART_BRR_SAMPLING8(pclk, huart->Init.BaudRate);
}
else
{
huart->Instance->BRR = UART_BRR_SAMPLING16(pclk, huart->Init.BaudRate);
}
#else
huart->Instance->BRR = UART_BRR_SAMPLING16(pclk, huart->Init.BaudRate);
#endif /* USART_CR1_OVER8 */
}
/**
* @brief Передает и принимает один бит через 1-Wire.
* @param huart Указатель на структуру UART
* @param bit Бит для передачи (0 или 1)
* @return Полученный бит (0 или 1)
* @details Передача осуществляется отправкой специального импульса, длина которого определяет передаваемый бит.
* Ответное значение читается сразу после передачи.
*/
uint8_t OneWireUART_ProcessBit(UART_HandleTypeDef *huart, uint8_t bit)
{
uint8_t txData;
uint8_t rxData = 0x00;
if (bit == 1)
{
txData = ONEWIRE_PULSE_SHORT; // Короткий импульс для передачи '1'
}
else
{
txData = ONEWIRE_PULSE_LONG; // Длинный импульс для передачи '0'
}
HAL_UART_Transmit(huart, &txData, 1, ONEWIRE_UART_TIMEOUT);
HAL_UART_Receive(huart, &rxData, 1, ONEWIRE_UART_TIMEOUT);
if (rxData == 0xFF)
{
bit = 1; // Короткий импульс для передачи '1'
}
else
{
bit = 0; // Длинный импульс для передачи '0'
}
return bit;
}
/**
* @brief Передает и принимает байт через 1-Wire.
* @param huart Указатель на структуру UART
* @param byte Отправляемый байт
* @return Принятый байт
* @details Отправляет 8 бит последовательно, используя @ref OneWire_ProcessBit.
* Каждый полученный бит собирается в байт и возвращается.
*/
uint8_t OneWireUART_ProcessByte(UART_HandleTypeDef *huart, uint8_t byte)
{
uint8_t rxByte = 0x00;
uint8_t txBit = 0;
uint8_t rxBit = 0;
for (uint8_t i = 0; i < 8; i++)
{
txBit = (byte >> i) & 0x01; // Извлекаем очередной бит для отправки
rxBit = OneWireUART_ProcessBit(huart, txBit);
rxByte |= (rxBit << i); // Собираем принятые биты в байт
}
return rxByte;
}
/**
* @brief Выполняет 1-Wire Reset и проверяет наличие устройств на шине.
* @param huart Указатель на структуру UART
* @return HAL Status
* @details Процедура Reset требует изменения скорости UART, чтобы сформировать
* большой по длительности импульс сброса. Если устройство ответило, шина в рабочем состоянии.
*/
HAL_StatusTypeDef OneWireUART_Reset(UART_HandleTypeDef *huart)
{
HAL_StatusTypeDef status = HAL_OK;
uint8_t txByte = ONEWIRE_RESET;
uint8_t rxByte = 0x00;
UARTSetBaudrate(huart, ONEWIRE_RESET_BAUDRATE); // Устанавливаем низкую скорость для Reset-импульса
HAL_UART_Transmit(huart, &txByte, 1, ONEWIRE_UART_TIMEOUT);
HAL_UART_Receive(huart, &rxByte, 1, ONEWIRE_UART_TIMEOUT);
UARTSetBaudrate(huart, ONEWIRE_BAUDRATE); // Возвращаем стандартную скорость
if (rxByte == txByte)
{
status = HAL_ERROR; // Если ответ совпадает с отправленным байтом, значит, устройств нет
}
return status;
}

57
DS18B20/onewire_uart.h Normal file
View File

@@ -0,0 +1,57 @@
/**
******************************************************************************
* @file : onewire_uart.h
* @brief : 1-Wire driver
* @author : MicroTechnics (microtechnics.ru)
*****************************************************************************/
#ifndef ONEWIRE_UART_H
#define ONEWIRE_UART_H
/* Includes ----------------------------------------------------------------*/
#include "stm32f1xx_hal.h"
/* Declarations and definitions --------------------------------------------*/
#define ONEWIRE_BAUDRATE 115200
#define ONEWIRE_RESET_BAUDRATE 9600
#define ONEWIRE_UART_TIMEOUT 10
/**
* @brief Комманды OneWire
* @details Определяет байты для uart, которые будут
* формировать необходимую длину импульса для разных комманд
*/
typedef enum
{
ONEWIRE_RESET = 0xF0, /*!< @brief Импульс длиной 520мкс для команды Reset (9600bod)
@details 1-Wire требует импульс длительностью >480мкс */
ONEWIRE_PULSE_SHORT = 0xFF, /*!< @brief Импульс длиной 8.7 мкс для записи "1"/чтения бита (115200bod)
@details 1-Wire требует импульс длительностью 1-15мкс */
ONEWIRE_PULSE_LONG = 0x00, /*!< @brief импульс длиной 78.3 мкс для записи "0" (115200bod)
@details 1-Wire требует импульс длительностью 60-120мкс */
// ONEWIRE_PULSE_1_15US = 0xFF,
// ONEWIRE_PULSE_60_120US = 0x00,
}ONEWIRE_Commands;
/* Functions ---------------------------------------------------------------*/
/* Выполняет 1-Wire Reset и проверяет наличие устройств на шине */
HAL_StatusTypeDef OneWireUART_Reset(UART_HandleTypeDef *huart);
/* Передает и принимает байт через 1-Wire */
uint8_t OneWireUART_ProcessByte(UART_HandleTypeDef *huart, uint8_t byte);
/* Передает и принимает один бит через 1-Wire */
uint8_t OneWireUART_ProcessBit(UART_HandleTypeDef *huart, uint8_t bit);
#endif // #ifndef ONEWIRE_UART_H

View File

@@ -16,7 +16,8 @@ uint32_t pin_pos = (OW_Pin_Numb < 8) ? (OW_Pin_Numb * 4) : ((OW_Pin_Numb - 8) *
*/ */
void OneWire_Pin_Mode(OneWire_t* OW, PinMode Mode) void OneWire_Pin_Mode(OneWire_t* OW, PinMode Mode)
{ {
#ifdef CMSIS_Driver #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_Pin_Numb < 8) ? &(OW->DataPort->CRL) : &(OW->DataPort->CRH);
// —брос текущих 4 бит (CNF + MODE) // —брос текущих 4 бит (CNF + MODE)
*config_reg &= ~(0xF << pin_pos); *config_reg &= ~(0xF << pin_pos);
@@ -33,8 +34,7 @@ volatile uint32_t *config_reg = (OW_Pin_Numb < 8) ? &(OW->DataPort->CRL) : &(OW-
// ¬ыход push-pull, 2 ћ√ц Ц MODE = 0b10, CNF = 0b00 // ¬ыход push-pull, 2 ћ√ц Ц MODE = 0b10, CNF = 0b00
*config_reg |= (0x2 << pin_pos); *config_reg |= (0x2 << pin_pos);
} }
#else #elif defined(LL_Driver)
#ifdef LL_Driver
if(Mode == Input) if(Mode == Input)
{ {
LL_GPIO_SetPinMode(OW->DataPort, OW->DataPin, LL_GPIO_MODE_INPUT); LL_GPIO_SetPinMode(OW->DataPort, OW->DataPin, LL_GPIO_MODE_INPUT);
@@ -53,7 +53,6 @@ volatile uint32_t *config_reg = (OW_Pin_Numb < 8) ? &(OW->DataPort->CRL) : &(OW-
} }
HAL_GPIO_Init(OW->DataPort, &GPIO_InitStruct); HAL_GPIO_Init(OW->DataPort, &GPIO_InitStruct);
#endif #endif
#endif
} }
/** /**
@@ -63,7 +62,8 @@ volatile uint32_t *config_reg = (OW_Pin_Numb < 8) ? &(OW->DataPort->CRL) : &(OW-
*/ */
void OneWire_Pin_Level(OneWire_t* OW, uint8_t Level) void OneWire_Pin_Level(OneWire_t* OW, uint8_t Level)
{ {
#ifdef CMSIS_Driver #if defined(UART_Driver)
#elif defined(CMSIS_Driver)
if (Level != GPIO_PIN_RESET) if (Level != GPIO_PIN_RESET)
{ {
OW->DataPort->BSRR = OW->DataPin; OW->DataPort->BSRR = OW->DataPin;
@@ -72,8 +72,7 @@ void OneWire_Pin_Level(OneWire_t* OW, uint8_t Level)
{ {
OW->DataPort->BSRR = (uint32_t)OW->DataPin << 16u; OW->DataPort->BSRR = (uint32_t)OW->DataPin << 16u;
} }
#else #elif defined(LL_Driver)
#ifdef LL_Driver
if(Level == 1) if(Level == 1)
{ {
LL_GPIO_SetOutputPin(OW->DataPort, OW->DataPin); LL_GPIO_SetOutputPin(OW->DataPort, OW->DataPin);
@@ -83,7 +82,6 @@ void OneWire_Pin_Level(OneWire_t* OW, uint8_t Level)
#else #else
HAL_GPIO_WritePin(OW->DataPort, OW->DataPin, Level); HAL_GPIO_WritePin(OW->DataPort, OW->DataPin, Level);
#endif #endif
#endif
} }
/** /**
@@ -93,15 +91,15 @@ void OneWire_Pin_Level(OneWire_t* OW, uint8_t Level)
*/ */
uint8_t OneWire_Pin_Read(OneWire_t* OW) uint8_t OneWire_Pin_Read(OneWire_t* OW)
{ {
#ifdef CMSIS_Driver #if defined(UART_Driver)
return 0;
#elif defined(CMSIS_Driver)
return ((OW->DataPort->IDR & OW->DataPin) != 0x00U) ? 1 : 0; return ((OW->DataPort->IDR & OW->DataPin) != 0x00U) ? 1 : 0;
#else #elif defined(LL_Driver)
#ifdef LL_Driver
return ((OW->DataPort->IDR & OW->DataPin) != 0x00U) ? 1 : 0; return ((OW->DataPort->IDR & OW->DataPin) != 0x00U) ? 1 : 0;
#else #else
return HAL_GPIO_ReadPin(OW->DataPort, OW->DataPin); return HAL_GPIO_ReadPin(OW->DataPort, OW->DataPin);
#endif #endif
#endif
} }
uint32_t tim_1us_period = OW_TIM_1US_PERIOD; uint32_t tim_1us_period = OW_TIM_1US_PERIOD;

View File

@@ -13,24 +13,26 @@
#include "stm32f1xx_hal.h" #include "stm32f1xx_hal.h"
/* I/O Port ------------------------------------------------------------------*/ /* I/O Port ------------------------------------------------------------------*/
#define UART_Driver ///< использовтаь UART (onewire_uart.c/.h)
//#define LL_Driver ///< использовать CMSIS для управления ножкой //#define LL_Driver ///< использовать CMSIS для управления ножкой
#define CMSIS_Driver ///< использовать CMSIS для управления ножкой #define CMSIS_Driver ///< использовать CMSIS для управления ножкой
// если ничего не выбрано - используется HAL // если ничего не выбрано - используется HAL
/** /**
* @def OW_GPIO_Port * @def OW_GPIO_Port
* @brief Порт вывода для шины 1-Wire. * @brief Порт вывода для шины 1-Wire.
* @details Указывает порт GPIO, к которому подключена линия данных 1-Wire (например, для DS18B20). * @details Указывает порт GPIO, к которому подключена линия данных 1-Wire (например, для DS18B20).
*/ */
#define OW_GPIO_Port GPIOB #define OW_GPIO_Port GPIOA
/** /**
* @def OW_Pin_Numb * @def OW_Pin_Numb
* @brief Номер пина в порту OW_GPIO_Port. * @brief Номер пина в порту OW_GPIO_Port.
* @details Используется для формирования маски пина и настройки ввода/вывода. * @details Используется для формирования маски пина и настройки ввода/вывода.
*/ */
#define OW_Pin_Numb 0 #define OW_Pin_Numb 9
/** /**
* @def OW_Pin * @def OW_Pin
@@ -51,10 +53,16 @@
* @brief Количество тактов таймера OW_TIM, соответствующее 1 микросекунде. * @brief Количество тактов таймера OW_TIM, соответствующее 1 микросекунде.
* @details Вычисляется на основе частоты таймера. Например, для таймера с частотой 24 МГц значение будет равно 24. * @details Вычисляется на основе частоты таймера. Например, для таймера с частотой 24 МГц значение будет равно 24.
*/ */
#define OW_TIM_1US_PERIOD 24 #define OW_TIM_1US_PERIOD 72
/* OneWire Timings -----------------------------------------------------------*/ /* OneWire Timings -----------------------------------------------------------*/
void OneWire_Delay_us(uint32_t us); void OneWire_Delay_us(uint32_t us);
/* Common Register -----------------------------------------------------------*/ /* Common Register -----------------------------------------------------------*/
#if defined(UART_Driver)
#include "onewire_uart.h"
#include "usart.h"
#endif
#endif /* ONEWIRE_PORT_H */ #endif /* ONEWIRE_PORT_H */

View File

@@ -91,9 +91,14 @@ int main(void)
MX_TIM3_Init(); MX_TIM3_Init();
MX_USART1_UART_Init(); MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */ /* USER CODE BEGIN 2 */
Dallas_BusFirstInit(&htim3); #ifndef UART_Driver
Dallas_BusFirstInit(&hdallas, OW_GPIO_Port, OW_Pin, NULL, NULL);
#else
Dallas_BusFirstInit(&hdallas, &huart1, NULL, NULL);
#endif
sens.Init.InitParam.Ind = 0; sens.Init.InitParam.Ind = 0;
sens.Init.init_func = &Dallas_SensorInitByInd; sens.Init.init_func = &Dallas_SensorInitByInd;
sens.Init.Resolution = DALLAS_CONFIG_12_BITS;
Dallas_AddNewSensors(&hdallas, &sens); Dallas_AddNewSensors(&hdallas, &sens);
/* USER CODE END 2 */ /* USER CODE END 2 */

View File

@@ -41,7 +41,7 @@ void MX_TIM3_Init(void)
/* USER CODE END TIM3_Init 1 */ /* USER CODE END TIM3_Init 1 */
htim3.Instance = TIM3; htim3.Instance = TIM3;
htim3.Init.Prescaler = 2; htim3.Init.Prescaler = 0;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 65535; htim3.Init.Period = 65535;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

View File

@@ -46,7 +46,7 @@ void MX_USART1_UART_Init(void)
huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16; huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK) if (HAL_HalfDuplex_Init(&huart1) != HAL_OK)
{ {
Error_Handler(); Error_Handler();
} }
@@ -71,18 +71,12 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
__HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE();
/**USART1 GPIO Configuration /**USART1 GPIO Configuration
PA9 ------> USART1_TX PA9 ------> USART1_TX
PA10 ------> USART1_RX
*/ */
GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN USART1_MspInit 1 */ /* USER CODE BEGIN USART1_MspInit 1 */
/* USER CODE END USART1_MspInit 1 */ /* USER CODE END USART1_MspInit 1 */
@@ -102,9 +96,8 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
/**USART1 GPIO Configuration /**USART1 GPIO Configuration
PA9 ------> USART1_TX PA9 ------> USART1_TX
PA10 ------> USART1_RX
*/ */
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9);
/* USER CODE BEGIN USART1_MspDeInit 1 */ /* USER CODE BEGIN USART1_MspDeInit 1 */

View File

@@ -175,7 +175,29 @@
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>end,0x0A</ItemText> <ItemText>end,0x0A</ItemText>
</Ww> </Ww>
<Ww>
<count>5</count>
<WinNumber>1</WinNumber>
<ItemText>resolution,0x0A</ItemText>
</Ww>
<Ww>
<count>6</count>
<WinNumber>1</WinNumber>
<ItemText>Scratchpad[4]</ItemText>
</Ww>
<Ww>
<count>7</count>
<WinNumber>1</WinNumber>
<ItemText>ibutton</ItemText>
</Ww>
</WatchWindow1> </WatchWindow1>
<WatchWindow2>
<Ww>
<count>0</count>
<WinNumber>2</WinNumber>
<ItemText>rom</ItemText>
</Ww>
</WatchWindow2>
<Tracepoint> <Tracepoint>
<THDelay>0</THDelay> <THDelay>0</THDelay>
</Tracepoint> </Tracepoint>
@@ -636,6 +658,30 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<bShared>0</bShared> <bShared>0</bShared>
</File> </File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\..\DS18B20\onewire_uart.c</PathWithFileName>
<FilenameWithoutPath>onewire_uart.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>32</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\..\DS18B20\onewire_uart.h</PathWithFileName>
<FilenameWithoutPath>onewire_uart.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group> </Group>
<Group> <Group>

View File

@@ -341,7 +341,7 @@
<MiscControls></MiscControls> <MiscControls></MiscControls>
<Define>USE_HAL_DRIVER,STM32F103xB</Define> <Define>USE_HAL_DRIVER,STM32F103xB</Define>
<Undefine></Undefine> <Undefine></Undefine>
<IncludePath>../Core/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F1xx/Include;../Drivers/CMSIS/Include;..\..\DS18B20</IncludePath> <IncludePath>../Core/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F1xx/Include;../Drivers/CMSIS/Include;../../DS18B20</IncludePath>
</VariousControls> </VariousControls>
</Cads> </Cads>
<Aads> <Aads>
@@ -708,6 +708,16 @@
<FileType>5</FileType> <FileType>5</FileType>
<FilePath>..\..\DS18B20\ow_port.h</FilePath> <FilePath>..\..\DS18B20\ow_port.h</FilePath>
</File> </File>
<File>
<FileName>onewire_uart.c</FileName>
<FileType>1</FileType>
<FilePath>..\..\DS18B20\onewire_uart.c</FilePath>
</File>
<File>
<FileName>onewire_uart.h</FileName>
<FileType>5</FileType>
<FilePath>..\..\DS18B20\onewire_uart.h</FilePath>
</File>
</Files> </Files>
</Group> </Group>
<Group> <Group>

View File

@@ -17,17 +17,16 @@ Mcu.Name=STM32F103C(8-B)Tx
Mcu.Package=LQFP48 Mcu.Package=LQFP48
Mcu.Pin0=PC13-TAMPER-RTC Mcu.Pin0=PC13-TAMPER-RTC
Mcu.Pin1=PC14-OSC32_IN Mcu.Pin1=PC14-OSC32_IN
Mcu.Pin10=VP_SYS_VS_Systick Mcu.Pin10=VP_TIM3_VS_ClockSourceINT
Mcu.Pin11=VP_TIM3_VS_ClockSourceINT
Mcu.Pin2=PC15-OSC32_OUT Mcu.Pin2=PC15-OSC32_OUT
Mcu.Pin3=PD0-OSC_IN Mcu.Pin3=PD0-OSC_IN
Mcu.Pin4=PD1-OSC_OUT Mcu.Pin4=PD1-OSC_OUT
Mcu.Pin5=PB0 Mcu.Pin5=PB0
Mcu.Pin6=PA9 Mcu.Pin6=PA9
Mcu.Pin7=PA10 Mcu.Pin7=PA13
Mcu.Pin8=PA13 Mcu.Pin8=PA14
Mcu.Pin9=PA14 Mcu.Pin9=VP_SYS_VS_Systick
Mcu.PinsNb=12 Mcu.PinsNb=11
Mcu.ThirdPartyNb=0 Mcu.ThirdPartyNb=0
Mcu.UserConstants= Mcu.UserConstants=
Mcu.UserName=STM32F103C8Tx Mcu.UserName=STM32F103C8Tx
@@ -44,13 +43,11 @@ NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
PA10.Mode=Asynchronous
PA10.Signal=USART1_RX
PA13.Mode=Serial_Wire PA13.Mode=Serial_Wire
PA13.Signal=SYS_JTMS-SWDIO PA13.Signal=SYS_JTMS-SWDIO
PA14.Mode=Serial_Wire PA14.Mode=Serial_Wire
PA14.Signal=SYS_JTCK-SWCLK PA14.Signal=SYS_JTCK-SWCLK
PA9.Mode=Asynchronous PA9.Mode=Half_duplex(single_wire_mode)
PA9.Signal=USART1_TX PA9.Signal=USART1_TX
PB0.Locked=true PB0.Locked=true
PB0.Signal=GPIO_Output PB0.Signal=GPIO_Output
@@ -95,7 +92,7 @@ ProjectManager.ToolChainLocation=
ProjectManager.UAScriptAfterPath= ProjectManager.UAScriptAfterPath=
ProjectManager.UAScriptBeforePath= ProjectManager.UAScriptBeforePath=
ProjectManager.UnderRoot=false ProjectManager.UnderRoot=false
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_TIM3_Init-TIM3-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_TIM3_Init-TIM3-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_USART2_UART_Init-USART2-false-HAL-true
RCC.ADCFreqValue=36000000 RCC.ADCFreqValue=36000000
RCC.AHBFreq_Value=72000000 RCC.AHBFreq_Value=72000000
RCC.APB1CLKDivider=RCC_HCLK_DIV2 RCC.APB1CLKDivider=RCC_HCLK_DIV2