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

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> прерывания STM32F4, должно работать, но не хочет...
Метценгерштейн
сообщение Aug 23 2014, 16:06
Сообщение #1


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

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



Вроде все настроил, платка F4Discovery, а работать по нажатию на кнопку не хочет.
Может кто подскажет что не так ему?
Код
void EXTI0_IRQHandler(void)
{
  on (LED_Blue);
  EXTI->PR |= EXTI_PR_PR0;//сбросили бит прерывания
}

Код
void main()
{
  InitPeriph(); // тут лампочка описана и дефайн кнопки
  
// настройка ноги на прерывание PA0
    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
    
    // настройка внешнего прерывания на PA0
      RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
      SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI0_PA;
      EXTI->IMR |= EXTI_IMR_MR0;
      EXTI->RTSR |= EXTI_FTSR_TR0;
      NVIC_EnableIRQ(EXTI0_IRQn);  
      NVIC_SetPriority(EXTI0_IRQn, 1);
  
  
  while(1)
  {
    
  }      
  
}
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 23 2014, 17:17
Сообщение #2


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Почему не работает не скажу, но при таком способе сброса запросов на прерывание сброшены будут все имеющиеся, а не только EXTI_PR_PR0. Надо так:
Код
EXTI->PR = EXTI_PR_PR0;


Проверьте, что с инициализацией - вот образец точно работающего:
http://188.134.5.254/browser/hfreceiver/trunk/pio.c#L362
Программирование вывода на ввод не здесь. У Вас - вне не только дефайн кнопки, но и инициализация регистров? Порт "А" включаете?

Вы везде предполагаете что в регистрах до Вас только нули были.

Вы задаёте proprity - а как сконфигурирована система прерываний? Реакция на вашу "1" от этого зависит.

Сообщение отредактировал Genadi Zawidowski - Aug 23 2014, 17:25
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Aug 23 2014, 17:23
Сообщение #3


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

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



Цитата(Genadi Zawidowski @ Aug 23 2014, 21:17) *
Почему не работает не скажу, но при таком способе сброса запросов на прерывание сброшены будут все имеющиеся, а не только EXTI_PR_PR0. Надо так:
Код
EXTI->PR = EXTI_PR_PR0;

разве у меня по-другому?
он не заходит в прерывание, раз LED не поджигает. До сброса не доходит дело.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 23 2014, 17:29
Сообщение #4


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Я напимсал, что увиденная ошибка не влияет. Но потом помешает.
Цитата
разве у меня по-другому?
У Вас:
Код
EXTI->PR |= EXTI_PR_PR0;
У меня:
Код
EXTI->PR = EXTI_PR_PR0;
В чём отличия понятно?


Инициализацию кнопки покажите. Или убедитесь, что её видно из программы.

hint: На discovery кнопка зажимает в "0" вход.

Сообщение отредактировал Genadi Zawidowski - Aug 23 2014, 17:28
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Aug 23 2014, 17:35
Сообщение #5


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

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



да, увидел отличия- глаз замылился.

кнопка- она же видна в 1-м посте.
настройка ноги на прерывание PA0

если имеете ввиду
on (LED_Blue);
то это работает, если просто в код вставить.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 23 2014, 17:38
Сообщение #6


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Если в первом посте, я не вижу
Код
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;    /* I/O port A clock enable */

Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Aug 23 2014, 17:41
Сообщение #7


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

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



вот InitPeriph(); здесь
Код
#ifndef HARDWARE_H__
#define HARDWARE_H__

#define  LED_Green      GPIOD, GPIO_Pin_12, H
#define  LED_Orange     GPIOD, GPIO_Pin_13, H
#define  LED_Red        GPIOD, GPIO_Pin_14, H
#define  LED_Blue       GPIOD, GPIO_Pin_15, H

#define RS232_BAUDRATE  38400
#define SYS_CLK             (32000000LL) // частота шины
#define TIM6_PRESCALER      (0x3E8LL) // предделитель системной частоты (делим на 1000)
#define TIM6_COMPARE(ARR)        MS // до скольки считает счетчик и прерывается

#define   MS                SYS_CLK / TIM6_PRESCALER / 1000  // сколько итераций цикла надо на одну миллисекунду
#define   MKS               MS / 1000                 // на микросекунду в 1000 раз меньше
    
void InitPeriph(void)  {
  SysTick_Config(SystemCoreClock/8/1000); // системный таймер -из файла exel видно, что он делится на 8 от тактовой частоты
  
  RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOAEN;   // Включаем тактирование порта D
  
  GPIOD->MODER |= GPIO_MODER_MODER12_0;  //output
  GPIOD->OTYPER &= ~GPIO_OTYPER_OT_12;  //Output push-pull
  GPIOD->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR12;  //40 MHz
  GPIOD->PUPDR &=~GPIO_PUPDR_PUPDR12;  //No pull-up, pull-down
  
  GPIOD->MODER |= GPIO_MODER_MODER13_0;  //output
  GPIOD->OTYPER &= ~GPIO_OTYPER_OT_13;  //Output push-pull
  GPIOD->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR13;  //40 MHz
  GPIOD->PUPDR &=~GPIO_PUPDR_PUPDR13;  //No pull-up, pull-down
  
  GPIOD->MODER |= GPIO_MODER_MODER14_0;  //output
  GPIOD->OTYPER &= ~GPIO_OTYPER_OT_14;  //Output push-pull
  GPIOD->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR14;  //40 MHz
  GPIOD->PUPDR &=~GPIO_PUPDR_PUPDR14;  //No pull-up, pull-down

  GPIOD->MODER |= GPIO_MODER_MODER15_0;  //output
  GPIOD->OTYPER &= ~GPIO_OTYPER_OT_15;  //Output push-pull
  GPIOD->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR15;  //40 MHz
  GPIOD->PUPDR &=~GPIO_PUPDR_PUPDR15;  //No pull-up, pull-downown
  }

#endif  //  HADRWARE_H__
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 23 2014, 17:45
Сообщение #8


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Проверьте видимость кнопки чтением регистра GPIOA->IDR. Вне прерываний. Так же, как проверяли on(LED_BLUE)
Вы включаете pull-down, на плате стоит pull-up... Предположу, что напряжение на входе кнопки меняется от 0 до 0.8 вольта.

Код
for (;;)
{
if ((GPIOA->IDR & 0x0001) != 0)
  on(LED_BLUE);
else
  off(LED_BLUE);
}

А потом поменяйте условие на обратное.

Сообщение отредактировал Genadi Zawidowski - Aug 23 2014, 17:50
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Aug 23 2014, 17:57
Сообщение #9


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

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



так нет реакции
Код
{
if ((GPIOA->IDR & 0x0001) != 0)
  on(LED_Blue);
else
  off(LED_Blue);
}

так
Код
{
if ((GPIOA->IDR & 0x0001) != 0)
  off(LED_Blue);
else
  on(LED_Blue);
}

загорелась сразу и горит. ничего не нажимал
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 23 2014, 17:58
Сообщение #10


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



На нажатия должна реагировать. Пока видно, что всегда читается "0".
Цитата
Предположу, что напряжение на входе кнопки меняется от 0 до 0.8 вольта.

Тестер есть?


Сообщение отредактировал Genadi Zawidowski - Aug 23 2014, 18:00
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Aug 23 2014, 18:00
Сообщение #11


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

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



инициализация прерывания верная же?
просто кнопка работает- опрашивал ее по кругу в цикле
есть и осцилл и тестер

при нажатии на кнопку, напряжение на РА0 2,97В
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 23 2014, 18:03
Сообщение #12


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата
просто кнопка работает- опрашивал ее по кругу в цикле

Как Вы заметили, мой тест тоже опрашивает по кругу в цикле... Но нет реакции.
Инициализация прерывания на мой взгляд правильная, разбирайтесь с инициализацией кнопки.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Aug 23 2014, 18:11
Сообщение #13


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

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



Код
if ( is_bit_active(KEY) )
{
  on (LED_Blue);
}

все работает- зажигается

вот дефайн
Код
#define _setL(port,bit)         do { port -> BSRRH = bit; } while(0)
    #define _setH(port,bit)         do { port -> BSRRL = bit; } while(0)
    #define _clrL(port,bit)         do { port -> BSRRL = bit; } while(0)
    #define _clrH(port,bit)         do { port -> BSRRH = bit; } while(0)
    #define _cpl(port,bit,val)         { if ((port -> ODR) & bit) _clr##val(port, bit); else _set##val(port, bit); }
    #define _bitL(port,bit)         (!((port -> IDR) & bit))
    #define _bitH(port,bit)         ((port -> IDR) & bit)
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 23 2014, 18:21
Сообщение #14


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Сорри, посмотрел схему... На PA0 кнопка подает "1".
Тогда смотрите? вообще работают ли прерывания. Таймерное. Закомментируйте NVIC_SetPriority
Цитата
все работает- зажигается

Я про свой код спросил. Он реагирует на кнопку?
Цитата
все работает- зажигается

Интересует, гаснет ли при отпускании кнопки.

Сообщение отредактировал Genadi Zawidowski - Aug 23 2014, 18:35
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Aug 23 2014, 18:35
Сообщение #15


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

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



провел эксперимент:
в цикле зеленый LED мигает, прерывания разрешены.
как только нажимаю на кнопку, зеленый LED прекращает мигать и останавливается в одном из положений.
???

Цитата(Genadi Zawidowski @ Aug 23 2014, 22:21) *
Сорри, посмотрел схему... На PA0 кнопка подает "1".
Тогда смотрите? вообще работают ли прерывания. Таймерное. Закомментируйте NVIC_SetPriority

Я про свой код спросил. Он реагирует на кнопку?

нет, не реагирует никак. в одном случае горит, во втором случае не горит.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 26th August 2025 - 13:34
Рейтинг@Mail.ru


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