350 init_timer(capture_timer_handle(), capture_timer());
356 set_cap_timer_capture();
358 GPIO_InitTypeDef gpio_init;
359 memset(&gpio_init, 0,
sizeof(gpio_init));
360 gpio_init.Mode = GPIO_MODE_AF_PP;
361 gpio_init.Pull = GPIO_PULLUP;
362 gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
363 gpio_init.Alternate = HW::CAPTURE_AF_MODE;
364 gpio_init.Pin = HW::NRZ_Pin::pin();
365 HAL_GPIO_Init(HW::NRZ_Pin::port(), &gpio_init);
367 if (!shared_timers())
369 init_timer(usec_timer_handle(), usec_timer());
374 TIM_IC_InitTypeDef channel_init;
375 memset(&channel_init, 0,
sizeof(channel_init));
376 channel_init.ICPolarity = TIM_ICPOLARITY_BOTHEDGE;
377 channel_init.ICSelection = TIM_ICSELECTION_DIRECTTI;
378 channel_init.ICPrescaler = TIM_ICPSC_DIV1;
379 channel_init.ICFilter = HW::CAPTURE_FILTER;
380 HASSERT(HAL_TIM_IC_ConfigChannel(capture_timer_handle(), &channel_init,
381 HW::CAPTURE_CHANNEL) == HAL_OK);
384 HASSERT(HAL_TIM_IC_Start_IT(capture_timer_handle(), HW::CAPTURE_CHANNEL) ==
387 __HAL_TIM_DISABLE_IT(capture_timer_handle(), HW::CAPTURE_IF);
391 TIM_OC_InitTypeDef channel_init;
392 memset(&channel_init, 0,
sizeof(channel_init));
393 channel_init.OCMode = TIM_OCMODE_TIMING;
394 channel_init.Pulse = (__HAL_TIM_GET_COUNTER(usec_timer_handle()) + 1) &
397 channel_init.OCPolarity = TIM_OCPOLARITY_HIGH;
398 channel_init.OCNPolarity = TIM_OCNPOLARITY_HIGH;
399 channel_init.OCFastMode = TIM_OCFAST_DISABLE;
400 channel_init.OCIdleState = TIM_OCIDLESTATE_RESET;
401 channel_init.OCNIdleState = TIM_OCNIDLESTATE_RESET;
402 HASSERT(HAL_TIM_OC_ConfigChannel(usec_timer_handle(), &channel_init,
403 HW::USEC_CHANNEL) == HAL_OK);
407 HAL_TIM_OC_Start_IT(usec_timer_handle(), HW::USEC_CHANNEL) == HAL_OK);
409 __HAL_TIM_DISABLE_IT(usec_timer_handle(), HW::USEC_IF);
411#if defined(GCC_ARMCM0)
412 HAL_NVIC_SetPriority(HW::CAPTURE_IRQn, 0, 0);
413 HAL_NVIC_SetPriority(HW::TIMER_IRQn, 0, 0);
414 HAL_NVIC_SetPriority(HW::OS_IRQn, 3, 0);
415#elif defined(GCC_ARMCM3)
416 SetInterruptPriority(HW::CAPTURE_IRQn, 0x20);
417 SetInterruptPriority(HW::TIMER_IRQn, 0x20);
418 SetInterruptPriority(HW::OS_IRQn, configKERNEL_INTERRUPT_PRIORITY);
420#error not defined how to set interrupt priority
423 NVIC_EnableIRQ(HW::CAPTURE_IRQn);
424 NVIC_EnableIRQ(HW::TIMER_IRQn);
425 NVIC_EnableIRQ(HW::OS_IRQn);
433 capture_timer_handle()->Instance = capture_timer();
434 usec_timer_handle()->Instance = usec_timer();
435 NVIC_DisableIRQ(HW::CAPTURE_IRQn);
436 NVIC_DisableIRQ(HW::TIMER_IRQn);
437 NVIC_DisableIRQ(HW::OS_IRQn);
438 HASSERT(HAL_TIM_IC_Stop_IT(capture_timer_handle(), HW::CAPTURE_CHANNEL) ==
442 HAL_TIM_OC_Stop_IT(usec_timer_handle(), HW::USEC_CHANNEL) == HAL_OK);
443 if (!shared_timers())
445 HASSERT(HAL_TIM_IC_DeInit(usec_timer_handle()) == HAL_OK);
447 HASSERT(HAL_TIM_IC_DeInit(capture_timer_handle()) == HAL_OK);