Для начала создадим файл констант альтернативных функций 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;