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

Почему не срабатывает EXTI на STM32f303

Всем добрый вечер! Стоит такая задача - зажечь светодиод от нажатия кнопки, а при следующем нажатии потушить. Пересмотрел много различных тем, связанных с 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. Однако, при нажатии кнопки прерывание все-таки происходит, и программа улетает неизвестно куды) Это на скрине

получается адрес, где прога зависает после прерывания? Может я тогда чего намудрил с векторами прерываний?

image.jpg

 

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


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

void EXTI0_IRQHandler() объявлена как обычная функция, а надо сделать ее как прерывание. или в файле "startup_stm32f30x.s" указано другое имя этого прерывания. Да и файл "startup_stm32f30x.s" должен быть по другому включен в проект.

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


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

Да и файл "startup_stm32f30x.s" должен быть по другому включен в проект.

А может вообще другой файл нужно использовать...

надо было просто вместо общего startup_stm32f30x.s использовать startup_stm32f334x8.s

всё заработало, всем всё равно спасибо sm.gif

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


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

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

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

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

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

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

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

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

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

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