work.c

Для начала создадим файл констант альтернативных функций gpio_af.h в соотвествии с дш:

nis@jane ~/stm32/f4examples/05-timers/02-ccr-in-comp-mode $ touch gpio_af.h

Этих констант почему то не оказалось в оригинальном заголовочном файле поэтому я и решил сделать свой.

Далее настроим порт в/в к которому подключены светодиоды на режим альтернативных функций для линий 12..15:

/* set led pins to af state */
    LED_PORT->MODER |=
        GPIO_MODER_MODER12_1 | GPIO_MODER_MODER13_1 |
        GPIO_MODER_MODER14_1 | GPIO_MODER_MODER15_1;

После этого переключим выбор альтернативных фунций для этих линий на таймеры2..5(альтернативные функции №2):

/* select af block - tim3..5(af2 function) to led pins */
    LED_PORT->AFR[1] |= (GPIO_AF2_TIM3_5 << 28) | (GPIO_AF2_TIM3_5 << 24) |
        (GPIO_AF2_TIM3_5 << 20) | (GPIO_AF2_TIM3_5 << 16);

Полный период таймера у нас теперь будет равен 1 секунде:

/* tim4 setup preload reg */
    TIM4->ARR = 1000;

Установим значение совпадения на половину периода для каналов сравнения/захвата 1..4:

/* tim4 load values to ccr1..4 */
    TIM4->CCR1 = 500;
    TIM4->CCR2 = 500;
    TIM4->CCR3 = 500;
    TIM4->CCR4 = 500;

После переключим режим выхода сравнения в переключение состояния при совпадении также для этих же каналов:

/* tim4 setup cc chanel1..4 */
    TIM4->CCMR1 |= TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC2M_0 | TIM_CCMR1_OC2M_1;
    TIM4->CCMR2 |= TIM_CCMR2_OC3M_0 | TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC4M_0 | TIM_CCMR2_OC4M_1;

Не забываем подключить выводы каналов к системе в/в:

/* tim4 setup cc chanel1..4 to corresponding output pin */
    TIM4->CCER |= TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E;