Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/38: Рейтинг темы: голосов - 38, средняя оценка - 4.84
ymmomi

(Решено)STM32f100 Проблемы с таймером 2.

17.09.2012, 17:56. Показов 7897. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые форумчане.
Начал изучение и один проект на STM32, добрался до таймеров, и возникла проблема.
Таймер 2 не хочет уходить в прерывание с определённым(заданным) периодом, а генерит свои прерывания на частото 33кгц и 50кгц.(наблюдаю на лог.анализаторе с ножки), т.е в перемешку 33 и 50кгц. И не зависит что записано в регистр ARR и PSC.
Привожу код иницилизации тамера:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void Init_Time(void)
{
 
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;   //разрешить подачу тактовых импульсов на TIM2
 
TIM2->CNT = 0;
TIM2->SR = 0;
TIM2->CR2=0x0;                //обнуляем регистр
TIM2->CR1=0x0;                //обнуляем регистр?
 
TIM2->PSC = 24000-1;    // предделитель таймера 2 (делим на 24000, получаем тик каждый 1000гц)
TIM2->ARR = 10;                              //каждые 100гц
 
TIM2->CR1 &= ~TIM_CR1_DIR;      //прямой счёт - 0 (обратный - 1) отсчёт
TIM2->CR1 &= ~TIM_CR1_UDIS;      //запр.-1; разрешаем событие по перепол.таймера -0
//   TIM2->CR1 &= ~TIM_CR1_CKD;      //clock division
//   TIM2->DIER |= TIM_DIER_UIE;      //&UPDATE INTERRPUT - прерывание по переполнению &&&
//   TIM2->DIER |= TIM_DIER_TIE;      //trigger ?
 
TIM2->CR1 &= ~TIM_CR1_ARPE;   //запрещаем 0 - когда прграмно ненадо менять значение ARR;разрешаем=1 перзагрузку
TIM2->CR1 &= ~TIM_CR1_OPM;
TIM2->CR1 |= TIM_CR1_URS;
//   NVIC_EnableIRQ (TIM2_IRQn);       //разрешаем прерывание
TIM2->EGR &= ~TIM_EGR_UG;      // сбрасываем 0 ;update enable  ARR и прескалер грузятся из предварительного в теневой регистр
//   TIM2->CR1 |= TIM_CR1_CEN;       //запускаем таймер2
 
//   TIM2->SR &= ~TIM_SR_UIF;
TIM2->DIER |= TIM_DIER_UIE;
TIM2->CR1 |= TIM_CR1_CEN;
//   NVIC_SetPriority(TIM2_IRQn, 15);
NVIC_EnableIRQ(TIM2_IRQn);
 
}
Код обработчика прерывния:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void TIM2_IRQHomdler(void)
{
if (TIM2->SR & TIM_SR_UIF)
{
//if (TIM_GetITStatus(TIM2, TIM_IT_Update))
 
//TIM_ClearITPendingByt(TIM2, TIM_IT_Update);
//TIM2->SR &= ~TIM_SR_UIF;    //сбрасываем флаг прерывания по переполнению
//TIM2->SR &= ~TIM_SR_TIF ; //? (првеорить этот бит и сбросить)
//GPIOB->BSRR=GPIO_BSRR_BS8;   //зажигаем LED PB8(порт сьрошен в 0)(Led подключ. к +пит.)
//GPIOB->BSRR=GPIO_BSRR_BR8;
if ((GPIOB->IDR & GPIO_IDR_IDR9)){
GPIOB->BSRR=GPIO_BSRR_BR9;
}
else {
GPIOB->BSRR=GPIO_BSRR_BS9;
}
 
}
}
Пишу в istypsi и arm-none-eabi, без оптимизации. частота кварца 24мгц.
Пробовал стандартной библиотекой завести таймер, выходит анологично, форум просмотрел несколко раз, решение проблемы не нашёл.
Подскажите, пожалуйста, где ошибки?
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.09.2012, 17:56
Ответы с готовыми решениями:

STM32F100 and flash[Решено]
Прочитал статью http://we.iosyitistromyss.ru/STM32/prog ... h.html#cut по работе с флеш. Не дословно, но повторил то что в ней написано. В...

Проблемы с таймером
Я не когда с такой проблемой не сталкивался, даже не знаю из за чего. В самом начале кода формы, прописал 3 переменные private uint...

Проблемы с таймером
Доброго дня есть програмка которая дожна запускать батник каждые 900 сек i:=i-1; lbl1.Caption:='Почта будет отправлена...

7
yizikyyt
17.09.2012, 22:18
Сильно не вникал, но может стоит попробовать раскомментировать эту строку?
Цитата Сообщение от ymmomi
Код:
//TIM2->SR &= ~TIM_SR_UIF; //сбрасываем флаг прерывания по переполнению

Я всегда сбрасываю подобные биты.
0 / 0 / 0
Регистрация: 02.11.2010
Сообщений: 499
18.09.2012, 09:25
Однозначно надо сбрасывать флаг. Иначе прерывание будет генериться постоянно.
0
ymmomi
18.09.2012, 16:08
В том то и дело, что делал, один раз входит (предположительно) и всё.
И по диаграмам в даташите, видно что надо сбрасывать.
ymmomi
18.09.2012, 17:27
сделал измениня в прерваниии, стало генерить 88гц, при той же иницилизации.
Изменеия:
Code
1
2
3
4
5
6
7
8
9
void TIM2_IRQHomdler(void)
{
if (TIM2->SR & TIM_SR_UIF)
{
TIM2->SR &= ~TIM_SR_UIF;
GPIOB->ODR = GPIOB->ODR ^ (1<<9);  //инвертировать GPIOB.9
 
}
}
потом изменил значения регистров PSC на 1, частота стала 16-20кгц, в перемешку.
а как меняю значение ARR болше 10, прерывания прекращаются.
Также нет разницы при смене направлеия счёта(в TIM_CR1_DIR)
ymmomi
18.09.2012, 18:00
Покопался, обнаружил, что проблема не с таймером, а с прерыванием.
Но ещё осталась проблема с плаванием частоты, т.е. то идёт стабильно скажем 16кгц, и раз пару импульсов с 20кгц, потом опять стабильно 16кгц.Что по идеи не должно происходить. кварц всё таки 24МГц.
ymmomi
19.09.2012, 13:33
Всем спасибо, разобрался.
Работает. скачки частот были связаны с семплированием лог.анализатора.
выкладыаю код, мож кому пригодится.
Иницилизация:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void Init_Time(void)
{
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;   //разрешить подачу тактовых импульсов на TIM2
TIM2->CNT = 0;
TIM2->SR = 0;
TIM2->CR2=0x0;          //обнуляем регистр
TIM2->CR1=0x0;          //обнуляем регистр?
 
TIM2->PSC = 8-1;          // предделитель таймера 2
TIM2->ARR = 207;      //14400гц   (SYSCLK_FREQ/(3*boude_uart2)-1) ;//число для переполнения, т.е задаём скорость опроса для софт. уарт
 
TIM2->CR1 &= ~TIM_CR1_DIR;      //прямой счёт - 0 (обратный - 1) отсчёт
TIM2->CR1 &= ~TIM_CR1_UDIS;      //запр.-1; разрешаем событие по перепол.таймера -0
TIM2->CR1 &= ~TIM_CR1_CKD;      //clock division
TIM2->CR1 &= ~TIM_CR1_ARPE;      //запрещаем 0 - когда прграмно ненадо менять значение ARR;разрешаем=1 перзагрузку
TIM2->CR1 &= ~TIM_CR1_OPM;      //Запрещем работу в режиме одиночного импульса
TIM2->DIER |= TIM_DIER_UIE;      //&UPDATE INTERRPUT - прерывание по переполнению &&&
 
TIM2->CR1 |= TIM_CR1_URS;
TIM2->EGR &= ~TIM_EGR_UG;      // сбрасываем 0 ;update enable  ARR и прескалер грузятся из предварительного в теневой регистр
TIM2->CR1 |= TIM_CR1_CEN;       //запускаем таймер2
NVIC_EnableIRQ (TIM2_IRQn);    //разрешаем прерывание
}
Обработчик прерывания:
Code
1
2
3
4
5
6
7
void TIM2_IRQHomdler(void)
{
if (TIM2->SR & TIM_SR_UIF){
TIM2->SR &= ~TIM_SR_UIF;        // очищаем флаг прерывания update??
GPIOB->ODR = GPIOB->ODR ^ (1<<9);  //инвертировать GPIOB.9
}
}
0 / 0 / 0
Регистрация: 12.06.2015
Сообщений: 10
02.02.2013, 22:38
Возникли вопросы по поводу этого же камня и этого же таймера
Не стал создавать новую тему (или лучше создать ?) так как есть эта :)

Проблема в том что не могу получить прерывание.

Вопрос по регистрам: TIM_DIER_UIE и TIM_DIER_TIE
В чем их разница и где что применяется ?

также не понял назначение регистра TIM_CR1_CKD

И если можно - расскажите последовательность (или просто действия) действий для получения прерывания от таймера

Спасибо заранее
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.02.2013, 22:38
Помогаю со студенческими работами здесь

Проблемы с таймером
Проблема заключается в следующем. Имеется такая вот подпрограмма: ;Подпрограмма временной задержки time_delay: ;Настройка и запуск...

Проблемы с таймером
Нужна помощь новичку) МК ATtiny13, режим таймера СТС, предделитель 8, количество счетов 9 Не понимаю, почему при достижении таймером...

Проблемы с таймером ATTiny13A
PCI0_ISR: PUSH TMP SBIC DevisePin,DevisePinN //I?iionoeou anee aeo a ii?oo i?euai RJMP PCI0_H OUT TCNT0,Null...

Проблемы с таймером 4 у stm8s103f2
День добрый. Наступил на грабли на ровном месте. Начинаю разбираться с STM8. Использую &quot;ST Visual Develop&quot; + Cosmic8 +...

Проблемы с таймером 2 в stm8l151k4
В регистре TIM2_SMCR самый младший бит из битов TS упорно не хочет выставляться. Пишем например: TIM2_SMCR = 0x18; в итоге имеем: ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru