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

 
 
> STM32F072CB PC13 в режиме EXTI
seniorandre
сообщение Feb 19 2015, 18:56
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 6-07-12
Из: г.Нижний Новгород
Пользователь №: 72 651



Очень долгое время бился над проблемой, сейчас она локализована, но легче не стало:
1. На выводах PC13-PC15 висят кнопки, выводы в режиме EXTI, проинициализировано, вот так:
Код
void EXTI_User_Button_Config(void)
{
    EXTI_InitTypeDef   EXTI_InitStructure;
    GPIO_InitTypeDef   GPIO_InitStructure;
    NVIC_InitTypeDef   NVIC_InitStructure;
    /* Enable GPIOA clock */
    RCC_AHBPeriphClockCmd(BUTTON_GPIO_CLK, ENABLE);

    /* Configure Button`s pins as input floating */
    GPIO_InitStructure.GPIO_Pin = BUTTON_LEFT | BUTTON_OK | BUTTON_RIGHT;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(BUTTON_GPIO_PORT, &GPIO_InitStructure);

    /* Enable SYSCFG clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    /* Connect EXTI Line to pin */
    SYSCFG_EXTILineConfig(BUTTON_EXTI_PORT_SOURCE, BUTTON_LEFT_EXTI_PIN_SOURCE);
    SYSCFG_EXTILineConfig(BUTTON_EXTI_PORT_SOURCE, BUTTON_OK_EXTI_PIN_SOURCE);
    SYSCFG_EXTILineConfig(BUTTON_EXTI_PORT_SOURCE, BUTTON_RIGHT_EXTI_PIN_SOURCE);

    /* Configure EXTI0 line */
    EXTI_InitStructure.EXTI_Line = BUTTON_LEFT_EXTI_LINE | BUTTON_OK_EXTI_LINE | BUTTON_RIGHT_EXTI_LINE;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    /* Enable and set EXTI0 Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = BUTTON_EXTI_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority = configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

2. Есть обработчик прерывания, вот:
Код
void EXTI4_15_IRQHandler(void)
{
    BaseType_t xTaskWoken;
    xTaskWoken = pdFALSE;
    //OK BUTTON
    if(EXTI_GetITStatus(BUTTON_OK_EXTI_LINE) != RESET)
    {
        //Button Pressed/Released
        //GPIO_ToggleBits(ERR_LED_PORTx,ERR_LED_PIN);
        if (GPIO_ReadInputDataBit(BUTTON_GPIO_PORT, BUTTON_OK) == 1){ //Released
            xTaskWoken = SendCommandFromISR(CMD_LUX, CurrentCmd); //lux and CurrentCmd
        }
        /* Clear the EXTI line pending bit */
        EXTI_ClearITPendingBit(BUTTON_OK_EXTI_LINE);
    }

    //LEFT BUTTON
    if(EXTI_GetITStatus(BUTTON_LEFT_EXTI_LINE) != RESET)
    {
        if (GPIO_ReadInputDataBit(BUTTON_GPIO_PORT, BUTTON_LEFT) == 1){ //Released
            if (CurrentCmd == 0)
                CurrentCmd = BUTTON_CMD1_LEN - 1;
            else
                --CurrentCmd;
            xTaskWoken = SendCommandFromISR(CMD_LUX, CurrentCmd); //lux and CurrentCmd
        }
        /* Clear the EXTI line pending bit */
        EXTI_ClearITPendingBit(BUTTON_LEFT_EXTI_LINE);
    }

    //RIGHT BUTTON
    if(EXTI_GetITStatus(BUTTON_RIGHT_EXTI_LINE) != RESET)
    {
//        if (GPIO_ReadInputDataBit(BUTTON_GPIO_PORT, BUTTON_RIGHT) == 1){ //Released
//            if (CurrentCmd >= BUTTON_CMD1_LEN - 1)
//                CurrentCmd = 0;
//            else
//                ++CurrentCmd;
//            ProcessButtonCmd();
//        }
        if (GPIO_ReadInputDataBit(BUTTON_GPIO_PORT, BUTTON_RIGHT) == 0){ // Released
            xTimerStart( xButtonPowerOffTimer, BUTTON_TIMERS_WAIT_START );  //Start Long press timer
            ButtonPowerOffProcessed = 0;
        } else {
            if (!ButtonPowerOffProcessed){
                xTimerStop( xButtonPowerOffTimer, BUTTON_TIMERS_WAIT_START );  //Stop Long press timer
                if (CurrentCmd >= BUTTON_CMD1_LEN - 1)
                    CurrentCmd = 0;
                else
                    ++CurrentCmd;
                xTaskWoken = SendCommandFromISR(CMD_LUX, CurrentCmd); //lux and CurrentCmd
                ButtonPowerOffProcessed = 1;
            }
        }
        /* Clear the EXTI line pending bit */
        EXTI_ClearITPendingBit(BUTTON_RIGHT_EXTI_LINE);
    }
    if( xTaskWoken != pdFALSE ) taskYIELD ();
}

3. На аппаратном SPI висит индикатор.
4. Все работает под FreeRtos и все работает правильно.
Проблема возникает перманентно при нажатии на кнопку PC13. Если начать нажимать на кнопку PC13, то может перестать работать индикатор. Иногда это происходит после одного нажатия иногда после 50. При нажатии на другие кнопки проблема не возникает НИКОГДА. Код выполняется один и тот же, задача одна и та же. На других кнопках задачи даже сложнее, а на этой просто - повторить.
Тренировал обработчик прерывания программным вызовом обработчика прерывания, проблем нет, работает железобетонно. Код ниже. Раз в 2 секунды делает 5 нажатий с задержкой 50ms.
Код
void DoLuxCMD( TimerHandle_t xTimer )
{
    (void) xTimer;
    int i;
    PrintfToOutQueue("LUX CMD\n\r");
    //SendCommandFromISR(CMD_LUX, 6);
    for (i = 0; i < 5; ++i){
        EXTI_GenerateSWInterrupt(EXTI_Line13); //ok
        vTaskDelay(50);
    };
}

void vTimerLuxTest(void){
    xLuxTimer = xTimerCreate("TmrLuxCmd",            /* The task name, only for help debugging. */
                            2000,                /* The timer period, which is a multiple command Delay. */
                            pdTRUE,                        /* This is auto restart timer */
                            NULL,                           /* Parameters is NULL */
                            DoLuxCMD                 /* Timer uses the callback. */
                          );
    xTimerStart( xLuxTimer, 0);  //Start/Restart Packed Exti
}

Проблема возникает только если нажимать аппаратно на кнопку PC13 - TAMPER -RTC. Может я должен еще как-то RTC конфигурировать, не пойму?
P.S. Обнаружил что RESET and CS от индикатора идут возле кнопки, поставил резисторы по 10к на массу, результата нет.

Сообщение отредактировал seniorandre - Feb 19 2015, 20:04
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- seniorandre   STM32F072CB PC13 в режиме EXTI   Feb 19 2015, 18:56
- - billidean   Может проблема в том, что Вы в обработчике прерыва...   Feb 20 2015, 04:50
|- - seniorandre   Цитата(billidean @ Feb 20 2015, 07:50) Мо...   Feb 20 2015, 08:05
|- - seniorandre   Цитата(billidean @ Feb 20 2015, 07:50) И ...   Feb 20 2015, 08:12
- - AndrejM   NVIC_InitStructure.NVIC_IRQChannelPriority = confi...   Feb 20 2015, 05:38
- - vladec   Може быть дело в самих портах PC13-PC15, не знаю к...   Feb 20 2015, 07:57
- - Golikov A.   а можно понять что ломается? то есть надо различи...   Feb 20 2015, 08:08
- - Golikov A.   а чипселект что двигает?   Feb 20 2015, 08:24
|- - seniorandre   Цитата(Golikov A. @ Feb 20 2015, 11:24) а...   Feb 20 2015, 08:27
- - Golikov A.   ну так плохо... если его опускать только на посылк...   Feb 20 2015, 08:30
|- - seniorandre   Цитата(Golikov A. @ Feb 20 2015, 11:30) т...   Feb 20 2015, 08:38
- - Golikov A.   Ничего такого не вижу на схеме... EXTI_ClearITP...   Feb 20 2015, 08:45
|- - seniorandre   Цитата(Golikov A. @ Feb 20 2015, 11:45) Н...   Feb 20 2015, 08:53
- - Копейкин   Антидребезг нужен. Кнопки дают его почти всегда. П...   Feb 20 2015, 09:12
- - Golikov A.   ну там кондерчик на кнопицах вроде есть по схеме.....   Feb 20 2015, 09:25
- - seniorandre   Цитатасамое простое это так. как возникает прерыва...   Feb 20 2015, 09:58
- - seniorandre   В общем все разрешилось. 1. EXTI_ClearITPendingBit...   Feb 20 2015, 16:32
- - Golikov A.   ЦитатаEXTI_ClearITPendingBit(BUTTON_RIGHT_EXTI_LIN...   Feb 20 2015, 17:01


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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 09:56
Рейтинг@Mail.ru


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