@@ -7,22 +7,23 @@ void clock_source_set_timer_params(uint16_t param1, uint16_t param2) {
77 // Pulse length of each channel
88 register_set (& (TIM1 -> CCR1 ), (((param1 & 0xFF00U ) >> 8U )* 10U ), 0xFFFFU );
99 register_set (& (TIM1 -> CCR2 ), ((param1 & 0x00FFU )* 10U ), 0xFFFFU );
10- register_set (& (TIM1 -> CCR3 ), (((param2 & 0xFF00U ) >> 8U )* 10U ), 0xFFFFU );
10+ register_set (& (TIM8 -> CCR3 ), (((param2 & 0xFF00U ) >> 8U )* 10U ), 0xFFFFU );
1111 // Timer period
1212 register_set (& (TIM1 -> ARR ), (((param2 & 0x00FFU )* 10U ) - 1U ), 0xFFFFU );
13+ register_set (& (TIM1 -> CCR4 ), ((TIM1 -> ARR + 1U ) / 2U ), 0xFFFFU );
1314}
1415
1516void clock_source_init (bool enable_channel1 ) {
1617 // Setup timer
1718 register_set (& (TIM1 -> PSC ), ((APB2_TIMER_FREQ * 100U )- 1U ), 0xFFFFU ); // Tick on 0.1 ms
1819 register_set (& (TIM1 -> ARR ), ((CLOCK_SOURCE_PERIOD_MS * 10U ) - 1U ), 0xFFFFU ); // Period
1920 register_set (& (TIM1 -> CCMR1 ), 0U , 0xFFFFU ); // No output on compare
20- register_set (& (TIM1 -> CCER ), TIM_CCER_CC1E , 0xFFFFU ); // Enable compare 1
21+ register_set (& (TIM1 -> CCER ), TIM_CCER_CC1E | TIM_CCER_CC2NE , 0xFFFFU ); // Enable compares
2122 register_set (& (TIM1 -> CCR1 ), (CLOCK_SOURCE_PULSE_LEN_MS * 10U ), 0xFFFFU ); // Compare 1 value
22- register_set (& (TIM1 -> CCR2 ), (CLOCK_SOURCE_PULSE_LEN_MS * 10U ), 0xFFFFU ); // Compare 1 value
23- register_set (& (TIM1 -> CCR3 ), (CLOCK_SOURCE_PULSE_LEN_MS * 10U ), 0xFFFFU ); // Compare 1 value
23+ register_set (& (TIM1 -> CCR2 ), (CLOCK_SOURCE_PULSE_LEN_MS * 10U ), 0xFFFFU ); // Compare 2 value
24+ register_set (& (TIM1 -> CCR4 ), (CLOCK_SOURCE_PERIOD_MS * 5U ), 0xFFFFU ); // For slave timer
2425 register_set_bits (& (TIM1 -> DIER ), TIM_DIER_UIE | TIM_DIER_CC1IE ); // Enable interrupts
25- register_set ( & ( TIM1 -> CR1 ), TIM_CR1_CEN , 0x3FU ); // Enable timer
26+
2627
2728 // No interrupts
2829 NVIC_DisableIRQ (TIM1_UP_TIM10_IRQn );
@@ -33,15 +34,33 @@ void clock_source_init(bool enable_channel1) {
3334 set_gpio_alternate (GPIOA , 8 , GPIO_AF1_TIM1 );
3435 }
3536 set_gpio_alternate (GPIOB , 14 , GPIO_AF1_TIM1 );
36- set_gpio_alternate (GPIOB , 15 , GPIO_AF1_TIM1 );
3737
3838 // Set PWM mode
3939 register_set (& (TIM1 -> CCMR1 ), (0b110UL << TIM_CCMR1_OC1M_Pos ) | (0b110UL << TIM_CCMR1_OC2M_Pos ), 0xFFFFU );
40- register_set (& (TIM1 -> CCMR2 ), (0b110UL << TIM_CCMR2_OC3M_Pos ), 0xFFFFU );
40+ register_set (& (TIM1 -> CCMR2 ), (0b110UL << TIM_CCMR2_OC3M_Pos ) | ( 0b111UL << TIM_CCMR2_OC4M_Pos ) , 0xFFFFU );
4141
4242 // Enable output
4343 register_set (& (TIM1 -> BDTR ), TIM_BDTR_MOE , 0xFFFFU );
4444
45- // Enable complementary compares
46- register_set_bits (& (TIM1 -> CCER ), TIM_CCER_CC2NE | TIM_CCER_CC3NE );
45+ // Sync with slave
46+ register_set (& (TIM1 -> SMCR ), TIM_SMCR_MSM , 0xFFFFU );
47+ register_set (& (TIM1 -> CR2 ), (0b0111U << TIM_CR2_MMS_Pos ), 0xFFFFU );
48+ register_set (& (TIM8 -> SMCR ), (0b0100U << TIM_SMCR_SMS_Pos ) | (0b000U << TIM_SMCR_TS_Pos ), 0xFFFFU );
49+
50+ // Setup slave timer (TIM8)
51+ register_set (& (TIM8 -> PSC ), TIM1 -> PSC , 0xFFFFU );
52+ register_set (& (TIM8 -> ARR ), TIM1 -> ARR , 0xFFFFU );
53+ register_set (& (TIM8 -> CCMR2 ), (0b110UL << TIM_CCMR2_OC3M_Pos ), 0xFFFFU );
54+ register_set (& (TIM8 -> CCR3 ), (CLOCK_SOURCE_PULSE_LEN_MS * 10U ), 0xFFFFU );
55+ register_set (& (TIM8 -> CCER ), TIM_CCER_CC3NE , 0xFFFFU );
56+
57+ // MOE for TIM8 as well
58+ register_set (& (TIM8 -> BDTR ), TIM_BDTR_MOE , 0xFFFFU );
59+
60+ // Set GPIO
61+ set_gpio_alternate (GPIOB , 15 , GPIO_AF3_TIM8 );
62+
63+ // Enable timers
64+ register_set (& (TIM1 -> CR1 ), TIM_CR1_CEN , 0x3FU );
65+ register_set (& (TIM8 -> CR1 ), TIM_CR1_CEN , 0x3FU );
4766}
0 commit comments