с таймера скорость срабатывания прерывания 848кгц. Частота плл 168 МГц, как-нибудь можно до 1 МГц дотянуть частоту?
В самом прерывании у меня gpiod->odr ^= pin_12
Неужели больше не получится выжать?
Должно быть больше. Таймер тактируется правильно, там никаких делителей нет между ним и pll?
а для чего такой кекс? почему не выход с таймера в порт?
Вроде нет, брал настройки проекта с куба, и пробовал делать на spl, результат одинаковый
Тогда странно. Мб прерывание действительно так долго отрабатывает, тогда попробуйте сделать глобальную переменную и в неё тикать +1 каждое прерывание, и только на каждый 10 тик, например, дергать пин. И измерить частоту, частота прерываний будет в 10 раз выше А если надо просто постоянный ШИМ, то действительно, проще запустить таймер и выходы вывести наружу, и пусть щёлкает себе
Вы про то, что скорость переключения ноги будет в 10 раз меньше?
Про то, что он в прерывании будет не ногу дергать, что мб долго для него, а просто писать в регистр, где эта переменная лежит, и дергать только иногда, если это его ускорит, то и правда быстрее в прерывании дергать не выйдет
Хм, тогда остаётся только pwm? Почему тогда он быстрее будет? Там тоже придется дергать ножками же
прерывание это сигнал сохранние контекста обработка и восстановление тактов 80 займет
Он в прерывании не делает ничего, его один раз запустил и он дёргает ногами Только выходы таймеров не на каждой ноге есть и не всех таймеров. Так что если уже готовая плата - не факт, что вам повезет)
У меня stm32f407 discovery плата, на ней тренируюсь
Ну вот откройте в кубе конфиг, если на нужной ноге есть какой нибудь выход таймера, то норм
Так как тогда данные класть? Есть он все время молотит ) и в прерывание не заходит. Фишка же в том, что бы на clk положить данные data и их передать на скорости 1 мегабит , ну и принять. Я по таймерам пока профан, поэтому столько вопросов Поэтому начал с того, что попытался выжать 1 мегабит с ножки.
Это уже сложнее. Наверное, как то таймер вовремя включать, когда данные готовы и выключать, когда всё отправлено... Ща мб кто то адекватнее подскажет
скорость gpio максимальную поставили? и можно еще оптимизацию включить
Да, gpio speed 100mhz. Оптимизацию кода?
Я так и делал, только для маленьких скоростей:)
у вас какой код в прерывании? только переключение состояния ноги и все?
Проверка, что произошло прерывание tim_it_update. Переключение состояние ноги и очистка бита прерывания. If(tim_getitstatus(tim10, tim_it_update) != reset) { Gpiod->odr ^= pin12; Tim10->sr &= ~ 0x0001; }
Тут надо все быстро делать,в функции чтения отключать всякие проверки,использовать bit banding для записи,а то вот у вас сброс в статус регистре бита-это уже несколько операций
Если убрать даже проверку установки флага, то скорость никак уже не меняется
Обсуждают сегодня