diff --git a/Core/Inc/tim.h b/Core/Inc/tim.h index 46c0a2a..10d4966 100644 --- a/Core/Inc/tim.h +++ b/Core/Inc/tim.h @@ -34,11 +34,16 @@ extern "C" { extern TIM_HandleTypeDef htim3; +extern TIM_HandleTypeDef htim4; + /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ void MX_TIM3_Init(void); +void MX_TIM4_Init(void); + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); /* USER CODE BEGIN Prototypes */ diff --git a/Core/Src/main.c b/Core/Src/main.c index fd129ba..4a315b4 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -93,6 +93,7 @@ int main(void) MX_SPI3_Init(); MX_USART2_UART_Init(); MX_TIM3_Init(); + MX_TIM4_Init(); /* USER CODE BEGIN 2 */ setup(); /* USER CODE END 2 */ @@ -149,7 +150,7 @@ void SystemClock_Config(void) } PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_TIM34; PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; - PeriphClkInit.Tim34ClockSelection = RCC_TIM34CLK_HCLK; + PeriphClkInit.Tim34ClockSelection = RCC_TIM34CLK_PLLCLK; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { Error_Handler(); diff --git a/Core/Src/tim.c b/Core/Src/tim.c index 865b097..43571c3 100644 --- a/Core/Src/tim.c +++ b/Core/Src/tim.c @@ -25,6 +25,7 @@ /* USER CODE END 0 */ TIM_HandleTypeDef htim3; +TIM_HandleTypeDef htim4; /* TIM3 init function */ void MX_TIM3_Init(void) @@ -69,6 +70,50 @@ void MX_TIM3_Init(void) /* USER CODE END TIM3_Init 2 */ +} +/* TIM4 init function */ +void MX_TIM4_Init(void) +{ + + /* USER CODE BEGIN TIM4_Init 0 */ + + /* USER CODE END TIM4_Init 0 */ + + TIM_MasterConfigTypeDef sMasterConfig = {0}; + TIM_OC_InitTypeDef sConfigOC = {0}; + + /* USER CODE BEGIN TIM4_Init 1 */ + + /* USER CODE END TIM4_Init 1 */ + htim4.Instance = TIM4; + htim4.Init.Prescaler = 0; + htim4.Init.CounterMode = TIM_COUNTERMODE_UP; + htim4.Init.Period = 1023; + htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_PWM_Init(&htim4) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 511; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_ENABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM4_Init 2 */ + + /* USER CODE END TIM4_Init 2 */ + HAL_TIM_MspPostInit(&htim4); + } void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef* tim_encoderHandle) @@ -101,6 +146,51 @@ void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef* tim_encoderHandle) } } +void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* tim_pwmHandle) +{ + + if(tim_pwmHandle->Instance==TIM4) + { + /* USER CODE BEGIN TIM4_MspInit 0 */ + + /* USER CODE END TIM4_MspInit 0 */ + /* TIM4 clock enable */ + __HAL_RCC_TIM4_CLK_ENABLE(); + /* USER CODE BEGIN TIM4_MspInit 1 */ + + /* USER CODE END TIM4_MspInit 1 */ + } +} +void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(timHandle->Instance==TIM4) + { + /* USER CODE BEGIN TIM4_MspPostInit 0 */ + + /* USER CODE END TIM4_MspPostInit 0 */ + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**TIM4 GPIO Configuration + PB6 ------> TIM4_CH1 + */ + GPIO_InitStruct.Pin = GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF2_TIM4; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + HAL_I2CEx_EnableFastModePlus(SYSCFG_CFGR1_I2C_PB6_FMP); + + /* USER CODE BEGIN TIM4_MspPostInit 1 */ + + /* USER CODE END TIM4_MspPostInit 1 */ + } + +} + void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef* tim_encoderHandle) { @@ -124,6 +214,22 @@ void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef* tim_encoderHandle) } } +void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* tim_pwmHandle) +{ + + if(tim_pwmHandle->Instance==TIM4) + { + /* USER CODE BEGIN TIM4_MspDeInit 0 */ + + /* USER CODE END TIM4_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM4_CLK_DISABLE(); + /* USER CODE BEGIN TIM4_MspDeInit 1 */ + + /* USER CODE END TIM4_MspDeInit 1 */ + } +} + /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ diff --git a/Makefile b/Makefile index 8406338..cd15e2a 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ########################################################################################################################## -# File automatically-generated by tool: [projectgenerator] version: [3.17.1] date: [Sat Sep 30 08:45:04 CEST 2023] +# File automatically-generated by tool: [projectgenerator] version: [3.17.1] date: [Sat Oct 14 13:34:44 CEST 2023] ########################################################################################################################## # ------------------------------------------------ diff --git a/app/core/app.c b/app/core/app.c index 54d1cd1..262fc7c 100644 --- a/app/core/app.c +++ b/app/core/app.c @@ -13,6 +13,7 @@ #define MAX_VOLT 330 #define MAX_REF 256 +#define MAX_PWM_VOLT 150 typedef enum { @@ -23,7 +24,8 @@ typedef enum POT, REF, OFFS, - ZERO, + // ZERO, + PWM, OPT_MAX } option_t; @@ -62,6 +64,7 @@ void setup(void) var[POT] = 255; var[REF] = 197; var[ONOFF] = 1; + var[REF] = 511; hst7565.hspi = &hspi3; hst7565.cs_port = ST7565_CS_GPIO_Port; @@ -131,6 +134,8 @@ void draw_string(void) DISP_writeString(&disp, &font5x7Info, (uint8_t *)"OFFS:", 8, 48, BM_NORMAL); // dac2 - zeroing DISP_writeString(&disp, &font5x7Info, (uint8_t *)"ZERO:", 8, 56, BM_NORMAL); + // pwm + DISP_writeString(&disp, &font5x7Info, (uint8_t *)"PWM:", 72, 0, BM_NORMAL); for (option_t opt = FREQ; opt < OPT_MAX; opt++) { @@ -186,8 +191,15 @@ void update_display(void) DISP_writeString(&disp, &font5x7Info, data, 48, 48, BM_NORMAL); DISP_writeString(&disp, &font5x7Info, (uint8_t *)"*", 0, 48, BM_NORMAL); break; - case ZERO: - temp = (MAX_REF * var[REF] + 127) / UINT8_MAX; + // case ZERO: + // temp = (MAX_REF * var[REF] + 127) / UINT8_MAX; + // snprintf((char *)data, 16, "%03u (%01d.%02d)", var[REF], temp / 100, temp % 100); + // // snprintf((char *)data, 8, "%03u", var[ZERO]); + // DISP_writeString(&disp, &font5x7Info, data, 48, 56, BM_NORMAL); + // DISP_writeString(&disp, &font5x7Info, (uint8_t *)"*", 0, 56, BM_NORMAL); + // break; + case PWM: + temp = (MAX_PWM_VOLT * var[REF] + 512) / 1024; snprintf((char *)data, 16, "%03u (%01d.%02d)", var[REF], temp / 100, temp % 100); // snprintf((char *)data, 8, "%03u", var[ZERO]); DISP_writeString(&disp, &font5x7Info, data, 48, 56, BM_NORMAL); @@ -324,10 +336,16 @@ void changeValue(int8_t inc) ad5303_set_value(&hdac, var[OFFS], AD_DAC2); break; } - case ZERO: + // case ZERO: + // { + // var[ZERO] = (var[ZERO] + inc) & UINT8_MAX; + // ad5303_set_value(&hdac, var[ZERO], AD_DAC1); + // break; + // } + case PWM: { - var[ZERO] = (var[ZERO] + inc) & UINT8_MAX; - ad5303_set_value(&hdac, var[ZERO], AD_DAC1); + var[PWM] = (var[PWM] + inc) & 0x03FF; // 0x03FF - 1023 + __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, var[PWM]); break; } default: diff --git a/fun_gen_amp_test.ioc b/fun_gen_amp_test.ioc index 578ffc9..e5f4b37 100644 --- a/fun_gen_amp_test.ioc +++ b/fun_gen_amp_test.ioc @@ -10,8 +10,9 @@ Mcu.IP3=SPI2 Mcu.IP4=SPI3 Mcu.IP5=SYS Mcu.IP6=TIM3 -Mcu.IP7=USART2 -Mcu.IPNb=8 +Mcu.IP7=TIM4 +Mcu.IP8=USART2 +Mcu.IPNb=9 Mcu.Name=STM32F303R(D-E)Tx Mcu.Package=LQFP64 Mcu.Pin0=PC13 @@ -36,16 +37,17 @@ Mcu.Pin25=PC10 Mcu.Pin26=PC11 Mcu.Pin27=PC12 Mcu.Pin28=PB3 -Mcu.Pin29=PB9 +Mcu.Pin29=PB6 Mcu.Pin3=PF0-OSC_IN -Mcu.Pin30=VP_SYS_VS_Systick +Mcu.Pin30=PB9 +Mcu.Pin31=VP_SYS_VS_Systick Mcu.Pin4=PF1-OSC_OUT Mcu.Pin5=PA0 Mcu.Pin6=PA1 Mcu.Pin7=PA2 Mcu.Pin8=PA3 Mcu.Pin9=PA4 -Mcu.PinsNb=31 +Mcu.PinsNb=32 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F303RETx @@ -136,6 +138,11 @@ PB3.GPIOParameters=GPIO_Label PB3.GPIO_Label=SWO PB3.Locked=true PB3.Signal=SYS_JTDO-TRACESWO +PB6.GPIOParameters=GPIO_Speed,GPIO_FM6 +PB6.GPIO_FM6=SYSCFG_CFGR1_I2C_PB6_FMP +PB6.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PB6.Locked=true +PB6.Signal=S_TIM4_CH1 PB9.GPIOParameters=GPIO_Label PB9.GPIO_Label=GAIN1 PB9.Locked=true @@ -223,7 +230,7 @@ RCC.I2C1Freq_Value=8000000 RCC.I2C2Freq_Value=8000000 RCC.I2C3Freq_Value=8000000 RCC.I2SClocksFreq_Value=48000000 -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,PLLSourceVirtual,RCC_MCODiv,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,PLLSourceVirtual,RCC_MCODiv,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,TIM34Selection,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=24000000 RCC.PLLCLKFreq_Value=48000000 @@ -246,7 +253,8 @@ RCC.TIM17Freq_Value=48000000 RCC.TIM1Freq_Value=48000000 RCC.TIM20Freq_Value=72000000 RCC.TIM2Freq_Value=48000000 -RCC.TIM3Freq_Value=48000000 +RCC.TIM34Selection=RCC_TIM34CLK_PLLCLK +RCC.TIM3Freq_Value=96000000 RCC.TIM8Freq_Value=48000000 RCC.UART4Freq_Value=24000000 RCC.UART5Freq_Value=24000000 @@ -263,6 +271,8 @@ SH.S_TIM3_CH1.0=TIM3_CH1,Encoder_Interface SH.S_TIM3_CH1.ConfNb=1 SH.S_TIM3_CH2.0=TIM3_CH2,Encoder_Interface SH.S_TIM3_CH2.ConfNb=1 +SH.S_TIM4_CH1.0=TIM4_CH1,PWM Generation1 CH1 +SH.S_TIM4_CH1.ConfNb=1 SPI2.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_32 SPI2.CLKPolarity=SPI_POLARITY_HIGH SPI2.CalculateBaudRate=750.0 KBits/s @@ -283,6 +293,11 @@ TIM3.IC1Filter=15 TIM3.IC2Filter=15 TIM3.IPParameters=Period,IC1Filter,IC2Filter TIM3.Period=255 +TIM4.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 +TIM4.IPParameters=Channel-PWM Generation1 CH1,Period,Pulse-PWM Generation1 CH1,OCFastMode_PWM-PWM Generation1 CH1 +TIM4.OCFastMode_PWM-PWM\ Generation1\ CH1=TIM_OCFAST_ENABLE +TIM4.Period=1023 +TIM4.Pulse-PWM\ Generation1\ CH1=511 USART2.IPParameters=VirtualMode-Asynchronous USART2.VirtualMode-Asynchronous=VM_ASYNC VP_SYS_VS_Systick.Mode=SysTick