From 2fb8c03a22f77468e04e07ad88877de81508cf60 Mon Sep 17 00:00:00 2001 From: imi415 Date: Sat, 22 May 2021 02:02:15 +0800 Subject: [PATCH] Added DS18B20 driver. --- Core/Inc/ds18b20_onewire.h | 21 +++++++ Core/Inc/main.h | 6 +- Core/Inc/one_wire.h | 4 ++ Core/Inc/stm32f1xx_hal_conf.h | 2 +- Core/Src/ds18b20_onewire.c | 44 +++++++++++++++ Core/Src/main.c | 101 ++++++++++++++++++++++++++++++---- Core/Src/one_wire.c | 11 ++++ Core/Src/one_wire_impl_ll.c | 4 +- Makefile | 6 +- STM32F103CBT6_Thermograph.ioc | 67 ++++++++++++---------- 10 files changed, 219 insertions(+), 47 deletions(-) create mode 100644 Core/Inc/ds18b20_onewire.h create mode 100644 Core/Src/ds18b20_onewire.c diff --git a/Core/Inc/ds18b20_onewire.h b/Core/Inc/ds18b20_onewire.h new file mode 100644 index 0000000..c85763c --- /dev/null +++ b/Core/Inc/ds18b20_onewire.h @@ -0,0 +1,21 @@ +#ifndef __DS18B20_ONEWIRE_H +#define __DS18B20_ONEWIRE_H + +#include "one_wire.h" + +typedef struct { + uint8_t t_high; + uint8_t t_low; + int16_t t_decimal; +} ds18b20_temp_t; + +typedef struct { + onewire_t *ow_driver; + onewire_rom_num_t rom; +} ds18b20_t; + +onewire_ret_t ds18b20_start_convert(ds18b20_t *ds); +uint8_t ds18b20_check_busy(ds18b20_t *ds); +onewire_ret_t ds18b20_read_temperature(ds18b20_t *ds, ds18b20_temp_t *temp); + +#endif \ No newline at end of file diff --git a/Core/Inc/main.h b/Core/Inc/main.h index da98839..95be385 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -58,9 +58,9 @@ void Error_Handler(void); /* USER CODE END EFP */ /* Private defines -----------------------------------------------------------*/ -#define LED_Pin GPIO_PIN_13 -#define LED_GPIO_Port GPIOC -#define WIRE_IO_Pin GPIO_PIN_0 +#define LED_Pin GPIO_PIN_9 +#define LED_GPIO_Port GPIOA +#define WIRE_IO_Pin GPIO_PIN_8 #define WIRE_IO_GPIO_Port GPIOB /* USER CODE BEGIN Private defines */ diff --git a/Core/Inc/one_wire.h b/Core/Inc/one_wire.h index baacec6..3527876 100644 --- a/Core/Inc/one_wire.h +++ b/Core/Inc/one_wire.h @@ -33,6 +33,10 @@ typedef struct { } onewire_t; uint8_t onewire_bus_reset(onewire_t *ow); + +onewire_ret_t onrwire_bus_write_bit(onewire_t *ow, uint8_t bit); +uint8_t onewire_bus_read_bit(onewire_t *ow); + onewire_ret_t onewire_bus_write_byte(onewire_t *ow, uint8_t byte); uint8_t onewire_bus_read_byte(onewire_t *ow); onewire_ret_t onewire_bus_search_init(onewire_t *ow); diff --git a/Core/Inc/stm32f1xx_hal_conf.h b/Core/Inc/stm32f1xx_hal_conf.h index f687c7c..7ad1731 100644 --- a/Core/Inc/stm32f1xx_hal_conf.h +++ b/Core/Inc/stm32f1xx_hal_conf.h @@ -48,7 +48,7 @@ /*#define HAL_I2C_MODULE_ENABLED */ /*#define HAL_I2S_MODULE_ENABLED */ /*#define HAL_IRDA_MODULE_ENABLED */ -/*#define HAL_IWDG_MODULE_ENABLED */ +#define HAL_IWDG_MODULE_ENABLED /*#define HAL_NOR_MODULE_ENABLED */ /*#define HAL_NAND_MODULE_ENABLED */ /*#define HAL_PCCARD_MODULE_ENABLED */ diff --git a/Core/Src/ds18b20_onewire.c b/Core/Src/ds18b20_onewire.c new file mode 100644 index 0000000..46176e7 --- /dev/null +++ b/Core/Src/ds18b20_onewire.c @@ -0,0 +1,44 @@ +#include "ds18b20_onewire.h" + +static onewire_ret_t ds18b20_match_rom(ds18b20_t *ds) { + onewire_bus_write_byte(ds->ow_driver, 0x55); // Issue match ROM + for(uint8_t i = 0; i < 8; i++) { + onewire_bus_write_byte(ds->ow_driver, ds->rom.rom_num[i]); + } + + return OW_OK; +} + +onewire_ret_t ds18b20_start_convert(ds18b20_t *ds) { + onewire_bus_reset(ds->ow_driver); + ds18b20_match_rom(ds); + onewire_bus_write_byte(ds->ow_driver, 0x44); // Issue convert T command + + return OW_OK; +} + +uint8_t ds18b20_check_busy(ds18b20_t *ds) { + uint8_t done = onewire_bus_read_bit(ds->ow_driver); + + if(done) return 0; + return 1; +} + +onewire_ret_t ds18b20_read_temperature(ds18b20_t *ds, ds18b20_temp_t *temp) { + onewire_bus_reset(ds->ow_driver); + ds18b20_match_rom(ds); + onewire_bus_write_byte(ds->ow_driver, 0xBE); // Issue read scrachpad command + + temp->t_low = onewire_bus_read_byte(ds->ow_driver); + temp->t_high = onewire_bus_read_byte(ds->ow_driver); + + onewire_bus_reset(ds->ow_driver); + + temp->t_decimal = (temp->t_high & 0xF8) ? 0x8000 : 0x0000; + temp->t_decimal |= (temp->t_high & 0x07) << 8U; + temp->t_decimal |= temp->t_low; + + temp->t_decimal = temp->t_decimal * 625 / 1000; + + return OW_OK; +} \ No newline at end of file diff --git a/Core/Src/main.c b/Core/Src/main.c index 2e66436..8828243 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -24,9 +24,12 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ +#include + #include "usbd_cdc_if.h" #include "one_wire_impl_ll.h" +#include "ds18b20_onewire.h" /* USER CODE END Includes */ @@ -45,12 +48,13 @@ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ +IWDG_HandleTypeDef hiwdg; /* USER CODE BEGIN PV */ onewire_impl_ll_t g_ow_impl = { .GPIOx = WIRE_IO_GPIO_Port, - .PinMask = LL_GPIO_PIN_0 + .PinMask = LL_GPIO_PIN_8 }; onewire_t g_ow = { @@ -67,8 +71,11 @@ onewire_t g_ow = { /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); +static void MX_IWDG_Init(void); /* USER CODE BEGIN PFP */ +void USB_ReEnum(void); + /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ @@ -100,21 +107,27 @@ int main(void) /* USER CODE BEGIN SysInit */ + USB_ReEnum(); + /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USB_DEVICE_Init(); + MX_IWDG_Init(); /* USER CODE BEGIN 2 */ onewire_bus_reset(&g_ow); onewire_rom_num_t rom_num; - onewire_bus_search_init(&g_ow); - while(onewire_bus_search_nextdev(&g_ow, &rom_num)){ - //register_ow_dev(rom_num); - } + ds18b20_t ds_sensor = { + .ow_driver = &g_ow, + }; + + ds18b20_temp_t ds_temp; + + char cdc_buffer[255]; /* USER CODE END 2 */ @@ -122,9 +135,31 @@ int main(void) /* USER CODE BEGIN WHILE */ while (1) { - CDC_Transmit_FS((uint8_t *)"H+\r\n", 4); + onewire_bus_search_init(&g_ow); + while(onewire_bus_search_nextdev(&g_ow, &rom_num) != OW_ERROR){ + ds_sensor.rom = rom_num; + ds18b20_start_convert(&ds_sensor); + while(ds18b20_check_busy(&ds_sensor)) { + HAL_Delay(10); + } + ds18b20_read_temperature(&ds_sensor, &ds_temp); + snprintf(cdc_buffer, 255, "%02x%02x%02x%02x%02x%02x%02x%02x\t%d\r\n", + rom_num.rom_num[0], + rom_num.rom_num[1], + rom_num.rom_num[2], + rom_num.rom_num[3], + rom_num.rom_num[4], + rom_num.rom_num[5], + rom_num.rom_num[6], + rom_num.rom_num[7], + ds_temp.t_decimal + ); + + CDC_Transmit_FS((uint8_t *)cdc_buffer, strlen(cdc_buffer)); + HAL_IWDG_Refresh(&hiwdg); + } HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); - HAL_Delay(1000); + HAL_Delay(100); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ @@ -145,10 +180,11 @@ void SystemClock_Config(void) /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; @@ -180,6 +216,34 @@ void SystemClock_Config(void) HAL_RCC_EnableCSS(); } +/** + * @brief IWDG Initialization Function + * @param None + * @retval None + */ +static void MX_IWDG_Init(void) +{ + + /* USER CODE BEGIN IWDG_Init 0 */ + + /* USER CODE END IWDG_Init 0 */ + + /* USER CODE BEGIN IWDG_Init 1 */ + + /* USER CODE END IWDG_Init 1 */ + hiwdg.Instance = IWDG; + hiwdg.Init.Prescaler = IWDG_PRESCALER_128; + hiwdg.Init.Reload = 4095; + if (HAL_IWDG_Init(&hiwdg) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN IWDG_Init 2 */ + + /* USER CODE END IWDG_Init 2 */ + +} + /** * @brief GPIO Initialization Function * @param None @@ -190,10 +254,9 @@ static void MX_GPIO_Init(void) GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET); @@ -219,6 +282,24 @@ static void MX_GPIO_Init(void) /* USER CODE BEGIN 4 */ +void USB_ReEnum(void) { + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + __HAL_RCC_GPIOA_CLK_ENABLE(); + + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET); + + GPIO_InitStruct.Pin = GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + HAL_Delay(100); + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_12); + + __HAL_RCC_GPIOA_CLK_DISABLE(); +} + /* USER CODE END 4 */ /** diff --git a/Core/Src/one_wire.c b/Core/Src/one_wire.c index 360755b..d84d15b 100644 --- a/Core/Src/one_wire.c +++ b/Core/Src/one_wire.c @@ -97,6 +97,17 @@ static inline onewire_ret_t onewire_op_write_bit(onewire_t *ow, uint8_t bit) { return OW_OK; } +onewire_ret_t onrwire_bus_write_bit(onewire_t *ow, uint8_t bit) { + if(bit) onewire_op_write_one_bit(ow); + else onewire_op_write_zero_bit(ow); + + return OW_OK; +} + +uint8_t onewire_bus_read_bit(onewire_t *ow) { + return onewire_op_read_bit(ow); +} + onewire_ret_t onewire_bus_write_byte(onewire_t *ow, uint8_t byte) { for(uint8_t i = 0; i < 8; i++) { onewire_op_write_bit(ow, byte & 0x01); diff --git a/Core/Src/one_wire_impl_ll.c b/Core/Src/one_wire_impl_ll.c index 9a9f4a9..0f5bb14 100644 --- a/Core/Src/one_wire_impl_ll.c +++ b/Core/Src/one_wire_impl_ll.c @@ -2,10 +2,12 @@ onewire_ret_t ow_impl_delay_us(onewire_impl_ll_t *impl, uint32_t usec) { + if(usec <= 5) return OW_OK; + LL_RCC_ClocksTypeDef clocks; LL_RCC_GetSystemClocksFreq(&clocks); - uint32_t ticks = usec * (clocks.HCLK_Frequency / 1000000); + uint32_t ticks = (usec - 5) * (clocks.HCLK_Frequency / 1000000); SysTick->CTRL = SYSTICK_CLKSOURCE_HCLK; diff --git a/Makefile b/Makefile index 6e3355a..bc195b2 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ########################################################################################################################## -# File automatically-generated by tool: [projectgenerator] version: [3.13.0-B3] date: [Fri May 21 00:30:07 CST 2021] +# File automatically-generated by tool: [projectgenerator] version: [3.13.0-B3] date: [Sat May 22 01:45:40 CST 2021] ########################################################################################################################## # ------------------------------------------------ @@ -38,6 +38,7 @@ BUILD_DIR = build C_SOURCES = \ Core/Src/one_wire.c \ Core/Src/one_wire_impl_ll.c \ +Core/Src/ds18b20_onewire.c \ Core/Src/main.c \ Core/Src/stm32f1xx_it.c \ Core/Src/stm32f1xx_hal_msp.c \ @@ -68,7 +69,8 @@ Core/Src/system_stm32f1xx.c \ Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c \ Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c \ Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c \ -Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c +Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c \ +Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_iwdg.c # ASM sources ASM_SOURCES = \ diff --git a/STM32F103CBT6_Thermograph.ioc b/STM32F103CBT6_Thermograph.ioc index 5b17804..9082879 100644 --- a/STM32F103CBT6_Thermograph.ioc +++ b/STM32F103CBT6_Thermograph.ioc @@ -1,27 +1,32 @@ #MicroXplorer Configuration settings - do not modify File.Version=6 GPIO.groupedBy=Group By Peripherals +IWDG.IPParameters=Reload,Prescaler +IWDG.Prescaler=IWDG_PRESCALER_128 +IWDG.Reload=4095 KeepUserPlacement=false Mcu.Family=STM32F1 -Mcu.IP0=NVIC -Mcu.IP1=RCC -Mcu.IP2=SYS -Mcu.IP3=USB -Mcu.IP4=USB_DEVICE -Mcu.IPNb=5 +Mcu.IP0=IWDG +Mcu.IP1=NVIC +Mcu.IP2=RCC +Mcu.IP3=SYS +Mcu.IP4=USB +Mcu.IP5=USB_DEVICE +Mcu.IPNb=6 Mcu.Name=STM32F103C(8-B)Tx Mcu.Package=LQFP48 -Mcu.Pin0=PC13-TAMPER-RTC -Mcu.Pin1=PD0-OSC_IN -Mcu.Pin2=PD1-OSC_OUT -Mcu.Pin3=PB0 -Mcu.Pin4=PA11 -Mcu.Pin5=PA12 -Mcu.Pin6=PA13 -Mcu.Pin7=PA14 -Mcu.Pin8=VP_SYS_VS_tim4 -Mcu.Pin9=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS -Mcu.PinsNb=10 +Mcu.Pin0=PD0-OSC_IN +Mcu.Pin1=PD1-OSC_OUT +Mcu.Pin10=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS +Mcu.Pin2=PA9 +Mcu.Pin3=PA11 +Mcu.Pin4=PA12 +Mcu.Pin5=PA13 +Mcu.Pin6=PA14 +Mcu.Pin7=PB8 +Mcu.Pin8=VP_IWDG_VS_IWDG +Mcu.Pin9=VP_SYS_VS_tim4 +Mcu.PinsNb=11 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F103CBTx @@ -54,18 +59,18 @@ PA13.Signal=SYS_JTMS-SWDIO PA14.Locked=true PA14.Mode=Serial_Wire PA14.Signal=SYS_JTCK-SWCLK -PB0.GPIOParameters=GPIO_Label,GPIO_Speed,GPIO_ModeDefaultOutputPP,PinState,GPIO_PuPd -PB0.GPIO_Label=WIRE_IO -PB0.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_OD -PB0.GPIO_PuPd=GPIO_PULLUP -PB0.GPIO_Speed=GPIO_SPEED_FREQ_LOW -PB0.Locked=true -PB0.PinState=GPIO_PIN_SET -PB0.Signal=GPIO_Output -PC13-TAMPER-RTC.GPIOParameters=GPIO_Label -PC13-TAMPER-RTC.GPIO_Label=LED -PC13-TAMPER-RTC.Locked=true -PC13-TAMPER-RTC.Signal=GPIO_Output +PA9.GPIOParameters=GPIO_Label +PA9.GPIO_Label=LED +PA9.Locked=true +PA9.Signal=GPIO_Output +PB8.GPIOParameters=GPIO_Label,GPIO_Speed,GPIO_ModeDefaultOutputPP,PinState,GPIO_PuPd +PB8.GPIO_Label=WIRE_IO +PB8.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_OD +PB8.GPIO_PuPd=GPIO_PULLUP +PB8.GPIO_Speed=GPIO_SPEED_FREQ_LOW +PB8.Locked=true +PB8.PinState=GPIO_PIN_SET +PB8.Signal=GPIO_Output PD0-OSC_IN.Locked=true PD0-OSC_IN.Mode=HSE-External-Oscillator PD0-OSC_IN.Signal=RCC_OSC_IN @@ -100,7 +105,7 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=Makefile ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false,4-MX_IWDG_Init-IWDG-false-HAL-true RCC.ADCFreqValue=36000000 RCC.AHBFreq_Value=72000000 RCC.APB1CLKDivider=RCC_HCLK_DIV2 @@ -127,6 +132,8 @@ USB_DEVICE.CLASS_NAME_FS=CDC USB_DEVICE.IPParameters=VirtualMode,VirtualModeFS,CLASS_NAME_FS USB_DEVICE.VirtualMode=Cdc USB_DEVICE.VirtualModeFS=Cdc_FS +VP_IWDG_VS_IWDG.Mode=IWDG_Activate +VP_IWDG_VS_IWDG.Signal=IWDG_VS_IWDG VP_SYS_VS_tim4.Mode=TIM4 VP_SYS_VS_tim4.Signal=SYS_VS_tim4 VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Mode=CDC_FS