реклама на сайте
подробности

 
 
> прерывание по таймеру, stm32f4xx
xheli
сообщение Jan 24 2012, 15:25
Сообщение #1





Группа: Участник
Сообщений: 14
Регистрация: 24-01-12
Пользователь №: 69 851



Пробую сделать обычный таймер, вроде работает, но вот первое прерывание вызывается сразу же после старта.
Т.е. настраиваю таймер на 5 секунд, делаю TIM_Cmd(TIM7, ENABLE), запускаю, микропроцессор стартует и сразу же срабатывает прерывание, затем все как надо, каждые пять секунд или сколько задам.
Как сделать, чтобы не было первого "ложного" срабатывания? Запустил проц и только через N сек сработало.
Вот код:
CODE

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd ( RCC_APB1Periph_TIM7, ENABLE );

NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

TIM_TimeBaseStructure.TIM_Period = ms * 2;
TIM_TimeBaseStructure.TIM_Prescaler = ( uint16_t ) ( SystemCoreClock / APB1_PRESCALER * 2 / 2000 ) - 1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit ( TIM7, &TIM_TimeBaseStructure );

TIM_ITConfig ( TIM7, TIM_IT_Update, ENABLE );
TIM_Cmd ( TIM7, ENABLE );


и обработчик прерывания:

CODE

void TIM7_IRQHandler ( void )
{
if ( TIM_GetITStatus ( TIM7, TIM_IT_Update ) != RESET )
{
TIM_ClearITPendingBit ( TIM7, TIM_IT_Update );
}

...
}


Микропроцессор stm32f417

Сообщение отредактировал xheli - Jan 24 2012, 15:26


--------------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
batisto4ka
сообщение Feb 20 2012, 14:56
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997



Вопрос по таймерам в stm32. Не могу понять, почему преывание срабатывает через половину заданного интервала, то есть в 2 раза быстрее. Прерывания от таймера настроено на 1 сек, а срабатывает чрез 30 секунд. Настройки:
Код:
Код
void SpeedSensorNVICTmrInit    (void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    TIM_ITConfig(SSTIMER,TIM_IT_Update,ENABLE);
}
void    TIM5_IRQHandler    (void) // если сработало прерывание на 1 sec
{

if    (TIM_GetITStatus(TIM5,TIM_IT_Update))
    {
    TIM_ClearITPendingBit(TIM5,TIM_IT_Update);          //
    TmrOff();
          //do smth;
    TmrOn();
    }
}
void InitSpeedSensorTmr    (TIM_TypeDef* TIM,unsigned short delay)
{
TIM_TimeBaseInitTypeDef     Tim_InitStruct;
Tim_InitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
Tim_InitStruct.TIM_CounterMode=TIM_CounterMode_Up;
Tim_InitStruct.TIM_Period=delay;         //    
Tim_InitStruct.TIM_Prescaler=35999;     //36MHz/(35999+1)=1000
TIM_TimeBaseInit(TIM,&Tim_InitStruct);

TmrOn();
}

Где
TIM=TIM5, delay=1000.
Используемый камень -stm32f107vet
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 20 2012, 16:40
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(batisto4ka @ Feb 20 2012, 17:56) *
Вопрос по таймерам в stm32. Не могу понять, почему преывание срабатывает через половину заданного интервала, то есть в 2 раза быстрее. Прерывания от таймера настроено на 1 сек, а срабатывает чрез 30 секунд.

Оно же sm.gif
http://electronix.ru/forum/index.php?showt...t&p=1029195
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 03:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01384 секунд с 7
ELECTRONIX ©2004-2016