Перейти к содержанию
    

Наводки stm32f405

Всем привет)Имеется макетка с stm32f405 и тремя кнопками! ну и собственно вопрос: почему процессор залетает в прерывание EXTI15_10_IRQHandler, если докоснуться к любому металлическому предмету лежащему рядом с макеткой, не говоря уже о прикосновении к дорожкам по изменению состояния которых и должны происходить прерывания!как бороться с этим эффектом?

Может я как-то не так провожу инициализацию кнопок?

Кнопки устроены простейшим образом, замыканием на vdd через 1к !

//***********************EXTI***********************
//Инициализация кнопок (PC13,PC14,PC15)
    RCC->AHB1ENR    |= RCC_AHB1ENR_GPIOCEN;            //Вкл. тактирования

    GPIOC->MODER    &=~GPIO_MODER_MODER13;            //Input
    GPIOC->MODER    &=~GPIO_MODER_MODER14;
    GPIOC->MODER    &=~GPIO_MODER_MODER15;

    GPIOC->PUPDR     &=~GPIO_PUPDR_PUPDR13;            //Без подтяжки
    GPIOC->PUPDR     &=~GPIO_PUPDR_PUPDR14;
    GPIOC->PUPDR     &=~GPIO_PUPDR_PUPDR15;

    SYSCFG->EXTICR[3] |= SYSCFG_EXTICR4_EXTI13_PC;    // PC13
    SYSCFG->EXTICR[3] |= SYSCFG_EXTICR4_EXTI14_PC;    // PC14
    SYSCFG->EXTICR[3] |= SYSCFG_EXTICR4_EXTI15_PC;    // PC15

    EXTI->IMR        |=(EXTI_IMR_MR13);                //РАЗРЕШАЕМ ПРЕРЫВАНИЯ ДЛЯ PC13
    EXTI->IMR        |=(EXTI_IMR_MR14);                // PC14
    EXTI->IMR        |=(EXTI_IMR_MR15);                // PC15

    EXTI->FTSR         |=(EXTI_FTSR_TR13);                //ПО СПАДУ
    EXTI->FTSR         |=(EXTI_FTSR_TR14);
    EXTI->FTSR         |=(EXTI_FTSR_TR15);

    NVIC_EnableIRQ(EXTI15_10_IRQn);
    NVIC_SetPriority(EXTI15_10_IRQn,14);
//__________________________________________________

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему "без подтяжки"? Внешние резисторы?

Внешней нет, но от внутренней подтяжки картина не меняется(

GPIOC->PUPDR &=~GPIO_PUPDR_PUPDR13_1;

GPIOC->PUPDR &=~GPIO_PUPDR_PUPDR14_1;

GPIOC->PUPDR &=~GPIO_PUPDR_PUPDR15_1;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для начала надо соединить все земли всех устройств (комп, макетка, БП). Отдельным проводом - лучше.

 

Для справки. Отсоедините макетку от компа. Измерьте ПЕРЕМЕННОЕ напряжение между землями макетки и компа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообщем решил я по странке, обрабатывать нажатие кнопки программно)

В итоге: написал процедуру опроса ножки порта- все работает на ура, но проблема в том что я не очень хорошо знаю язык С и поэтому процедура получилась очень громоздкой((((

Господа-программёры подскажите, как можно грамотно сократить сей код????????????

 

void TIM7_IRQHandler(void)

 

{

//************************USER1**********************

//обработка первой кнопки

TIM7->SR&= ~TIM_SR_UIF; //Сбрасываем флаг UIF

//флаг инвертированного значения региста IDR

FLAG |=FLAG_IDR_USER1;

//I_TIM7 независимый счетчик прерываний таймера.Отсчет начинается при появлении первой 1 в IDR

if(I_TIM7>0){I_TIM7++;}

//защита от кратковременных помех

if(I_TIM7>100){I_TIM7=0;}

if (GPIOC->IDR & GPIO_IDR_IDR_13) //Кнопка нажата?

{

//FLAG_IDR_USER1=0 кнопка нажата

FLAG &=~FLAG_IDR_USER1;

//Если это первая 1 то запускаем независимый счетчик I_TIM7

if(I_TIM7<1){I_TIM7++;}

//суммируем время нажатия

USER1++;

//Если TEMP<2 то фиксируем нажатие иначе очищаем I_TIM7

TEMP=I_TIM7-USER1;

//Кнопка была зажата более 60мс?

if(USER1>60)

{

USER1=0;

I_TIM7=0;

//Проверка на помехи. Разность между I_TIM7 и USER1 не должна превышать 2

if(TEMP<2)

{

//Установка флага кнопка зажата

FLAG |=FLAG_USER1;

}

}

}

//Если кнопку отпутили то проверяем было ли нажатие ?

//Да-очищаем все флаги и переходим в обработку события(нажатия USER1)

//Нет-переходим к USER2

if(FLAG&FLAG_IDR_USER1)

{

if(FLAG&FLAG_USER1)

{

FLAG &=~FLAG_USER1;

I_TIM7=0;

IRQ_USER1();

}

}

//__________________________________________________

Изменено пользователем stm32f4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В вложении мой код обработки клаву на прерываниях. Различает 3 типа нажатия нормальное: <1сек; длиное: >1сек и сверхдлиное: >2сек. Попутно озвучиваем нажатой кнопки дополнительним таймером. Выдрал из проекта, досконально не проверял, может что не хватает.

KBD.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...