|
повторные прерывания LPC17xx |
|
|
|
Jan 14 2014, 23:32
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Jan 16 2014, 16:13
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jan 16 2014, 16:54
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(sidy @ Jan 16 2014, 22:13)  нужно ли мне ставить после __enable_irq(); __ISB()? Скажем по-другому: вам скорее всего не нужно ставить __disable_irq()/__enable_irq(). Зачем они? У вас что - в другом, более приоритетном ISR осуществляется запись в эти регистры???  Цитата(swisst @ Jan 16 2014, 18:30)  я же написал - для чистоты эксперимента. иначе получается, что вы знаете о том, что переменная нигде не используется, но не знаете, что порт 2 пустой  Что переменная нигде не используется я знаю из static int, а то что порт больше нигде - об этом ни слова. К тому же переменных типа int в ОЗУ можно создать ГОРАЗДО больше чем обычно имеется портов в МК. Если вы так расточительно будете подходить к ногам, что на одну ногу будете тратить целый 32-битный порт, то далеко не уедете...
|
|
|
|
|
Jan 16 2014, 17:18
|
Местный
  
Группа: Участник
Сообщений: 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 будет некорректным.
|
|
|
|
|
Jan 16 2014, 18:57
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|