Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32L151 USB прерывания
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
MiklPolikov
Коллеги, помогите разобраться с прерываниями USB .

1) Когда включено только прерывание USB_LP_IRQHandler и все прерывания обрабатываются только в нём, проблем нет.

2) Пытаюсь настроить прерывание USB_HP_IRQHandler и обрабатывать в нём флаг успешной транзакции USB_ISTR_CTR , т.к. оно только для этого и нужно.
Обнаруживаю, что :
- Программа с флагом USB_ISTR_CTR попадает то в HP , то в LP , хотя в HP все флаги USB->ISTR сбрасываются и флаги в регистрах конечных точек USB_EPNR_CTR_RX USB_EPNR_CTR_TX то же сбрасываются. По идее программа в LP попадать не должна, т.к. HP происходит раньше.
- При снятом бите USB_CNTR_CTRM т.е. отключенном прерывании программа всё равно попадает в прерывание с флагом USB_ISTR_CTR , что совсем сбивает с толку.

Чего я не понимаю ?

Заранее спасибо !
Obam
В соответствующем регистре NVIC (NVIC_IPRx) обработчиками pending-флаги снимаются? Это случай, если прерывание по уровню…
MiklPolikov
Цитата(Obam @ Jun 19 2015, 09:20) *
В соответствующем регистре NVIC (NVIC_IPRx) обработчиками pending-флаги снимаются? Это случай, если прерывание по уровню…


Не снимаются.
Но с прерыванием LP как-то ведь работает, не зависает в нём.

Объясните пожалуйста, какие именно биты нужно снять и как?
NVIC_IPRx - это Interrupt priority registers
Есть регистр NVIC_ICPRx Interrupt clear-pending registers , при попадании в HP NVIC_ICPR0 содержится значение 0x08000000
Делаю NVIC_ICPR0 = 0x08000000 ; запись 1 должна снимать бит. Но он не снимается. И программа продолжает попадать в LP
prottoss
Цитата(MiklPolikov @ Jun 20 2015, 07:09) *
Объясните пожалуйста, какие именно биты нужно снять и как?

Цитата из даташита:
Цитата
24.3.1 Description of USB blocks...
Interrupt Mapper: This block is used to select how the possible USB events can generate interrupts and map them to three different lines of the NVIC:
– USB low-priority interrupt (Channel 20): Triggered by all USB events (Correct transfer, USB reset, etc.). The firmware has to check the interrupt source before serving the interrupt.
– USB high-priority interrupt (Channel 19): Triggered only by a correct transfer event for isochronous and double-buffer bulk transfer to reach the highest possible transfer rate.
– USB wakeup interrupt (Channel 42): Triggered by the wakeup event from the USB Suspend mode.

т.е. для ISO и BULK (если двойная буферизация) можно использовать HP.
MiklPolikov
Цитата(prottoss @ Jun 20 2015, 07:34) *
т.е. для ISO и BULK (если двойная буферизация) можно использовать HP.


Так я с этого и начал : )
А мой вопрос - почему у меня не работает ?
prottoss
Цитата(MiklPolikov @ Jun 20 2015, 11:10) *
А мой вопрос - почему у меня не работает ?
У меня до конца нет понимания, что не работает sm.gif
А почему нельзя обрабатывать буфер точки в обоих обработчиках?

В конце-концов, если попали в LP ISR и обнаружили, что буфер точки не содержит данных для обработки, можно просто выйти из ISR
MiklPolikov
Цитата(prottoss @ Jun 20 2015, 08:23) *
А почему нельзя обрабатывать буфер точки в обоих обработчиках?
В конце-концов, если попали в LP ISR и обнаружили, что буфер точки не содержит данных для обработки, можно просто выйти из ISR


Да, так можно.
Но я подумал, что если в документации написано, что прерывание HP специально сделано для обработки только BULK и ISO , то нужно его именно для этого и применить, и обрабатывать только там.

Документация ясности не даёт, уже 10 раз её перечитал. Надеюсь, что кто-нибудь, кто с этим разобрался, подскажет.
prottoss
Цитата(MiklPolikov @ Jun 20 2015, 11:28) *
Но я подумал...
Я тоже так думал.

В итоге пришел к выводу, что HP ISR полезно только если происходит одновременная работа по BULK и INTERRUPT каналам, чтобы приоритет был у BULK
Obam
Цитата(MiklPolikov @ Jun 20 2015, 05:09) *
Но с прерыванием LP как-то ведь работает, не зависает в нём.

Так грамотно написанный обработчик систему не вешает. sm.gif

Цитата
Объясните пожалуйста, какие именно биты нужно снять и как?

NVIC_IPRx??? Прошу прощения, "обдёрнулся": конечно же NVIC_ISPRх.
Что я имел в виду? Соответствующий флаг в NVIC_ISPRх у прерывания, активируемого уровнем, остаётся "1" и при активном состоянии прерывания. Его (флаг) надо не забыть снять в NVIC_IСPRх, но и причина вызова прерывания должна быть устранена. Тогда повторного (лишнего) входа в обработчик не будет.

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.