Isaev_ivan 0 26 декабря, 2016 Опубликовано 26 декабря, 2016 · Жалоба Всем добрый вечер! Стоит такая задача - зажечь светодиод от нажатия кнопки, а при следующем нажатии потушить. Пересмотрел много различных тем, связанных с EXTI, но своего случая не нашел. Работаю с платой stm32f3discovery. Ниже приведен мой код: #include "stm32f30x.h" #include "startup_stm32f30x.s" #include "system_stm32f30x.c" #include "system_stm32f30x.h" void establish_clock(); void delay(int); void establish_ports(); void establish_int(); void EXTI0_IRQHandler(); void main() { establish_clock(); establish_ports(); establish_int(); do{} while(1); } void establish_clock() { RCC->CR |= RCC_CR_HSEBYP|RCC_CR_HSEON; RCC->AHBENR |= RCC_AHBENR_GPIOAEN|RCC_AHBENR_GPIOEEN; RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; do { delay(500); } while(RCC->CR&(RCC_CR_HSERDY)==0); //Checking RCC_CR_CSSON } void delay(int time) { do{} while(time--!=0); } void establish_ports() { GPIOA->MODER &= ~(GPIO_MODER_MODER0); GPIOE->MODER |= GPIO_MODER_MODER8_0|GPIO_MODER_MODER9_0|GPIO_MODER_MODER10_0|GPIO_MODER_MODER11_ 0|GPIO_MODER_MODER12_0|GPIO_MODER_MODER13_0|GPIO_MODER_MODER14_0|GPIO_MODER_MODER 15_0; } void establish_int() { EXTI->RTSR |= EXTI_RTSR_TR0; EXTI->IMR |= EXTI_IMR_MR0; //EXTI->SWIER = EXTI_SWIER_SWIER0; SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI0_PA; NVIC->ISER[0] |= 0x40; } void EXTI0_IRQHandler(void) { EXTI->PR|=EXTI_PR_PR0; if(GPIOE->ODR&(GPIO_ODR_8)==0) { GPIOE->ODR |= GPIO_ODR_8|GPIO_ODR_9|GPIO_ODR_10|GPIO_ODR_11|GPIO_ODR_12|GPIO_ODR_13|GPIO_ODR_1 4|GPIO_ODR_15; } else { GPIOE->ODR &= ~(GPIO_ODR_8|GPIO_ODR_9|GPIO_ODR_10|GPIO_ODR_11|GPIO_ODR_12|GPIO_ODR_13|GPIO_O DR_14|GPIO_ODR_15); } } Кнопка висит на порте PA0, а светодиоды на PE8...15. Однако, при нажатии кнопки прерывание все-таки происходит, и программа улетает неизвестно куды) Это на скрине получается адрес, где прога зависает после прерывания? Может я тогда чего намудрил с векторами прерываний? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 26 декабря, 2016 Опубликовано 26 декабря, 2016 · Жалоба void EXTI0_IRQHandler() объявлена как обычная функция, а надо сделать ее как прерывание. или в файле "startup_stm32f30x.s" указано другое имя этого прерывания. Да и файл "startup_stm32f30x.s" должен быть по другому включен в проект. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 10 26 декабря, 2016 Опубликовано 26 декабря, 2016 · Жалоба Да и файл "startup_stm32f30x.s" должен быть по другому включен в проект. А может вообще другой файл нужно использовать... надо было просто вместо общего startup_stm32f30x.s использовать startup_stm32f334x8.s всё заработало, всем всё равно спасибо sm.gif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Isaev_ivan 0 27 декабря, 2016 Опубликовано 27 декабря, 2016 · Жалоба Lagman, спасибо, сейчас буду пробовать!) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться