STM32WLE5核心RAK3172-SIP无PWM输出问题求助
在RAK3172-SIP(STM32WLE5CCU6)上生成PWM输出失败的问题
我在搭载STM32WLE5CCU6的RAK3172-SIP上尝试生成PWM输出但未成功,目标是在PA8和PA9引脚输出PWM,目前单个引脚都无法生成。以下是我在main.c和tim.c中的尝试代码:
main.c代码
MX_GPIO_Init(); MX_SubGHz_Phy_Init(); MX_TIM1_Init(); if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1) != HAL_OK){ Error_Handler(); } while (1) { } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Configure LSE Drive Capability */ HAL_PWR_EnableBkUpAccess(); __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW); /** Configure the main internal regulator output voltage */ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /** Initializes the CPU, AHB and APB buses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE|RCC_OSCILLATORTYPE_MSI; RCC_OscInitStruct.LSEState = RCC_LSE_ON; RCC_OscInitStruct.MSIState = RCC_MSI_ON; RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT; RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_11; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK3|RCC_CLOCKTYPE_HCLK |RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1 |RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.AHBCLK3Divider = RCC_SYSCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } }
tim.c代码
void MX_TIM1_Init(void) { /* USER CODE BEGIN TIM1_Init 0 */ /* USER CODE END TIM1_Init 0 */ TIM_OC_InitTypeDef sConfigOC = {0}; htim1.Instance = TIM1; htim1.Init.Prescaler = 49; // Prescaler value htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 999; // Period value htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 200; // Duty cycle value for Channel 1 (20%) sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } HAL_TIM_MspPostInit(&htim1); } 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 PA9 ------> TIM1_CH2 PA8 ------> TIM1_CH1 */ GPIO_InitStruct.Pin = GPIO_PIN_9|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 */ } }
问题排查与修正方案
TIM1时钟未使能
高级定时器TIM1的时钟没有开启,需要在HAL_TIM_PWM_MspInit函数中添加时钟使能代码:void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* timHandle) { if(timHandle->Instance==TIM1) { __HAL_RCC_TIM1_CLK_ENABLE(); // 开启TIM1时钟 } }高级定时器需开启主输出
TIM1作为高级定时器,必须通过BDTR寄存器的MOE位开启主输出,PWM才能正常输出。可以通过HAL库函数或直接寄存器操作实现:// 在MX_TIM1_Init中添加主输出配置 TIM_MasterConfigTypeDef sMasterConfig = {0}; sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) { Error_Handler(); } // 或者直接设置寄存器 // TIM1->BDTR |= TIM_BDTR_MOE;通道2未配置PWM
当前仅配置了TIM1_CH1(PA8),若要PA9(TIM1_CH2)输出PWM,需添加通道2的配置代码:// 在MX_TIM1_Init中,通道1配置后添加 sConfigOC.Pulse = 500; // 设置通道2的占空比(50%) if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) { Error_Handler(); }启动两个通道的PWM输出
在main.c中添加通道2的启动代码:if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2) != HAL_OK){ Error_Handler(); }引脚冲突检查
确认RAK3172-SIP的PA8/PA9引脚未被SubGHz模块或其他外设占用,可参考硬件手册的引脚复用表。
内容的提问来源于stack exchange,提问作者simon
相关产品推荐
相关产品推荐

