Page 1 of 1

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

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

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

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

Code: Select all

#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)
   {
		 
}
 }

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

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