Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/23: Рейтинг темы: голосов - 23, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 12.10.2014
Сообщений: 164

дважды устанавливается пендинг бит EXTI

20.09.2015, 14:08. Показов 4712. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
всем привет, на контроллере stm32f103rb при обработке прерывания по линии EXTI выяснил что после обработки прерывания сразу же устанавливается повторно(или сразу дважды) пендинг бит, так что например если включать/выключать светодиод, то после включения через время задержки прерывание срабатывает еще раз и он выключается
ладно если он дважды устанавливается то и сбрасывать его буду тоже дважды - проблема решена
но вот вопрос ведь в референсе мануал ничего такого не написано ?
всем спасибо за ответы :)

[1002 байт]
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.09.2015, 14:08
Ответы с готовыми решениями:

Не устанавливается 64-бит система на виртуалку
В чем может быть проблема? Система такая: i5-4570, 8gb RAM, Radeon R9 290. Ну то есть мощи дофига и больше. Пробовал Минт и Убунту. Не...

STM8S UART не устанавливается бит RXNE!!!
Не устанавливается бит RXNE при приеме, проверяю с закольцованным TX-RX (что передал то и получил) Висит в ожидании приема... #define...

Не устанавливается драйвер HP Photosmart C4483 на windows 7 64 бит
ОС -Windows 7 64 бит, на 32 бит этой проблемы нет. При установке драйвера с этой страницы...

4
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
20.09.2015, 15:24
Цитата Сообщение от vodym_123
всем привет, на контроллере stm32f103rb при обработке прерывания по линии EXTI выяснил что после обработки прерывания сразу же устанавливается повторно(или сразу дважды) пендинг бит, так что например если включать/выключать светодиод, то после включения через время задержки прерывание срабатывает еще раз и он выключается
ладно если он дважды устанавливается то и сбрасывать его буду тоже дважды - проблема решена
но вот вопрос ведь в референсе мануал ничего такого не написано ?
всем спасибо за ответы :)
Вы как то лаконично описали условия.Откуда берётся прерывание.Если устройство,вызывающее прерывание,гарантированно выдаёт один "FALLING",а запросов-два,это одно.А если у Вас кнопка,то дребезг и на прерывание распространяется...И что тогда,должно быть написано,если он отрабатывает,как есть.
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 553
20.09.2015, 15:57
В коде настройка EXTI некрасивая: настраиваются только два регистра вместо четырех, оно понятно, что если там дефолтное значение, то можно не трогать, но где гарантия, что там таки будет дефолтное значение?
А по поводу дважды установленного бита EXTI: есть такая борода, что бит "не успевает" очиститься и прерывание вызывается снова. Не помню, к каким процам это относится, но в данном случае стоит попробовать очищать pending бит в начале обработчика прерывания.
И еще, очищать бит надо не через OR, а просто записывая новое значение, вот так:
Code
1
EXTI->PR = EXTI_PR_PR1;
0
0 / 0 / 0
Регистрация: 12.10.2014
Сообщений: 164
21.09.2015, 11:29
Цитата Сообщение от TomityWotf
В коде настройка EXTI некрасивая: настраиваются только два регистра вместо четырех, оно понятно, что если там дефолтное значение, то можно не трогать, но где гарантия, что там таки будет дефолтное значение?
А по поводу дважды установленного бита EXTI: есть такая борода, что бит "не успевает" очиститься и прерывание вызывается снова. Не помню, к каким процам это относится, но в данном случае стоит попробовать очищать pending бит в начале обработчика прерывания.
И еще, очищать бит надо не через OR, а просто записывая новое значение, вот так:
Код:
EXTI->PR = EXTI_PR_PR1;

хорошо, спасибо, попробую вначале
0
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
10.01.2016, 11:04
подниму темку. Есть несколько датчиков, висят на ногах 12...15. Проц STM32F427VG
Настройка:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
   GPIO_InitTypeDef   GPIO_InitStructure;
NVIC_InitTypeDef   NVIC_InitStructure;
 
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
 
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE   ,EXTI_PinSource12   );         //Sensor NC
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE   ,EXTI_PinSource13   );         //Sensor extractor
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE   ,EXTI_PinSource14   );         //Sensor plate
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE   ,EXTI_PinSource15   );         //Sensor sector
 
//Настроим NVIC
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;         //Все сенсоры на одном прерывании
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 13;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
Т.к. все сенсоры висят на одном прерывании, то отключаем их через отключение в EXTI:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void SensPlateEnable(void)
{
EXTI_InitTypeDef   EXTI_InitStructure;
//Настроим EXTI
EXTI_InitStructure.EXTI_Line = EXTI_Line14;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Ymtirrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
void SensPlateDysable(void)
{
EXTI_InitTypeDef   EXTI_InitStructure;
//Настроим EXTI
EXTI_InitStructure.EXTI_Line = EXTI_Line14;
EXTI_InitStructure.EXTI_LineCmd = DISABLE;
EXTI_Init(&EXTI_InitStructure);
}
Обработчик прерывания:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void EXTI15_10_IRQHomdler(void)
{
if (EXTI_GetITStatus(EXTI_Line12) != RESIT)      //Sensor NC
{
EXTI_ClearITPendingByt(EXTI_Line12);
 
}
if (EXTI_GetITStatus(EXTI_Line13) != RESIT)      //Sensor extractor
{
EXTI_ClearITPendingByt(EXTI_Line13);
 
}
if (EXTI_GetITStatus(EXTI_Line14) != RESIT)      //Sensor plate
{
EXTI_ClearITPendingByt(EXTI_Line14);
SensPlateDysable();
DoSomething();
ExtiCount++;
}
if (EXTI_GetITStatus(EXTI_Line15) != RESIT)      //Sensor sector
{
EXTI_ClearITPendingByt(EXTI_Line15);
 
}
}
В прерывании, как только оно пришло, мы тут же его отключаем, т.е. надо сделать чтобы функция DoSomething(); выполнилась только один раз. Однако она выполняется несколько раз, переменная ExtiCount может принимать значения от 2 до 29. Если в функции SensPlateDysable() поставить отключение прерываний EXTI15_10_IRQn, то прерываний срабатывает корректно только один раз, однако тем самым мы отключаем все остальные сенсоры, которые сидят на этом же прерывании. Пока решение видится в еще одной переменной флаге, которая будет говорить, что прерывание уже один раз выполнялось. Однако, вопрос: если мы отключаем(маскируем источник EXTI line 14), то почему оно все равно срабатывает?
UPD: пока писал пост, посмотрел что внутри функции EXTI_Init(). А там какой-то трешняк, если надо отключить линию.
Там должно быть:
Code
1
EXTI->IMR&=~EXTI_IMR_MR14;
Эта строчка маскирует прерывание от линии, в итоге все работает корректно, функция вызывается лишь один раз. Выходит, что через SPL нельзя корректно отключить EXTI, не отключая прерывание.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.01.2016, 11:04
Помогаю со студенческими работами здесь

Поменять местами значения бит в заданном количестве пар бит. Номера бит в парах задаются с клавиатуры
1.Разработать алгоритм ввода с клавиатуры требуемых типов данных и показать на экране их внутреннее представление в двоичной системе...

Почему дважды вызванный рандомный метод дважды рандомит одинаково?
Взгляните, есть метод рандомной генерации матрицы. Мы его дважды вызываем, и дважды получаем одну и туже матрицу, т.е. две одинаковых перед...

STM32F4+ EXTI
Всем привет! Нахожусь в процессе изучения EXTI. Настроил на порт А 0 пин (там кнопка висит). Все работает. Решил проверить, что будет если...

EXTI у STM8S103K3
Не могу разобраться с внешними прерываниями у данного контроллера. это читал, но не могу разобраться.

При сложении по модулю два двух чисел по 48 бит пропадает 1 бит
Здравствуйте, помогите пожалуйста. В этой строке пропадает 1 бит, т.е. должно быть 48, а их 47. R =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru