Skip to content

Commit c10b82f

Browse files
authored
Stagger dcam FSIN (#2307)
1 parent 814fc7a commit c10b82f

File tree

1 file changed

+28
-9
lines changed

1 file changed

+28
-9
lines changed

board/drivers/clock_source.h

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

1516
void 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

Comments
 (0)