Приветствую, может, кто сталкивался с такой проблемой? Принимаю ИК посылку из стартового бита и четырех бит команды.
Вот инит таймера.
static void TIM2_init(void)
{
NVIC_EnableIRQ (TIM2_IRQn);
NVIC_SetPriority(TIM2_IRQn, 0);
/* Включаем тактирование на порту А GPIO */
RCC->AHBENR |= (1<<17);
/*Выставляем альтернативную функцию на РА1*/
GPIOA->MODER |= GPIO_MODER_MODER1_1;
GPIOA->PUPDR |= GPIO_PUPDR_PUPDR1_0;
/*Задаем AF2 для PА1*/
GPIOA->AFR[0] |= (1<<5);
RCC->APB1ENR |=(1<<0); //включаем тактирование таймера 2
TIM2->PSC = 7; //предделитель для получения тактовой частоты 1 МГц
TIM2->CR1 |= TIM_CR1_ARPE; //TIM2_ARR register is buffered
TIM2->ARR = 9100;
/*настраиваем СC1 на вход TI2*/
TIM2->CCMR1 |= TIM_CCMR1_CC1S_1;
TIM2->CCMR1 &= ~TIM_CCMR1_CC1S_0;
//TIM2->CCER &= ~TIM_CCER_CC1NP ; //активная полярность канала передний фронт
TIM2->CCER &= ~(TIM_CCER_CC1NP | TIM_CCER_CC1P);
/*настраиваем СС2 на вход TI2*/
TIM2->CCMR1 |= TIM_CCMR1_CC2S_0;
TIM2->CCMR1 &= ~TIM_CCMR1_CC2S_1;
/*Устанавливаем срабатывание по заднему фронту (активная полярность)*/
TIM2->CCER |= TIM_CCER_CC2P;
TIM2->CCER |= TIM_CCER_CC1E ; //разрешаем захват
/*Выбрать TI2FP2 в качестве входа триггера */
TIM2->SMCR |= (TIM_SMCR_TS_1| TIM_SMCR_TS_2);
TIM2->SMCR &= ~TIM_SMCR_TS_0;
/*reset mode*/
TIM2->SMCR |= TIM_SMCR_SMS_2 ;
TIM2->SMCR &= ~TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1;
//TIM2->EGR |= TIM_EGR_UG;
TIM2->DIER |= TIM_DIER_CC1IE;
TIM2->EGR = TIM_EGR_UG;
TIM2->SR;
TIM2->SR = 0;
TIM_EnableCounter(TIM2);
}
А вот сам обработчик
void TIM2_IRQHandler(void)
{
uint32_t sr = TIM2->SR;
TIM2->SR = ~sr;
if(sr & TIM_SR_CC1IF)
{
period = (TIM2->CCR1);
}
else if ((TIM2->SR & TIM_SR_CC1OF) != 0) /* Check the overflow */
{
TIM2->SR = ~(TIM_SR_CC1OF | TIM_SR_CC1IF); /* Clear the flags */
return;
}
printf("period is %lu\n", period);
__ISB();
}
Первый раз посылка принялась нормально, но все остальные разы принимается стартовый бит и первый. Анализатор показывает, что посылка приходит полностью. В чем может быть затык? Заранее спасибо.