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

 
 
 
Reply to this topicStart new topic
> STM32L152 внешние прерывания, не разобраться
Метценгерштейн
сообщение Jan 10 2013, 22:09
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



именно под проц L

хочу настроить ногу РА0 на срабатывание.

мне порт РА0 конфигурить как альтернативную функцию или просто как порт на вход?

где указать для этого проца, что EXTI0 будет именно на порт А?


чего еще не хвататет, чтобы заработало?
Код
  EXTI->IMR |= EXTI_IMR_MR0; // конфига the mask bits
  EXTI->RTSR |= EXTI_RTSR_TR0; //настройка фронта-среза
  EXTI->FTSR |= EXTI_FTSR_TR0; //настройка фронта-среза
  NVIC_EnableIRQ(EXTI0_IRQn);
  NVIC_SetPriority(EXTI0_IRQn, 15);

Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 11 2013, 05:37
Сообщение #2


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Метценгерштейн @ Jan 11 2013, 02:09) *
мне порт РА0 конфигурить как альтернативную функцию или просто как порт на вход?
У меня как порт на вход c пулапом.
Цитата(Метценгерштейн @ Jan 11 2013, 02:09) *
именно под проц L
Не для L, но тем не менее.
Код
static void mcu_init_ext_interrupts(void)       // PD15 interrupt on falling edge
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  // Enable AFIO clock

    EXTI_DeInit();

    EXTI_InitTypeDef EXTI_InitStruct;

    EXTI_InitStruct.EXTI_Line    = EXTI_Line15;
    EXTI_InitStruct.EXTI_Mode    = EXTI_Mode_Interrupt;
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;

    EXTI_Init(&EXTI_InitStruct);

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource15);

    NVIC_EnableIRQ(EXTI15_10_IRQn);                           // enable interrupt EXTI 15..10
}


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 11 2013, 08:34
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



т.е. нога у Вас просто как вход. Не как альтернативная ф-я. А зачем тогда тактирование разрешать альтернативной ф-ии?
Вопрос остается- как в L назначить именно порт А на EXTI0?

В процах F серии- там по-другому все делается.
Go to the top of the page
 
+Quote Post
ek74
сообщение Jan 11 2013, 10:12
Сообщение #4


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

Группа: Свой
Сообщений: 81
Регистрация: 4-08-05
Из: г. Саратов
Пользователь №: 7 351



Цитата(Метценгерштейн @ Jan 11 2013, 02:09) *
где указать для этого проца, что EXTI0 будет именно на порт А?


Код
// Connect EXTI line 0 to PA.0
SYSCFG->EXTICR[EXTI_PinSource0 >> 0x02] =
    (SYSCFG->EXTICR[EXTI_PinSource0 >> 0x02] & ~(0x0F << ((EXTI_PinSource0 & 0x03) * 4))) |
    (EXTI_PortSourceGPIOA << ((EXTI_PinSource0 & 0x03) * 4));

Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 11 2013, 10:23
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Метценгерштейн @ Jan 11 2013, 12:34) *
т.е. нога у Вас просто как вход. Не как альтернативная ф-я.
Да.
Цитата
А зачем тогда тактирование разрешать альтернативной ф-ии?
Не помню уже. Больше года назад писал это. Без этого видимо не работало.
Вспомнил! Потому что альтернативная функция может быть только на вывод, а нога то на ввод настраивается.
Цитата
GPIO MODES:
* ANALOG
* INPUT_FLOATING
* INPUT_PULL_DOWN
* INPUT_PULL_UP
* OUTPUT_PUSH_PULL
* OUTPUT_OPEN_DRAIN
* ALT_OUTPUT_PUSH_PULL
* ALT_OUTPUT_OPEN_DRAIN


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 11 2013, 11:08
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



добавил в проект файл stm32l1xx_syscfg.c

и подключил к линии EXTI0 порт А
Код
  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);   // Connect EXTI line 0 to PA.0


один хрен не работает. Что упускаю еще? Может тактирование разрешить? На порт А подаю
Код
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;


вот код с обработчиком
Код
void EXTI0_IRQHandler(void) {
  on (LED_Green);
  EXTI->PR |= EXTI_PR_PR0;//сбросили бит прерывания
}
...
...
...
  GPIOA->MODER &= ~GPIO_MODER_MODER0;  //input
  GPIOA->OTYPER &= ~GPIO_OTYPER_OT_0;  //Output push-pull
  GPIOA->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR0;  //40 MHz
  GPIOA->PUPDR &=~GPIO_PUPDR_PUPDR0;  //No pull-up, pull-down
  
  //настройка внешнего прерывания на int0
  __enable_irq ();
  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);   // Connect EXTI line 0 to PA.0
  EXTI->IMR |= EXTI_IMR_MR0; // какую линию выбираем из 23-х (у нас 0-я)
  EXTI->RTSR |= EXTI_RTSR_TR0; //настройка фронта-среза
  NVIC_EnableIRQ(EXTI0_IRQn);
  NVIC_SetPriority(EXTI0_IRQn, 15);


Цитата(demiurg_spb @ Jan 11 2013, 14:23) *
Вспомнил! Потому что альтернативная функция может быть только на вывод, а нога то на ввод настраивается.

осторожно не соглашусь) А где это сказано?
т.к. под UART я настраивал под альтернативную и вход и выход
Код
...
//Инициализация выводов: PA9 - USART1_TX, PA10 - USART1_RX
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //Включаем тактирование GPIOА
  
  //Для выводов PA9, PA10 выбираем альтернативную функцию работы с USART1
  GPIOA->AFR[1] |= (7<<4) | (7<<8); //для PA9 и PA10 задаем значение альтернативной функции - AF7, что соответствует USART1_TX
  
  //Инициализации вывода PA10 - USART1_Rx По умолчанию он Input floating
  GPIOA->MODER |= GPIO_MODER_MODER10_1;  //Alternate function mode  
  //Инициализации вывода PA9 - USART1_Tx
  GPIOA->MODER |= GPIO_MODER_MODER9_1;  //Alternate function mode
  GPIOA->OTYPER &= ~GPIO_OTYPER_OT_9;  //Output push-pull
  GPIOA->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR9_1;  //10 MHz
  GPIOA->PUPDR &=~GPIO_PUPDR_PUPDR9;  //No pull-up, pull-down
...


Сообщение отредактировал Метценгерштейн - Jan 11 2013, 10:41
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 11 2013, 13:24
Сообщение #7


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Вот мой обработчик:
Код
void __irq EXTI15_10_IRQHandler(void) // Photo flash feedback
{
    #define IRQ_MASK pin_mask(PIN_PHOTO_FEEDBACK)

    STATIC_ASSERT((IRQ_MASK>=(1UL<<10))&&(IRQ_MASK<=(1UL<<15)));

    EXTI->PR = IRQ_MASK; // reset flag by writing 1 to its bits location

    ENTER_CRITICAL_SECTION();
    {
        photo.picture.done     = photo.picture.awaiting;   // done if awaiting
        photo.picture.awaiting = 0;
    }
    LEAVE_CRITICAL_SECTION();    
}
Как видите для сброса можно и нужно ИМХО просто писать в EXTI->PR = MASK, а у вас по или: EXTI->PR |= MASK.
Не думаю что это критично, но тем не менее так оптимальней.
И ещё не уверен на счёт очерёдности сброса флага и выполнения тела обработчика (у меня сначала флаг, потом тело, а у вас наоборот).
Про остальное ничего вам не смогу посоветовать, т.к. c STM32L не работал, а отличия от F имеются.
Вы посмотрите структурную схему тактовых сигналов для вашего чипа, от туда сразу будет видно какое тактирование необходимо включить.
Что касается режимов работы GPIO, так я их все из даташита аккуратненько извлёк и ничего не упустил - это точно.

Цитата(Метценгерштейн @ Jan 11 2013, 15:08) *
осторожно не соглашусь) А где это сказано?
т.к. под UART я настраивал под альтернативную и вход и выход...
Ну например в их библиотеке STM32F10x_StdPeriph_Driver, а конкретнее в файле stm32f10x_gpio.h
Или в TRM на стр 156 в таблице 20


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 11 2013, 15:30
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



обработчик
Код
void EXTI0_IRQHandler(void) {
  on (LED_Blue);
  EXTI->PR |= EXTI_PR_PR0;//сбросили бит прерывания
}

инициализация
Код
void InitPeriph(void)
  {
...
тут инициализация портов на ногах и разрешение тактирования GPIOA GPIOB
кнопка PA0- как вход
...
  //настройка внешнего прерывания на int0
  __enable_irq ();
    RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
    
    SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI0_PA;
  
    EXTI->IMR |= EXTI_IMR_MR0; // какую линию выбираем из 23-х (у нас 0-я)
  
    EXTI->RTSR |= EXTI_RTSR_TR0; //настройка фронта-среза
    EXTI->FTSR |= EXTI_FTSR_TR0;
  
    NVIC_EnableIRQ(EXTI0_IRQn);
    NVIC_SetPriority(EXTI0_IRQn, 1);

  }

и при этом всем работать не хочет! Чего не так?
Уже в инете посмотрел- все так и инициализируют. Почему не работает?

Сообщение отредактировал Метценгерштейн - Jan 12 2013, 12:39
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Jan 12 2013, 13:41
Сообщение #9


Гуру
******

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



Функция обработчик у Вас так называется ?

Код
void EXTI0_IRQHandler(void)
{
     EXTI->PR|=(1<<0);     //сбрасываем флаг прерывания
}


У Вас есть внутрисхемный отладчик ? Можете посмотреть регистры ?


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 12 2013, 13:56
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



да, обработчик такой- выше сообщение- там он как раз и есть.

есть ST-LINKV2 и IAR.

Но с регистрами там что-то при нажатии на кнопку ничего не происходит.
Что непосредственно надо смотреть?

Сообщение отредактировал Метценгерштейн - Jan 12 2013, 14:06
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 12 2013, 15:56
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



разобрался- заработало.
Причина- был выбран в проекте язык С++, при смене на С- все работает.

А почему так?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 12 2013, 16:37
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Метценгерштейн @ Jan 12 2013, 17:56) *
разобрался- заработало.
Причина- был выбран в проекте язык С++, при смене на С- все работает.

А почему так?


Попробуйте так:
Код
extern "C" void EXTI0_IRQHandler(void)
{
     EXTI->PR|=(1<<0);     //сбрасываем флаг прерывания
}
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 12 2013, 18:58
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



да, заработало.
Вспомнил, что уже наступал на эти грабли)
Go to the top of the page
 
+Quote Post

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

 


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


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