Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/48: Рейтинг темы: голосов - 48, средняя оценка - 4.60
Kooddjomp
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 87
1

ТАЙМЕРЫ НА STM32

04.03.2012, 21:20. Просмотров 8665. Ответов 5
Метки нет (Все метки)

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

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

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

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

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2012, 21:20
Ответы с готовыми решениями:

Таймеры в STM32
Необходимо узнать, на каких пинах, с помощью какого таймера можно генерировать...

Таймеры в STM32
Доброго времени суток, товарищи. Работаю с STM32f407 установленной на плате...

таймеры stm32
Всем привет! Только недавно начал практиковать с стм32, и есть вопрос по...

Чем связать STM32 + STM32 в одном корпусе?
Есть 2 платы: (1) - STM32 (Вывод на LCD + запись SD) и (2) - STM32F4 (обработка...

Общение с барометром MS5540 на STM32 (Arduino to STM32)
Получил от китайца сей аппарат, пошел тут же гуглить что нибудь готовое, но не...

5
md5sum
0 / 0 / 0
Регистрация: 19.01.2011
Сообщений: 72
05.03.2012, 08:19 2
Цитата Сообщение от Kooddjomp
TYM16->CR1|=TIM_CR1_CEN; // вкл таймер
TYM16->SR&=~TIM_SR_UIF; // хотел сразу очистить флаги - флаги ПРОСТО НЕ ОЧИСТИЛИСЬ !!!!!
А поменять местами эти строки?
Сначала очищаем флаги, затем запускаем таймер....
0
Kooddjomp
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 87
05.03.2012, 12:05 3
Флаги устанавливаються только после включения таймера. Проверял. Странно только то, что очистить их в функции обработки прерывания можна.. а вне функции нельзя..
0
phomtom tord
0 / 0 / 0
Регистрация: 30.01.2011
Сообщений: 335
05.03.2012, 16:44 4
ну так в самом начале при настройке таймера сразу обнули его счетный регистр до запуска таймера и до разрешения прерывания.
0
Kooddjomp
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 87
08.03.2012, 03:04 5
Тоже не понигает. Как выяснилось считает "очень быстро" )))
Честно говоря путем эсперемнта дошел к следующему:
как написано в даташите, обновления коэфициэнта деления и всех остальных параметров таймера происходит после возникновения события "UPDATE", которое связано с переполнением таймер. Получаеться следующая ситуация: после того как я настроил таймер НО НЕ ВКЛЮЧИЛ ЭГО в реальные настройки таймера все еще по умолчанию. Соответствено новые настройки вступят в силу только после того как возникнет событие переполнения (поэтому то он у меня и переполняеться первый раз намного быстрее). А для того чтобы настройки таймера установились сразу, до того как таймер начнет тикать, нужно установить бит UG "UPDATE GENERATION". Тоесть необходимо сгенерировать прерывание, тогда как бы должно все работать нормально.........

Отпишите пожалуйста.. Правильно ли я зделал ??
0
yozymmo
0 / 0 / 0
Регистрация: 31.03.2012
Сообщений: 66
27.04.2012, 13:07 6
[quote="Kooddjomp"] А для того чтобы настройки таймера установились сразу, до того как таймер начнет тикать, нужно установить бит UG "UPDATE GENERATION". Тоесть необходимо сгенерировать прерывание, тогда как бы должно все работать нормально.........

[quote]
ДА
0
27.04.2012, 13:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2012, 13:07

stm32 + FSMC + stm32
Доброе времени суток. Возможно ли к Ftosh памяти подцепить два Stm32F4. Один...

STM32 - STM32 I2C
*****ПРОБЛЕМА ИСПРАВЛЕНА****ОТВЕТ НИЖЕ , НЕ ВЧИТЫВАЙТЕСЬ В КОД...

Таймеры в STM32F4
Купил плату stm32f4discovery. Пытаюсь запустить простой генератор с...


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

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

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