From 973dfad5c7875fa316e5f92c79a4098f3d52e7e6 Mon Sep 17 00:00:00 2001 From: zhoujie <929834232@qq.com> Date: Sat, 7 Mar 2026 13:23:23 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(tim):=20=E6=96=B0=E5=A2=9ETIM1?= =?UTF-8?q?=20PWM=E6=97=B6=E9=92=9F=E8=BE=93=E5=87=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在tim.h中声明TIM1句柄和初始化函数 - 在tim.c中实现TIM1 PWM初始化配置,用于生成ADC采样时钟 - 在main.c中初始化TIM1并启动PWM输出 - 更新STM32CubeMX项目文件(.ioc),添加TIM1配置 🐛 fix(gpio): 修复GPIO配置错误 - 修正gpio.c中ADC_SYNC引脚的GPIO端口配置,使用正确的端口宏 - 移除对PA8引脚的错误配置,PA8现在用于TIM1 PWM输出 ♻️ refactor(main): 重构ADC采样触发逻辑 - 移除使用GPIO手动触发ADC采样的代码 - 注释掉TIM2中断回调中控制PA8的代码,该引脚现在用于时钟输出 --- Core/Inc/tim.h | 5 ++ Core/Src/gpio.c | 8 ++-- Core/Src/main.c | 8 +++- Core/Src/tim.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++ STM_ATEM_F405.ioc | 22 ++++++--- 5 files changed, 150 insertions(+), 13 deletions(-) diff --git a/Core/Inc/tim.h b/Core/Inc/tim.h index 5e9bd09..24dd662 100644 --- a/Core/Inc/tim.h +++ b/Core/Inc/tim.h @@ -32,14 +32,19 @@ extern "C" { /* USER CODE END Includes */ +extern TIM_HandleTypeDef htim1; + extern TIM_HandleTypeDef htim2; /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ +void MX_TIM1_Init(void); void MX_TIM2_Init(void); +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + /* USER CODE BEGIN Prototypes */ /* USER CODE END Prototypes */ diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c index 9dd2a6d..30a01fd 100644 --- a/Core/Src/gpio.c +++ b/Core/Src/gpio.c @@ -52,7 +52,7 @@ void MX_GPIO_Init(void) __HAL_RCC_GPIOD_CLK_ENABLE(); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOA, ADC_SYNC_Pin|GPIO_PIN_8, GPIO_PIN_RESET); + HAL_GPIO_WritePin(ADC_SYNC_GPIO_Port, ADC_SYNC_Pin, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(RS485_CTL_GPIO_Port, RS485_CTL_Pin, GPIO_PIN_RESET); @@ -69,12 +69,12 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(ADC_DRY_GPIO_Port, &GPIO_InitStruct); - /*Configure GPIO pins : ADC_SYNC_Pin PA8 */ - GPIO_InitStruct.Pin = ADC_SYNC_Pin|GPIO_PIN_8; + /*Configure GPIO pin : ADC_SYNC_Pin */ + GPIO_InitStruct.Pin = ADC_SYNC_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); + HAL_GPIO_Init(ADC_SYNC_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pin : RS485_CTL_Pin */ GPIO_InitStruct.Pin = RS485_CTL_Pin; diff --git a/Core/Src/main.c b/Core/Src/main.c index f2eb815..1a37926 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -518,6 +518,7 @@ int main(void) MX_USB_DEVICE_Init(); MX_USART3_UART_Init(); MX_TIM2_Init(); + MX_TIM1_Init(); /* USER CODE BEGIN 2 */ // 初始化系统监控 @@ -589,6 +590,9 @@ int main(void) Error_Handler(); } + // 输出时钟到ADC + HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); + // 触发信号引脚初始化 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); @@ -763,9 +767,9 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) { // ADC是4KHz采样率,定时器是8KHz - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET); + // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET); ProcessAdcData(); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET); + // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET); } } diff --git a/Core/Src/tim.c b/Core/Src/tim.c index 80f7bfe..852b4f9 100644 --- a/Core/Src/tim.c +++ b/Core/Src/tim.c @@ -24,8 +24,69 @@ /* USER CODE END 0 */ +TIM_HandleTypeDef htim1; TIM_HandleTypeDef htim2; +/* TIM1 init function */ +void MX_TIM1_Init(void) +{ + + /* USER CODE BEGIN TIM1_Init 0 */ + + /* USER CODE END TIM1_Init 0 */ + + TIM_MasterConfigTypeDef sMasterConfig = {0}; + TIM_OC_InitTypeDef sConfigOC = {0}; + TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; + + /* USER CODE BEGIN TIM1_Init 1 */ + + /* USER CODE END TIM1_Init 1 */ + htim1.Instance = TIM1; + htim1.Init.Prescaler = 0; + htim1.Init.CounterMode = TIM_COUNTERMODE_UP; + htim1.Init.Period = 167; + htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim1.Init.RepetitionCounter = 0; + htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 84; + 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(&htim1, &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.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; + if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM1_Init 2 */ + + /* USER CODE END TIM1_Init 2 */ + HAL_TIM_MspPostInit(&htim1); + +} /* TIM2 init function */ void MX_TIM2_Init(void) { @@ -67,6 +128,22 @@ void MX_TIM2_Init(void) } +void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* tim_pwmHandle) +{ + + if(tim_pwmHandle->Instance==TIM1) + { + /* USER CODE BEGIN TIM1_MspInit 0 */ + + /* USER CODE END TIM1_MspInit 0 */ + /* TIM1 clock enable */ + __HAL_RCC_TIM1_CLK_ENABLE(); + /* USER CODE BEGIN TIM1_MspInit 1 */ + + /* USER CODE END TIM1_MspInit 1 */ + } +} + void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) { @@ -86,6 +163,49 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) /* USER CODE END TIM2_MspInit 1 */ } } +void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(timHandle->Instance==TIM1) + { + /* USER CODE BEGIN TIM1_MspPostInit 0 */ + + /* USER CODE END TIM1_MspPostInit 0 */ + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**TIM1 GPIO Configuration + PA8 ------> TIM1_CH1 + */ + GPIO_InitStruct.Pin = GPIO_PIN_8; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM1_MspPostInit 1 */ + + /* USER CODE END TIM1_MspPostInit 1 */ + } + +} + +void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* tim_pwmHandle) +{ + + if(tim_pwmHandle->Instance==TIM1) + { + /* USER CODE BEGIN TIM1_MspDeInit 0 */ + + /* USER CODE END TIM1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM1_CLK_DISABLE(); + /* USER CODE BEGIN TIM1_MspDeInit 1 */ + + /* USER CODE END TIM1_MspDeInit 1 */ + } +} void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) { diff --git a/STM_ATEM_F405.ioc b/STM_ATEM_F405.ioc index de973af..361e52d 100644 --- a/STM_ATEM_F405.ioc +++ b/STM_ATEM_F405.ioc @@ -109,10 +109,11 @@ Mcu.CPN=STM32F405RGT6 Mcu.Family=STM32F4 Mcu.IP0=DMA Mcu.IP1=FATFS -Mcu.IP10=USART1 -Mcu.IP11=USART3 -Mcu.IP12=USB_DEVICE -Mcu.IP13=USB_OTG_FS +Mcu.IP10=TIM2 +Mcu.IP11=USART1 +Mcu.IP12=USART3 +Mcu.IP13=USB_DEVICE +Mcu.IP14=USB_OTG_FS Mcu.IP2=NVIC Mcu.IP3=RCC Mcu.IP4=SDIO @@ -120,8 +121,8 @@ Mcu.IP5=SPI1 Mcu.IP6=SPI2 Mcu.IP7=SPI3 Mcu.IP8=SYS -Mcu.IP9=TIM2 -Mcu.IPNb=14 +Mcu.IP9=TIM1 +Mcu.IPNb=15 Mcu.Name=STM32F405RGTx Mcu.Package=LQFP64 Mcu.Pin0=PH0-OSC_IN @@ -211,7 +212,7 @@ PA6.Signal=SPI1_MISO PA7.Mode=Full_Duplex_Master PA7.Signal=SPI1_MOSI PA8.Locked=true -PA8.Signal=GPIO_Output +PA8.Signal=S_TIM1_CH1 PA9.Mode=Asynchronous PA9.Signal=USART1_TX PB10.Locked=true @@ -337,6 +338,8 @@ SDIO.HardwareFlowControl=SDIO_HARDWARE_FLOW_CONTROL_DISABLE SDIO.IPParameters=ClockDiv,HardwareFlowControl SH.GPXTI1.0=GPIO_EXTI1 SH.GPXTI1.ConfNb=1 +SH.S_TIM1_CH1.0=TIM1_CH1,PWM Generation1 CH1 +SH.S_TIM1_CH1.ConfNb=1 SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_8 SPI1.CLKPhase=SPI_PHASE_2EDGE SPI1.CalculateBaudRate=10.5 MBits/s @@ -357,6 +360,11 @@ SPI3.Direction=SPI_DIRECTION_2LINES_RXONLY SPI3.IPParameters=VirtualType,Mode,Direction,DataSize,CLKPhase SPI3.Mode=SPI_MODE_SLAVE SPI3.VirtualType=VM_SLAVE +TIM1.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 +TIM1.IPParameters=Channel-PWM Generation1 CH1,Period,Pulse-PWM Generation1 CH1,OCFastMode_PWM-PWM Generation1 CH1 +TIM1.OCFastMode_PWM-PWM\ Generation1\ CH1=TIM_OCFAST_ENABLE +TIM1.Period=167 +TIM1.Pulse-PWM\ Generation1\ CH1=84 TIM2.IPParameters=Prescaler,Period TIM2.Period=124 TIM2.Prescaler=83