You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 */
  }

}

问题排查与修正方案

  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时钟
      }
    }
    
  2. 高级定时器需开启主输出
    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;
    
  3. 通道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();
    }
    
  4. 启动两个通道的PWM输出
    在main.c中添加通道2的启动代码:

    if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2) != HAL_OK){
        Error_Handler();
    }
    
  5. 引脚冲突检查
    确认RAK3172-SIP的PA8/PA9引脚未被SubGHz模块或其他外设占用,可参考硬件手册的引脚复用表。


内容的提问来源于stack exchange,提问作者simon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 12:07:20