|
STM32f4 discovery прерывания, Запутался в прерываниях, прошу помощи |
|
|
|
Apr 23 2015, 14:49
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 24-02-15
Пользователь №: 85 339

|
в STM32CubeMX сгенерировал себе вот такой проект: USB OTG FS(для передачи данных на пк через виртуальный ком-порт), TIM6, Синяя кнопка, +2 gpio пина для работы с ультразвуковым датчиком расстояния. Цель программы - научиться считывать показания датчика. Как с ним работать: подать на пин Trig единицу длиной 10микроСек, засечь, сколько жду ответ от датчика по пину Echo. Преобразовать временной промежуток и получить расстояние до объекта. Все просто! Как я хочу, чтобы работала программа: при нажатии на кнопку контроллер отправляет по usb мне расстояние до объекта. Алгоритм: 1)прерывание по нажатию на кнопку 2)запускается таймер, его источник - 48МГц, делитель 0, период 47. (чтобы каждую микросекунду он генерировал прерывание) 3)работа с сенсором //этот пункт сейчас не вызывает вопросов 4)отправка данных по usb Данные по usb передаются нормально, но, если я включаю таймер, то USB виснет. Догадываюсь, что дело в прерываниях и их приоритетах. Приоритеты прерываний см на изображении. Что такое под-приоритет?
|
|
|
|
|
 |
Ответов
|
Apr 23 2015, 16:56
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 24-02-15
Пользователь №: 85 339

|
Цитата(adnega @ Apr 23 2015, 19:10)  Тут вам следует пересмотреть архитектуру. Что полезного вы успеете сделать за 48 тактов, причем 12 израсходуется только для вхождения в прерывание? Для формирования импульса и измерения отклика можно и нужно использовать аппаратные возможности таймера (при этом точность можно значительно повысить). А почему за 48 тактов? Проц работает на частоте 168Мгц (или нет?). А как называется режим, в котором стоит использовать таймер для такой моей цели? One Pulse Mode? Спасибо за ответ, но насчет прерываний-то что?
|
|
|
|
|
Apr 23 2015, 17:44
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Silber @ Apr 23 2015, 19:56)  А почему за 48 тактов? Проц работает на частоте 168Мгц (или нет?). А как называется режим, в котором стоит использовать таймер для такой моей цели? One Pulse Mode? Спасибо за ответ, но насчет прерываний-то что? Частота 168МГц это максимум для данного МК. В данном случае это ситуацию не меняет, т.к. вместо 48 тактов будет 168 и это все равно очень мало. Я бы сделал так: 1. Настроил таймер (лучше TIM2 - он 32-битный) с нужным PSC (т.е. временнЫм разрешением). 2. В ARR записал значение в зависимости от требуемой частоты опроса. 3. CH1 настроил на вывод PWM сигнала на ногу Trig с длительностью 10 мкс. 4. CH2 настроил на захват переднего фронта с ноги Echo и генерацией прерывания. В итоге имеем требуемую частоту опроса датчика с генерацией прерывания по приходу эха. Таймер работает с максимальным разрешением, cpu отвлекается только в моменты прихода эха. При этом в регистре лежит результат, который нужно лишь домножить на константу, чтоб получить расстояние. Если данные нужны не в реальном времени, а можно сложить в буфер, например, для отправки по USB, то, натравив на таймер DMA, можно еще больше разгрузить cpu. Задачка явно не для 168МГц))
|
|
|
|
|
Apr 23 2015, 18:08
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 24-02-15
Пользователь №: 85 339

|
Цитата(adnega @ Apr 23 2015, 20:44)  Частота 168МГц это максимум для данного МК. В данном случае это ситуацию не меняет, т.к. вместо 48 тактов будет 168 и это все равно очень мало.
Я бы сделал так: 1. Настроил таймер (лучше TIM2 - он 32-битный) с нужным PSC (т.е. временнЫм разрешением). 2. В ARR записал значение в зависимости от требуемой частоты опроса. 3. CH1 настроил на вывод PWM сигнала на ногу Trig с длительностью 10 мкс. 4. CH2 настроил на захват переднего фронта с ноги Echo и генерацией прерывания.
В итоге имеем требуемую частоту опроса датчика с генерацией прерывания по приходу эха. Таймер работает с максимальным разрешением, cpu отвлекается только в моменты прихода эха. При этом в регистре лежит результат, который нужно лишь домножить на константу, чтоб получить расстояние. Если данные нужны не в реальном времени, а можно сложить в буфер, например, для отправки по USB, то, натравив на таймер DMA, можно еще больше разгрузить cpu. Задачка явно не для 168МГц)) Большое спасибо, очень круто (даже не подозревал, что можно так)! Так и сделаю. А насчет моего изначального вопроса (ну не оставлять же пробелы в голове) У датчика есть еще один способ снятия показаний: умножить на коэф длину эха. Получается, еще лучше использовать этот способ, поставив СН2 в input capture?
|
|
|
|
Сообщений в этой теме
Silber STM32f4 discovery прерывания Apr 23 2015, 14:49 Silber Ошибся в последнем предложении. Режим называется P... Apr 23 2015, 19:40 adnega Цитата(Silber @ Apr 23 2015, 22:40) Режим... Apr 24 2015, 05:36  Silber Цитата(adnega @ Apr 24 2015, 08:36) Вам д... Apr 24 2015, 06:09   adnega Цитата(Silber @ Apr 24 2015, 09:09) Мой п... Apr 24 2015, 06:32    Silber Цитата(adnega @ Apr 24 2015, 09:32) Ааа. ... Apr 24 2015, 11:04 esaulenka Осциллографа под рукой нету?
Моргания светодиода ... Apr 24 2015, 12:24 Silber Показания сняты успешно!
Однако, не без загадо... Apr 24 2015, 12:30 esaulenka Цитата(Silber @ Apr 24 2015, 15:30) Осцил... Apr 24 2015, 12:58 esaulenka Как нарисовано, так и работает.
По входу "три... Apr 24 2015, 12:39 Silber Цитата(esaulenka @ Apr 24 2015, 15:39) Ка... Apr 24 2015, 12:50 Silber ЦитатаНе понял, что это. Полная документация есть?... Apr 24 2015, 13:07 esaulenka Ну... Надо учитывать, что Шенжень находится достат... Apr 24 2015, 13:25 Silber Цитата(esaulenka @ Apr 24 2015, 16:25) А ... Apr 24 2015, 14:39  esaulenka Цитата(Silber @ Apr 24 2015, 17:39) А в ч... Apr 27 2015, 08:45
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|