Как отсчитать равный промежуток тактов на stm32f1

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
black_lizard
Встал на лапы
Сообщения: 132
Зарегистрирован: Вс сен 23, 2012 05:51:35

Как отсчитать равный промежуток тактов на stm32f1

Сообщение black_lizard »

Суть вопроса заключается в следующем. Мне нужно, чтобы, например, после прерывания А, прерывание Б происходило ровно, скажем, через 600 тактов. Вопрос решается, скажете вы, довольно просто, запусти таймер на 600 тактов, который вызывает прерывание. Ан нет, давно уже мучаюсь с этим, но ничего не выходит. Прерывание происходит не ровно через 600 тактов, а через 601-602 и т.д. в зависимости от фоновых действий.

То есть я запускаю таймер 1 с прерыванием. Он его генерит. В прерывании запускается таймер 2 на 600 тактов. Я что-то делаю в первом прерывании и выхожу из него. Срабатывает второе... но проходит не ровно 600 тактов! И как решить эту задачу я уже голову сломал. Да, счётчик таймера я сбрасываю.

Пробовал делать всё в одном прерывании, просто запомнить значение другого таймера в начале прерывания. Сделать какие-то дела в прерывании. И дождаться нужного значения в эти 600 тактов просто в вайле, но не тут то было! Арм и тут меня подловил и судя по всему иногда происходит, а иногда не происходит лишняя инструкция сравнения, но стабильности нет.

Пока единственный способ решения задачи, который я нашёл - просто ждать в for опрелённое количество цыклов в одном прерывании до события Б. Тогда выходит, что всегда отсчитывается нужное значение от начала прерывания А до события Б. Но! Это же такая бессмысленная трата ресурсов, которые мне очень нужны. Прошу помощи в решении этой нелёгкой задачи.

Единственное решение, которое я сейчас предполагаю - как-то отправить камень в сон и ждать прерывания от второго таймера после действий в событии А. Тогда, предположительно, он всегда будет одинаково выходить из сна и я буду получать свои фиксированные 600 тактов, но как это сделать я так и не понял. Ну или как-то ждать в самом прерывании значения таймера без вайла, какой-то скрытой командой, о которой я ничего не знаю.

Хочу сделать ремарку, что 600 тактов число навсидку. Мне просто нужно всегда чтобы событие Б происходило через фиксированное количество тактов от события А.
Собираю самопальный мини-компьютер
Реклама
Аватара пользователя
AVI-crak
Прорезались зубы
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17
Контактная информация:

Re: Как отсчитать равный промежуток тактов на stm32f1

Сообщение AVI-crak »

Виновата флешпамять.
Доступ к данным не мгновенный и зависит от латентности (FLASH->ACR). Вариант - выполнять программу из памяти.
Реклама
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: Как отсчитать равный промежуток тактов на stm32f1

Сообщение arkhnchul »

[uquote="black_lizard",url="/forum/viewtopic.php?p=3205314#p3205314"]после прерывания А, прерывание Б происходило ровно, скажем, через 600 тактов.[/uquote]
надежно - никак.
[uquote="black_lizard",url="/forum/viewtopic.php?p=3205314#p3205314"]Единственное решение, которое я сейчас предполагаю - как-то отправить камень в сон и ждать прерывания от второго таймера после действий в событии А. Тогда, предположительно, он всегда будет одинаково выходить из сна[/uquote]
с режимами сна я особо не ковырялся, но емнип первое, что делает контроллер по пробуждении - дожидается стабилизации частоты тактового генератора. Это время не фиксировано.
[uquote="black_lizard",url="/forum/viewtopic.php?p=3205314#p3205314"]Мне просто нужно всегда чтобы событие Б происходило через фиксированное количество тактов от события А.[/uquote]
а зачем, если не секрет?
Аватара пользователя
black_lizard
Встал на лапы
Сообщения: 132
Зарегистрирован: Вс сен 23, 2012 05:51:35

Re: Как отсчитать равный промежуток тактов на stm32f1

Сообщение black_lizard »

[uquote="AVI-crak",url="/forum/viewtopic.php?p=3205331#p3205331"]Виновата флешпамять.
Доступ к данным не мгновенный и зависит от латентности (FLASH->ACR). Вариант - выполнять программу из памяти.[/uquote]

Nope, попробовал через конфиг кейла закидывать функции в рам - не помогло.
с режимами сна я особо не ковырялся, но емнип первое, что делает контроллер по пробуждении - дожидается стабилизации частоты тактового генератора. Это время не фиксировано.
Ну я предполагал, что есть режим сна, в котором тактирование не отключается. Впрочем, он так глубоко уходит в сон по WFI, что до него даже программатор достучаться не может.
надежно - никак.
Печалька. Но, отвечая на ваш последний вопрос - вывод на vga. Я давно с ним воюю. Но в итоге победил, не знаю как, но мне удалось методом проб и ошибок добиться того, чтобы более менее фиксированный был промежуток между синхроимпульсом в первом прерывании и началом отрисовки во втором. Остаётся только дивиться, как люди умудряются на восьмибитках его (vga) поднимать.

Ответ на свой вопрос я получил, спасибо. (никак)
Собираю самопальный мини-компьютер
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Как отсчитать равный промежуток тактов на stm32f1

Сообщение oleg110592 »

[uquote="black_lizard",url="/forum/viewtopic.php?p=3205344#p3205344"]вывод на vga[/uquote]
может поглядеть как тут сделано:
http://bitboxconsole.blogspot.com/p/blog-page.html
Реклама
Аватара пользователя
black_lizard
Встал на лапы
Сообщения: 132
Зарегистрирован: Вс сен 23, 2012 05:51:35

Re: Как отсчитать равный промежуток тактов на stm32f1

Сообщение black_lizard »

[uquote="oleg110592",url="/forum/viewtopic.php?p=3205380#p3205380"][uquote="black_lizard",url="/forum/viewtopic.php?p=3205344#p3205344"]вывод на vga[/uquote]
может поглядеть как тут сделано:
http://bitboxconsole.blogspot.com/p/blog-page.html[/uquote]

В stm32f4 многое по другому и проще. Речь идёт именно о серии stm32f1.
Собираю самопальный мини-компьютер
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Как отсчитать равный промежуток тактов на stm32f1

Сообщение dosikus »

Тогда забудьте про подсчеты тактов а'ля авр , и читайте здесь https://www.artekit.eu/vga-output-using-a-36-pin-stm32/
Аватара пользователя
philosoraptor
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб янв 14, 2012 22:53:50

Re: Как отсчитать равный промежуток тактов на stm32f1

Сообщение philosoraptor »

В прерывании запускается таймер 2 на 600 тактов. Я что-то делаю в первом прерывании и выхожу из него. Срабатывает второе... но проходит не ровно 600 тактов!
Ошибка в самом построении задачи.
Аватара пользователя
black_lizard
Встал на лапы
Сообщения: 132
Зарегистрирован: Вс сен 23, 2012 05:51:35

Re: Как отсчитать равный промежуток тактов на stm32f1

Сообщение black_lizard »

[uquote="dosikus",url="/forum/viewtopic.php?p=3205791#p3205791"]Тогда забудьте про подсчеты тактов а'ля авр , и читайте здесь https://www.artekit.eu/vga-output-using-a-36-pin-stm32/[/uquote]
Я читал. Там одноцветная картинка через SPI. Идея понятна, но не подходит, я хочу цвет.
Ошибка в самом построении задачи.
Не очень понял, в чём ошибка.
Собираю самопальный мини-компьютер
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Как отсчитать равный промежуток тактов на stm32f1

Сообщение Reflector »

Black_lizard, у меня все работает, не важно из флеша выполнять или RAM. Пишу в CCR1 600, в прерывании сохраняю в массив текущее значение счетчика, CCR1 увеличиваю на 600, когда массив заполняется сверяю разницу между соседними значениями массива и она всегда равна 600.
Аватара пользователя
philosoraptor
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб янв 14, 2012 22:53:50

Re: Как отсчитать равный промежуток тактов на stm32f1

Сообщение philosoraptor »

Не очень понял, в чём ошибка.
Ошибка в использовании прерывания для запуска кода, особенно если нужен точный тайминг.
Аватара пользователя
black_lizard
Встал на лапы
Сообщения: 132
Зарегистрирован: Вс сен 23, 2012 05:51:35

Re: Как отсчитать равный промежуток тактов на stm32f1

Сообщение black_lizard »

[uquote="Reflector",url="/forum/viewtopic.php?p=3205814#p3205814"]Black_lizard, у меня все работает, не важно из флеша выполнять или RAM. Пишу в CCR1 600, в прерывании сохраняю в массив текущее значение счетчика, CCR1 увеличиваю на 600, когда массив заполняется сверяю разницу между соседними значениями массива и она всегда равна 600.[/uquote]

Хм. Возможно тогда это где-то всё-таки моя ошибка была. Спасибо.
Ошибка в использовании прерывания для запуска кода, особенно если нужен точный тайминг.
Ну если он успевает выполниться до следующего прерывания, то в чём проблема?
Собираю самопальный мини-компьютер
Аватара пользователя
philosoraptor
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб янв 14, 2012 22:53:50

Re: Как отсчитать равный промежуток тактов на stm32f1

Сообщение philosoraptor »

Ну если он успевает выполниться до следующего прерывания, то в чём проблема?
В чем проблема вы вроде сами выше написали. Надеюсь, вы в курсе, что пока код выполняется, вы сидите в прерывании?

Собственно, Reflector предложил одно из возможных ее решений.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Как отсчитать равный промежуток тактов на stm32f1

Сообщение oleg110592 »

[uquote="black_lizard",url="/forum/viewtopic.php?p=3205744#p3205744"]Речь идёт именно о серии stm32f1[/uquote]
с F1 мало дела имел, но таймер там вроде умеет запускать другой таймер, DMA вроде тоже есть - разве нельзя на F1 так типа сделать:
Изображение
Аватара пользователя
black_lizard
Встал на лапы
Сообщения: 132
Зарегистрирован: Вс сен 23, 2012 05:51:35

Re: Как отсчитать равный промежуток тактов на stm32f1

Сообщение black_lizard »

[uquote="philosoraptor",url="/forum/viewtopic.php?p=3205818#p3205818"]
Ну если он успевает выполниться до следующего прерывания, то в чём проблема?
В чем проблема вы вроде сами выше написали. Надеюсь, вы в курсе, что пока код выполняется, вы сидите в прерывании?

Собственно, Reflector предложил одно из возможных ее решений.[/uquote]

Конечно, в курсе. И что прерывание не сработает до тех пор, пока мы сидим в прерывании с большим приоритетом. Тем не менее ранее я всех поблагодарил за помощь и написал, что решением проблемы нашлось. И, видимо, это была моя ошибка. Во всяком случае стабильности я добился.

oleg110592, с DMA я делал изначально и всё бы хорошо, но на его работу воздействует фоновая программа. То есть DMA нормально работает только если на фоне крутится цыкл while(1);. Начинаешь делать вычисления - и начинаются проблемы. На V-Sync вообще не нужен отдельный таймер, достаточно считать строки в прерываниях на H-sync. По статьям я понял, что эта проблема с DMA решается тем, что в мк несколько независимых блоков SRAM памяти и можно выводить данные с блока, который не будет затронут. МБ я ошибаюсь, но нормальную цветную картинку я пока видел только на F4 )
Собираю самопальный мини-компьютер
Аватара пользователя
philosoraptor
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб янв 14, 2012 22:53:50

Re: Как отсчитать равный промежуток тактов на stm32f1

Сообщение philosoraptor »

Кстати, в проекте по линку от dosikus столкнулись с похожей на вашу проблемой:
One curious fact was that we had to move the interrupt handlers to a fixed position at the end of the flash because adding code before those functions (in terms of position in flash) made the SPI to start sooner or later, depending on the added code. I believe in some flash fetching delay depending on the function location.
Galizin
Мучитель микросхем
Сообщения: 478
Зарегистрирован: Ср окт 15, 2008 09:33:03
Откуда: Воронеж

Re: Как отсчитать равный промежуток тактов на stm32f1

Сообщение Galizin »

Примерно похожую задачу решали здесь http://we.easyelectronics.ru/STM8/progr ... ast-2.html. Там нужно было начать выполнять код через фиксированное время после первого фронта USB пакета. Где то было продолжение уже для m0.
Ответить

Вернуться в «ARM»