STM32F030F4 Timer3 funktioniert nicht

Ich verwende STM32F030F4 im TSSOP-20-Paket und der Timer funktioniert nicht. Ich versuche, ein Beispiel für STM32F103 zu finden, und es funktioniert sehr gut.

Hier ist das Codebeispiel, das ich verwende:

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

GPIO_InitTypeDef GPIO_Config;
GPIO_Config.GPIO_Pin = GPIO_Pin_6;

GPIO_Config.GPIO_Mode = GPIO_Mode_AF;
GPIO_Config.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Config.GPIO_OType = GPIO_OType_PP;
GPIO_Config.GPIO_PuPd = GPIO_PuPd_NOPULL;

TIM_TimeBaseInitTypeDef timer;
TIM_OCInitTypeDef timerPWM;

TIM_TimeBaseStructInit(&timer);
timer.TIM_Prescaler = 0;
timer.TIM_Period = 100;
timer.TIM_ClockDivision = 0;
timer.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &timer);

TIM_OCStructInit(&timerPWM);
timerPWM.TIM_OCMode = TIM_OCMode_PWM1;
timerPWM.TIM_OutputState = TIM_OutputState_Enable;
timerPWM.TIM_Pulse = 50;
timerPWM.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OC1Init(TIM3, &timerPWM);
TIM_Cmd(TIM3, ENABLE);

TIM3->CCR1 = 50;
Ihr STM32F0 unterscheidet sich wesentlich von einem STM32F1, insbesondere im Hinblick darauf, wie GPIO-Alternativfunktionen konfiguriert sind. Ihr TSSOP-20 wäre eine der niedrigsten Varianten des Chips, daher ist es wichtig zu prüfen, welche Peripheriegeräte gelöscht werden können - aber Sie haben Glück, Timer 3 ist da, es sind die Timer 6, 7 und 15, die es nicht sind .

Antworten (1)

Hier ist der Timer 3-Initialisierungscode, wie er vom STM32CubeMX generiert wird:

/* TIM3 init function */
void MX_TIM3_Init(void)
{
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 5;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 400;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  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 = 0;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_TIM_MspPostInit(&htim3);

}

Und innerhalb von HAL_TIM_MspPostInit(&htim3) ist hier der zugehörige Code zur Pin-Initialisierung:

__HAL_RCC_GPIOA_CLK_ENABLE();
/**TIM3 GPIO Configuration    
PA6     ------> TIM3_CH1
PA7     ------> TIM3_CH2 
*/
GPIO_InitStruct.Pin = PWM_ISO_Pin|PWM_LED_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

Mir ist aufgefallen, dass Ihnen diese Anweisung fehlt: 'GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;' was bedeutet, dass Sie den Pin als Alternate_Function festlegen, aber vergessen, festzulegen, welchem ​​AF er zugeordnet werden soll. Hoffentlich hilft das.

vielen Dank für den ausführlichen Beitrag. Ich habe die HAL-Bibliothek noch nicht verwendet, also ist es Zeit, es zu versuchen :)
Und noch etwas zur GPIO-Struktur: typedef struct { uint32_t GPIO_Pin; GPIOMode_TypeDef GPIO_Mode; GPIOSpeed_TypeDef GPIO_Geschwindigkeit; GPIOOType_TypeDef GPIO_OType; GPIOPuPd_TypeDef GPIO_PuPd; }GPIO_InitTypeDef; Es hat kein Alternate_Function-Feld, aber alle anderen Felder, die ich initialisiert habe.
Ich habe diesen Code ausprobiert, aber er funktioniert nicht vollständig. Ich weiß nicht, vielleicht funktioniert der MC nicht richtig und ich sollte ihn ersetzen. Aber das Schreiben von 1 an Pin_0 funktioniert perfekt. Hat jemand ein paar Ideen?