Cianid 0 9 августа, 2020 Опубликовано 9 августа, 2020 · Жалоба Всех приветствую. Проблема такая: при нажатии кнопки собственно нет захода в обработчик. При этом в дебаге вижу появление флага в PR13 в PR регистре. Прикрепил состояния регистров EXTI и SYSCFG. Инициализация прерывания void interrupt_init () { RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN; RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; GPIOC->PUPDR |= GPIO_PUPDR_PUPDR13_1; SYSCFG->EXTICR[3] &= ~SYSCFG_EXTICR4_EXTI13; SYSCFG->EXTICR[3] |= SYSCFG_EXTICR4_EXTI13_PC; EXTI->FTSR |= EXTI_FTSR_TR13; EXTI->RTSR |= EXTI_RTSR_TR13; EXTI->IMR |= EXTI_IMR_IM13; __NVIC_EnableIRQ(EXTI3_IRQn); } Основной цикл и обработчик int main(void) { spi_init(); port_led_init(); interrupt_init(); while (1) { GPIOA->ODR |= GPIO_ODR_OD5; GPIOA->ODR = 0; } } void EXTI3_IRQHandler (void) { EXTI->PR |= EXTI_PR_PR13; spi_write(0xAB); spi_write(0x14); for (int i =0; i<1000000; ++i) { GPIOA->ODR |= GPIO_ODR_OD5; } for (int i =0; i<1000000; ++i) { GPIOA->ODR = 0; } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 9 августа, 2020 Опубликовано 9 августа, 2020 · Жалоба Вектор не тот. У вас же не третье, а тринадцатое прерывание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Cianid 0 9 августа, 2020 Опубликовано 9 августа, 2020 (изменено) · Жалоба 36 минут назад, AHTOXA сказал: Вектор не тот. У вас же не третье, а тринадцатое прерывание. Как не тот? Всего же 5 векторов для обработки внешних прерываний. 13ый порт идет на EXTI3_IRQn. Изменено 9 августа, 2020 пользователем Cianid Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zeal0t 0 9 августа, 2020 Опубликовано 9 августа, 2020 · Жалоба вместо EXTI3_IRQHandler нужно использовать EXTI15_10_IRQHandler и там внутри разбирать от 13 линии это запрос или нет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 9 августа, 2020 Опубликовано 9 августа, 2020 · Жалоба 20 минут назад, Cianid сказал: 13ый порт идет на EXTI3_IRQn Чисто спортивный интерес: какие рассуждения привели вас к этому выводу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zeal0t 0 9 августа, 2020 Опубликовано 9 августа, 2020 (изменено) · Жалоба 3 minutes ago, Сергей Борщ said: Чисто спортивный интерес: какие рассуждения привели вас к этому выводу? скорее всего от того, что настраивается как SYSCFG->EXTICR[3] значит и прерывание тоже 3-е )) p.s. угадал ) Изменено 9 августа, 2020 пользователем Zeal0t Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Cianid 0 9 августа, 2020 Опубликовано 9 августа, 2020 (изменено) · Жалоба 9 минут назад, Сергей Борщ сказал: Чисто спортивный интерес: какие рассуждения привели вас к этому выводу? 13ый пин выбирается для прерывания в SYSCFG_EXTICR4 регистре, подумал, что ему в соответствие ставится EXTI3_IRQn вектор. Изменено 9 августа, 2020 пользователем Cianid Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 9 августа, 2020 Опубликовано 9 августа, 2020 · Жалоба Ну, раз с вектором вроде разобрались, добавлю, что чистить прерывание нужно не так: EXTI->PR |= EXTI_PR_PR13; , а вот так: EXTI->PR = EXTI_PR_PR13; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Cianid 0 9 августа, 2020 Опубликовано 9 августа, 2020 · Жалоба Только что, AHTOXA сказал: Ну, раз с вектором вроде разобрались, добавлю, что чистить прерывание нужно не так: EXTI->PR |= EXTI_PR_PR13; , а вот так: EXTI->PR = EXTI_PR_PR13; Спасибо. Заработало. Не совсем очевидна оказалась логика группировки 5-9 и 10-15 запросов в 1 регистр. А зачем обнулять именно весь регистр? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 9 августа, 2020 Опубликовано 9 августа, 2020 · Жалоба Там все биты помечены как "rc_w1". То есть, очищаются записью единички, а запись нуля не меняет состояние бита. Цитата read/clear (rc_w1) Software can read as well as clear this bit by writing 1. Writing ‘0’ has no effect on the bit value. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Cianid 0 9 августа, 2020 Опубликовано 9 августа, 2020 · Жалоба 37 минут назад, AHTOXA сказал: Там все биты помечены как "rc_w1". То есть, очищаются записью единички, а запись нуля не меняет состояние бита. Понял. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться