Einrichten von PWM auf PA.3 des STM32F091RC Nucleo-Boards

Ich verwende STM32Cube und die HAL-Bibliotheken, um die PWM einzurichten.

Zum Initialisieren von Timer 2 habe ich:

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(htim_base->Instance==TIM2)
  {
  /* USER CODE BEGIN TIM2_MspInit 0 */

  /* USER CODE END TIM2_MspInit 0 */
    /* Peripheral clock enable */
    __TIM2_CLK_ENABLE();

    /**TIM2 GPIO Configuration    
    PA3     ------> TIM2_CH4 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF2_TIM2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USER CODE BEGIN TIM2_MspInit 1 */

  /* USER CODE END TIM2_MspInit 1 */
  }

}

Und:

void MX_TIM2_Init(void)
{

  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;
  TIM_OC_InitTypeDef sConfigOC;

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 0;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 800;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  HAL_TIM_Base_Init(&htim2);

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig);

  HAL_TIM_PWM_Init(&htim2);

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 400;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4);

}

Beide oben genannten wurden von STM32CubeMX generiert. Im Wesentlichen habe ich zwei Zeilen hinzugefügt, um den Timer und den PWM-Kanal zu starten:

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();

  /* USER CODE BEGIN 2 */

    HAL_TIM_Base_Start(&htim2);
    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

Der Code wird kompiliert und heruntergeladen, aber ich sehe keinen PWM-Ausgang an PA3 (ich messe mit einem Logikanalysator). PWM-Ausgang funktioniert auch nicht bei PA4. Ich habe versucht, von TIM2 auf TIM15 umzuschalten, um zu überprüfen, ob das funktioniert, aber es gibt auch keinen PWM-Ausgang.

Um meinen Code zu überprüfen, habe ich einige andere PWM-Pins (PA10, PB3, PB5, PB4, PA8, PA9, PA6, PA5) getestet und sie funktionieren alle. Gibt es eindeutige Einstellungen für die Pins PA3 und PA4, damit der PWM-Ausgang funktioniert?

Antworten (1)

Auf Entwicklungsplatinen können einige Pins häufig von anderen Funktionen auf der Platine verwendet werden, z. B. einem Display, Tasten, LEDs usw. Es gibt wahrscheinlich eine Reihe von Lötbrücken auf der Rückseite der Platine, die dazu dienen, einen Pin zu trennen den Mikrocontroller aus den GPIO-Headern, weil sie von etwas anderem auf der Platine verwendet werden.

Werfen Sie einen Blick in das Benutzerhandbuch und prüfen Sie, ob PA3 und PA4 für eine andere Funktion auf der Platine verwendet werden. ST enthält oft die Schaltpläne für das Entwicklungsboard und es sollte auch die Lötbrücken darauf zeigen.

Danke! Aus der Anleitung geht hervor, dass die Lötbrücke das Problem ist.