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;
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.
Chris Stratton