-
- А существует ли среди этих "больших возможностей" возможность
искусственно вызвать прерывание (симулировать его). Но те так,
чтобы вызвать его обработчик, как подпрограмму, а чтобы оно само
сработало? Типа флаг прерывания искусственно установить? Мне все
равно, какого прерывания, лишь бы свой обработчик можно было на
него поставить. - Kceния(27.08.2020 21:45)
- немного изначально не понял ! Пишем функцию с нужным кодом! Когда из прерывания ЕСЛИ флаг такойто - дергаем нашу функцию, когда из кода дергаем напрямую! - Aleksey_75(27.08.2020 22:20)
- Описание векторов прерываний есть в заголовочниках типа
stm32f407xx.h evgeniy1294(2246 знак., 27.08.2020 22:02)
- Ура! NVIC->STIR как раз то, что нужно. - Kceния(27.08.2020 22:55)
- Только когда вы в прерывание зайдете, при проверке флагов, активных
не будет обнаружено, что будем делать ??? Aleksey_75(11 знак., 27.08.2020 22:58, ссылка)
- Что значит "активных"? Разве если я в NVIC->STIR запишу номер
нужного мне прерывания, оно не исполнится? Еще какое-то условие
нужно? - Kceния(27.08.2020 23:02)
- прерывание выполнится! но флагов там как конь на... и по каждому
флагу нужно свое действие! В примеру прерывание по USART , дальше
будем разбирать флаги LBD, RX, TX и еще с пяток ... Как вы
задействуете свою функцию если флагов нету ?? С тем же успехом
можно напрямую вызвать ..._IRQHander(); - Aleksey_75(27.08.2020 23:08)
- Я собираюсь эмулировать прерывание от таймера, а там вроде бы
нечего с таймером не надо делать. - Kceния(27.08.2020 23:21)
- сфигали ?? смотрим TIMx_SR и удивляемяся!! По какому флагу будем
отрабатывать ??? - Aleksey_75(27.08.2020 23:29)
- Хочу, чтобы досрочно сработал TIM6_DAC_IRQHandler() Kceния(172 знак., 27.08.2020 23:42)
- это прерывание не с таймера с ЦАПа - Aleksey_75(27.08.2020 23:45)
- Это их общее прерывание, ЦАП у меня не используется, а TIM6 генерит
прерывания каждые 60 ms. Иногда требуется, чтобы он выдал
прерывание досрочно. - Kceния(28.08.2020 00:07)
- ))) у таймера 6 и 7 действительно есть один флаг OVF! если брать
другие таймеры там очень много флагов и по переполнению и по
сравнению, и все флаги необходимо обрабатывать в прерывании!
поэтому я изначально сказал что делаем функцию или её вызваем из
прерывания или напрямую.. - Aleksey_75(28.08.2020 00:15)
- Проблема сама снимается тем, что в конце кода TIM6_DAC_IRQHandler()
я вызывают стандартный обработчик HAL'а - HAL_TIM_IRQHandler(
&htim6); а сама с флагами не вожусь. И так оно во всех
прерываниях - имею право отправлять на обработку в стандартный
хандлер. Фактически я делаю перехват, т.к. по умолчанию
TIM6_DAC_IRQHandler() объявлен так: Kceния(66 знак., 28.08.2020 00:29)
- А что, стандартный обработчик HALа не проверяет флаги? ))) Что это
меняет по существу вопроса? Отсутствие взведенных флагов приведет к
фиктивному исполнению обработчика - вошел и тут же вышел. И почему
не выделить интересующий функционал обработчика в отдельную функцию
и вызывать ее как в теле обработчика, так и в любом необходимом
месте? - my504(28.08.2020 05:51)
- Cтандартный обработчик HALа делает всё, что положено делать с
данной периферией, что снимает необходимость делать это
самостоятельно. Тогда как собственный обработчик прерывания нужен
только затем, чтобы можно было вписать свои дополнительные команды
до или после вызова стандартного обработчика. - Kceния(28.08.2020 08:34)
- Кроме проверки и сброса флага "стандартного" в обработчике ничего нет и быть не может. То есть "стандартный" - это ПУСТОЙ обработчик. Но пустой обработчик никому не нужен, значит прямо за его телом должен следовать Ваш код. Вы бы открыли тело "стандартного" и посмотрели что в нем... my504(492 знак., 28.08.2020 09:43)
- я везде так и делаю. Причем вставляю свои ф-ии в одном случае ДО, в
других случаях - ПОСЛЕ - Лaгyнoв(28.08.2020 09:40)
- Повторяю вопрос. Как отделить разные флаги одного вектора при
ПОСЛЕДОВАТЕЛЬНОМ размещении "стандартного" и пользовательского
кода? На самом деле, этот самый "стандартный" обработчик - это
ПРОСТО СБРОС ФЛАГА. И ставить его рекомендуют в конце ISR. Таким
образом, этот "стандартный" никак не исключает проверку флага
силами пользователя... - my504(28.08.2020 10:47)
- чаще всего я свой обработчик ставлю после кубовского. Т.е. он
реально мне нужен только для сброса флага. Но один раз пришлось
ставить ДО чтобы знать - прерывание от UART было по приему или
передаче. - Лaгyнoв(28.08.2020 12:19)
- И как кубовский обработчик помогает в определении источника
прерываний по общему вектору? У меня ощущение, что вся эта история
со "стандартным" обработчиком - это мазохизм в извращенной форме. - my504(28.08.2020 12:45)
- Так он же там не один, а для каждого типа периферии свой. Например: Kceния(874 знак., 28.08.2020 13:34)
- Ксения, речь идет об ОДНОМ векторе. Например, TIM6_DAC. Обработчик одного вектора может быть ТОЛЬКО ОДИН. То есть прерывания по НЕСКОЛЬКИМ флагам (иногда одной, а иногда и разной периферии) вызывают переход ПО ОДНОМУ АДРЕСУ. Пользователь должен сортировать флаги САМ. То есть написать цепочку условий проверки ОТДЕЛЬНЫХ флагов с ОТДЕЛЬНЫМИ обработчиками по каждому из них. Вот и объясните мне каким образом "стандартный" обработчик по факту являющийся лишь сбросом флага (а может my504(63 знак., 28.08.2020 13:56)
- ))) и на какой флаг реагирует HAL_UART_IRQHandler(&huart1); ??? - Aleksey_75(28.08.2020 13:38)
- я не имел в виду, что кубовский обработчик помогает. Я имел в виду,
что мой обработчик (который и определяет источник) пришлось ставить
впереди кубовского, потому что он сбрасывает запрос. Я вроде уже
тут говорил, но повторюсь. Для меня лично вся эта затея с проектом
от Куба нужна исключительно как "рыба". Ввиду моей неграмотности в
Кейле вообще и в Си в частности мне было проще вписывать свои
строки во что-то готовое. Только и всего. :-) - Лaгyнoв(28.08.2020 13:20)
- Доступ к регистрам осуществляется через указатель на структуру. То есть достаточно узнать из референс-мануала регистр флагов прерываний по данной периферии и обычным if проверить бит с искомым флагом. Так же прочесть в референс-мануале как сбросить этот флаг (не всегда это запись нуля в этот бит). Иначе можно огрести разные чудесатости... - my504(28.08.2020 14:07)
- +1!! флаги разбирать все равно ручками, да и сбрасывать тоже, ибо не все флаги стираются записью 0, по многоим нужны танцы с бубнами!!! - Aleksey_75(28.08.2020 13:07)
- Так он же там не один, а для каждого типа периферии свой. Например: Kceния(874 знак., 28.08.2020 13:34)
- И как кубовский обработчик помогает в определении источника
прерываний по общему вектору? У меня ощущение, что вся эта история
со "стандартным" обработчиком - это мазохизм в извращенной форме. - my504(28.08.2020 12:45)
- чаще всего я свой обработчик ставлю после кубовского. Т.е. он
реально мне нужен только для сброса флага. Но один раз пришлось
ставить ДО чтобы знать - прерывание от UART было по приему или
передаче. - Лaгyнoв(28.08.2020 12:19)
- Повторяю вопрос. Как отделить разные флаги одного вектора при
ПОСЛЕДОВАТЕЛЬНОМ размещении "стандартного" и пользовательского
кода? На самом деле, этот самый "стандартный" обработчик - это
ПРОСТО СБРОС ФЛАГА. И ставить его рекомендуют в конце ISR. Таким
образом, этот "стандартный" никак не исключает проверку флага
силами пользователя... - my504(28.08.2020 10:47)
- Cтандартный обработчик HALа делает всё, что положено делать с
данной периферией, что снимает необходимость делать это
самостоятельно. Тогда как собственный обработчик прерывания нужен
только затем, чтобы можно было вписать свои дополнительные команды
до или после вызова стандартного обработчика. - Kceния(28.08.2020 08:34)
- ну вам виднее! самое главное потом горюшка не хапнуть ))) - Aleksey_75(28.08.2020 00:32)
- А что, стандартный обработчик HALа не проверяет флаги? ))) Что это
меняет по существу вопроса? Отсутствие взведенных флагов приведет к
фиктивному исполнению обработчика - вошел и тут же вышел. И почему
не выделить интересующий функционал обработчика в отдельную функцию
и вызывать ее как в теле обработчика, так и в любом необходимом
месте? - my504(28.08.2020 05:51)
- Проблема сама снимается тем, что в конце кода TIM6_DAC_IRQHandler()
я вызывают стандартный обработчик HAL'а - HAL_TIM_IRQHandler(
&htim6); а сама с флагами не вожусь. И так оно во всех
прерываниях - имею право отправлять на обработку в стандартный
хандлер. Фактически я делаю перехват, т.к. по умолчанию
TIM6_DAC_IRQHandler() объявлен так: Kceния(66 знак., 28.08.2020 00:29)
- ))) у таймера 6 и 7 действительно есть один флаг OVF! если брать
другие таймеры там очень много флагов и по переполнению и по
сравнению, и все флаги необходимо обрабатывать в прерывании!
поэтому я изначально сказал что делаем функцию или её вызваем из
прерывания или напрямую.. - Aleksey_75(28.08.2020 00:15)
- Это их общее прерывание, ЦАП у меня не используется, а TIM6 генерит
прерывания каждые 60 ms. Иногда требуется, чтобы он выдал
прерывание досрочно. - Kceния(28.08.2020 00:07)
- это прерывание не с таймера с ЦАПа - Aleksey_75(27.08.2020 23:45)
- Хочу, чтобы досрочно сработал TIM6_DAC_IRQHandler() Kceния(172 знак., 27.08.2020 23:42)
- сфигали ?? смотрим TIMx_SR и удивляемяся!! По какому флагу будем
отрабатывать ??? - Aleksey_75(27.08.2020 23:29)
- Я собираюсь эмулировать прерывание от таймера, а там вроде бы
нечего с таймером не надо делать. - Kceния(27.08.2020 23:21)
- прерывание выполнится! но флагов там как конь на... и по каждому
флагу нужно свое действие! В примеру прерывание по USART , дальше
будем разбирать флаги LBD, RX, TX и еще с пяток ... Как вы
задействуете свою функцию если флагов нету ?? С тем же успехом
можно напрямую вызвать ..._IRQHander(); - Aleksey_75(27.08.2020 23:08)
- Что значит "активных"? Разве если я в NVIC->STIR запишу номер
нужного мне прерывания, оно не исполнится? Еще какое-то условие
нужно? - Kceния(27.08.2020 23:02)
- Только когда вы в прерывание зайдете, при проверке флагов, активных
не будет обнаружено, что будем делать ??? Aleksey_75(11 знак., 27.08.2020 22:58, ссылка)
- Ура! NVIC->STIR как раз то, что нужно. - Kceния(27.08.2020 22:55)
- да - SciFi(27.08.2020 21:48)
- +1 гамно вопрос !!! XXX_IRQhandler(); откуда хочь! - Aleksey_75(27.08.2020 22:16)
- А существует ли среди этих "больших возможностей" возможность
искусственно вызвать прерывание (симулировать его). Но те так,
чтобы вызвать его обработчик, как подпрограмму, а чтобы оно само
сработало? Типа флаг прерывания искусственно установить? Мне все
равно, какого прерывания, лишь бы свой обработчик можно было на
него поставить. - Kceния(27.08.2020 21:45)