@@ -47,18 +47,20 @@ void TimerPeripheral::init() {
4747 handle->Instance = handle_to_timer[handle];
4848 handle->Init .Prescaler = init_data.prescaler ;
4949 handle->Init .CounterMode = TIM_COUNTERMODE_UP;
50- handle->Init .Period = init_data.period ;
51- handle->Init .ClockDivision = TIM_CLOCKDIVISION_DIV1;
52- handle->Init .RepetitionCounter = 0 ;
53- handle->Init .AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
50+ handle->Init .AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
5451 for (PWMData pwm_data : init_data.pwm_channels ) {
5552 if (pwm_data.mode == PHASED) {
53+ handle->Init .CounterMode = TIM_COUNTERMODE_CENTERALIGNED1;
54+ break ;
55+ } else if (pwm_data.mode == CENTER_ALIGNED) {
5656 handle->Init .CounterMode = TIM_COUNTERMODE_CENTERALIGNED3;
5757 handle->Init .AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
58- break ;
58+ break ;
5959 }
6060 }
61-
61+ handle->Init .Period = init_data.period ;
62+ handle->Init .ClockDivision = TIM_CLOCKDIVISION_DIV1;
63+ handle->Init .RepetitionCounter = 0 ;
6264
6365 if (init_data.type == BASE) {
6466 if (HAL_TIM_Base_Init (handle) != HAL_OK){
@@ -113,7 +115,8 @@ void TimerPeripheral::init() {
113115 sConfigOC .OCNIdleState = TIM_OCNIDLESTATE_RESET;
114116
115117 if (pwm_data.mode == PHASED) {
116- sConfigOC .OCMode = TIM_OCMODE_PWM1;
118+ // ASSYMETRIC_MODE_1 means one output per pair of registers (CCR1 - CCR2) for example
119+ sConfigOC .OCMode = TIM_OCMODE_ASSYMETRIC_PWM1;
117120 if (HAL_TIM_PWM_ConfigChannel (handle, &sConfigOC , pwm_data.channel ) != HAL_OK) {
118121 ErrorHandler (" Unable to configure a PWM channel on %d" , name.c_str ());
119122 }
0 commit comments