Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[STM32]Zliczanie naciśnięć przycisków

Leon90 15 Lis 2012 15:46 1029 2
  • #1 15 Lis 2012 15:46
    Leon90
    Poziom 11  

    Witam
    Ten program powinien działać w taki sposób, żeby zliczał naciśnięcia przycisku Pin15 w czasie 2s. Mógłby mi ktoś powiedzieć w jaki sposób go zmienić aby działał? Z góry dziękuję za odp

    Code:

    /* Includes ------------------------------------------------------------------*/

    #include "stm32f10x.h"


    /* Private typedef -----------------------------------------------------------*/
    /* Private define ------------------------------------------------------------*/
    /* Private macro -------------------------------------------------------------*/
    /* Private variables ---------------------------------------------------------*/
    uint8_t y;


    /* Private function prototypes -----------------------------------------------*/
    void GPIO_Configuration();
    void NVIC_Configuration(void);
    void EXTI_Configuration(void);
    void Delay(__IO uint32_t nCount);
    /* Private functions ---------------------------------------------------------*/

    /*******************************************************************************
    * Function Name  : main.
    * Description    : main routine.
    * Input          : None.
    * Output         : None.
    * Return         : None.
    *******************************************************************************/

    GPIO_InitTypeDef GPIO_InitStructure;

    int main(void)
    {

      uint32_t i;
      GPIO_Configuration();
      GPIO_ResetBits(GPIOA,GPIO_Pin_1);
      NVIC_Configuration();
      EXTI_Configuration();
      for(i=0;i<1000000;i++)  //zakładam, że ten for wykonuje się przez 2s
      GPIO_Write(GPIOA, y);
      while(1)
      {}
    }
    void NVIC_Configuration(void)
    {
    NVIC_InitTypeDef NVIC_InitStructure;       //deklaracja struktury
    NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);      //adres do tablicy
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);    //grupa priorytetów
    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;  //wypełnienie pól struktury
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStructure);    //wywołanie funkcji inicjalizującej NVIC


    }
    void EXTI_Configuration(void)
    {
       EXTI_InitTypeDef EXTI_InitStruct;
       GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource15);
       EXTI_InitStruct.EXTI_Line = EXTI_Line15;




       EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
       EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;

    }
    void GPIO_Configuration(void)
    {
      GPIO_InitTypeDef GPIO_InitStructure;


      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

      /* Configure LED outputs */

      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
      GPIO_Init(GPIOA, &GPIO_InitStructure);

      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 ;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
      GPIO_Init(GPIOB, &GPIO_InitStructure);
    }

    /*******************************************************************************
    * Function Name  : Delay
    * Description    : Inserts a delay time.
    * Input          : nCount: specifies the delay time length.
    * Output         : None
    * Return         : None
    *******************************************************************************/
    void Delay(__IO uint32_t nCount)
    {
      uint8_t i;

      for(; nCount!= 0;nCount--)
      {i=nCount;}
    }


    Code:

    void EXTI15_10_IRQHandler(void)
    {
       extern y;
       if(EXTI_GetITStatus(EXTI_Line15) != RESET)
         {
          y=y<<1;
          y++;
          EXTI_ClearITPendingBit(EXTI_Line15); //kasowanie znacznika
       }
    }

    0 2
  • #2 15 Lis 2012 16:35
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Leon90 napisał:
    Mógłby mi ktoś powiedzieć w jaki sposób go zmienić aby działał?

    W prawidłowy i zgodny ze sztuką?

    Ten temat to mistrzostwo... Opisu sytuacji - brak (jaki mikrokontroler?). Opisu dokładnego problemu - brak (co nie działa?). Dobrze że choć kod jest... Pomijając już to, że jest to przykład znanego i lubianego problemu opisanego mniej więcej w milionie miejsc.

    4\/3!!

    0
  • #3 15 Lis 2012 19:30
    Leon90
    Poziom 11  

    Sorry, faktycznie trochę się pośpieszyłem. Mikrokontroler to STM32F103, a problem polega na tym, że żadna z diod się nie zapala obojętnie kiedy nie nacisnę Pin15.

    0