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

 
 
> повторные прерывания LPC17xx
evgen2
сообщение Jan 14 2014, 23:32
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Вот похожая тема В прерываниях CM0/CM3 в конце нужен ClearPending?

Имеем такой простой до невозможности код
Код
/* таймер T2  25 МГц */
   LPC_TIM2->MR0 = 782/2;           // 782 = 32 кHz
   LPC_TIM2->MCR = 3;                
   LPC_TIM2->TCR=  0x01;
   NVIC_EnableIRQ(TIMER2_IRQn);

void TIMER2_IRQHandler(void)
{    static int raz=0;
     if(raz == 0)
     {  LPC_GPIO2->FIOSET = 0x1000;raz = 1;
     } else {
       LPC_GPIO2->FIOCLR = 0x1000; raz = 0;
   }
    LPC_TIM2->IR = 1; // Clear interrupt flag
}


смотрим осциилографом, что получается:

___|___|___|___

Или наоборот

— — |— — |— — |— —

Вместо ожидаемого — — |___|— — |___|— — |___

При этом, если поставить брякпойнт на FIOSET или FIOCLR, а потом убрать и продолжить, то картина меняется
если мерять время этого второго паразита, то это будет 12-14 клоков
Однако, если перенести IR = 1; в начало
Код
void TIMER2_IRQHandler(void)
{    static int raz=0;
      LPC_TIM2->IR = 1; // Clear interrupt flag
     if(raz == 0)
     {  LPC_GPIO2->FIOSET = 0x1000;raz = 1;
     } else {
       LPC_GPIO2->FIOCLR = 0x1000; raz = 0;
   }
}


То все налаживается....

Теперь смотрю на все остальные прервывания, в том числе GPI прерывания GPIO прерывания Rising/Falling edge приходят одновременно? (2 ноги * прерывания по фронту и спаду) - там тоже получается какое-то левое повторное прерывание.. однако манипуляции с выносом очистки прерывания как можно раньше не прокатывают и, кажется, наоборот, от выноса очистки в конец количество левых прерываний уменьшается

ЗЫ: а в эмуляторе это не вылазит

Сообщение отредактировал evgen2 - Jan 15 2014, 00:07
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sidy
сообщение Jan 16 2014, 16:13
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Допустим, у меня есть следующий обработчик прерываний:
Код
void TIM1_TRG_COM_TIM11_IRQHandler(void){
  if(TIM11->SR&TIM_SR_UIF){
      TIM11->SR&=~TIM_SR_UIF;
      __disable_irq();
      TIM4->CNT=(TIM11->CNT*5.25f/168.0f)
      TIM4->CR1|=TIM_CR1_CEN;              
      __enable_irq();                      
  }
}

нужно ли мне ставить после __enable_irq(); __ISB()?

Сообщение отредактировал sidy - Jan 16 2014, 16:14
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 16 2014, 16:54
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(sidy @ Jan 16 2014, 22:13) *
нужно ли мне ставить после __enable_irq(); __ISB()?

Скажем по-другому: вам скорее всего не нужно ставить __disable_irq()/__enable_irq().
Зачем они? У вас что - в другом, более приоритетном ISR осуществляется запись в эти регистры??? smile3046.gif

Цитата(swisst @ Jan 16 2014, 18:30) *
я же написал - для чистоты эксперимента. иначе получается, что вы знаете о том, что переменная нигде не используется, но не знаете, что порт 2 пустой rolleyes.gif

Что переменная нигде не используется я знаю из static int, а то что порт больше нигде - об этом ни слова.
К тому же переменных типа int в ОЗУ можно создать ГОРАЗДО больше чем обычно имеется портов в МК. Если вы так расточительно будете подходить к ногам, что на одну ногу будете тратить целый 32-битный порт, то далеко не уедете...
Go to the top of the page
 
+Quote Post
sidy
сообщение Jan 16 2014, 17:18
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Цитата(jcxz @ Jan 16 2014, 20:54) *
Скажем по-другому: вам скорее всего не нужно ставить __disable_irq()/__enable_irq().
Зачем они? У вас что - в другом, более приоритетном ISR осуществляется запись в эти регистры???

Например, если между записью в регистр CNT и пуском таймера TIM_CR1_CEN придет более приоритетное прерывание, то TIM11->CNT может сделать n-ое количество тактов и значение TIM4->CNT будет некорректным.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 16 2014, 18:24
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Как же можно ответить ответить на Ваш вопрос, если невозможно догадаться, что у вас за регистры такие SR и CNT?
В UM на LPC17xx таковых нету.
Ну если под CNT ещё можно предположить регистр TC, то с SR вообще теряюсь в догадках....
Подозреваю что у вас не LPC17x. А в таком случае нужно указывать какой CPU имеете в виду если вопрос касается периферии и желательно указывать как она у вас сконфигурена.
Go to the top of the page
 
+Quote Post
sidy
сообщение Jan 16 2014, 18:57
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Цитата(jcxz @ Jan 16 2014, 22:24) *
Как же можно ответить ответить на Ваш вопрос, если невозможно догадаться, что у вас за регистры такие SR и CNT?
В UM на LPC17xx таковых нету.
Ну если под CNT ещё можно предположить регистр TC, то с SR вообще теряюсь в догадках....
Подозреваю что у вас не LPC17x. А в таком случае нужно указывать какой CPU имеете в виду если вопрос касается периферии и желательно указывать как она у вас сконфигурена.

Да у меня STM32F407, но думаю что переферия таймеров очень похожа с LPC17x отличия только а названиях регистров.
TIM11->CNT - счетный регистр таймера
TIM11->SR - регистр статуса таймера
TIM_SR_UIF - флаг в регистре статуса, который устанавливается при прерывании

Сообщение отредактировал sidy - Jan 16 2014, 19:09
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 16 2014, 19:39
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Только в LPC флаги прерываний квтируются не записью '0', а записью '1'.
Отвечая на Ваш вопрос, думаю что вряд-ли будет проблема из-за отсутствия барьеров после квитирования флага прерывания, так как после этой операции и до выхода из ISR у вас много команд, так что сброс флага должен успеть дойти до периферии таймера до выхода из ISR.
И опять-же - что за мания такая использовать операции чтения-модификации-записи там где нужна просто запись? А остальные флаги потерять не боитесь? Да и просто - ЗАЧЕМ????
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- evgen2   повторные прерывания LPC17xx   Jan 14 2014, 23:32
- - _Артём_   Цитата(evgen2 @ Jan 15 2014, 01:32) Вот п...   Jan 14 2014, 23:50
- - Сергей Борщ   Цитата(evgen2 @ Jan 15 2014, 01:32) То вс...   Jan 15 2014, 07:54
|- - evgen2   Цитата(Сергей Борщ @ Jan 15 2014, 11:54) ...   Jan 15 2014, 09:41
|- - Сергей Борщ   Цитата(evgen2 @ Jan 15 2014, 11:41) ...   Jan 15 2014, 09:50
|- - evgen2   Цитата(Сергей Борщ @ Jan 15 2014, 13:50) ...   Jan 15 2014, 18:33
- - Aleksandr Baranov   Due to the processor pipeline, the Cortex-M proces...   Jan 15 2014, 22:32
|- - jcxz   Цитата(Aleksandr Baranov @ Jan 16 2014, 04...   Jan 16 2014, 06:48
- - swisst   Доброго дня ! на контроллере 1768 с MC0 и тайм...   Jan 16 2014, 09:55
|- - jcxz   1. Вот потому, что "дальше код", потому ...   Jan 16 2014, 10:48
|- - swisst   Цитата(jcxz @ Jan 16 2014, 12:48) 1. Вот ...   Jan 16 2014, 12:30
|- - sidy   Цитата(jcxz @ Jan 16 2014, 23:39) И опять...   Jan 16 2014, 19:44
- - Golikov A.   это стандартная ошибка при сбросах флагов REG |= ...   Jan 17 2014, 07:06
- - sidy   Понял, т.е. мы прочитали, изменили, записали в рег...   Jan 17 2014, 07:33
|- - Сергей Борщ   Цитата(sidy @ Jan 17 2014, 09:33) Т.е. оп...   Jan 17 2014, 10:50
|- - Golikov A.   Цитата(Сергей Борщ @ Jan 17 2014, 14:50) ...   Jan 17 2014, 20:17
- - Golikov A.   скорее так REG&=~FLAG => REG=REG&(~FLA...   Jan 17 2014, 10:18


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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 17:11
Рейтинг@Mail.ru


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