Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32f4 таймер. захват.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Fobes
Всем доброго времени суток. Нужно посчитать период импульсов, приходящих на ногу. Выбрал 32-битный таймер, TIM5(п.с. нужен именно этот)...

CODE

void capture_timer_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;

TIM_TimeBaseInitTypeDef timer_base;
TIM_ICInitTypeDef timer_ic;

/* TIM1 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);

//GPIOA затактировано

/* TIM1 channel 2 pin (PE.11) configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Connect TIM pins to AF2 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_TIM5);

TIM_TimeBaseStructInit(&timer_base);
timer_base.TIM_Prescaler = 0;
TIM_TimeBaseInit(TIM5, &timer_base);


timer_ic.TIM_Channel = TIM_Channel_1;
timer_ic.TIM_ICPolarity = TIM_ICPolarity_Rising;
timer_ic.TIM_ICSelection = TIM_ICSelection_DirectTI;
timer_ic.TIM_ICPrescaler = TIM_ICPSC_DIV1;
timer_ic.TIM_ICFilter = 0;
TIM_ICInit(TIM5, &timer_ic);

TIM_ITConfig(TIM5, TIM_IT_CC1, ENABLE);

TIM_Cmd(TIM5, ENABLE);

NVIC_EnableIRQ(TIM5_IRQn);
}

volatile uint32_t capture1 = 0, capture2 = 0;

void TIM5_IRQHandler(void)
{
if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM5, TIM_IT_CC1);

capture1 = capture2;
capture2 = TIM_GetCapture1(TIM5);

if (TIM_GetFlagStatus(TIM5, TIM_FLAG_CC1OF) != RESET)
{
TIM_ClearFlag(TIM5, TIM_FLAG_CC1OF);
}
}
}




Что я сделал не так ? таймер запускается, начинает считать, но счетчик cnt встает на значении 0x0501C956 и дальше не считает... Импульсов на ногу не подается при этом, в прерывания не заходит, но все равно встает на этом значении... Перезапуск ничего не делает, таймер дальше не считает...

п.с. stm32f407vgt
Fobes
Так, кажись нашел из-за чего... Как только TIM2 генерирует триггер через секунду, TIM5 встает, странно, но он ведь не в слейв режиме ... sad.gif
Fobes
CODE
void second_timer_config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

TIM_TimeBaseInitStructure.TIM_Prescaler = 0;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 84000000;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);

TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
}


Если убрать данный код, все работает верно... Объясните мне, где косяк, как вылечить ?
Fobes
Вопрос по прежнему актуален... Почему таймер срабатывает по триггеру, хотя у него он не выбран ?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.