Consider setup code for timer1 + PWM:
if TIM_HandleTypeDef (first line in function) is allocated as static, or outside the function, the complementary output stops working, wtf??
void setup_timer()
{
TIM_HandleTypeDef TIM_HandleStruct;
TIM_OC_InitTypeDef TIM_OC_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
TIM_BreakDeadTimeConfigTypeDef TIM_DeadTimeStruct;
TIM_HandleStruct.Instance = TIM1;
TIM_HandleStruct.Channel = HAL_TIM_ACTIVE_CHANNEL_1;
TIM_HandleStruct.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
TIM_HandleStruct.Init.Prescaler = 31; // 2.064516 MHz
TIM_HandleStruct.Init.CounterMode = TIM_COUNTERMODE_UP;
TIM_HandleStruct.Init.Period = 255; // more or less 8 bit PWM
TIM_HandleStruct.Init.RepetitionCounter = 0;
TIM_HandleStruct.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if(HAL_TIM_PWM_Init(&TIM_HandleStruct) != HAL_OK)
{
asm("bkpt 255");
}
TIM_OC_InitStruct.OCMode = TIM_OCMODE_PWM1;
TIM_OC_InitStruct.Pulse = 10;
TIM_OC_InitStruct.OCPolarity = TIM_OCPOLARITY_HIGH;
TIM_OC_InitStruct.OCNPolarity = TIM_OCNPOLARITY_HIGH;
TIM_OC_InitStruct.OCIdleState = TIM_OCIDLESTATE_RESET;
TIM_OC_InitStruct.OCNIdleState = TIM_OCNIDLESTATE_RESET;
if(HAL_TIM_PWM_ConfigChannel(&TIM_HandleStruct, &TIM_OC_InitStruct, TIM_CHANNEL_1) != HAL_OK)
{
asm("bkpt 255");
}
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
if(HAL_TIM_Base_Start(&TIM_HandleStruct) != HAL_OK)
{
asm("bkpt 255");
}
TIM_DeadTimeStruct.DeadTime = 70;
if(HAL_TIMEx_ConfigBreakDeadTime(&TIM_HandleStruct, &TIM_DeadTimeStruct) != HAL_OK)
{
asm("bkpt 255");
}
if(HAL_TIM_PWM_Start(&TIM_HandleStruct, TIM_CHANNEL_1) != HAL_OK)
{
asm("bkpt 255");
}
if(HAL_TIMEx_PWMN_Start(&TIM_HandleStruct, TIM_CHANNEL_1) != HAL_OK)
{
asm("bkpt 255");
}
__HAL_TIM_SET_COMPARE(&TIM_HandleStruct, TIM_CHANNEL_1, 240);
}