реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Прерывания не срабатывают на нужной кнопке, stm32f103ve
magals
сообщение Jan 15 2015, 09:32
Сообщение #1





Группа: Новичок
Сообщений: 2
Регистрация: 15-01-15
Пользователь №: 84 603



Изучаю тему с прерываниями/ Есть stm32f103ve к ноге PD12 установлена кнопка, при нажатии должно срабатывать прерывание.
код:
Код
int main() {
        RCC->APB2ENR |= RCC_APB2Periph_GPIOD;
        GPIOD->CRL |= 0x04;
        GPIOD->CRL &= ~0xb;

        AFIO->EXTICR [0] = AFIO_EXTICR4_EXTI12_PD;
        EXTI->FTSR |= EXTI_FTSR_TR0;
        EXTI->IMR |= EXTI_IMR_MR0;
        NVIC_EnableIRQ (EXTI0_IRQn);

  while(1)
  {
     //Программа ничего не делает в пустом цикле
  }
}
// Обработчик прерывания EXTI0
void EXTI0_IRQHandler(void)
{
         if (EXTI->PR & (1<<0)) //проверяем прерывание от EXTI0
         {
                 GPIOC->BRR = GPIO_BRR_BR8;//тушим светодиод
                 EXTI->PR |= EXTI_PR_PR1; //сброс флага прерывания
         }
}

но прерывание срабатывает на ножке PA0. где я ошибся?

Сообщение отредактировал IgorKossak - Jan 15 2015, 11:14
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 15 2015, 09:47
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата
AFIO->EXTICR [0] = AFIO_EXTICR4_EXTI12_PD;

а не EXTICR [4] случаем?
Go to the top of the page
 
+Quote Post
magals
сообщение Jan 15 2015, 11:43
Сообщение #3





Группа: Новичок
Сообщений: 2
Регистрация: 15-01-15
Пользователь №: 84 603



все понял.
код
CODE
GPIO_InitTypeDef PORT;
//Затактируем все три порта
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD , ENABLE);
//Прерывания - это альтернативная функция порта
//поэтому надо установить бит Alternate function I/O clock enable
//в регистре RCC_APB2ENR
RCC_APB2PeriphClockCmd(RCC_APB2ENR_AFIOEN , ENABLE);
// Настроим ноги со светодиодами на выход
PORT.GPIO_Pin = (GPIO_Pin_6 | GPIO_Pin_5);
PORT.GPIO_Mode = GPIO_Mode_Out_PP;
PORT.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOE, &PORT);



AFIO->EXTICR[3]|=AFIO_EXTICR4_EXTI12_PD;
//Прерывания от нулевой и первой ноги разрешены
EXTI->IMR|=(EXTI_IMR_MR12);
//Прерывания на обоих ногах по нарастающему фронту
EXTI->RTSR|=(EXTI_RTSR_TR12);
//Разрешаем оба прерывания
//NVIC_EnableIRQ (EXTI0_IRQn);
NVIC_EnableIRQ(EXTI15_10_IRQn);

while(1)
{
}
}
// Обработчик прерывания EXTI0
void EXTI15_10_IRQHandler(void)
{
GPIOE->ODR^=GPIO_Pin_6;//тушим светодиод
EXTI->PR |= EXTI_PR_PR12;
}

проблема в том что я не ту функцию прерывания для используемой ноги вызываю и настройки ножки тоже не правильные были
http://easystm32.ru/for-beginners/25-inter...ndling-in-stm32 - помогла статья

только само прерывание что-то очень долго срабатывает. примерно после нажатия проходит 1 секунда прежде чем светодиод поменяет состояние

Сообщение отредактировал IgorKossak - Jan 15 2015, 18:08
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 17:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01368 секунд с 7
ELECTRONIX ©2004-2016