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

 
 
> Таймеры в 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
Ответов
AHTOXA
сообщение Apr 21 2010, 15:43
Сообщение #2


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

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



В комплекте с FwLib - куча примеров. Посмотрите пример из папочки TIM\TimeBase.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
_Макс
сообщение Apr 21 2010, 15:57
Сообщение #3


Знающий
****

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



Цитата(AHTOXA @ Apr 21 2010, 18:58) *
В комплекте с FwLib - куча примеров. Посмотрите пример из папочки TIM\TimeBase.

Смотрю на них, по ним и написал этот код. Но как оказалось у меня не случается ни одного прерывания, я ошибся!

Удивительно, что по адресу 0x4000 0000 вижу в отладчике одни нули, но ведь TIM2 сидит на этом адресе.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 21 2010, 16:16
Сообщение #4


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

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



Цитата(_Макс @ Apr 21 2010, 22:12) *
Смотрю на них, по ним и написал этот код. Но как оказалось у меня не случается ни одного прерывания, я ошибся!


Отлично. Тогда давайте по порядку.
Прерывания инициализировали? (в примере TIM\TimeBase это функция NVIC_Configuration())

Да, и не забыли ли вы создать экземпляр объекта OS::TISRW в обработчике прерывания?

----
Ещё забыл. В *.cpp файлах обработчики прерывания надо объявлять как extern "C"

Таким образом, с учётом scmRTOS будет вот так:
Код
extern "C" OS_INTERRUPT void USART1_IRQHandler()
{
    OS::TISRW ISR;
    Event.SignalISR();
}


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



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

 


RSS Текстовая версия Сейчас: 28th July 2025 - 19:12
Рейтинг@Mail.ru


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