Перейти к содержанию
    

sith633

Участник
  • Постов

    6
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

  1. Совет оказался дельным, я, признаться, об этом как-то не подумал. Прерывания срабатывали как надо, все дело в printf было и в методе отладки(я использовал семихостинг и тыкал эти принты куда только можно) Разобравшись в том почему printf недопустима, я ее отовсюду убрал и... Все тут же заработало. Всем откликнувшимся спасибо.
  2. void TIM2_IRQHandler(void) { TIM2->SR = ~TIM_SR_UIF; if ((TIM2->SR & TIM_SR_CC1IF) != 0) { period = (TIM2->CCR1); } if ((TIM2->SR & TIM_SR_CC1OF) != 0) /* Check the overflow */ { TIM2->SR = ~(TIM_SR_CC1OF | TIM_SR_CC1IF); /* Clear the flags */ return; } __ISB(); } При таком виде обработчика принимается только стартовый бит
  3. uint32_t sr = TIM2->SR; TIM2->SR = ~sr; Вместо этого была строчка TIM2->SR =~TIM_SR_UIF;
  4. Чем же он мешает? Меня предупреждали, что это плохо, но не смертельно. Я его выносил в тело основной функции, но результат был примерно тем же
  5. Приветствую, может, кто сталкивался с такой проблемой? Принимаю ИК посылку из стартового бита и четырех бит команды. Вот инит таймера. 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(); } Первый раз посылка принялась нормально, но все остальные разы принимается стартовый бит и первый. Анализатор показывает, что посылка приходит полностью. В чем может быть затык? Заранее спасибо.
×
×
  • Создать...