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

 
 
> Внешнее прерывание в STM32, почему не происходит прерывание от кнопки?
kumle
сообщение Sep 9 2011, 06:52
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 15-12-09
Из: Москва
Пользователь №: 54 280



Всем привет!
Разбираюсь с платкой STM32DISCOVERY
Там имеется кнопка которая подключена к порту PA0
Надо сделать чтоб по нажатию происходило прерывание

Пользуюсь библиотекой STM32F10x_StdPeriphDiver (CMSIS)

Я делаю так:

1) В подключенном к проекту файле startup_stm32f10x_md_vl.s есть строка DCD EXTI0_IRQHandler ; EXTI Line 0
поэтому в программе вставляю обработчик void EXTI0_IRQHandler(void)
2) Затем настраиваю порт PA0 как вход подтянутый к нулю
3)Включаю тактирование RCC_APB2Periph_GPIOA порта A
4)Тут же включаю тактирование RCC_APB2Periph_AFIO, так как это альтернативная фунция порта
5) Настраиваю блок EXTI и разрешаю прерывание в NVIC:

void EXTI_INIT(void)
{
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //говорим что вывод PA0 используется как внешний вывод прерывания
GPIO_EventOutputConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //неуверен что это нужно ???

EXTI_InitStructure.EXTI_Line = 0; //используем линию 0 (она для портов PA0 - PG0)
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //режим хардварного прерывания
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //прерывание по нарастанию импульса
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //??? это я вообще непонял зачем нужно ???
EXTI_Init(&EXTI_InitStructure); //передаем настройку в функцию инициализации

EnableIRQ(EXTI0_IRQn); //разрешаем прерывание в NVIC //использую линию EXTI0_IRQn так как она ля портов PA0-PG0
}

Все сделал но прерывание не срабатывает ?
Другие прерывания (от USART и от SYSTICK) в эом же проекте прекрасно работают
В чем тут может быть дело? Может я чего упустил ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kumle
сообщение Sep 12 2011, 06:13
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 15-12-09
Из: Москва
Пользователь №: 54 280



Цитата(MK2 @ Sep 9 2011, 20:40) *
В файле stm32vldiscovery.c есть настройка портов
вот что вы забыли:
Код
  /* Configure Button pin as input floating */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Pin = BUTTON_PIN[Button];
  GPIO_Init(BUTTON_PORT[Button], &GPIO_InitStructure);


Нет не забыл, я же в пункте 2 написал что:
"2) Затем настраиваю порт PA0 как вход подтянутый к нулю"

Вобщем ВСЕ ЗАРАБОТАЛО !, дело оказалось вот в чем:

В настройках EXTI я написал:
EXTI_InitStructure.EXTI_Line = 0; //используем линию 0 (она для портов PA0 - PG0)
Но это оказалось неправильно.

Нужно было сделать так:
EXTI_InitStructure.EXTI_Line=EXTI_Line0;

Константа EXTI_Line0 описана в файле stm32f10x_exti.h
#define EXTI_Line0 ((uint32_t)0x00001) /*!< External interrupt line 0 */
Rjy


Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение May 15 2012, 15:32
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Поделюсь своим кодом для прерываний от кнопок на PB8 PB9 STM32L151 Keil

Код
////////////настраиваем порт//////////////////////////////////////
void GPIO_INIT(void)
{
  
   //включаем тактирование портов
   RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
    
   //кнопки
    GPIOB->MODER &= ~GPIO_MODER_MODER8;
    GPIOB->MODER &= ~GPIO_MODER_MODER9;

    GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR8;
    GPIOB->PUPDR |=  GPIO_PUPDR_PUPDR8_0;

    GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR9;
    GPIOB->PUPDR |=  GPIO_PUPDR_PUPDR9_0;

    RCC->APB2ENR|=RCC_APB2ENR_SYSCFGEN;     //включаем тактирование System configuration controller

    SYSCFG->EXTICR[2]|= SYSCFG_EXTICR3_EXTI8_PB; //     http://eugenemcu.ru/publ/13-1-0-80
    SYSCFG->EXTICR[2]|= SYSCFG_EXTICR3_EXTI9_PB; //

    EXTI->IMR |= (1<<8)|(1<<9);
    EXTI->FTSR |= (1<<8)|(1<<9);

    
    NVIC_SetPriority(EXTI9_5_IRQn, 4);
    NVIC_EnableIRQ(EXTI9_5_IRQn);

}





//////////////////прерывание от кнопок/////////////////////
void EXTI9_5_IRQHandler(void)
{

EXTI->PR=0xffffffff;     //сбрасываем флаг прерывания
}


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post



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

 


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


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