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

Местный
  
Группа: Участник
Сообщений: 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 ?
|
|
|
|
|
 |
Ответов
|
Apr 19 2014, 21:42
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Golikov A. @ Apr 20 2014, 01:18)  почему = лучше чем &= уже много раз обсуждали.... Оно не лучше, оно для разных случаев. "&=" или "|=" вместо "=" - типичная ошибка при работе с write-only регистрами. Но как раз в случае STM так делать нельзя, по причине наличия такого примечания для незадействованных битов в регистрах: Reserved, must be kept at reset value. Так что только "&=" и "|=".
|
|
|
|
|
Apr 20 2014, 05:53
|
Гуру
     
Группа: Свой
Сообщений: 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); - не правильно!
|
|
|
|
|
Apr 20 2014, 09:33
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Golikov A. @ Apr 20 2014, 09:53)  может затереть возникший за эти три такта новый флаг, Если битов несколько, и есть такая вероятность, то да, может. Цитата(Golikov A. @ Apr 20 2014, 09:53)  не говоря уже о чтение битов, которые предназначены только для записи. Тут уж что-то одно - или write-only, или w0. Но никак не одновременно. Для обсуждаемого случая "&=" является вполне корректной конструкцией.
|
|
|
|
Сообщений в этой теме
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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|