ymmomi
1

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

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

Здравствуйте уважаемые форумчане.
Начал изучение и один проект на STM32, добрался до таймеров, и возникла проблема.
Таймер 2 не хочет уходить в прерывание с определённым(заданным) периодом, а генерит свои прерывания на частото 33кгц и 50кгц.(наблюдаю на лог.анализаторе с ножки), т.е в перемешку 33 и 50кгц. И не зависит что записано в регистр ARR и PSC.
Привожу код иницилизации тамера:
Код
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);

}
Код обработчика прерывния:
Код
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мгц.
Пробовал стандартной библиотекой завести таймер, выходит анологично, форум просмотрел несколко раз, решение проблемы не нашёл.
Подскажите, пожалуйста, где ошибки?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2012, 17:56
Ответы с готовыми решениями:

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

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

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

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

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

Я всегда сбрасываю подобные биты.
0 / 0 / 0
Регистрация: 02.11.2010
Сообщений: 500
18.09.2012, 09:25 3
Однозначно надо сбрасывать флаг. Иначе прерывание будет генериться постоянно.
0
ymmomi
18.09.2012, 16:08 4
В том то и дело, что делал, один раз входит (предположительно) и всё.
И по диаграмам в даташите, видно что надо сбрасывать.
ymmomi
18.09.2012, 17:27 5
сделал измениня в прерваниии, стало генерить 88гц, при той же иницилизации.
Изменеия:
Код
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 6
Покопался, обнаружил, что проблема не с таймером, а с прерыванием.
Но ещё осталась проблема с плаванием частоты, т.е. то идёт стабильно скажем 16кгц, и раз пару импульсов с 20кгц, потом опять стабильно 16кгц.Что по идеи не должно происходить. кварц всё таки 24МГц.
ymmomi
19.09.2012, 13:33 7
Всем спасибо, разобрался.
Работает. скачки частот были связаны с семплированием лог.анализатора.
выкладыаю код, мож кому пригодится.
Иницилизация:
Код
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);    //разрешаем прерывание
}
Обработчик прерывания:
Код
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 8
Возникли вопросы по поводу этого же камня и этого же таймера
Не стал создавать новую тему (или лучше создать ?) так как есть эта :)

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

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

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

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

Спасибо заранее
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.02.2013, 22:38

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

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

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

Проблемы с таймером или с логикой?
Господа, помогите начинающему: Есть объект DynamicGameObject, его тип содержит статический...


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

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

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