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

 
 
> Таймеры в STM32
_Макс
сообщение Apr 21 2010, 11:47
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Как правильно настроить таймер, чтобы он генерировал прерывание? Несколько тысяч раз в секунду.
У меня вот такое:
Код
  TIM_TimeBaseInitTypeDef TIM2_BaseInit;
  TIM2_BaseInit.TIM_Period = 65535;
  TIM2_BaseInit.TIM_Prescaler = 0;
  TIM2_BaseInit.TIM_ClockDivision = 0;
  TIM2_BaseInit.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM2_BaseInit);
  TIM_ITConfig(TIM2, TIM_IT_Trigger, ENABLE);
  TIM_Cmd(TIM2, ENABLE);

Прерывание генерируется только один раз после старта, потом не проходит. Менял TIM_IT_Trigger на TIM_IT_Update, не помогло.

Почему нельзя ставить брекпоинт в обработчике прерывания? (IAR 5.41+J-Link). О прерывании узнаю по сигналу от TEventFlag в приемнике.

Спасибо!

Сообщение отредактировал _Макс - Apr 21 2010, 11:53
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Макс
сообщение Apr 21 2010, 16:31
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Процесс:
Код
template<> OS_PROCESS void TBlinkProc::Exec()
{
  //NVIC init
  NVIC_InitTypeDef NVIC_TIM2Init;
  NVIC_TIM2Init.NVIC_IRQChannel = TIM2_IRQn;
  NVIC_TIM2Init.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_TIM2Init.NVIC_IRQChannelSubPriority = 1;
  NVIC_TIM2Init.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_TIM2Init);
  //GPIO init
  
  //TIM2 init
  TIM2_BaseInit.TIM_Period = 65535;
  TIM2_BaseInit.TIM_Prescaler = 0;
  TIM2_BaseInit.TIM_ClockDivision = 0;
  TIM2_BaseInit.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM2_BaseInit);
  TIM_PrescalerConfig(TIM2, SystemCoreClock / 12000000, TIM_PSCReloadMode_Immediate);
  TIM_ITConfig(TIM2, TIM_IT_Trigger | TIM_IT_Update, ENABLE);
  TIM_Cmd(TIM2, ENABLE);  
  for(;;)
  {
    //GPIO blink by TEvent
    BlinkByTIM2.Wait(0);
    //Do something
  }
}

Обработчик прерывания:
Код
extern "C" OS_INTERRUPT void TIM2_IRQHandler(void)
{
  OS::TISRW TIM2ISR;
  BlinkByTIM2.SignalISR();
}


Сообщение отредактировал _Макс - Apr 21 2010, 16:34
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 21 2010, 16:48
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Ага, почти порядок. Не хватает
Код
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);


А в прерывании, соответственно, проверять флаги
TIM_IT_Trigger и TIM_IT_Update (на них настроено прерывание) и сбрасывать их.

Типа:
Код
  if (TIM_GetITStatus(TIM2, TIM_IT_Trigger))
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_Trigger);
....
  }
  if (TIM_GetITStatus(TIM2, TIM_IT_Update))
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
....
  }


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 10:08
Рейтинг@Mail.ru


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