Easyelectronics.ru

Электроника для всех
Текущее время: 24 окт 2020, 20:06

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: ТАЙМЕРЫ НА STM32
СообщениеДобавлено: 05 мар 2012, 21:07 
Заглядывает иногда

Зарегистрирован: 06 фев 2012, 17:33
Сообщения: 87
Доброго времени суток уважаимые форумчанины ))) .
Вопрос следующий:
Необходимо чтобы таймер отсчитывал заданые промежутки времени (собствено говоря функция преоболения дребезга контактов). Функцию написал давно, все работает. НО недавно заметил одну особенность: как только я включаю таймер первый раз (первый раз после настройки) - никакой задержки нету. Таймер сразу вываливаеться в прерывание по переполнению. В принципе это логично.... Все настроичные данные из ШАДОВ регистра должны перегрузиться в рабочие.. Но хочеться как то обойти с помощью настроек таймер.. Тоесть чтобы я не вываливался в прерывание при первом включении таймера. Приведу функцию настройки таймера, функцию обработки внешнего прерывания ( которая запускает таймер) и функцию обработки прерывания таймера.


//-----------------настройка таймера
void addjaustment_TIM16(void){
RCC->APB2ENR|=RCC_APB2ENR_TIM16EN; // вкл тактирование
TIM16->PSC=TIM_wait_EXT*8000000/65535; // уст. коэфициэнт деления
TIM16->DIER=TIM_DIER_UIE; // разрешаю прерывание по переполнению
NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn);
};



// ------обработка прерывания по переполнению счетного регистра
void TIM1_UP_TIM16_IRQHandler(void){
GPIOC->ODR^=GPIO_ODR_ODR9; // индикатор отсчкта паромежутка времени: светодиод светиться заданое время
TIM16->CR1&=~TIM_CR1_CEN; // выключаю таймер
TIM16->SR&=~TIM_SR_UIF; // сбрасываю флаг прерывания
TIM16->CNT=0; // обнуляю счетчик... Просто пробывал как то бороться
EXTI->IMR|=EXTI_IMR_MR0; //разрешаю внешние прерывания
};

//-----обработка внешнего прерывания-------------
void EXTI0_IRQHandler(void){
EXTI->IMR&=~EXTI_IMR_MR0; // запрещаю внешние прерывания
EXTI->PR|=EXTI_PR_PR0; // сбрасываю флаг внешнего прерывания
GPIOC->ODR^=GPIO_ODR_ODR9; // начало индикации промежутка времени
TIM16->CNT=5; // думал что если предварительно записать в счетный регистр число - прерывание не возникнет... ошибался
TIM16->CR1|=TIM_CR1_CEN; // вкл таймер
TIM16->SR&=~TIM_SR_UIF; // хотел сразу очистить флаги - флаги ПРОСТО НЕ ОЧИСТИЛИСЬ !!!!!
};


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ТАЙМЕРЫ НА STM32
СообщениеДобавлено: 06 мар 2012, 08:06 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 14 июл 2011, 01:36
Сообщения: 72
Откуда: Москва
Gooddjamp писал(а):
TIM16->CR1|=TIM_CR1_CEN; // вкл таймер
TIM16->SR&=~TIM_SR_UIF; // хотел сразу очистить флаги - флаги ПРОСТО НЕ ОЧИСТИЛИСЬ !!!!!

А поменять местами эти строки?
Сначала очищаем флаги, затем запускаем таймер....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ТАЙМЕРЫ НА STM32
СообщениеДобавлено: 06 мар 2012, 11:52 
Заглядывает иногда

Зарегистрирован: 06 фев 2012, 17:33
Сообщения: 87
Флаги устанавливаються только после включения таймера. Проверял. Странно только то, что очистить их в функции обработки прерывания можна.. а вне функции нельзя..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ТАЙМЕРЫ НА STM32
СообщениеДобавлено: 06 мар 2012, 16:31 
Старожил

Зарегистрирован: 31 янв 2011, 19:17
Сообщения: 437
Откуда: Москва
ну так в самом начале при настройке таймера сразу обнули его счетный регистр до запуска таймера и до разрешения прерывания.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ТАЙМЕРЫ НА STM32
СообщениеДобавлено: 09 мар 2012, 02:51 
Заглядывает иногда

Зарегистрирован: 06 фев 2012, 17:33
Сообщения: 87
Тоже не помагает. Как выяснилось считает "очень быстро" )))
Честно говоря путем эсперемнта дошел к следующему:
как написано в даташите, обновления коэфициэнта деления и всех остальных параметров таймера происходит после возникновения события "UPDATE", которое связано с переполнением таймер. Получаеться следующая ситуация: после того как я настроил таймер НО НЕ ВКЛЮЧИЛ ЭГО в реальные настройки таймера все еще по умолчанию. Соответствено новые настройки вступят в силу только после того как возникнет событие переполнения (поэтому то он у меня и переполняеться первый раз намного быстрее). А для того чтобы настройки таймера установились сразу, до того как таймер начнет тикать, нужно установить бит UG "UPDATE GENERATION". Тоесть необходимо сгенерировать прерывание, тогда как бы должно все работать нормально.........

Отпишите пожалуйста.. Правильно ли я зделал ??


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ТАЙМЕРЫ НА STM32
СообщениеДобавлено: 28 апр 2012, 12:54 
Заглядывает иногда

Зарегистрирован: 04 апр 2012, 01:14
Сообщения: 66
[quote="Gooddjamp"] А для того чтобы настройки таймера установились сразу, до того как таймер начнет тикать, нужно установить бит UG "UPDATE GENERATION". Тоесть необходимо сгенерировать прерывание, тогда как бы должно все работать нормально.........

[quote]
ДА

_________________
...и на пятый день господь создал STM32F407...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: sed_alex


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB