diff --git a/firmware/func_gen_stm32f303re_nucleo/Core/Inc/tim.h b/firmware/func_gen_stm32f303re_nucleo/Core/Inc/tim.h index 1cfd24e..4bb229d 100644 --- a/firmware/func_gen_stm32f303re_nucleo/Core/Inc/tim.h +++ b/firmware/func_gen_stm32f303re_nucleo/Core/Inc/tim.h @@ -36,12 +36,17 @@ extern TIM_HandleTypeDef htim2; extern TIM_HandleTypeDef htim3; +extern TIM_HandleTypeDef htim17; + /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ void MX_TIM2_Init(void); void MX_TIM3_Init(void); +void MX_TIM17_Init(void); + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); /* USER CODE BEGIN Prototypes */ diff --git a/firmware/func_gen_stm32f303re_nucleo/Core/Src/main.c b/firmware/func_gen_stm32f303re_nucleo/Core/Src/main.c index ed5409e..c224186 100644 --- a/firmware/func_gen_stm32f303re_nucleo/Core/Src/main.c +++ b/firmware/func_gen_stm32f303re_nucleo/Core/Src/main.c @@ -100,6 +100,7 @@ int main(void) MX_SPI3_Init(); MX_TIM2_Init(); MX_TIM3_Init(); + MX_TIM17_Init(); /* USER CODE BEGIN 2 */ ulog_init(); ulog_subscribe(RTT_console_logger, ULOG_TRACE_LEVEL); @@ -181,9 +182,11 @@ void SystemClock_Config(void) Error_Handler(); } PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_I2C1 - |RCC_PERIPHCLK_TIM2|RCC_PERIPHCLK_TIM34; + |RCC_PERIPHCLK_TIM17|RCC_PERIPHCLK_TIM2 + |RCC_PERIPHCLK_TIM34; PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI; + PeriphClkInit.Tim17ClockSelection = RCC_TIM17CLK_HCLK; PeriphClkInit.Tim2ClockSelection = RCC_TIM2CLK_HCLK; PeriphClkInit.Tim34ClockSelection = RCC_TIM34CLK_HCLK; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) diff --git a/firmware/func_gen_stm32f303re_nucleo/Core/Src/tim.c b/firmware/func_gen_stm32f303re_nucleo/Core/Src/tim.c index 91b3645..d0fcdbc 100644 --- a/firmware/func_gen_stm32f303re_nucleo/Core/Src/tim.c +++ b/firmware/func_gen_stm32f303re_nucleo/Core/Src/tim.c @@ -26,6 +26,7 @@ TIM_HandleTypeDef htim2; TIM_HandleTypeDef htim3; +TIM_HandleTypeDef htim17; /* TIM2 init function */ void MX_TIM2_Init(void) @@ -110,6 +111,64 @@ void MX_TIM3_Init(void) /* USER CODE END TIM3_Init 2 */ +} +/* TIM17 init function */ +void MX_TIM17_Init(void) +{ + + /* USER CODE BEGIN TIM17_Init 0 */ + + /* USER CODE END TIM17_Init 0 */ + + TIM_OC_InitTypeDef sConfigOC = {0}; + TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; + + /* USER CODE BEGIN TIM17_Init 1 */ + + /* USER CODE END TIM17_Init 1 */ + htim17.Instance = TIM17; + htim17.Init.Prescaler = 0; + htim17.Init.CounterMode = TIM_COUNTERMODE_UP; + htim17.Init.Period = 2; + htim17.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim17.Init.RepetitionCounter = 0; + htim17.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim17) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_Init(&htim17) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 1; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_ENABLE; + sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; + sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; + if (HAL_TIM_PWM_ConfigChannel(&htim17, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; + sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; + sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; + sBreakDeadTimeConfig.DeadTime = 0; + sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; + sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; + sBreakDeadTimeConfig.BreakFilter = 0; + sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; + if (HAL_TIMEx_ConfigBreakDeadTime(&htim17, &sBreakDeadTimeConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM17_Init 2 */ + + /* USER CODE END TIM17_Init 2 */ + HAL_TIM_MspPostInit(&htim17); + } void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) @@ -126,6 +185,17 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) /* USER CODE END TIM2_MspInit 1 */ } + else if(tim_baseHandle->Instance==TIM17) + { + /* USER CODE BEGIN TIM17_MspInit 0 */ + + /* USER CODE END TIM17_MspInit 0 */ + /* TIM17 clock enable */ + __HAL_RCC_TIM17_CLK_ENABLE(); + /* USER CODE BEGIN TIM17_MspInit 1 */ + + /* USER CODE END TIM17_MspInit 1 */ + } } void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef* tim_encoderHandle) @@ -157,6 +227,33 @@ void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef* tim_encoderHandle) /* USER CODE END TIM3_MspInit 1 */ } } +void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(timHandle->Instance==TIM17) + { + /* USER CODE BEGIN TIM17_MspPostInit 0 */ + + /* USER CODE END TIM17_MspPostInit 0 */ + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**TIM17 GPIO Configuration + PB5 ------> TIM17_CH1 + */ + GPIO_InitStruct.Pin = GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF10_TIM17; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM17_MspPostInit 1 */ + + /* USER CODE END TIM17_MspPostInit 1 */ + } + +} void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) { @@ -172,6 +269,17 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) /* USER CODE END TIM2_MspDeInit 1 */ } + else if(tim_baseHandle->Instance==TIM17) + { + /* USER CODE BEGIN TIM17_MspDeInit 0 */ + + /* USER CODE END TIM17_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM17_CLK_DISABLE(); + /* USER CODE BEGIN TIM17_MspDeInit 1 */ + + /* USER CODE END TIM17_MspDeInit 1 */ + } } void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef* tim_encoderHandle) diff --git a/firmware/func_gen_stm32f303re_nucleo/Makefile b/firmware/func_gen_stm32f303re_nucleo/Makefile index a0b9a88..cfde730 100644 --- a/firmware/func_gen_stm32f303re_nucleo/Makefile +++ b/firmware/func_gen_stm32f303re_nucleo/Makefile @@ -1,5 +1,5 @@ ########################################################################################################################## -# File automatically-generated by tool: [projectgenerator] version: [3.17.1] date: [Mon Jul 31 16:49:59 CEST 2023] +# File automatically-generated by tool: [projectgenerator] version: [3.17.1] date: [Tue Aug 01 10:57:07 CEST 2023] ########################################################################################################################## # ------------------------------------------------ diff --git a/firmware/func_gen_stm32f303re_nucleo/func_gen_stm32f303re_nucleo.ioc b/firmware/func_gen_stm32f303re_nucleo/func_gen_stm32f303re_nucleo.ioc index 5b57eb2..bc9f637 100644 --- a/firmware/func_gen_stm32f303re_nucleo/func_gen_stm32f303re_nucleo.ioc +++ b/firmware/func_gen_stm32f303re_nucleo/func_gen_stm32f303re_nucleo.ioc @@ -15,8 +15,9 @@ Mcu.IP4=SPI3 Mcu.IP5=SYS Mcu.IP6=TIM2 Mcu.IP7=TIM3 -Mcu.IP8=USART2 -Mcu.IPNb=9 +Mcu.IP8=TIM17 +Mcu.IP9=USART2 +Mcu.IPNb=10 Mcu.Name=STM32F303R(D-E)Tx Mcu.Package=LQFP64 Mcu.Pin0=PC13 @@ -45,18 +46,20 @@ Mcu.Pin29=PC11 Mcu.Pin3=PF0-OSC_IN Mcu.Pin30=PC12 Mcu.Pin31=PB3 -Mcu.Pin32=PB6 -Mcu.Pin33=PB7 -Mcu.Pin34=PB9 -Mcu.Pin35=VP_SYS_VS_Systick -Mcu.Pin36=VP_TIM2_VS_ClockSourceINT +Mcu.Pin32=PB5 +Mcu.Pin33=PB6 +Mcu.Pin34=PB7 +Mcu.Pin35=PB9 +Mcu.Pin36=VP_SYS_VS_Systick +Mcu.Pin37=VP_TIM2_VS_ClockSourceINT +Mcu.Pin38=VP_TIM17_VS_ClockSourceINT Mcu.Pin4=PF1-OSC_OUT Mcu.Pin5=PA0 Mcu.Pin6=PA1 Mcu.Pin7=PA2 Mcu.Pin8=PA3 Mcu.Pin9=PA4 -Mcu.PinsNb=37 +Mcu.PinsNb=39 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F303RETx @@ -160,6 +163,7 @@ PB3.GPIOParameters=GPIO_Label PB3.GPIO_Label=SWO PB3.Locked=true PB3.Signal=SYS_JTDO-TRACESWO +PB5.Signal=S_TIM17_CH1 PB6.Locked=true PB6.Mode=I2C PB6.Signal=I2C1_SCL @@ -253,9 +257,9 @@ RCC.I2C1Freq_Value=8000000 RCC.I2C2Freq_Value=8000000 RCC.I2C3Freq_Value=8000000 RCC.I2SClocksFreq_Value=72000000 -RCC.IPParameters=ADC12outputFreq_Value,ADC34outputFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2SClocksFreq_Value,LSI_VALUE,MCOFreq_Value,PLLCLKFreq_Value,PLLM,PLLMCOFreq_Value,PLLMUL,PLLN,PLLP,PLLQ,RCC_PLLsource_Clock_Source_FROM_HSE,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSourceVirtual,TIM15Freq_Value,TIM16Freq_Value,TIM17Freq_Value,TIM1Freq_Value,TIM20Freq_Value,TIM2Freq_Value,TIM3Freq_Value,TIM8Freq_Value,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOOutput2Freq_Value +RCC.IPParameters=ADC12outputFreq_Value,ADC34outputFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2SClocksFreq_Value,LSI_VALUE,MCOFreq_Value,PLLCLKFreq_Value,PLLM,PLLMCOFreq_Value,PLLMUL,PLLN,PLLP,PLLQ,RCC_MCODiv,RCC_MCOSource,RCC_PLLsource_Clock_Source_FROM_HSE,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSourceVirtual,TIM15Freq_Value,TIM16Freq_Value,TIM17Freq_Value,TIM1Freq_Value,TIM20Freq_Value,TIM2Freq_Value,TIM3Freq_Value,TIM8Freq_Value,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOOutput2Freq_Value RCC.LSI_VALUE=40000 -RCC.MCOFreq_Value=72000000 +RCC.MCOFreq_Value=9000000 RCC.PLLCLKFreq_Value=72000000 RCC.PLLM=8 RCC.PLLMCOFreq_Value=72000000 @@ -263,6 +267,8 @@ RCC.PLLMUL=RCC_PLL_MUL9 RCC.PLLN=336 RCC.PLLP=RCC_PLLP_DIV4 RCC.PLLQ=7 +RCC.RCC_MCODiv=RCC_MCODIV_8 +RCC.RCC_MCOSource=RCC_MCO1SOURCE_PLLCLK RCC.RCC_PLLsource_Clock_Source_FROM_HSE=RCC_HSE_PREDIV_DIV2 RCC.RTCFreq_Value=40000 RCC.RTCHSEDivFreq_Value=250000 @@ -285,6 +291,8 @@ RCC.USBFreq_Value=72000000 RCC.VCOOutput2Freq_Value=8000000 SH.GPXTI13.0=GPIO_EXTI13 SH.GPXTI13.ConfNb=1 +SH.S_TIM17_CH1.0=TIM17_CH1,PWM Generation1 CH1 +SH.S_TIM17_CH1.ConfNb=1 SH.S_TIM3_CH1.0=TIM3_CH1,Encoder_Interface SH.S_TIM3_CH1.ConfNb=1 SH.S_TIM3_CH2.0=TIM3_CH2,Encoder_Interface @@ -305,6 +313,12 @@ SPI3.Direction=SPI_DIRECTION_1LINE SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler,DataSize SPI3.Mode=SPI_MODE_MASTER SPI3.VirtualType=VM_MASTER +TIM17.Channel=TIM_CHANNEL_1 +TIM17.IPParameters=Channel,Period,OCFastMode_PWM,OCIdleState_1,Pulse +TIM17.OCFastMode_PWM=TIM_OCFAST_ENABLE +TIM17.OCIdleState_1=TIM_OCIDLESTATE_RESET +TIM17.Period=2 +TIM17.Pulse=1 TIM2.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE TIM2.IPParameters=AutoReloadPreload TIM3.IC1Filter=15 @@ -315,6 +329,8 @@ USART2.IPParameters=VirtualMode-Asynchronous USART2.VirtualMode-Asynchronous=VM_ASYNC VP_SYS_VS_Systick.Mode=SysTick VP_SYS_VS_Systick.Signal=SYS_VS_Systick +VP_TIM17_VS_ClockSourceINT.Mode=Enable_Timer +VP_TIM17_VS_ClockSourceINT.Signal=TIM17_VS_ClockSourceINT VP_TIM2_VS_ClockSourceINT.Mode=Internal VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT board=NUCLEO-F303RE diff --git a/firmware/shared_libs/controllers/ctrl_app.c b/firmware/shared_libs/controllers/ctrl_app.c index 7717a91..1d1779c 100644 --- a/firmware/shared_libs/controllers/ctrl_app.c +++ b/firmware/shared_libs/controllers/ctrl_app.c @@ -1,4 +1,5 @@ #include "main.h" +#include "tim.h" #include "hw_button.h" #include "ctrl_bottom_button.h" #include "ctrl_channel_button.h" @@ -154,6 +155,14 @@ void CTRL_longPushedChanBtnEvent(ButtonKey_t *key) ULOG_TRACE("Chan btn(long): %d", key->instance); GEN_channel_t channel = btn_ch_to_chan[key->instance]; + if (channel == CHANNEL2) + { + if (HAL_TIM_Base_Start(&htim17) == HAL_ERROR) + { + HAL_TIM_Base_Stop(&htim17); + } + } + switch (signal_gen[channel].type) { case GEN_FG_TYPE: