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

 
 
 
Reply to this topicStart new topic
> прерывание на stm32f407, не чистится бит EXTI->PR [2,3]
BlackOps
сообщение Jul 18 2013, 08:43
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121



Сконфигурировал два прерывания на EXTI2 и EXTI3. Пины PE2 и PE3.

При подаче единицы на пин PE2(EXTI2) прерывание всегда срабатывает как надо, и внутри обработчика включается один таймер.

Прерывание EXTI3 при подаче единицы на PE3не срабатывает нормально, а именно: Код входит в прерывание, проверяыет наличие прерывание на пине EXTI->PR,
затем даже производит нужные действия, включает еще один таймер и пару пинов других. Однако, по непонятным причинам не производится очистка бита 3 в регистре EXTI->PR

в дебаггере регистр EXTI->PR читается как 0хс, т.е. 1100, т.е. видно что якобы два прерывания активно, EXTI2 и EXTI3.

Мне непонятно одно: почему выстоен пин 2? Ведь первое прерывание прошло успешно, и я проверял что пин №2 после первого прерывания был очищен, и никакого сигнала на тот пин больше не подавал!

Каким образом вдруг не с того не с сего выставлен пин №2? И почему не очищается пин №3?


Вот код настройки прерывания EXTI2,3:
CODE

// Enable SYSCFG clock
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;



// External interrupt from pin PE2 (EXT1_IN1)
SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI2_PE; //

EXTI->IMR |= (1 << 2); // Mask PE2
EXTI->RTSR |= (1 << 2); // Rising Edge detection

NVIC_SetPriority(EXTI2_IRQn, 0x1);

NVIC_EnableIRQ(EXTI2_IRQn);



// External interrupt from pin PE3 (EXT1_IN2)
SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI3_PE; //

EXTI->IMR |= (1 << 3); // Mask PE3
EXTI->RTSR |= (1 << 3); // Rising Edge detection

NVIC_SetPriority(EXTI3_IRQn, 0x2);

NVIC_EnableIRQ(EXTI3_IRQn);



а вот код обработчиков EXTI2,3:
CODE

void EXTI2_IRQHandler()
{


// check if interrupt bit set
if ( (EXTI->PR) == (1 << 2) )
{
// clear interrupt bit
EXTI->PR = (1 << 2);

TIM2->CR1 |= TIM_CR1_CEN; // Enable TIM2
}


}



void EXTI3_IRQHandler()
{


// check if interrupt bit set
if ( (EXTI->PR) == (1 << 3) )
{
// clear interrupt bit
EXTI->PR = (1 << 3);

TIM5->CR1 |= TIM_CR1_CEN; // Enable TIM5


GPIOD->ODR |= GPIO_ODR_ODR_0; // EXT3_OUT1, PD0 HIGH

GPIOD->ODR |= GPIO_ODR_ODR_1; // EXT3_OUT2, PD1 HIGH
}


}



--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 18 2013, 09:29
Сообщение #2


Гуру
******

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



Код
if ( (EXTI->PR) == (1 << 2) )
if ( (EXTI->PR) == (1 << 3) )

Неправильно. Нужно так:
Код
if ( (EXTI->PR) & (1 << 2) )
if ( (EXTI->PR) & (1 << 3) )
}


Go to the top of the page
 
+Quote Post
BlackOps
сообщение Jul 18 2013, 09:37
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121



да точно..спасибо.


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 18 2013, 12:28
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



OFF: заметил что вы используете ODR для махания пинами - это не самый оптимальный способ.
Так будет лучше с нескольких точек зрения:
Код
GPIOX->BSRR = (1UL << (XPIN));  // Atomic bit-set operation
GPIOX->BRR  = (1UL << (XPIN));   // Atomic bit-clr operation

ну или через bitband...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Allregia
сообщение Jul 19 2013, 12:32
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(demiurg_spb @ Jul 18 2013, 14:28) *
OFF: заметил что вы используете ODR для махания пинами - это не самый оптимальный способ.
Так будет лучше с нескольких точек зрения:
Код
GPIOX->BSRR = (1UL << (XPIN));  // Atomic bit-set operation
GPIOX->BRR  = (1UL << (XPIN));   // Atomic bit-clr operation

Может лучше:

Код
GPIOX->BSRRL =  (1UL << (XPIN));}
GPIOX->BSRRH =  (1UL << (XPIN));}


?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 19 2013, 12:47
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Allregia @ Jul 19 2013, 16:32) *
Да. Я для stm32f10x пример дал, а для f4 немного иначе. Как Вы предложили или так:
Код
GPIOX->BSRR = (1UL << (XPIN));  // Atomic bit-set operation
GPIOX->BSRR = (1UL << 16+(XPIN));   // Atomic bit-clr operation


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

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

 


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


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