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

 
 
> Обработчик прерывания срабатывает сразу после запуска таймера
MaxiMuz
сообщение Apr 18 2014, 13:11
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658



Запрограммировал таймер на отчет временных интервалов:
Код
/* Настройка таймера TIM2 на событие: Прерывание при совпадении с р-ром TIM2_ARR */
    TIM2->ARR=(8000); // загрузка рег-ра для сравнения 366/8000=0,046 Hz
    TIM2->PSC=(65536-1);        // предделитель CK_CNT=24000000/65536=366 Hz
    TIM2->DIER|=(TIM_DIER_UIE); // разрешаем прерывание по срабатыванию таймера
    TIM2->CNT=1;
    TIM2->CR1|=(TIM_CR1_CEN); // Запуск Таймера

/* Разрешение прерывания TIM2 */
    NVIC_EnableIRQ(TIM2_IRQn);

Период србатывания ~21сек.
В обработчике поставил маркер срабатывания:
Код
void TIM2_IRQHandler (void)
{
    u32 i;
    TIM2->SR &=~(TIM_SR_UIF);// сброс ф.прерывания
    SWITCH_PIN(PC8);
}

При запуске программы почемуто сразу срабатывает прерывание. С какого это оно срабатывает , если событие не наступило?
Как сделать чтобы первое срабатывание было только по совпадению с рег-ом ARR ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Apr 19 2014, 21:18
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



я к тому что надо писать не
TIM2->SR &= ~(TIM_SR_UIF);

а

TIM2->SR = ~(TIM_SR_UIF);

я не прав? Остальные биты регистра читаемые? Реагируют ли они на 1?

почему = лучше чем &= уже много раз обсуждали....
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 19 2014, 21:42
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Golikov A. @ Apr 20 2014, 01:18) *
почему = лучше чем &= уже много раз обсуждали....

Оно не лучше, оно для разных случаев.
"&=" или "|=" вместо "=" - типичная ошибка при работе с write-only регистрами.
Но как раз в случае STM так делать нельзя, по причине наличия такого примечания
для незадействованных битов в регистрах: Reserved, must be kept at reset value.
Так что только "&=" и "|=".
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 20 2014, 05:53
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата(aaarrr @ Apr 20 2014, 01:42) *
Оно не лучше, оно для разных случаев.
"&=" или "|=" вместо "=" - типичная ошибка при работе с write-only регистрами.
Но как раз в случае STM так делать нельзя, по причине наличия такого примечания
для незадействованных битов в регистрах: Reserved, must be kept at reset value.
Так что только "&=" и "|=".


нет оно именно лучше.

если в регистре несколько битов - флагов, то
&= |=
срабатывая в 3 такта
забрать значение, изменить, записать обратно
может затереть возникший за эти три такта новый флаг, не говоря уже о чтение битов, которые предназначены только для записи.

Поэтому если в регистре есть биты которые должны оставаться всегда в ресет значениях, значит это должно быть учтено при
REGISTR = SBROS, в величине SBROS, но не как не означает что надо делать &=, |=....

REGISTR = (DEFAULT_VAL & (~INTERRUPT)); - правильно
REGISTR &= (~INTERRUPT) ==== REGISTR = REGISTR & (~INTERRUPT); - не правильно!
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 20 2014, 09:33
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Golikov A. @ Apr 20 2014, 09:53) *
может затереть возникший за эти три такта новый флаг,

Если битов несколько, и есть такая вероятность, то да, может.

Цитата(Golikov A. @ Apr 20 2014, 09:53) *
не говоря уже о чтение битов, которые предназначены только для записи.

Тут уж что-то одно - или write-only, или w0. Но никак не одновременно.

Для обсуждаемого случая "&=" является вполне корректной конструкцией.
Go to the top of the page
 
+Quote Post
adnega
сообщение Apr 20 2014, 15:05
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(aaarrr @ Apr 20 2014, 13:33) *
Для обсуждаемого случая "&=" является вполне корректной конструкцией.

Вряд ли. Если в момент "чтение-модификация-запись" произойдет установка какого-нибудь другого флага, то он будет сброшен без обработки.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 20 2014, 17:06
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата(adnega @ Apr 20 2014, 19:05) *
Вряд ли. Если в момент "чтение-модификация-запись" произойдет установка какого-нибудь другого флага, то он будет сброшен без обработки.


как я понял автор настаивает на том, что в этом регистре всего один флаг (или используется только он), и потому ничего нельзя затереть. Другое дело что потом понадобиться другой флаг, или будет перенос кода обработчика через ctrl-c, ctrl-v или переход на другой проц с несколькими флагами, но кто у нас об этом думает...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 20 2014, 18:20
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Golikov A. @ Apr 20 2014, 21:06) *
Другое дело что потом понадобиться другой флаг, или будет перенос кода обработчика через ctrl-c, ctrl-v или переход на другой проц с несколькими флагами, но кто у нас об этом думает...

Да мало ли способов накосячить? Это лишь один из многих.

P.S. Специально раскопал свой (целый один) проект с STM32. Таки да, прерывания в нем сбрасываю через = FLAG. Сброс более одного флага в обработчике используется только в модуле USB.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- MaxiMuz   Обработчик прерывания срабатывает сразу после запуска таймера   Apr 18 2014, 13:11
- - KnightIgor   Цитата(MaxiMuz @ Apr 18 2014, 14:11) При ...   Apr 18 2014, 15:18
|- - MaxiMuz   Цитата(KnightIgor @ Apr 18 2014, 18:18) С...   Apr 21 2014, 11:15
- - Golikov A.   ЦитатаTIM2->SR &=~(TIM_SR_UIF); и это стои...   Apr 19 2014, 14:31
|- - KnightIgor   Цитата(Golikov A. @ Apr 19 2014, 15:31) и...   Apr 19 2014, 19:03
||- - MaxiMuz   Цитата(aaarrr @ Apr 20 2014, 12:33) Для о...   Apr 21 2014, 12:31
||- - AHTOXA   Цитата(MaxiMuz @ Apr 21 2014, 18:31) Я н...   Apr 21 2014, 20:24
|- - HHIMERA   Цитата(Golikov A. @ Apr 20 2014, 08:53) R...   Apr 23 2014, 00:28
- - AHTOXA   Цитата(MaxiMuz @ Apr 18 2014, 19:11) При ...   Apr 20 2014, 05:24
|- - MaxiMuz   Цитата(AHTOXA @ Apr 20 2014, 08:24) Добав...   Apr 22 2014, 07:44
|- - AHTOXA   У вас прерывание назначено на событие обновления (...   Apr 22 2014, 08:32
|- - MaxiMuz   Цитата(AHTOXA @ Apr 22 2014, 11:32) Надо ...   Apr 22 2014, 09:17
|- - KnightIgor   Цитата(MaxiMuz @ Apr 22 2014, 10:17) тоже...   Apr 22 2014, 09:56
- - MaxiMuz   Выясненно опытным путем с использованием документа...   Apr 22 2014, 10:48
|- - Haamu   Цитата(MaxiMuz @ Apr 22 2014, 14:48) 1. П...   Apr 22 2014, 13:19
- - Golikov A.   ЦитатаНо если я убираю команду TIM2->EGR = TIM_...   Apr 22 2014, 16:51
- - Golikov A.   правильно DEFAULT_VAL равно не нулю, а тому чему о...   Apr 23 2014, 06:23
|- - HHIMERA   Цитата(Golikov A. @ Apr 23 2014, 09:23) D...   Apr 23 2014, 07:38
|- - aaarrr   Цитата(HHIMERA @ Apr 23 2014, 11:38) Тогд...   Apr 23 2014, 07:49
|- - ViKo   Цитата(aaarrr @ Apr 23 2014, 10:49) Их не...   Apr 23 2014, 08:32
|- - HHIMERA   Цитата(aaarrr @ Apr 23 2014, 10:49) Не ув...   Apr 23 2014, 10:29
- - Golikov A.   да я тоже часто в ПЛИС делают некоторые резервные ...   Apr 23 2014, 15:13
- - HHIMERA   Цитатаесли их трогать скорее всего ничего не будет...   Apr 23 2014, 17:54
- - MaxiMuz   Задача своевременного запуска обработчика таймера ...   Apr 25 2014, 11:30


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

 


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


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