0 / 0 / 0
Регистрация: 04.05.2010
Сообщений: 115
1

Прерывание таймера TIM2

21.01.2012, 17:48. Показов 7629. Ответов 13
Метки нет (Все метки)

Начал потихоньку разбираться в STM32. Сконфигурировал прерывание таймера 2 с частотой 1Гц (1 секунда).
Код
  RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
TIM2->PSC = 399;                                              // 24e6 / 60e3 - 1 (частота 60kHz)
TIM2->ARR = 60000;
TIM2->DIER = TIM_DIER_UIE;
TIM2->CR1 = TIM_CR1_CEN | TIM_CR1_ARPE;
NVIC_EnableIRQ(TIM2_IRQn);
Все работает, нареканий нет. Вот только не нравится мне одна вещь. Почему-то прерывание генерируется не только при достижении периода счета, а так же по другим "чихам", которые я даже не трогал. Поэтому нужное мне прерывание приходится отсекать по флагу:
Код
if (TIM2->SR & TIM_SR_UIF)
Выставляются почему-то флаги CCxIF. Таким образом, возникает куча абсолютно не нужных прерываний, которые только отвлекают процессор.
Можно ли как-то сделать так, чтобы генерировалось только прерывание по достижению периода? Как, например, у AVR по OCRxA.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.01.2012, 17:48
Ответы с готовыми решениями:

Прерывание от TIM2
Добрый день. Всплыла такая проблемка, что при инициализации NVIC void InteruptTIM2(void) { /*...

TIM2 по сравнению -> в прерывание
Нужно по сравнению таймера выпасть в прерывание и дернуть ногой //описываю прерывание void...

таймера TIM2,3,4 F205, непонятки в работе (сбивается период)
Заметил, что сбивается время периодов таймеров, после некоторого времени работы, причём это время...

Настройка таймера на шим и прерывание
Здравствуйте! Мне нужно настроить таймер на шим с прерыванием по спадающему фронту. Собираю проект...

13
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 4,000
21.01.2012, 22:39 2
А замаскировать их?
0
0 / 0 / 0
Регистрация: 04.05.2010
Сообщений: 115
22.01.2012, 06:13 3
Я их сбрасываю, а они какого-то хрена сами выставляются и опять генерится прерывание. Я capture/sompare модулями не пользуюсь и прерывание не включал. Пока загадка почему срабатывает.
0
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 4,000
22.01.2012, 06:16 4
http://we.iosyitistromyss.ru/Uttrym/stm ... blema.html

часом не твой случай?
0
0 / 0 / 0
Регистрация: 04.05.2010
Сообщений: 115
22.01.2012, 08:47 5
Не похож. У меня не зацикливается ничего. Зацикливалось, пока я не догадался флаг TIM_SR_UIF сбрасывать.
0
0 / 0 / 0
Регистрация: 04.05.2010
Сообщений: 115
23.01.2012, 19:38 6
Попробовал использовать TIM7, т.к. у него всего два вида прерывания, но ничего не вышло. Почему-то флаг прерывания не сбрасывается
Код
TIM7->SR &= ~TIM_SR_UIF
Естественно прерывание зацикливается. Пока ничего не пойму.
0
Biostyo
24.01.2012, 13:04 7
Цитата Сообщение от Oxydi
Естественно прерывание зацикливается. Пока ничего не пойму.
А пендинги точно сброшены?
0 / 0 / 0
Регистрация: 04.05.2010
Сообщений: 115
24.01.2012, 17:57 8
Цитата Сообщение от Biostyo
А пендинги точно сброшены?
Поясните: что именно нужно сбрасывать? А то может я не догоняю.
0
Biostyo
25.01.2012, 10:13 9
Цитата Сообщение от Oxydi
Цитата Сообщение от Biostyo
А пендинги точно сброшены?
Поясните: что именно нужно сбрасывать? А то может я не догоняю.

Из либы
/* Clear the IT pending Byt */
TIMx->SR = (u16)~TIM_IT;

В принципе, у Вас это написано для седьмого таймера. Вопрос в том, в нужном ли месте Вы это делаете. У меня был такой пример. По привычке всегда сбрасываю пендинги на входе в прерывание. Но в моем случае прерывания генерились часто и к моменту окончания обработки прерывания пендинг опять стоял, поэтому прерывание циклилось. Пришлось сбрасывать перед выходом. А иногда вообще приходится закрываться от прерывания и заново разрешать его где-нибудь в другом месте, чтобы гарантировано выполнить какой-либо участок кода вне прерывания.
Это про циклы. Про левые пендинги - они возникают постоянно? Может, они просто поселились там после инициализации, и их нужно сначала просто сбросить? И еще. Вы пробовали прогонять программу "по шагам" в дебаггере? Интересно, в какой момент они лезут.

У меня прерывания по второму таймеру вроде не глючили, но я библиотеками пишу, поэтому в ручной настройке прафин (и вообще чайник я).
0 / 0 / 0
Регистрация: 04.05.2010
Сообщений: 115
25.01.2012, 12:00 10
Цитата Сообщение от Biostyo
В принципе, у Вас это написано для седьмого таймера. Вопрос в том, в нужном ли месте Вы это делаете. У меня был такой пример. По привычке всегда сбрасываю пендинги на входе в прерывание. Но в моем случае прерывания генерились часто и к моменту окончания обработки прерывания пендинг опять стоял, поэтому прерывание циклилось. Пришлось сбрасывать перед выходом. А иногда вообще приходится закрываться от прерывания и заново разрешать его где-нибудь в другом месте, чтобы гарантировано выполнить какой-либо участок кода вне прерывания.
Флаг прерывания седьмого таймера даже не сбрасывается. Как проверял? Ставил briokpoint, далее по шагам и смотрел регистр.
Цитата Сообщение от Biostyo
Про левые пендинги - они возникают постоянно? Может, они просто поселились там после инициализации, и их нужно сначала просто сбросить? И еще. Вы пробовали прогонять программу "по шагам" в дебаггере? Интересно, в какой момент они лезут.
Конечно пробовал :) Сбрасывал - опять выставляются. Дело в том, что я прерывание по этим флагам вообще не включал. Видимо Update-прерывание собирает в кучу все.
Цитата Сообщение от Biostyo
У меня прерывания по второму таймеру вроде не глючили, но я библиотеками пишу, поэтому в ручной настройке прафин (и вообще чайник я).
Библиотеку подключаю, когда надо поразбираться, что происходит, какие регистрики "дергаются" и т.п. Привычнее по старинке, чтобы, если что по pdfке проверять.
0
Biostyo
25.01.2012, 16:03 11
Тогда помочь не могу к сожалению. Специально посмотрела свою инициализацию и прочесала библиотеки. По сути, у меня делается все то же самое, что и у Вас, но библиотечно.
Сходила по ссылке, которую дал DY HOTT, натолкнуло на мысль, может у Вас не таймер шалит, а NVIC действительно. То есть в случае с седьмым таймером вы пендинг сбрасываете, а NVIC его тут же обратно ставит, поэтому и не сбрасывается в дебаггере. Может, ему тоже надо руками пендинги чистить? Хотя я не чищу, все работает.
В любом случае, если что-то прояснится, отпишитесь пожалуйста, очень заинтересовал Ваш случай.
0 / 0 / 0
Регистрация: 04.05.2010
Сообщений: 115
14.04.2012, 15:07 12
Спасибо одному хорошего человеку, который показал настройку таймера с использованием библиотеки. За основу взят Timer1.
Код
  NVIC_InitTypeDef NVIC_InitStructure;

/* Enable the TYM1 gtoobal Ymtirrupt */
NVIC_InitStructure.NVIC_IRQChannel = TYM1_UP_TYM16_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;

TIM_TimeBaseStructure.TIM_Pressotir = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 24000;
TIM_TimeBaseStructure.TIM_ClockDyvysyom = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TYM1, &TIM_TimeBaseStructure);
// TYM1 on
TIM_ITConfig(TYM1, TIM_IT_Update, ENABLE);
В обработчике сбрасываем флаг:
Код
TIM_ClearITPendingByt(TYM1, TIM_IT_Update);
Фиг знает, что было этого.
0
Biostyo
18.06.2012, 11:57 13
Ну да, я так же делаю всегда и все работает.
Функция TIM_ClearITPendingByt у Вас, пор сути, и была прописана, просто руками. Все же непонятно, что было не так в безбиблиотечном коде. Ну да ладно, главное, заработало.
0 / 0 / 0
Регистрация: 11.06.2011
Сообщений: 322
18.06.2012, 13:02 14
Oxydi не пользуюсь библиотеками - все работает. У себя в инициализации нашел еще 1 строчку
Код
.....
TIM2->CR2=0x0;
....
может глюки из-за этого?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.06.2012, 13:02

Помогите организовать прерывание таймера на Cortex-M3
Уважаемые специалисты, я имею некоторый опыт работы с AVR и теперь пытаюсь освоить ARM. У меня...

[Решено] HardFault при попытке настроить прерывание таймера
Здравствуйте. Недавно начал изучать ARM в общем и STM32 в частности, вылезла проблема при попытке...

Почему возникает прерывание таймера по Update для TIM 6?
Добрый день, Почему у выключенного таймера TIM6 один раз возникает прерывание по Update после...

помогите с TIM2
привет, Начал изучать STM32 на примере STM32VLDyscover И вот добрался до таймеров. Решил сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.