From fa32d653e83da0594b7ac9ed5a99a55b549dbcf7 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Mon, 30 Jun 2025 18:34:17 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=20onewire=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20uart?= =?UTF-8?q?=20=D0=B8=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B0?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80?= =?UTF-8?q?=D1=83=D0=B0=20=D1=88=D0=B8=D0=BD=D1=8B=20OneWire=20=D0=B8=20?= =?UTF-8?q?=D0=B8=D0=BD=D1=86=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Теперь при выборе UART, в функцию Dallas_BusFirstInit передается hdallas, huart, ow, ds А при выборе GPIO ножки: hdallas, gpiox, gpio_pin, ow, ds но надо как-то структуруизировать дальше --- DS18B20/dallas_tools.c | 55 ++++++++++--- DS18B20/dallas_tools.h | 10 ++- DS18B20/onewire.c | 13 ++-- DS18B20/onewire.h | 8 +- DS18B20/onewire_uart.c | 158 ++++++++++++++++++++++++++++++++++++++ DS18B20/onewire_uart.h | 57 ++++++++++++++ DS18B20/ow_port.c | 22 +++--- DS18B20/ow_port.h | 14 +++- test/Core/Src/main.c | 7 +- test/Core/Src/tim.c | 2 +- test/Core/Src/usart.c | 13 +--- test/MDK-ARM/test.uvoptx | 46 +++++++++++ test/MDK-ARM/test.uvprojx | 12 ++- test/test.ioc | 17 ++-- 14 files changed, 373 insertions(+), 61 deletions(-) create mode 100644 DS18B20/onewire_uart.c create mode 100644 DS18B20/onewire_uart.h diff --git a/DS18B20/dallas_tools.c b/DS18B20/dallas_tools.c index cfe20ff..984264f 100644 --- a/DS18B20/dallas_tools.c +++ b/DS18B20/dallas_tools.c @@ -86,30 +86,61 @@ DALLAS_HandleTypeDef hdallas; /* Functions ---------------------------------------------------------------*/ /** -* @brief Функция для иниицализации шины OW для датчиков + * @brief Функция для иниицализации структуры dallas и шины OW для датчиков + * @param hdallas Указатель на хендл для общения с датчиками + * @param OW Указатель на структуру OneWire (если NULL — используется по умолчанию) + * @param DS Указатель на структуру драйвера DS18B20 (если NULL — используется по умолчанию) * @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; - 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; - hdallas.ds_devices = &DS; - OW.DataPin = OW_Pin; - OW.DataPort = OW_GPIO_Port; +#ifndef UART_Driver + if(GPIOx == NULL) + return HAL_ERROR; + + 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_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 Функция для иниицализации нового датчика в структуре @@ -153,7 +184,7 @@ HAL_StatusTypeDef Dallas_ReplaceLostedSensor(DALLAS_SensorHandleTypeDef *sensor) 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; if(sensor->Init.init_func(sensor->hdallas, sensor) != HAL_OK) diff --git a/DS18B20/dallas_tools.h b/DS18B20/dallas_tools.h index a99e9d9..0dff84a 100644 --- a/DS18B20/dallas_tools.h +++ b/DS18B20/dallas_tools.h @@ -130,8 +130,14 @@ typedef enum /* Functions ---------------------------------------------------------------*/ - -HAL_StatusTypeDef Dallas_BusFirstInit(TIM_HandleTypeDef *htim); +/* Функция для иниицализации структуры dallas и шины OW для датчиков */ +#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); /* Инициализирует структуру датчика по ROM */ diff --git a/DS18B20/onewire.c b/DS18B20/onewire.c index 930cc6d..48d5451 100644 --- a/DS18B20/onewire.c +++ b/DS18B20/onewire.c @@ -49,7 +49,7 @@ void OneWire_WriteBit(OneWire_t* OW, uint8_t bit) } __enable_irq(); #else - OneWireUART_ProcessBit(onewire_uart, bit); + OneWireUART_ProcessBit(OW->huart, bit); #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); __enable_irq(); #else - bit = OneWireUART_ProcessBit(onewire_uart, 1); + bit = OneWireUART_ProcessBit(OW->huart, 1); #endif /* Return bit value */ return bit; @@ -107,7 +107,7 @@ void OneWire_WriteByte(OneWire_t* OW, uint8_t byte) byte >>= 1; } #else - OneWireUART_ProcessByte(onewire_uart, byte); + OneWireUART_ProcessByte(OW->huart, byte); #endif } @@ -129,7 +129,7 @@ uint8_t OneWire_ReadByte(OneWire_t* OW) byte |= (OneWire_ReadBit(OW) << 7); } #else - byte = OneWireUART_ProcessByte(onewire_uart, 0xFF); + byte = OneWireUART_ProcessByte(OW->huart, 0xFF); #endif return byte; @@ -163,7 +163,7 @@ uint8_t OneWire_Reset(OneWire_t* OW) #else uint8_t rslt = 0; - if(OneWireUART_Reset(onewire_uart) == HAL_OK) + if(OneWireUART_Reset(OW->huart) == HAL_OK) rslt = 0; else rslt = 1; @@ -314,6 +314,7 @@ void OneWire_GetDevRom(OneWire_t* OW, uint8_t *ROM) */ void OneWire_Init(OneWire_t* OW) { +#ifndef UART_Driver OneWire_Pin_Mode(OW, Output); OneWire_Pin_Level(OW, 1); OneWire_Delay_us(1000); @@ -321,7 +322,7 @@ void OneWire_Init(OneWire_t* OW) OneWire_Delay_us(1000); OneWire_Pin_Level(OW, 1); OneWire_Delay_us(2000); - +#endif /* Reset the search state */ OW->LastDiscrepancy = 0; OW->LastDeviceFlag = 0; diff --git a/DS18B20/onewire.h b/DS18B20/onewire.h index 5fb2935..7871140 100644 --- a/DS18B20/onewire.h +++ b/DS18B20/onewire.h @@ -14,10 +14,8 @@ /* Includes ------------------------------------------------------------------*/ #include "ow_port.h" - /* Driver Selection ----------------------------------------------------------*/ -//#define LL_Driver -//#define CMSIS_Driver + /* OneWire Timings -----------------------------------------------------------*/ #define ONEWIRE_RESET_PULSE_US 480 // Длительность импульса сброса #define ONEWIRE_PRESENCE_WAIT_US 70 // Ожидание ответа от датчика @@ -49,8 +47,12 @@ typedef struct uint8_t LastDeviceFlag; uint8_t RomByte[8]; uint8_t RomCnt; +#if defined(UART_Driver) + UART_HandleTypeDef *huart; +#else uint16_t DataPin; GPIO_TypeDef *DataPort; +#endif } OneWire_t; /* External Function ---------------------------------------------------------*/ diff --git a/DS18B20/onewire_uart.c b/DS18B20/onewire_uart.c new file mode 100644 index 0000000..e84c682 --- /dev/null +++ b/DS18B20/onewire_uart.c @@ -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; +} diff --git a/DS18B20/onewire_uart.h b/DS18B20/onewire_uart.h new file mode 100644 index 0000000..58b532c --- /dev/null +++ b/DS18B20/onewire_uart.h @@ -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 \ No newline at end of file diff --git a/DS18B20/ow_port.c b/DS18B20/ow_port.c index 4ccf350..b4b0d8c 100644 --- a/DS18B20/ow_port.c +++ b/DS18B20/ow_port.c @@ -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) { -#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); // —брос текущих 4 бит (CNF + MODE) *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 *config_reg |= (0x2 << pin_pos); } -#else -#ifdef LL_Driver +#elif defined(LL_Driver) if(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); #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) { -#ifdef CMSIS_Driver +#if defined(UART_Driver) +#elif defined(CMSIS_Driver) if (Level != GPIO_PIN_RESET) { 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; } -#else -#ifdef LL_Driver +#elif defined(LL_Driver) if(Level == 1) { LL_GPIO_SetOutputPin(OW->DataPort, OW->DataPin); @@ -83,7 +82,6 @@ void OneWire_Pin_Level(OneWire_t* OW, uint8_t Level) #else HAL_GPIO_WritePin(OW->DataPort, OW->DataPin, Level); #endif -#endif } /** @@ -93,15 +91,15 @@ void OneWire_Pin_Level(OneWire_t* OW, uint8_t Level) */ 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; -#else -#ifdef LL_Driver +#elif defined(LL_Driver) return ((OW->DataPort->IDR & OW->DataPin) != 0x00U) ? 1 : 0; #else return HAL_GPIO_ReadPin(OW->DataPort, OW->DataPin); #endif -#endif } uint32_t tim_1us_period = OW_TIM_1US_PERIOD; diff --git a/DS18B20/ow_port.h b/DS18B20/ow_port.h index ac9e139..ca8cda9 100644 --- a/DS18B20/ow_port.h +++ b/DS18B20/ow_port.h @@ -13,24 +13,26 @@ #include "stm32f1xx_hal.h" /* I/O Port ------------------------------------------------------------------*/ +#define UART_Driver ///< использовтаь UART (onewire_uart.c/.h) //#define LL_Driver ///< использовать CMSIS для управления ножкой #define CMSIS_Driver ///< использовать CMSIS для управления ножкой // если ничего не выбрано - используется HAL + /** * @def OW_GPIO_Port * @brief Порт вывода для шины 1-Wire. * @details Указывает порт GPIO, к которому подключена линия данных 1-Wire (например, для DS18B20). */ -#define OW_GPIO_Port GPIOB +#define OW_GPIO_Port GPIOA /** * @def OW_Pin_Numb * @brief Номер пина в порту OW_GPIO_Port. * @details Используется для формирования маски пина и настройки ввода/вывода. */ -#define OW_Pin_Numb 0 +#define OW_Pin_Numb 9 /** * @def OW_Pin @@ -51,10 +53,16 @@ * @brief Количество тактов таймера OW_TIM, соответствующее 1 микросекунде. * @details Вычисляется на основе частоты таймера. Например, для таймера с частотой 24 МГц значение будет равно 24. */ -#define OW_TIM_1US_PERIOD 24 +#define OW_TIM_1US_PERIOD 72 /* OneWire Timings -----------------------------------------------------------*/ void OneWire_Delay_us(uint32_t us); /* Common Register -----------------------------------------------------------*/ + + +#if defined(UART_Driver) +#include "onewire_uart.h" +#include "usart.h" +#endif #endif /* ONEWIRE_PORT_H */ diff --git a/test/Core/Src/main.c b/test/Core/Src/main.c index 59817d0..3ea936c 100644 --- a/test/Core/Src/main.c +++ b/test/Core/Src/main.c @@ -91,9 +91,14 @@ int main(void) MX_TIM3_Init(); MX_USART1_UART_Init(); /* 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.init_func = &Dallas_SensorInitByInd; + sens.Init.Resolution = DALLAS_CONFIG_12_BITS; Dallas_AddNewSensors(&hdallas, &sens); /* USER CODE END 2 */ diff --git a/test/Core/Src/tim.c b/test/Core/Src/tim.c index c202faa..cb112d3 100644 --- a/test/Core/Src/tim.c +++ b/test/Core/Src/tim.c @@ -41,7 +41,7 @@ void MX_TIM3_Init(void) /* USER CODE END TIM3_Init 1 */ htim3.Instance = TIM3; - htim3.Init.Prescaler = 2; + htim3.Init.Prescaler = 0; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 65535; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; diff --git a/test/Core/Src/usart.c b/test/Core/Src/usart.c index e96da31..f2e6e13 100644 --- a/test/Core/Src/usart.c +++ b/test/Core/Src/usart.c @@ -46,7 +46,7 @@ void MX_USART1_UART_Init(void) huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; - if (HAL_UART_Init(&huart1) != HAL_OK) + if (HAL_HalfDuplex_Init(&huart1) != HAL_OK) { Error_Handler(); } @@ -71,18 +71,12 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) __HAL_RCC_GPIOA_CLK_ENABLE(); /**USART1 GPIO Configuration PA9 ------> USART1_TX - PA10 ------> USART1_RX */ 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; 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 END USART1_MspInit 1 */ @@ -102,9 +96,8 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) /**USART1 GPIO Configuration 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 */ diff --git a/test/MDK-ARM/test.uvoptx b/test/MDK-ARM/test.uvoptx index 2efa43d..c561479 100644 --- a/test/MDK-ARM/test.uvoptx +++ b/test/MDK-ARM/test.uvoptx @@ -175,7 +175,29 @@ 1 end,0x0A + + 5 + 1 + resolution,0x0A + + + 6 + 1 + Scratchpad[4] + + + 7 + 1 + ibutton + + + + 0 + 2 + rom + + 0 @@ -636,6 +658,30 @@ 0 0 + + 5 + 31 + 1 + 0 + 0 + 0 + ..\..\DS18B20\onewire_uart.c + onewire_uart.c + 0 + 0 + + + 5 + 32 + 5 + 0 + 0 + 0 + ..\..\DS18B20\onewire_uart.h + onewire_uart.h + 0 + 0 + diff --git a/test/MDK-ARM/test.uvprojx b/test/MDK-ARM/test.uvprojx index 70d2719..2e79038 100644 --- a/test/MDK-ARM/test.uvprojx +++ b/test/MDK-ARM/test.uvprojx @@ -341,7 +341,7 @@ USE_HAL_DRIVER,STM32F103xB - ../Core/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F1xx/Include;../Drivers/CMSIS/Include;..\..\DS18B20 + ../Core/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F1xx/Include;../Drivers/CMSIS/Include;../../DS18B20 @@ -708,6 +708,16 @@ 5 ..\..\DS18B20\ow_port.h + + onewire_uart.c + 1 + ..\..\DS18B20\onewire_uart.c + + + onewire_uart.h + 5 + ..\..\DS18B20\onewire_uart.h + diff --git a/test/test.ioc b/test/test.ioc index 2da6211..8c61903 100644 --- a/test/test.ioc +++ b/test/test.ioc @@ -17,17 +17,16 @@ Mcu.Name=STM32F103C(8-B)Tx Mcu.Package=LQFP48 Mcu.Pin0=PC13-TAMPER-RTC Mcu.Pin1=PC14-OSC32_IN -Mcu.Pin10=VP_SYS_VS_Systick -Mcu.Pin11=VP_TIM3_VS_ClockSourceINT +Mcu.Pin10=VP_TIM3_VS_ClockSourceINT Mcu.Pin2=PC15-OSC32_OUT Mcu.Pin3=PD0-OSC_IN Mcu.Pin4=PD1-OSC_OUT Mcu.Pin5=PB0 Mcu.Pin6=PA9 -Mcu.Pin7=PA10 -Mcu.Pin8=PA13 -Mcu.Pin9=PA14 -Mcu.PinsNb=12 +Mcu.Pin7=PA13 +Mcu.Pin8=PA14 +Mcu.Pin9=VP_SYS_VS_Systick +Mcu.PinsNb=11 Mcu.ThirdPartyNb=0 Mcu.UserConstants= 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.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\: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.Signal=SYS_JTMS-SWDIO PA14.Mode=Serial_Wire PA14.Signal=SYS_JTCK-SWCLK -PA9.Mode=Asynchronous +PA9.Mode=Half_duplex(single_wire_mode) PA9.Signal=USART1_TX PB0.Locked=true PB0.Signal=GPIO_Output @@ -95,7 +92,7 @@ ProjectManager.ToolChainLocation= ProjectManager.UAScriptAfterPath= ProjectManager.UAScriptBeforePath= 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.AHBFreq_Value=72000000 RCC.APB1CLKDivider=RCC_HCLK_DIV2