nya 0 11 ноября, 2015 Опубликовано 11 ноября, 2015 (изменено) · Жалоба Коллеги, а подскажите, как работать с прерываниями от внешних интерфейсов. Возьмем, к примеру, CAN. Есть две функции приема по CAN: HAL_CAN_Receive() и HAL_CAN_Receive_IT(). В чем между ними разница? Генерит ли HAL_CAN_Receive() прерывания, если нет - как ей пользоваться? При каких условиях запускаются обработчики прерываний USB_LP_CAN1_RX0_IRQHandler() и CAN1_RX1_IRQHandler()? Как пользоваться HAL_CAN_RxCpltCallback() и почему Cube не создает эту функцию вместе с прочими обработчиками прерываний? Примеров c HAL в интернетах очень мало, поэтому я не смог найти ответов на эти вопросы... заранее спасибо. Изменено 11 ноября, 2015 пользователем nya Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tanya 4 11 ноября, 2015 Опубликовано 11 ноября, 2015 · Жалоба Примеров c HAL в интернетах очень мало, поэтому я не смог найти ответов на эти вопросы... заранее спасибо. 1. Из названия понятно, кажется мне. Если нет прерываний - ждем-опрашиваем. 3. Создает пустышку-затычку с атрибутом __weak. Ведь никто не может читать Ваши мысли... Вы сами у себя в программе пишите обработчик. Без атрибута, тогда Ваша код будет иметь приоритет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nya 0 11 ноября, 2015 Опубликовано 11 ноября, 2015 · Жалоба Но зачем два обработчика - Handler и Callback? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tanya 4 11 ноября, 2015 Опубликовано 11 ноября, 2015 · Жалоба Но зачем два обработчика - Handler и Callback? Это для того, чтобы Вы не возились с регистрами. HAL - Hardware Abstraction Level (Layer). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nya 0 11 ноября, 2015 Опубликовано 11 ноября, 2015 · Жалоба Это для того, чтобы Вы не возились с регистрами. HAL - Hardware Abstraction Level (Layer). Так это понятно. :) Но я сейчас нашел таки рабочий пример для CAN - http://geektimes.ru/post/255534/ Похоже, в моем коде были неправильно выставлены настройки фильтров, вот прерывания и не вызывались. Поэкспериментировав, выяснил, что оба этих обработчика работают одинаково хорошо. И запускаются одновременно. Поэтому все-такие непонятно в чем между ними разница и когда нужно использовать Handler, а когда - Callback. В обоих случаях "ручной труд" с регистрами равен нулю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tanya 4 11 ноября, 2015 Опубликовано 11 ноября, 2015 · Жалоба когда нужно использовать Handler, а когда - Callback. В обоих случаях "ручной труд" с регистрами равен нулю. Нужно использовать Callback. Предполагается, что всегда. Callback вызывается в самом конце обработчика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nya 0 11 ноября, 2015 Опубликовано 11 ноября, 2015 · Жалоба Нужно использовать Callback. Предполагается, что всегда. Callback вызывается в самом конце обработчика. То есть я должен писать обработчики Callback в main.c вместо того, чтобы лезть в stm32***_it.c? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tanya 4 11 ноября, 2015 Опубликовано 11 ноября, 2015 · Жалоба То есть я должен писать обработчики Callback в main.c вместо того, чтобы лезть в stm32***_it.c? Пишите, где хотите... в своем коде. Ведь их код может быть со временем изменен в новой версии. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 11 ноября, 2015 Опубликовано 11 ноября, 2015 · Жалоба То есть я должен писать обработчики Callback в main.c вместо того, чтобы лезть в stm32***_it.c? Да. Так будет правильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
drozel 0 12 ноября, 2015 Опубликовано 12 ноября, 2015 · Жалоба Да. Так будет правильно. Да вот хз. По идее, даже не смотря на навороченный NVIC, обработчик прерывания должен быть разумно коротким, а в HAL мало того, что обработчик раздутый до нельзя, так еще и калбек вызывается прямо из него. А пользователь в калбеке воротит кучу кода и еще вызовы своих функций. Дай бог, без блокирующих задержек. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 12 ноября, 2015 Опубликовано 12 ноября, 2015 (изменено) · Жалоба Да вот хз. По идее, даже не смотря на навороченный NVIC, обработчик прерывания должен быть разумно коротким, а в HAL мало того, что обработчик раздутый до нельзя, так еще и калбек вызывается прямо из него. этот HAL переплюнул легендарный индусский код. Его даже в кач-ве справочника использовать нельзя. но и это цветочки. по идее, описание регистров всей линейки stm32 должно уместиться в пару файлов 25-30 кб, с весьма удобным API вместо 100 метровых библиотек ни о чем. Изменено 12 ноября, 2015 пользователем _Pasha Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 12 ноября, 2015 Опубликовано 12 ноября, 2015 · Жалоба Это для того, чтобы Вы не возились с регистрами. HAL - Hardware Abstraction Level (Layer). Как правило: тот кто не хочет возиться с регистрами, возится с кучей кривых исходников написанных школьниками. А потом ещё идёт и строчит в форумы "хелп ми!".... по идее, описание регистров всей линейки stm32 должно уместиться в пару файлов 25-30 кб, с весьма удобным API вместо 100 метровых библиотек ни о чем. согласен с Вами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
drozel 0 12 ноября, 2015 Опубликовано 12 ноября, 2015 · Жалоба Как правило: тот кто не хочет возиться с регистрами, возится с кучей кривых исходников написанных школьниками. Я за среднее. Не люблю возиться с регистрами (тем не менее, знаю их и могу анализировать исходники), но и HAL - ужас. Должна быть либа, абстрагирующая от регистров с четким todo. stdlib был ближе к моему идеалу, нежели HAL. libopencm3 - ничего Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 12 ноября, 2015 Опубликовано 12 ноября, 2015 · Жалоба А у меня подход простой. Срочно надо сделать проект -- берем то, что проще заставить работать. По ходу те части, что работают неудовлетворительно перепишем. К сожалению нет времени заниматься перфекционизмом. Остаются компромисы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MIKS 0 17 ноября, 2015 Опубликовано 17 ноября, 2015 · Жалоба Подниму тему по аналогичному вопросу. Есть STM32 с bsp кокос. Есть пины подключенные в ISM приемопередатчику и отслеживающие его состояния(помимо SPI связи с ним) Задача в обработчике прерывания запрещать и разрешать прерывания(в т.ч. в обработчике скажем void EXTI2_IRQHandler(void) его же и запрещать) ну и дополнительно переключать срабатывания по фронтам. Т.е четко отслеживать передний фронт и потом переключиться на отслеживание заднего фронта. По запрещению и разрешению: Сначала пробовал с помощью NVIC_EnableIRQ(); NVIC_DisableIRQ(); Потом написал поделку c использованием NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE/DISABLE Работает на половину (( Вопрос такой: надо ли после каждого такого телодвижения заново инициализировать PIN по пути GPIO->EXTI->NVIC? К сожалению лог/анализатора нет и в схему также вносит значительные искажения отладка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться