Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: прерывание по таймеру
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
xheli
Пробую сделать обычный таймер, вроде работает, но вот первое прерывание вызывается сразу же после старта.
Т.е. настраиваю таймер на 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
klen
первая мысль без обдумывания - а не занести ли в счетный регистр значение 1 перед пуском?
xheli
Цитата(klen @ Jan 24 2012, 19:36) *
первая мысль без обдумывания - а не занести ли в счетный регистр значение 1 перед пуском?

Т.е. такое поведение нормально?
TIM7->CNT = 1 не помогает, да и не правильно это.

Вот так работает:
Код
TIM_ClearITPendingBit ( TIM7, TIM_IT_Update );
TIM_ITConfig ( TIM7, TIM_IT_Update, ENABLE );
TIM_Cmd ( TIM7, ENABLE );
Aaron
я всегда и везде перед инициализацией прерываний очищаю сопутствующие флаги, и в аппнотах по-моему на все или почти все МК пишут так делать.
xheli
Цитата(Aaron @ Jan 25 2012, 11:32) *
я всегда и везде перед инициализацией прерываний очищаю сопутствующие флаги, и в аппнотах по-моему на все или почти все МК пишут так делать.

спасибо, буду внимательнее
batisto4ka
Вопрос по таймерам в 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
AHTOXA
Вот что написано в RM0008:
Цитата
1. if the APB prescaler is 1, the timer clock frequencies are set to the same frequency as
that of the APB domain to which the timers are connected.
2. otherwise, they are set to twice (×2) the frequency of the APB domain to which the
timers are connected.

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

Оно же sm.gif
http://electronix.ru/forum/index.php?showt...t&p=1029195
batisto4ka
проверила, прескаллер АРВ1 = 2.В чем тогда причина
ViKo
Цитата(batisto4ka @ Feb 21 2012, 15:12) *
проверила, прескаллер АРВ1 = 2.В чем тогда причина

В нем и есть... Внимательно изучите уже сказанное в ответ.
Sanya_kv
Цитата
Вопрос по таймерам в stm32. Не могу понять, почему преывание срабатывает через половину заданного интервала, то есть в 2 раза быстрее. Прерывания от таймера настроено на 1 сек, а срабатывает чрез 30 секунд.

У меня была подобная проблема на STM32F2
Код
void TIM7_IRQHandler(void)
{
    if (TIM7->SR& TIM_SR_UIF)
    {
        ...
        //Почему-то не всегда сбрасывается, примерно через рас, иногда не регулярно.
        TIM7->SR = ~(uint16_t)TIM_SR_UIF;
        //if (TIM7->SR& TIM_SR_UIF)//Проверка. В системе только таймер, больше не чего.
        //    while(1);//ОСТОРОЖНО Ж

        //решил этим
        while (TIM7->SR& TIM_SR_UIF)
            TIM7->SR = ~(uint16_t)TIM_SR_UIF;
    }

}
Vichkins
Цитата(Sanya_kv @ Feb 22 2012, 08:31) *
У меня была подобная проблема на STM32F2
Код
void TIM7_IRQHandler(void)
{
    if (TIM7->SR& TIM_SR_UIF)
    {
        ...
        //Почему-то не всегда сбрасывается, примерно через рас, иногда не регулярно.
        TIM7->SR = ~(uint16_t)TIM_SR_UIF;
        //if (TIM7->SR& TIM_SR_UIF)//Проверка. В системе только таймер, больше не чего.
        //    while(1);//ОСТОРОЖНО Ж

        //решил этим
        while (TIM7->SR& TIM_SR_UIF)
            TIM7->SR = ~(uint16_t)TIM_SR_UIF;
    }

}


правильнее будет wink.gif
TIM7->SR &=~TIM_SR_UIF;
ViKo
Цитата(Vichkins @ Feb 23 2012, 11:37) *
правильнее будет wink.gif
TIM7->SR &=~TIM_SR_UIF;

Если посмотрите на состав регистра SR в базовых таймерах, то увидите, что достаточно будет
TIM7->SR = 0;
Аналогично, для проверки достаточно
while (!TIM7->SR)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.