STM32f4. Внешние прерывания по кнопке.

Все о микроконтроллерах: AVR, PIC, STM8, STM32, Arduino, Altera, Xilinx, все что угодно. Этот раздел для всего что клацает байтиками.
Rogers
Сообщения: 13
Откуда: МО, Климовск

Сообщение Rogers » 22 июл 2014, 00:48

Приветствую! Имеется stm32f4discovery и подключенная к ней внешняя кнопка. Нужно, чтобы при нажатии на внешнюю кнопку на определенных пинах выставлялась 1 или 0. Кто-нибудь делал такое, используя внешние прерывания?

Rogers
Сообщения: 13
Откуда: МО, Климовск

Сообщение Rogers » 23 июл 2014, 20:57

Вроде немного разобрался. Здесь конкретно моя задача: к stm32f4discovery подключена внешняя кнопка. При ее нажатии должна "включится" кнопка User на плате, которая в свою очередь при ее нажатии включает светодиоды по кругу. Если внешняя кнопка не нажата, то кнопка User "не включена". Рабочий код:

Код: Выделить всё

#include "stm32f4xx.h"
void delay(__IO uint32_t nCount)
{
  while(nCount--)
  {
  }
}

void EXTI15_10_IRQHandler(void)
    {
    EXTI->PR        |=EXTI_PR_PR13;
      if ((GPIOC->IDR & 0x04000000)!=0x04000000)
       {   
          if ((GPIOA->IDR & 0x01)==0x01)
          {
          GPIO_SetBits(GPIOD, GPIO_Pin_12);
           delay(0x111111);
           GPIO_SetBits(GPIOD, GPIO_Pin_13);
           delay(0x111111);
           GPIO_SetBits(GPIOD, GPIO_Pin_14);
           delay(0x111111);
           GPIO_SetBits(GPIOD, GPIO_Pin_15);
           delay(0x111111);
           GPIO_ResetBits(GPIOD, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
           delay(0x111111);
       
            }}
      else
      {   GPIO_ResetBits(GPIOA, GPIO_Pin_0);
    }
   }
int main(void)
{
   
   GPIO_InitTypeDef GPIO_InitStructure;
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
   GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0;
   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN;
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
   GPIO_Init(GPIOA, &GPIO_InitStructure);


   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12| GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
   GPIO_Init(GPIOD, &GPIO_InitStructure);
SystemInit();
//***********RCC****************
    RCC->APB2ENR    |=RCC_APB2ENR_SYSCFGEN;
    RCC->AHB1ENR    |= RCC_AHB1ENR_GPIOCEN;

//***********GPIOC**************
    GPIOC->MODER    &=~GPIO_MODER_MODER13;       
    GPIOC->PUPDR     &=~GPIO_PUPDR_PUPDR13;       

//***********SYSCFG*************
    SYSCFG->EXTICR[3] |= SYSCFG_EXTICR4_EXTI13_PC;// PC13

//***********EXTI***************
    EXTI->IMR        |=(EXTI_IMR_MR13);           
    EXTI->RTSR         |=(EXTI_RTSR_TR13);           
    EXTI->FTSR         |=(EXTI_FTSR_TR13);           

//***********NVIC***************
    NVIC_EnableIRQ(EXTI15_10_IRQn);               
    NVIC_SetPriority(EXTI15_10_IRQn,14);       

    while(1)
   {
      
}
 }

Pavlya
Сообщения: 21
Откуда: Киев

Сообщение Pavlya » 24 июл 2014, 09:52

delay() в прерывании - это плохо. Очень плохо :-) Не надо так делать. Попробуй следующий алгоритм: Настрой внешние прерывания для кнопки 1 и 2. Прерывание кнопки 1 и 2 должно реагировать как на возрастающий так и на спадающий фронт (нажата/отжата) При нажатии кнопки 1 ты попадаешь в обработчик прерывания, который включает EXTI прерывания для кнопки 2. При отпускании кнопки - выключает. В обработчике прерываний кнопки 2 выставляешь флаг (присваиваешь в переменную 0 или 1) согласно которой в main() светодиоды по кругу будут включатся (или выключатся при отпущенной кнопке)

Вернуться в «Микроконтроллеры и ПЛИС»



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей