STM32F303 NUCLEO64开发板PWM无输出问题求助
STM32F303 NUCLEO64开发板PB0引脚无PWM输出问题
我使用STM32F303 NUCLEO64开发板,通过CubeIDE自动生成代码,程序能正常运行(SWO可看到printf()输出持续更新)。在GPIO和TIM3初始化后添加1秒延时,再通过以下代码启动PWM:
HAL_Delay(1000); HAL_TIMEx_PWMN_Start(&htim3, TIM_CHANNEL_3);
但PB0引脚始终没有输出PWM波形。完整代码如下:
#include "main.h" #include "stdio.h" TIM_HandleTypeDef htim3; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM3_Init(void); uint8_t counter = 0; int _write(int file, char *ptr, int len) { int i=0; for(i=0 ; i<len ; i++) ITM_SendChar((*ptr++)); return len; } int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM3_Init(); HAL_Delay(1000); HAL_TIMEx_PWMN_Start(&htim3, TIM_CHANNEL_3); while (1) { counter++; printf("counter = %d \n", counter); HAL_Delay(100); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_TIM34; PeriphClkInit.Tim34ClockSelection = RCC_TIM34CLK_HCLK; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { Error_Handler(); } } static void MX_TIM3_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; htim3.Instance = TIM3; htim3.Init.Prescaler = 0; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 65535; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; 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 = 26214; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) { Error_Handler(); } HAL_TIM_MspPostInit(&htim3); } static void MX_GPIO_Init(void) { __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); } void Error_Handler(void) { __disable_irq(); while (1) { } } #ifdef USE_FULL_ASSERT void assert_failed(uint8_t *file, uint32_t line) { } #endif
GPIO配置代码如下:
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(htim->Instance==TIM3) { __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF2_TIM3; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } }
问题原因与解决方法
核心问题
你调用的HAL_TIMEx_PWMN_Start(&htim3, TIM_CHANNEL_3)是用于启动TIM3_CH3的互补通道(CH3N),而该通道对应的引脚是PB1,并非你需要的PB0(PB0是TIM3_CH3的主通道引脚)。
修正方案
将启动PWM的代码替换为主通道启动函数:
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);
额外验证点
- 引脚映射确认:STM32F303的PB0确实是TIM3_CH3的复用功能引脚(复用功能AF2),你的GPIO配置完全正确。
- 时钟与参数合理性:TIM3时钟来源为HCLK(72MHz),Prescaler=0,计数频率72MHz;Period=65535对应PWM周期约910µs(频率约1.1kHz),Pulse=26214对应约40%占空比,参数设置无问题。
- 初始化流程:
HAL_TIM_MspPostInit在MX_TIM3_Init末尾被正确调用,GPIO初始化流程正常。
内容的提问来源于stack exchange,提问作者Steven Wang
相关产品推荐
相关产品推荐

