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][przerwania]klawiatura matrycowa

marcelix007 26 Lis 2010 09:11 2241 4
  • #1 26 Lis 2010 09:11
    marcelix007
    Poziom 14  

    Witam. Muszę napisać funkcje obsługi klawiatury matrycowej. Niestety generuje mi się dodatkowe przerwanie podczas zmiany stanu wyprowadzeń pinów. Przerwania jest generowane gdy aktywuje ponownie przerwania.

    Cytat:

    void klawmat1(void)
    {
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0);
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = DISABLE;
    EXTI_Init(&EXTI_InitStructure);

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource1);
    EXTI_InitStructure.EXTI_Line = EXTI_Line1;
    EXTI_Init(&EXTI_InitStructure);

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);
    EXTI_InitStructure.EXTI_Line = EXTI_Line2;
    EXTI_Init(&EXTI_InitStructure);


    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
    NVIC_Init(&NVIC_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
    NVIC_Init(&NVIC_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
    NVIC_Init(&NVIC_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOE, &GPIO_InitStructure);

    GPIO_ResetBits(GPIOE, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
    GPIO_SetBits(GPIOE, GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);

    }

    void klawmat(void)
    {
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
    GPIO_SetBits(GPIOE, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOE, &GPIO_InitStructure);

    GPIO_ResetBits(GPIOE, GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;




    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0);
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource1);
    EXTI_InitStructure.EXTI_Line = EXTI_Line1;
    EXTI_Init(&EXTI_InitStructure);

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);
    EXTI_InitStructure.EXTI_Line = EXTI_Line2;
    EXTI_Init(&EXTI_InitStructure);
    }

    Cytat:

    //ObsBuga przycisków
    void EXTI0_IRQHandler(void)
    {
    USART_SendData(USART3,'T');
    while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
    USART_SendData(USART3,13);
    while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);

    klawmat1();
    USART_SendData(USART3,(GPIO_ReadInputData(GPIOE)>>3)&0xF);
    while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
    USART_SendData(USART3,13);
    while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
    EXTI_ClearITPendingBit(EXTI_Line0);
    klawmat();
    }

    void EXTI1_IRQHandler(void)
    {
    USART_SendData(USART3,'D');
    while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
    USART_SendData(USART3,13);
    while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);

    EXTI_ClearITPendingBit(EXTI_Line1);

    }
    void EXTI2_IRQHandler(void)
    {
    USART_SendData(USART3,'P');
    while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
    USART_SendData(USART3,13);
    while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);

    EXTI_ClearITPendingBit(EXTI_Line2);
    }


    Po wyzwoleniu przerwania EXTI0_IRQHandler wykonuje się to przerwania oraz EXTI2_IRQHandler.

    Co robię źle?

    0 4
  • #2 26 Lis 2010 10:02
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Skoro zerujesz ręcznie piny to czego się spodziewasz jeśli nie wyzwolenia przerwania od zbocza opadającego? Moduł EXTI działa niezależnie od tego czy ma włączone przerwania czy nie - jeśli są wyłączone to po prostu nic się nie wywoła, ale flagi zostaną sprawdzone. Jeśli włączysz przerwanie, a flaga była ustawiona, to przerwanie zostanie aktywowane najszybciej jak to możliwe.

    4\/3!!

    0
  • #3 26 Lis 2010 10:27
    marcelix007
    Poziom 14  

    Byłem przekonany, że po wyłączeniu EXTI flagi sie nie zmieniają.
    Czyli muszę wyzerować flagę poleceniem EXTI_ClearFlag(EXTI_Line0)?

    0
  • Pomocny post
    #4 26 Lis 2010 10:36
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Musisz wyzerować flagę, a czy zrobisz to normalnie czy przy użyciu tej bzdurnej biblioteki to już nie ma znaczenia.

    4\/3!!

    0
  • #5 26 Lis 2010 10:47
    marcelix007
    Poziom 14  

    Dzięki Freeddie jesteś WIELKI

    0