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

 
 
> stm32f4 прерывания, изменение переменных прерыванием, и включение другого прерывания
BlackOps
сообщение Jul 30 2013, 16:13
Сообщение #1


Знающий
****

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



два вопроса:

1) как лучше объявлять глобальную переменную вне функции main() если я хочу чтобы эта переменная нормально модифицировалась/читалась прерыванием и основной программой?


2) Я заметил проблемы с прерыванием по EXTI, а именно, когда в обработчике прерывания по EXTI я хочу включить прерывание EXTI другого пина, то у меня все вылетает с ошибкой Segmentation Fault, в чем причина этого?

И как правильнее организовать включение одного прерывания (в данном случае EXTI) внутри другого?

Я например делаю так:

первое прерывание ЕХТИ:
Код
// Enable SYSCFG clock
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;


[code]// 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);



А вот так выглядит обработчик этого прерывания где включается второе аналогичное:

Код
void EXTI2_IRQHandler()
{

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

// External interrupt from pin PE4 (EXT1_IN3)
SYSCFG->EXTICR[1] |= SYSCFG_EXTICR2_EXTI4_PE; //

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

NVIC_SetPriority(EXTI4_IRQn, 0x3);

NVIC_EnableIRQ(EXTI4_IRQn);

}
}


не кладите мой код в codebox, это КОРОТКИЙ код!


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
BlackOps
сообщение Sep 2 2013, 23:23
Сообщение #2


Знающий
****

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



короче я переделал код потом. Одна из задач такая: Активируется внешние прерывание ЕХТI2, внутри него в зависимости от некоторых условий должно быть включено прерывание на ЕХТI4.
т.е. как только программа начинается включено прерывание ЕХТI2 на высокий уровень внешнего сигнала а прерывание ЕХТI4 выключено. Прерывание ЕХТI4 должно включится внутри прерывания ЕХТI2 при соблюдении определенных условий.

разумеется я в начале включаю SYSCFG clock, затем включаю прерывание ЕХТI2.

вот код включения прерывания ЕХТI4 (код включения ЕХТI2 аналогичный только с другой маской):
Код
// External interrupt from pin PE4 (EXT1_IN3)
SYSCFG->EXTICR[1] |= SYSCFG_EXTICR2_EXTI4_PE; //

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

NVIC_SetPriority(EXTI4_IRQn, 0x3);

NVIC_EnableIRQ(EXTI4_IRQn);

Так вот проблема сейчас в том, что после включения прерывания ЕХТI4, и подачи сигнала 1 на соответствующий пин прерывание ЕХТI4 не срабатывает.
Оно просто не включается и все.

Я уладил это тем что создал глобальную переменную, и вместо того чтобы включать прерывание ЕХТI4 внутри ЕХТI2 я просто меняю значение созданной глобальной переменной, затем из ЕХТI2 программа возвращается к основному циклу, а там происходит проверка глобальной переменной, если ее значение изменено, то внутри основного цикла программы я включаю прерывание ЕХТI4 точно тем куском кода приведенным выше.

И тогда все работает, т.е. подается сигнал уровня 1 на соответствующий пин и все срабатывает как надо.

Стоит мне перенести этот код внутри прерывания ЕХТI2 и опять ничего не работает.
Ошибок дебаггер сейчас не выдает.

В чем же может быть проблема в данном случае? (точно не в железе, т.к. разница между работающим и не работающем прерывании ЕХТI4 только в перестановке вышеуказанного кода между циклом основной программы и телом прерывания ЕХТI2)
Я помню пробовал раньше из одного прерывания включать другое и работало, так выходит иногда это не работает? Но от чего зависит?

Я также пробовал проверить регистры IMR,RTSR просто чтоб убедится что они выставлены как надо когда тот код в теле прерывания ЕХТI2, и все было правильно. Но прерывание просто не активно! т.е. не срабатывает на внешний сигнал.


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:19
Рейтинг@Mail.ru


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