Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Почему не срабатывает EXTI на STM32f303
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Isaev_ivan
Всем добрый вечер! Стоит такая задача - зажечь светодиод от нажатия кнопки, а при следующем нажатии потушить. Пересмотрел много различных тем, связанных с 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
void EXTI0_IRQHandler() объявлена как обычная функция, а надо сделать ее как прерывание. или в файле "startup_stm32f30x.s" указано другое имя этого прерывания. Да и файл "startup_stm32f30x.s" должен быть по другому включен в проект.
adnega
Цитата(Lagman @ Dec 26 2016, 23:19) *
Да и файл "startup_stm32f30x.s" должен быть по другому включен в проект.

А может вообще другой файл нужно использовать...
Цитата
надо было просто вместо общего startup_stm32f30x.s использовать startup_stm32f334x8.s
всё заработало, всем всё равно спасибо sm.gif
Isaev_ivan
Lagman, спасибо, сейчас буду пробовать!)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.