From 9bbed9f1c47df7ec76dc20e146bf2412bf6c39ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Sat, 4 Mar 2023 22:11:26 +0100 Subject: [PATCH] update cube project --- BluepillTrouba.ioc | 80 ++++++++++++++------------- BluepillTrouba.txt | 132 +++++++++++++++++++++++++++++++++++++++++++++ Core/Inc/main.h | 26 ++++----- Core/Inc/tim.h | 3 ++ Core/Src/gpio.c | 20 ++----- Core/Src/main.c | 1 + Core/Src/tim.c | 101 ++++++++++++++++++++++++++++++++-- Makefile | 2 +- pt100.gnumeric | Bin 0 -> 12488 bytes 9 files changed, 297 insertions(+), 68 deletions(-) create mode 100644 BluepillTrouba.txt create mode 100644 pt100.gnumeric diff --git a/BluepillTrouba.ioc b/BluepillTrouba.ioc index 1123a00..b79f4f3 100644 --- a/BluepillTrouba.ioc +++ b/BluepillTrouba.ioc @@ -42,8 +42,9 @@ Mcu.CPN=STM32F103CBT6 Mcu.Family=STM32F1 Mcu.IP0=ADC1 Mcu.IP1=DMA -Mcu.IP10=TIM4 -Mcu.IP11=USART1 +Mcu.IP10=TIM3 +Mcu.IP11=TIM4 +Mcu.IP12=USART1 Mcu.IP2=FREERTOS Mcu.IP3=IWDG Mcu.IP4=NVIC @@ -52,23 +53,23 @@ Mcu.IP6=RTC Mcu.IP7=SPI1 Mcu.IP8=SYS Mcu.IP9=TIM2 -Mcu.IPNb=12 +Mcu.IPNb=13 Mcu.Name=STM32F103C(8-B)Tx Mcu.Package=LQFP48 Mcu.Pin0=PC13-TAMPER-RTC Mcu.Pin1=PC14-OSC32_IN -Mcu.Pin10=PA6 -Mcu.Pin11=PA7 -Mcu.Pin12=PB11 +Mcu.Pin10=PB0 +Mcu.Pin11=PB1 +Mcu.Pin12=PB10 Mcu.Pin13=PA9 Mcu.Pin14=PA10 Mcu.Pin15=PA13 Mcu.Pin16=PA14 Mcu.Pin17=PA15 -Mcu.Pin18=PB5 -Mcu.Pin19=PB6 +Mcu.Pin18=PB6 +Mcu.Pin19=PB7 Mcu.Pin2=PC15-OSC32_OUT -Mcu.Pin20=PB7 +Mcu.Pin20=PB8 Mcu.Pin21=VP_ADC1_TempSens_Input Mcu.Pin22=VP_ADC1_Vref_Input Mcu.Pin23=VP_FREERTOS_VS_CMSIS_V2 @@ -77,14 +78,15 @@ Mcu.Pin25=VP_RTC_VS_RTC_Activate Mcu.Pin26=VP_RTC_No_RTC_Output Mcu.Pin27=VP_SYS_VS_tim1 Mcu.Pin28=VP_TIM2_VS_ClockSourceINT +Mcu.Pin29=VP_TIM3_VS_ClockSourceINT Mcu.Pin3=PD0-OSC_IN Mcu.Pin4=PD1-OSC_OUT Mcu.Pin5=PA0-WKUP Mcu.Pin6=PA1 -Mcu.Pin7=PA3 -Mcu.Pin8=PA4 -Mcu.Pin9=PA5 -Mcu.PinsNb=29 +Mcu.Pin7=PA5 +Mcu.Pin8=PA6 +Mcu.Pin9=PA7 +Mcu.PinsNb=30 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F103CBTx @@ -128,45 +130,43 @@ PA15.GPIOParameters=GPIO_Speed,GPIO_Label PA15.GPIO_Label=BUZZER PA15.GPIO_Speed=GPIO_SPEED_FREQ_HIGH PA15.Signal=S_TIM2_CH1_ETR -PA3.GPIOParameters=GPIO_Label -PA3.GPIO_Label=OLED_RST -PA3.Locked=true -PA3.Signal=GPIO_Output -PA4.GPIOParameters=GPIO_Label -PA4.GPIO_Label=OLED_DC -PA4.Locked=true -PA4.Signal=GPIO_Output PA5.GPIOParameters=GPIO_Label PA5.GPIO_Label=OLED_SCLK PA5.Mode=TX_Only_Simplex_Unidirect_Master PA5.Signal=SPI1_SCK PA6.GPIOParameters=GPIO_Label -PA6.GPIO_Label=OLED_CS -PA6.Locked=true -PA6.Signal=GPIO_Output +PA6.GPIO_Label=HEATER +PA6.Signal=S_TIM3_CH1 PA7.GPIOParameters=GPIO_Label PA7.GPIO_Label=OLED_MOSI PA7.Mode=TX_Only_Simplex_Unidirect_Master PA7.Signal=SPI1_MOSI PA9.Mode=Asynchronous PA9.Signal=USART1_TX -PB11.GPIOParameters=GPIO_Label -PB11.GPIO_Label=HEATER -PB11.Locked=true -PB11.Signal=GPIO_Output -PB5.GPIOParameters=GPIO_PuPd,GPIO_Label -PB5.GPIO_Label=KNOB_PUSH -PB5.GPIO_PuPd=GPIO_PULLUP -PB5.Locked=true -PB5.Signal=GPIO_Input +PB0.GPIOParameters=GPIO_Label +PB0.GPIO_Label=OLED_CS +PB0.Locked=true +PB0.Signal=GPIO_Output +PB1.GPIOParameters=GPIO_Label +PB1.GPIO_Label=OLED_DC +PB1.Locked=true +PB1.Signal=GPIO_Output +PB10.GPIOParameters=GPIO_Label +PB10.GPIO_Label=OLED_RST +PB10.Locked=true +PB10.Signal=GPIO_Output PB6.GPIOParameters=GPIO_PuPd,GPIO_Label -PB6.GPIO_Label=KNOB_B +PB6.GPIO_Label=KNOB_A PB6.GPIO_PuPd=GPIO_PULLUP PB6.Signal=S_TIM4_CH1 PB7.GPIOParameters=GPIO_PuPd,GPIO_Label -PB7.GPIO_Label=KNOB_A +PB7.GPIO_Label=KNOB_B PB7.GPIO_PuPd=GPIO_PULLUP PB7.Signal=S_TIM4_CH2 +PB8.GPIOParameters=GPIO_Label +PB8.GPIO_Label=KNOB_PUSH +PB8.Locked=true +PB8.Signal=GPIO_Input PC13-TAMPER-RTC.GPIOParameters=GPIO_Label PC13-TAMPER-RTC.GPIO_Label=LED PC13-TAMPER-RTC.Locked=true @@ -207,7 +207,7 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=Makefile ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_IWDG_Init-IWDG-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_ADC1_Init-ADC1-false-HAL-true,6-MX_SPI1_Init-SPI1-false-HAL-true,7-MX_DMA_Init-DMA-false-HAL-true,8-MX_TIM4_Init-TIM4-false-HAL-true,9-MX_TIM2_Init-TIM2-false-HAL-true +ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_IWDG_Init-IWDG-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_ADC1_Init-ADC1-false-HAL-true,6-MX_SPI1_Init-SPI1-false-HAL-true,7-MX_DMA_Init-DMA-false-HAL-true,8-MX_TIM4_Init-TIM4-false-HAL-true,9-MX_TIM2_Init-TIM2-false-HAL-true,10-MX_RTC_Init-RTC-false-HAL-true RCC.ADCFreqValue=2250000 RCC.ADCPresc=RCC_ADCPCLK2_DIV8 RCC.AHBFreq_Value=72000000 @@ -239,6 +239,8 @@ SH.ADCx_IN1.0=ADC1_IN1,IN1 SH.ADCx_IN1.ConfNb=1 SH.S_TIM2_CH1_ETR.0=TIM2_CH1,PWM Generation1 CH1 SH.S_TIM2_CH1_ETR.ConfNb=1 +SH.S_TIM3_CH1.0=TIM3_CH1,PWM Generation1 CH1 +SH.S_TIM3_CH1.ConfNb=1 SH.S_TIM4_CH1.0=TIM4_CH1,Encoder_Interface SH.S_TIM4_CH1.ConfNb=1 SH.S_TIM4_CH2.0=TIM4_CH2,Encoder_Interface @@ -252,6 +254,10 @@ SPI1.VirtualType=VM_MASTER TIM2.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 TIM2.IPParameters=Channel-PWM Generation1 CH1,Prescaler TIM2.Prescaler=2 +TIM3.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 +TIM3.IPParameters=Channel-PWM Generation1 CH1,Prescaler,Pulse-PWM Generation1 CH1 +TIM3.Prescaler=2 +TIM3.Pulse-PWM\ Generation1\ CH1=32768 TIM4.IC2Filter=15 TIM4.IPParameters=IC2Filter,Prescaler TIM4.Prescaler=0 @@ -274,4 +280,6 @@ VP_SYS_VS_tim1.Mode=TIM1 VP_SYS_VS_tim1.Signal=SYS_VS_tim1 VP_TIM2_VS_ClockSourceINT.Mode=Internal VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT +VP_TIM3_VS_ClockSourceINT.Mode=Internal +VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT board=custom diff --git a/BluepillTrouba.txt b/BluepillTrouba.txt new file mode 100644 index 0000000..a0d5d28 --- /dev/null +++ b/BluepillTrouba.txt @@ -0,0 +1,132 @@ +Configuration BluepillTrouba +STM32CubeMX 6.5.0 +Date 03/04/2023 +MCU STM32F103CBTx + + + +PERIPHERALS MODES FUNCTIONS PINS +ADC1 IN0 ADC1_IN0 PA0-WKUP +ADC1 IN1 ADC1_IN1 PA1 +ADC1 Single-ended ADC1_TempSens_Input VP_ADC1_TempSens_Input +ADC1 Vrefint Channel ADC1_Vref_Input VP_ADC1_Vref_Input +RCC Crystal/Ceramic Resonator RCC_OSC_IN PD0-OSC_IN +RCC Crystal/Ceramic Resonator RCC_OSC_OUT PD1-OSC_OUT +RCC Crystal/Ceramic Resonator RCC_OSC32_IN PC14-OSC32_IN +RCC Crystal/Ceramic Resonator RCC_OSC32_OUT PC15-OSC32_OUT +RTC Activate Clock Source RTC_VS_RTC_Activate VP_RTC_VS_RTC_Activate +RTC No RTC Output RTC_No_RTC_Output VP_RTC_No_RTC_Output +SPI1 Transmit Only Master SPI1_MOSI PA7 +SPI1 Transmit Only Master SPI1_SCK PA5 +SYS Serial Wire SYS_JTCK-SWCLK PA14 +SYS Serial Wire SYS_JTMS-SWDIO PA13 +SYS TIM1 SYS_VS_tim1 VP_SYS_VS_tim1 +TIM2 Internal Clock TIM2_VS_ClockSourceINT VP_TIM2_VS_ClockSourceINT +TIM2 PWM Generation CH1 TIM2_CH1 PA15 +TIM3 Internal Clock TIM3_VS_ClockSourceINT VP_TIM3_VS_ClockSourceINT +TIM3 PWM Generation CH1 TIM3_CH1 PA6 +TIM4 Encoder Mode TIM4_CH1 PB6 +TIM4 Encoder Mode TIM4_CH2 PB7 +USART1 Asynchronous USART1_RX PA10 +USART1 Asynchronous USART1_TX PA9 + + + +Pin Nb PINs FUNCTIONs LABELs +2 PC13-TAMPER-RTC GPIO_Output LED +3 PC14-OSC32_IN RCC_OSC32_IN +4 PC15-OSC32_OUT RCC_OSC32_OUT +5 PD0-OSC_IN RCC_OSC_IN +6 PD1-OSC_OUT RCC_OSC_OUT +10 PA0-WKUP ADC1_IN0 ADC_PT100 +11 PA1 ADC1_IN1 ADC_SENSR +15 PA5 SPI1_SCK OLED_SCLK +16 PA6 TIM3_CH1 HEATER +17 PA7 SPI1_MOSI OLED_MOSI +18 PB0 GPIO_Output OLED_CS +19 PB1 GPIO_Output OLED_DC +21 PB10 GPIO_Output OLED_RST +30 PA9 USART1_TX +31 PA10 USART1_RX +34 PA13 SYS_JTMS-SWDIO +37 PA14 SYS_JTCK-SWCLK +38 PA15 TIM2_CH1 BUZZER +42 PB6 TIM4_CH1 KNOB_A +43 PB7 TIM4_CH2 KNOB_B +45 PB8 GPIO_Input KNOB_PUSH +PERIPHERALS MODES FUNCTIONS PINS +ADC1 IN0 ADC1_IN0 PA0-WKUP +ADC1 IN1 ADC1_IN1 PA1 +ADC1 Single-ended ADC1_TempSens_Input VP_ADC1_TempSens_Input +ADC1 Vrefint Channel ADC1_Vref_Input VP_ADC1_Vref_Input +RCC Crystal/Ceramic Resonator RCC_OSC_IN PD0-OSC_IN +RCC Crystal/Ceramic Resonator RCC_OSC_OUT PD1-OSC_OUT +RCC Crystal/Ceramic Resonator RCC_OSC32_IN PC14-OSC32_IN +RCC Crystal/Ceramic Resonator RCC_OSC32_OUT PC15-OSC32_OUT +RTC Activate Clock Source RTC_VS_RTC_Activate VP_RTC_VS_RTC_Activate +RTC No RTC Output RTC_No_RTC_Output VP_RTC_No_RTC_Output +SPI1 Transmit Only Master SPI1_MOSI PA7 +SPI1 Transmit Only Master SPI1_SCK PA5 +SYS Serial Wire SYS_JTCK-SWCLK PA14 +SYS Serial Wire SYS_JTMS-SWDIO PA13 +SYS TIM1 SYS_VS_tim1 VP_SYS_VS_tim1 +TIM2 Internal Clock TIM2_VS_ClockSourceINT VP_TIM2_VS_ClockSourceINT +TIM2 PWM Generation CH1 TIM2_CH1 PA15 +TIM3 Internal Clock TIM3_VS_ClockSourceINT VP_TIM3_VS_ClockSourceINT +TIM3 PWM Generation CH1 TIM3_CH1 PA6 +TIM4 Encoder Mode TIM4_CH1 PB6 +TIM4 Encoder Mode TIM4_CH2 PB7 +USART1 Asynchronous USART1_RX PA10 +USART1 Asynchronous USART1_TX PA9 + + + +Pin Nb PINs FUNCTIONs LABELs +2 PC13-TAMPER-RTC GPIO_Output LED +3 PC14-OSC32_IN RCC_OSC32_IN +4 PC15-OSC32_OUT RCC_OSC32_OUT +5 PD0-OSC_IN RCC_OSC_IN +6 PD1-OSC_OUT RCC_OSC_OUT +10 PA0-WKUP ADC1_IN0 ADC_PT100 +11 PA1 ADC1_IN1 ADC_SENSR +15 PA5 SPI1_SCK OLED_SCLK +16 PA6 TIM3_CH1 HEATER +17 PA7 SPI1_MOSI OLED_MOSI +18 PB0 GPIO_Output OLED_CS +19 PB1 GPIO_Output OLED_DC +21 PB10 GPIO_Output OLED_RST +30 PA9 USART1_TX +31 PA10 USART1_RX +34 PA13 SYS_JTMS-SWDIO +37 PA14 SYS_JTCK-SWCLK +38 PA15 TIM2_CH1 BUZZER +42 PB6 TIM4_CH1 KNOB_A +43 PB7 TIM4_CH2 KNOB_B +45 PB8 GPIO_Input KNOB_PUSH + + + +SOFTWARE PROJECT + +Project Settings : +Project Name : BluepillTrouba +Project Folder : /home/ondra/STM32Cube/BluepillTrouba +Toolchain / IDE : Makefile +Firmware Package Name and Version : STM32Cube FW_F1 V1.8.4 + + +Code Generation Settings : +STM32Cube MCU packages and embedded software packs : Copy only the necessary library files +Generate peripheral initialization as a pair of '.c/.h' files per peripheral : Yes +Backup previously generated files when re-generating : No +Delete previously generated files when not re-generated : Yes +Set all free pins as analog (to optimize the power consumption) : No + + +Toolchains Settings : +Compiler Optimizations : + + + + + diff --git a/Core/Inc/main.h b/Core/Inc/main.h index a2271fb..ce59137 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -63,26 +63,26 @@ void Error_Handler(void); #define ADC_PT100_GPIO_Port GPIOA #define ADC_SENSR_Pin GPIO_PIN_1 #define ADC_SENSR_GPIO_Port GPIOA -#define OLED_RST_Pin GPIO_PIN_3 -#define OLED_RST_GPIO_Port GPIOA -#define OLED_DC_Pin GPIO_PIN_4 -#define OLED_DC_GPIO_Port GPIOA #define OLED_SCLK_Pin GPIO_PIN_5 #define OLED_SCLK_GPIO_Port GPIOA -#define OLED_CS_Pin GPIO_PIN_6 -#define OLED_CS_GPIO_Port GPIOA +#define HEATER_Pin GPIO_PIN_6 +#define HEATER_GPIO_Port GPIOA #define OLED_MOSI_Pin GPIO_PIN_7 #define OLED_MOSI_GPIO_Port GPIOA -#define HEATER_Pin GPIO_PIN_11 -#define HEATER_GPIO_Port GPIOB +#define OLED_CS_Pin GPIO_PIN_0 +#define OLED_CS_GPIO_Port GPIOB +#define OLED_DC_Pin GPIO_PIN_1 +#define OLED_DC_GPIO_Port GPIOB +#define OLED_RST_Pin GPIO_PIN_10 +#define OLED_RST_GPIO_Port GPIOB #define BUZZER_Pin GPIO_PIN_15 #define BUZZER_GPIO_Port GPIOA -#define KNOB_PUSH_Pin GPIO_PIN_5 -#define KNOB_PUSH_GPIO_Port GPIOB -#define KNOB_B_Pin GPIO_PIN_6 -#define KNOB_B_GPIO_Port GPIOB -#define KNOB_A_Pin GPIO_PIN_7 +#define KNOB_A_Pin GPIO_PIN_6 #define KNOB_A_GPIO_Port GPIOB +#define KNOB_B_Pin GPIO_PIN_7 +#define KNOB_B_GPIO_Port GPIOB +#define KNOB_PUSH_Pin GPIO_PIN_8 +#define KNOB_PUSH_GPIO_Port GPIOB /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ diff --git a/Core/Inc/tim.h b/Core/Inc/tim.h index 280ba03..9f1cdf9 100644 --- a/Core/Inc/tim.h +++ b/Core/Inc/tim.h @@ -34,6 +34,8 @@ extern "C" { extern TIM_HandleTypeDef htim2; +extern TIM_HandleTypeDef htim3; + extern TIM_HandleTypeDef htim4; /* USER CODE BEGIN Private defines */ @@ -41,6 +43,7 @@ extern TIM_HandleTypeDef htim4; /* USER CODE END Private defines */ void MX_TIM2_Init(void); +void MX_TIM3_Init(void); void MX_TIM4_Init(void); void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c index 7b97247..c20a16c 100644 --- a/Core/Src/gpio.c +++ b/Core/Src/gpio.c @@ -54,10 +54,7 @@ void MX_GPIO_Init(void) HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOA, OLED_RST_Pin|OLED_DC_Pin|OLED_CS_Pin, GPIO_PIN_RESET); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(HEATER_GPIO_Port, HEATER_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOB, OLED_CS_Pin|OLED_DC_Pin|OLED_RST_Pin, GPIO_PIN_RESET); /*Configure GPIO pin : PtPin */ GPIO_InitStruct.Pin = LED_Pin; @@ -66,24 +63,17 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct); - /*Configure GPIO pins : PAPin PAPin PAPin */ - GPIO_InitStruct.Pin = OLED_RST_Pin|OLED_DC_Pin|OLED_CS_Pin; - 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); - - /*Configure GPIO pin : PtPin */ - GPIO_InitStruct.Pin = HEATER_Pin; + /*Configure GPIO pins : PBPin PBPin PBPin */ + GPIO_InitStruct.Pin = OLED_CS_Pin|OLED_DC_Pin|OLED_RST_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(HEATER_GPIO_Port, &GPIO_InitStruct); + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure GPIO pin : PtPin */ GPIO_InitStruct.Pin = KNOB_PUSH_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(KNOB_PUSH_GPIO_Port, &GPIO_InitStruct); } diff --git a/Core/Src/main.c b/Core/Src/main.c index 8f160c8..7a6de37 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -106,6 +106,7 @@ int main(void) MX_TIM4_Init(); MX_TIM2_Init(); MX_RTC_Init(); + MX_TIM3_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ diff --git a/Core/Src/tim.c b/Core/Src/tim.c index 1443046..62589c2 100644 --- a/Core/Src/tim.c +++ b/Core/Src/tim.c @@ -25,6 +25,7 @@ /* USER CODE END 0 */ TIM_HandleTypeDef htim2; +TIM_HandleTypeDef htim3; TIM_HandleTypeDef htim4; /* TIM2 init function */ @@ -80,6 +81,60 @@ void MX_TIM2_Init(void) /* USER CODE END TIM2_Init 2 */ HAL_TIM_MspPostInit(&htim2); +} +/* TIM3 init function */ +void MX_TIM3_Init(void) +{ + + /* USER CODE BEGIN TIM3_Init 0 */ + + /* USER CODE END TIM3_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + TIM_OC_InitTypeDef sConfigOC = {0}; + + /* USER CODE BEGIN TIM3_Init 1 */ + + /* USER CODE END TIM3_Init 1 */ + htim3.Instance = TIM3; + htim3.Init.Prescaler = 2; + htim3.Init.CounterMode = TIM_COUNTERMODE_UP; + htim3.Init.Period = 65535; + htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim3) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_Init(&htim3) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 32768; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM3_Init 2 */ + + /* USER CODE END TIM3_Init 2 */ + HAL_TIM_MspPostInit(&htim3); + } /* TIM4 init function */ void MX_TIM4_Init(void) @@ -140,6 +195,17 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) /* USER CODE END TIM2_MspInit 1 */ } + else if(tim_baseHandle->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspInit 0 */ + + /* USER CODE END TIM3_MspInit 0 */ + /* TIM3 clock enable */ + __HAL_RCC_TIM3_CLK_ENABLE(); + /* USER CODE BEGIN TIM3_MspInit 1 */ + + /* USER CODE END TIM3_MspInit 1 */ + } } void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef* tim_encoderHandle) @@ -159,7 +225,7 @@ void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef* tim_encoderHandle) PB6 ------> TIM4_CH1 PB7 ------> TIM4_CH2 */ - GPIO_InitStruct.Pin = KNOB_B_Pin|KNOB_A_Pin; + GPIO_InitStruct.Pin = KNOB_A_Pin|KNOB_B_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); @@ -181,7 +247,6 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) /* USER CODE BEGIN TIM2_MspPostInit 0 */ /* USER CODE END TIM2_MspPostInit 0 */ - __HAL_RCC_GPIOA_CLK_ENABLE(); /**TIM2 GPIO Configuration PA15 ------> TIM2_CH1 @@ -197,6 +262,25 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) /* USER CODE END TIM2_MspPostInit 1 */ } + else if(timHandle->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspPostInit 0 */ + + /* USER CODE END TIM3_MspPostInit 0 */ + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**TIM3 GPIO Configuration + PA6 ------> TIM3_CH1 + */ + GPIO_InitStruct.Pin = HEATER_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(HEATER_GPIO_Port, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM3_MspPostInit 1 */ + + /* USER CODE END TIM3_MspPostInit 1 */ + } } @@ -214,6 +298,17 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) /* USER CODE END TIM2_MspDeInit 1 */ } + else if(tim_baseHandle->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspDeInit 0 */ + + /* USER CODE END TIM3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM3_CLK_DISABLE(); + /* USER CODE BEGIN TIM3_MspDeInit 1 */ + + /* USER CODE END TIM3_MspDeInit 1 */ + } } void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef* tim_encoderHandle) @@ -231,7 +326,7 @@ void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef* tim_encoderHandle) PB6 ------> TIM4_CH1 PB7 ------> TIM4_CH2 */ - HAL_GPIO_DeInit(GPIOB, KNOB_B_Pin|KNOB_A_Pin); + HAL_GPIO_DeInit(GPIOB, KNOB_A_Pin|KNOB_B_Pin); /* TIM4 interrupt Deinit */ HAL_NVIC_DisableIRQ(TIM4_IRQn); diff --git a/Makefile b/Makefile index 0749da0..9105f96 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ########################################################################################################################## -# File automatically-generated by tool: [projectgenerator] version: [3.16.0] date: [Thu Feb 23 00:46:03 CET 2023] +# File automatically-generated by tool: [projectgenerator] version: [3.16.0] date: [Sat Mar 04 11:28:52 CET 2023] ########################################################################################################################## # ------------------------------------------------ diff --git a/pt100.gnumeric b/pt100.gnumeric new file mode 100644 index 0000000000000000000000000000000000000000..13a168f117b7d87813b99ec62895db1a3c476546 GIT binary patch literal 12488 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 G=>GswrD!Ao literal 0 HcmV?d00001