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

cy4ka12345

Участник
  • Постов

    6
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Был задан вполне конкретный вопрос - какого чёрта МК улетает в прерывания от любого чиха и как бороться с таким поведением. Вопрос не праздный. На любом промышленном изделии порой требуются ремонтные действия и будет мало приятного если при банальном замере напряжения у МК будет сносить крышу напрочь. Если есть что сказать по делу, то стоит это сделать, а шутки тут как-то не особо к месту. Всё-таки не КВН
  2. Попробовал, всё равно срабатывает, но ощутимо реже чем раньше
  3. Согласен что кнопка и прерывание = неудачное решение, но тут даже до нажатия кнопки дело не доходит. Достаточно просто коснуться вывода PA0 щупом тестера для замера напряжения и БАЦ!, получите прерывание. Я бы ещё понял если бы вывод болтался без подтяжки в воздухе и я его касался проводником - тут уж без вариантов будет многократное срабатывание прерывания от наводок, емкости щупов и т.п. Но почему себя так ведёт полностью обвязанный и прикрытый от всех случайностей вывод мне совершенно неясно ( Конденсатора C22 на плате нет, но я специально проверял на выводе PA1 схему с внешней подтяжкой и полной RC цепью - результат отрицательный, лучше не становиться. Вот проверенные мною варианты. Подтягивающий резистор менял от 100 Ом до 10к
  4. Почему же тогда на моей отладочной плате с ATmega16A подобных приколов с прерываниями нет и в помине. Касаюсь я щупом или пинцетом или нет всё работает устойчиво и чётко. К тому же я уже раз 5 повторил что ножка никакая не высокоомная - она ПОДЯТНУТА к питанию или земле через резистор. При поиске решения я испытывал даже 100 Ом в качестве подтягивающего резистора и эффект ничуть меньше не становился. К тому же я уже писал что подобную проблему на STM32 наблюдали и раньше, но тогда всё списали на плохую разводку и на этом всё и заглохло http://forum.easyelectronics.ru/viewtopic....76&start=50 Крутаните до 3 страницы (последнее сообщение) - там человек описывает ровно туже проблему Спасибо за совет. Нужно будет внимательно проверить. Версия CooCox у меня далеко не новая. Возможно библиотеки действительно с багами. Хотя я пробовал инициализацию через прямой доступ к регистрам и это не дало положительного результата..
  5. Про дребезг контактов и методы борьбы с ним мне известно, но то что я описываю это не дребезг. Прерывание срабатывает именно от касания (не замыкание на на что либо!) вывода МК любым металлическим предметом (палец такого эффекта не даёт). При этом не спасает даже подтяжка вывода к питанию или земле через резистор. Программно в обработчике прерывания удалось отследить что это всё-таки не случайность, а кратковременное изменение уровня на ножке при касании проводящим предметом. Удивляет поразительная чувствительность STM32 к такому. Тот же AVR на такое никогда не реагировал. И как в таком случае мерить потенциал на ножке если любое касание её даже щупом тестера вызывает подобные эффекты?
  6. Столкнулся с похожей проблемой что и автор топика. Контроллер STM32F100RB на плате STM32VLDISCOVERY. На плате имеется штатная кнопка USER при нажатии на которую на ножку PA0 подаётся высокий уровень (2.9V - питание контроллера). Ножка PA0 изначально подтянута внешним резистором к общему проводу (к земле). Мне хочется чтобы при нажатии срабатывало прерывание EXTI и светодиод LD3 менял своё состояние на противоположное. Пример как можно видеть простейший и всё работает как и задумано, но есть БОЛЬШАЯ проблема с устойчивостью всей этой системы. При любом касании ножки PA0 металлическим пинцетом или щупом мультиметра происходит прерывание. Ничего подобного на других МК мною раньше не наблюдалось. Как пробовал бороться: 1. Проверил подтяжку ножки осцилогафом - при касании уровень не меняется (или осцилографф не успевает это зафиксировать). Попробовал подтянуть через резистор меньшего номинала (вплоть до 100 Ом) - НЕ ПОМОГАЕТ 2. Пробовал ставить RC фильтр на ножку (100 Ом 100 нФ) - НЕ ПОМОГАЕТ. 3. Пробовал менять процедуру инициализации ножки и внешнего прерывания. Вместо SPL пробовал инициализацию через прямую запись в регистры - НЕ ПОМОГАЕТ. Также пробовались разные варианты инициализации из разных примеров/форумов/руководств - НЕ ПОМОГАЕТ. 4. Пробовал другие линии EXTI и другие ножки МК - НЕ ПОМОГАЕТ. Устойчивость достигается только в одном случае - при прямой (без резистора) подтяжке ноги к питанию или земле. Тогда реакции на касания пинцетом нет. Сомнений в качестве разводки платы быть не может. Всё-таки это фирменная плата от STM. Поведение МК абсолютно не поддаётся логике и если честно уже начинают опускаться руки. В процессе поиска решения натыкался на темы форумов где описывались похожие глюки этих МК судя по всему авторам так и не смогли помочь с этим. Вообще какая-то засада... Схема платы Код проекта. IDE CooCox 1.7.8 #include "stm32f10x.h" #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" #include "stm32f10x_exti.h" #include "misc.h" void EXTI_USER_Button_init() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // Set pin PA0 as input GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // Tell system that you will use PA0 for EXTI_Line0 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); EXTI_InitTypeDef EXTI_InitStructure; // PA0 is connected to EXTI_Line0 EXTI_InitStructure.EXTI_Line = EXTI_Line0; // Interrupt mode EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // Triggers on rising edge EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // Enable interrupt EXTI_InitStructure.EXTI_LineCmd = ENABLE; // Add to EXTI EXTI_Init(&EXTI_InitStructure); // Add IRQ vector to NVIC NVIC_InitTypeDef NVIC_InitStruct; // PA0 is connected to EXTI_Line1, which has EXTI0_IRQn vector NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn; // Set priority NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00; // Set sub priority NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00; // Enable interrupt NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // Add to NVIC NVIC_Init(&NVIC_InitStruct); } int main(void) { // Инициализируем светодиоды LD3 и LD4 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; // PC8 - LD4, PC9 - LD3 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // Set pin PC8 and PC9 as output GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_SetBits(GPIOC,GPIO_Pin_9); GPIO_SetBits(GPIOC,GPIO_Pin_8); EXTI_USER_Button_init(); while(1) { // } } void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) // Judge whether a line break { GPIOC->ODR ^= GPIO_Pin_9; for(uint32_t i = 0; i < 500000; i++); // Simple delay } EXTI_ClearITPendingBit(EXTI_Line0); // Remove LINE interrupt flag bit }
×
×
  • Создать...