Перейти к содержанию
    

stm32f4, EXTI, PD6

не срабатывает

 

Библиотеку стандартную не использую, хотя только под нее примиеры и находил.

 

вот так включаю прерывание (использованы парa функций СМ4)

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

// External interrupt from pin PD6
SYSCFG->EXTICR[1] = SYSCFG_EXTICR2_EXTI6_PD; //


EXTI->IMR = 0x01; // Mask MR0
EXTI->RTSR = 0x01; // Rising Edge detection
EXTI->FTSR = 0x00; // Falling edge detect OFF



NVIC_SetPriority(EXTI9_5_IRQn, 0x0000000f);

NVIC_EnableIRQ(EXTI9_5_IRQn);

 

Порт настроен как вход, с подтяжкой к земле.

 

обработчик пока пустой, пока просто хочу проверить перейдет ли он вообще в прерывание

void EXTI9_5_IRQHandler()
{
    for(;;)
    {
    }
}

 

вроде настроено все как надо, а две функции СМ4 ставят приоритет и включают прерывание, Пин 6 между Пин9 и Пин5, так что думаю верно все выбрано.

 

что я упустил?

 

попробовал добавить после всей инициализации это:

EXTI->SWIER = 0x01;

 

т.е. программно включить прерывание, тоже не помогает пока

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тактирование порта подано?

да, подано, на этом порту и УСАРТ работает, все нормально.

 

Я еще вот что сделал сейчас:

EXTI->SWIER = 0x01;

pr_reg = EXTI->PR;

 

И значение pr_reg = 1 в дебаггере, т.е. бит установился, вроде как среагировал на прерывание эмулированное программным путем, но проблема в том, что он не хочет переходить в обработчик прерывания.

 

кстати, вторая проблема в том что EXTI->PR имеет значение 0 когда провод подтягиваю к 3.3В, сам порт как я уже сказал настроен на подтяжку на землю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё прекрассно работает. В частности переключаю на лету ногу SPI и жду готовности от АЦП

 

// Работа с ножкой готовности АЦП

#define ADCPIN_DOUT GPIOC->MODER = PIN2X(SPI3_MISO,AF)|MODER_C

#define ADCPIN_RDY GPIOC->MODER = PIN2X(SPI3_MISO,IN)|MODER_C

// Настройка прерывания по готовности (свалу импульса)

#define ADCPIN_RDY_INTEN EXTI->IMR |= PIN(SPI3_MISO)

#define ADCPIN_RDY_INTDIS EXTI->IMR &= ~PIN(SPI3_MISO)

#define ADCPIN_RDY_INIT EXTI->FTSR |= PIN(SPI3_MISO); SYSCFG->EXTICR[2] = PORTC_PIN<<12

#define ADCPIN_RDY_INTCLR EXTI->PR = PIN(SPI3_MISO)

 

Вы SYSCFG не загрузили

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как-то форум не очень чётко работает. Не меняется число ответов в теме и последний ответ игнорируется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы SYSCFG не загрузили

как это не загрузил? загрузил. Проблема не в этом была. Я маску просто не так настроил.

надо было:

EXTI->IMR = 0x40; // Mask MR0

EXTI->RTSR = 0x40; // Rising Edge detection

EXTI->FTSR = 0x00; // Falling edge detect OFF

 

т.е. EXTI->IMR = (1 << 6); потому что у меня пин 6.

 

а я просто EXTI->IMR = 0х01; писал, я просто думал любой бит там можно выбрать для линии прерывания, а должна быть маска

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...