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

 
 
 
Reply to this topicStart new topic
> Наводки stm32f405
stm32f4
сообщение Dec 26 2012, 20:35
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 11-08-12
Пользователь №: 73 098



Всем привет)Имеется макетка с 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);
//__________________________________________________
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 26 2012, 20:41
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



А почему "без подтяжки"? Внешние резисторы?
Go to the top of the page
 
+Quote Post
stm32f4
сообщение Dec 27 2012, 06:10
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 11-08-12
Пользователь №: 73 098



Цитата(_Pasha @ Dec 27 2012, 00:41) *
А почему "без подтяжки"? Внешние резисторы?

Внешней нет, но от внутренней подтяжки картина не меняется(
Цитата
GPIOC->PUPDR &=~GPIO_PUPDR_PUPDR13_1;
GPIOC->PUPDR &=~GPIO_PUPDR_PUPDR14_1;
GPIOC->PUPDR &=~GPIO_PUPDR_PUPDR15_1;
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Dec 27 2012, 06:37
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



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

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


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
stm32f4
сообщение Dec 29 2012, 05:55
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 11-08-12
Пользователь №: 73 098



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

Цитата
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 - Dec 29 2012, 05:59
Go to the top of the page
 
+Quote Post
-JonnS-
сообщение Dec 29 2012, 14:09
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 7-05-07
Из: Болгария
Пользователь №: 27 577



В вложении мой код обработки клаву на прерываниях. Различает 3 типа нажатия нормальное: <1сек; длиное: >1сек и сверхдлиное: >2сек. Попутно озвучиваем нажатой кнопки дополнительним таймером. Выдрал из проекта, досконально не проверял, может что не хватает.
Прикрепленные файлы
Прикрепленный файл  KBD.rar ( 2.76 килобайт ) Кол-во скачиваний: 33
 
Go to the top of the page
 
+Quote Post

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

 


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


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