Код:
// PA7 INTERRUPTIONS_CAPTURE
MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODER6_Msk, 0b10 << GPIO_MODER_MODER6_Pos); // PA7 Режим альтернативных функций
MODIFY_REG(GPIOA->AFR[4], GPIO_AFRL_AFSEL7_Msk, 0b0100 << GPIO_AFRL_AFSEL7_Pos); // AF-4 PA7
MODIFY_REG(GPIOA->PUPDR, GPIO_PUPDR_PUPDR6_Msk, 0b00 << GPIO_PUPDR_PUPDR6_Pos); // PA7 Без подтягивания
MODIFY_REG(GPIOA->OSPEEDR, GPIO_OSPEEDR_OSPEEDR0_Msk, 0b11 << GPIO_OSPEEDR_OSPEEDR0_Pos); //PA0 High speed
Код:
void TIM14_capture(void){
SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN); // Тактирование TIM14 ON
CLEAR_BIT(TIM14->CR1,TIM_CR1_CEN); // Счётчик OFF
CLEAR_BIT(TIM14->CCMR1,TIM_CCMR1_OC1PE); // Регистр предварительной загрузки в TIMx_CCR1 OFF
SET_BIT(TIM14->CCER,TIM_CCER_CC1E); // включение выхода захвата/сравнения 1.
//_____
// Биты CC1P и CC1NP работают в паре, определяя режим захвата таймера по фронтам
//_____
// ---------- ТАК ПО ПАДАЮЩЕМУ ФРОНТУ ----------
SET_BIT(TIM14->CCER,TIM_CCER_CC1P); // 0b10
CLEAR_BIT(TIM14->CCER,TIM_CCER_CC1NP); // 0b10
// ---------- ТАК ПО НАРАСТАЮЩЕМУ ФРОНТУ ----------
//CLEAR_BIT(TIM14->CCER,TIM_CCER_CC1P); // 0b00
//CLEAR_BIT(TIM14->CCER,TIM_CCER_CC1NP); // 0b00
// ---------- ТАК ПО ОБОИМ ФРОНТАМ ----------
//SET_BIT(TIM14->CCER,TIM_CCER_CC1P); // 0b11
//SET_BIT(TIM14->CCER,TIM_CCER_CC1NP); // 0b11
//_____
MODIFY_REG(TIM14->OR, TIM14_OR_TI1_RMP_Msk, 0b00 << TIM14_OR_TI1_RMP_Pos); // Канал 1 TIM14 альтернативное назначение функций
MODIFY_REG(TIM14->CCMR1, TIM_CCMR1_CC1S_Msk, 0b01 << TIM_CCMR1_CC1S_Pos); // Канал CC1 настроен как вход, IC1 сопоставлен с TI1
CLEAR_BIT(TIM14->DIER, TIM_DIER_UIE); // Прерывание обновления OFF
SET_BIT(TIM14->DIER, TIM_DIER_CC1IE); // Прерывание CC1 ON
TIM14->PSC = 48 - 1; // 1 тик микросек.
TIM3->ARR = 65535 - 1;
NVIC_EnableIRQ(TIM14_IRQn); // Разрешить прерывания
SET_BIT(TIM14->CR1,TIM_CR1_CEN); // Счётчик включен
}
Код:
void TIM14_IRQHandler(void){
if(READ_BIT(TIM14->SR,TIM_SR_CC1IF) != RESET){ // Проверить и сбросить флаг!!!
CLEAR_BIT(TIM14->SR,TIM_SR_CC1IF); // Сбросить флаг!!!
test++;
}
}
Добрый день форумчане!
Есть такой вопрос.
Нужно измерять длительность сигнала, для декодирования ИК от ПДУ.
Решил использовать для этой задачи таймер по захвату фронта. ( падающего )
Открыл референс, там посмотрел-полистал вроде бы там описано как это всё дело включить.
В итоге всегда попадаю в обработчик постоянно и кручусь там. Установил туа тестовую переменную
и в отладке чётко видно что всё крутится там и переменная всегда инкрементируется но при этом на
входе PA7 ни чего нет, генератор сигналов не подключён. Я прошу помочь, посмотрите на настройки и укажите
на ошибку в настройках. Ибо не вижу где проблема, не могу сам найти где не так настроил.
Спасибо!