stm32f4 0 26 декабря, 2012 Опубликовано 26 декабря, 2012 · Жалоба Всем привет)Имеется макетка с 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); //__________________________________________________ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 26 декабря, 2012 Опубликовано 26 декабря, 2012 · Жалоба А почему "без подтяжки"? Внешние резисторы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stm32f4 0 27 декабря, 2012 Опубликовано 27 декабря, 2012 · Жалоба А почему "без подтяжки"? Внешние резисторы? Внешней нет, но от внутренней подтяжки картина не меняется( GPIOC->PUPDR &=~GPIO_PUPDR_PUPDR13_1; GPIOC->PUPDR &=~GPIO_PUPDR_PUPDR14_1; GPIOC->PUPDR &=~GPIO_PUPDR_PUPDR15_1; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DpInRock 0 27 декабря, 2012 Опубликовано 27 декабря, 2012 · Жалоба Для начала надо соединить все земли всех устройств (комп, макетка, БП). Отдельным проводом - лучше. Для справки. Отсоедините макетку от компа. Измерьте ПЕРЕМЕННОЕ напряжение между землями макетки и компа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stm32f4 0 29 декабря, 2012 Опубликовано 29 декабря, 2012 (изменено) · Жалоба Вообщем решил я по странке, обрабатывать нажатие кнопки программно) В итоге: написал процедуру опроса ножки порта- все работает на ура, но проблема в том что я не очень хорошо знаю язык С и поэтому процедура получилась очень громоздкой(((( Господа-программёры подскажите, как можно грамотно сократить сей код???????????? 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(); } } //__________________________________________________ Изменено 29 декабря, 2012 пользователем stm32f4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-JonnS- 0 29 декабря, 2012 Опубликовано 29 декабря, 2012 · Жалоба В вложении мой код обработки клаву на прерываниях. Различает 3 типа нажатия нормальное: <1сек; длиное: >1сек и сверхдлиное: >2сек. Попутно озвучиваем нажатой кнопки дополнительним таймером. Выдрал из проекта, досконально не проверял, может что не хватает. KBD.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться