но своего случая не нашел. Работаю с платой 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);
}
}
#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. Однако, при нажатии кнопки прерывание все-таки происходит, и программа улетает неизвестно куды) Это на скрине
получается адрес, где прога зависает после прерывания? Может я тогда чего намудрил с векторами прерываний?