Jump to content

    
Sign in to follow this  
stm32f4

Наводки stm32f405

Recommended Posts

Всем привет)Имеется макетка с 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);
//__________________________________________________

Share this post


Link to post
Share on other sites
А почему "без подтяжки"? Внешние резисторы?

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

GPIOC->PUPDR &=~GPIO_PUPDR_PUPDR13_1;

GPIOC->PUPDR &=~GPIO_PUPDR_PUPDR14_1;

GPIOC->PUPDR &=~GPIO_PUPDR_PUPDR15_1;

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

 

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();

}

}

//__________________________________________________

Edited by stm32f4

Share this post


Link to post
Share on other sites

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

KBD.rar

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this