Например TDA7294

Форум РадиоКот :: Просмотр темы - STM32 каскадирование таймеров и одновременные прерывания
Форум РадиоКот
https://radiokot.ru/forum/

STM32 каскадирование таймеров и одновременные прерывания
https://radiokot.ru/forum/viewtopic.php?f=59&t=173273
Страница 1 из 1

Автор:  kurator [ Вт окт 13, 2020 14:16:22 ]
Заголовок сообщения:  STM32 каскадирование таймеров и одновременные прерывания

Добрый день! Кто подскажет, почему не запускается прерывание переполнения (т.е. не формируется событие переполнения) в режиме захвата. Из-за этого не получается запустить ведомый таймер или отработать прерывание переполнения. Измеритель частоты на 3 каскадах работает нормально. Пробовал различные комбинации с TIM1...TIM4. В режиме захвата, каждый таймер измеряет ШИМ нормально.

Автор:  КРАМ [ Вт окт 13, 2020 16:43:22 ]
Заголовок сообщения:  Re: STM32 каскадирование таймеров и одновременные прерывания

Может стоит привести код инициализации таймера?

Автор:  240265 [ Вт окт 13, 2020 17:15:48 ]
Заголовок сообщения:  Re: STM32 каскадирование таймеров и одновременные прерывания

А чо, так не видно чтоли ? :)))

Автор:  kurator [ Вт окт 13, 2020 17:55:47 ]
Заголовок сообщения:  Re: STM32 каскадирование таймеров и одновременные прерывания

Период измеряет нормально.

;Инициалиафция TIM1:

MOV32 R0,#TIM1_PSC ;Предделитель
MOV R1,#(70-1) ;
STR R1,[R0]

MOV32 R0,#TIM1_ARR ;Счет
MOV R1,#(0xffff)
STR R1,[R0]

MOV32 R0,#TIM1_CCMR1
MOV R1,#((1<<CC1S0)) ; CC1S[01]: канал CC1 на вход, IC1 отображается на TI1,
STR R1,[R0] ;

MOV32 R0,#TIM1_CCER
MOV R1,#(1<<CC1E) ;Измерение периода
STR R1,[R0]

MOV32 R0,#TIM1_CR2
MOV R1,#(1<<MMS1) ; MMS[010]: Обновление
STR R1,[R0]

MOV32 R0,#TIM1_SMCR
MOV R1,#(1<<TS2)+(1<<TS0)+(1<<SMS2) ; TS[101] - Фильтрованный вход таймера 1 (TI1FP1) , SMS[100] - режим сброса.
STR R1,[R0]

MOV32 R0,#SRAM_Tim
STR Noll,[R0]

MOV32 R0,#TIM1_CCR1
STR Noll,[R0]

MOV32 R0,#TIM1_CNT
STR Noll,[R0]

MOV32 R0,#TIM1_CR1_CEN ;TIM3 счетчик - включение/отключение
STR Unit, [R0]
MOV32 R0,#TIM1_DIER_CC1IE ;Разрешения прерывания захвата/сравнения 1
STR Unit, [R0]
MOV32 R0,#TIM1_DIER_UIE ;Обновление разрешения прерывания TIM4
STR Unit, [R0]

Автор:  a797945 [ Ср окт 14, 2020 19:48:00 ]
Заголовок сообщения:  Re: STM32 каскадирование таймеров и одновременные прерывания

как-то у Вас все термины в кучу, вот смотрите:
каскадирование - соединение счетчиков (читай таймеров), так что предыдущий это как предделитель для следующего, т.е. для этого вызов прерывания не нужен;
тут же Вы пишите "Измеритель частоты на 3 каскадах работает нормально"
- т.е. получается состыковали 3 таймера?
далее
"переполнение" таймера - по сути это совпадение "веса" счетчика со значением в ARR, формируется упр.импульс события "переполнения", далее идут действия завязанные на это событие; например взводится флаг, если настроены прерывания таймер "стукнет током" контроллер прерывания - брось все запускай обработчик прерывания.
переполнения может на приключиться, например, потому что - выключен, не тактируется, не дотягивается (т.е. в режиме сброс сбрасывается раньше, чем достигнет значения в ARR).

не особо знаю асму, все не проверял, но это бросилось в глаза :
MOV32 R0,#TIM1_DIER_UIE ;
STR Unit, [R0]
что здесь должно загрузиться в R0?

Автор:  КРАМ [ Ср окт 14, 2020 20:41:14 ]
Заголовок сообщения:  Re: STM32 каскадирование таймеров и одновременные прерывания

Это бит-бендинг, насколько я понимаю в колбасных обрезках.... По адресу бита устанавливается единица

Автор:  jcxz [ Чт окт 15, 2020 07:34:11 ]
Заголовок сообщения:  Re: STM32 каскадирование таймеров и одновременные прерывания

Видимо значение неуказанных символических имён предлагается угадать экстрасенсам? 8)
Дальше должно следовать выдавливание информации по капли из партизана. Видимо это не ему нужно, а он делает одолжение форуму выдавая детали по крупицам. :dont_know:

PS: И при чём тут вообще ШИМ???

PPS: А прерывание не вызывается видимо потому, что оно не разрешено в NVIC. Или потому, что не прописан адрес ISR в вектор таблицы прерываний. Или потому, что неправильно прописано расположение таблицы прерываний. Или потому что прерывания глобально запрещены. Или по 100500 другим причинам... :dont_know:

Автор:  КРАМ [ Чт окт 15, 2020 12:33:57 ]
Заголовок сообщения:  Re: STM32 каскадирование таймеров и одновременные прерывания

Видимо значение неуказанных символических имён предлагается угадать экстрасенсам?

Полагаю, что они объявлены в стандартном inc-файле МК в проекте.
Из контекста следует. И отличается от маски бит в CMSIS именем периферии:
#TIM1_DIER_UIE

Автор:  kurator [ Чт окт 15, 2020 13:40:24 ]
Заголовок сообщения:  Re: STM32 каскадирование таймеров и одновременные прерывания

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

Автор:  jcxz [ Пт окт 16, 2020 11:11:25 ]
Заголовок сообщения:  Re: STM32 каскадирование таймеров и одновременные прерывания

Полагаю, что они объявлены в стандартном inc-файле МК в проекте.
"Noll" и "Unit" объявлены? :dont_know: Сильно сомневаюсь. И из контекста вопроса их значение тоже угадать невозможно.

Добавлено after 5 minutes 38 seconds:
Но жизнь заставила, нужно было делать ассемблерные вставки для ускорения работы программ. С тех пор пишу на Ассемблере.
Ускорение инициализации периферии? Серьёзно??? А какой смысл? :dont_know:
Да и нет там у вас там никакого ускорения, а наоборот - плохим знанием ассемблера вы сделали код более громоздким и тормозным чем его сделал бы нормальный компилятор. Одна только многократная загрузка адресов регистров одного и того же таймера чего стоит! Нафига так делать?? :dont_know:

PS: Чтобы программировать на асме действительно эффективно и от этого была польза и смысл, надо сперва изучить систему команд МК. Чего вы не сделали, как видно по коду.

Автор:  kurator [ Пт окт 16, 2020 12:11:53 ]
Заголовок сообщения:  Re: STM32 каскадирование таймеров и одновременные прерывания

jcxz ! Вы хотите все сразу и большой ложкой.
1. Тот вид куска программы показан для лучшего понимания тем кто имеет мало опыта в Ассемблере. Если бы я представил в оптимизированном виде, Вы бы еще дольше разбирались.
2. Вы правы в том что я не указал, что есть "0" и "1", что вызвало суету. Исправляю:

GET stm32f103_Keil.s

Unit RN 11 ;"1" - еденица (R11)
Noll RN 10 ;"0" - ноль (R10)
Rsos RN 9 ;Rsos - Регистр СОСТОЯНИЯ ПРОГРАММЫ (R9)

; Для BitBand под рукой всегда должны быть нолик
MOV32 Noll,#0
; Для BitBand под рукой всегда должны быть единичка
MOV32 Unit,#1

3. У меня конкретный вопрос. Я никогда не пользовался одновременно несколькими прерываниями, в частности - Обновлением и Захвата. Возможно это? Если возможно, то как? У меня не получается.

Автор:  КРАМ [ Пт окт 16, 2020 16:12:22 ]
Заголовок сообщения:  Re: STM32 каскадирование таймеров и одновременные прерывания

Сильно сомневаюсь.

Я имел ввиду дефайн адреса бита, а не Noll и Unit, которые совершенно очевидны и без комментариев автора.

Добавлено after 4 minutes 25 seconds:
Возможно это?

Конечно возможно. Какие биты разрешений подняты, такие и будут генерировать прерывания. Только их нужно в обработчике сортировать. Сейчас лениво лезть в проект, но у меня по какому то (не помню) таймеру в 407-м генерируются прерывания и по ШИМу (увы, не по захвату) и по апдейту. Причина банальна. Автор проекта, который я по наследству правил, не удосужился оставить конкретные ноги под медленный ШИМ и пришлось делать ШИМ ногодрыгом из прерываний.

Добавлено after 2 minutes 37 seconds:
А прерывание не вызывается видимо потому, что оно не разрешено в NVIC. Или потому, что не прописан адрес ISR в вектор таблицы прерываний. Или потому, что неправильно прописано расположение таблицы прерываний. Или потому что прерывания глобально запрещены.

Причина конечно есть, но поскольку РАЗДЕЛЬНО прерывания генерируются, то ни одна из перечисленных причин не катит. Вектор у таймера один, к слову. А IVT вообще должен формировать линкер...

Автор:  kurator [ Пт окт 16, 2020 18:33:00 ]
Заголовок сообщения:  Re: STM32 каскадирование таймеров и одновременные прерывания

Я может не правильно сформулировал задачу. Дело в том что по отдельности каждое прерывание работает (по очереди запрещал),а вот вместе нет - сбоит. Такое впечатление, что наезжают друг на друга прерывания. Хотя старался разводить их измеряемым сигналом. Отработку прерываний уменьшал до 0,8 мкС.
У меня создалось впечатление, что сигналы запуска и захвата каким-то образом запускают прерывание обновления.
Спасибо! Появились идеи, попробую проверить.

Автор:  a797945 [ Пт окт 16, 2020 20:27:42 ]
Заголовок сообщения:  Re: STM32 каскадирование таймеров и одновременные прерывания

чего имеем по листингу:

PSC [70-1], ARR [FFFF] (до максимума),
SMS [100], TS [101], CC1S [ 01] - режим сброс, нога для сброса - вход первого канала,
т.е. тактирование от внутр., при фронте на ноге 1-го канала, обнулится начнет снова;
CC1E [ 1] - вход первого канала разрешен;
MMS [010] - если случится "обновление" счетчика пнуть ведомый тамер, т.е. этот импульс транслируется в TRGO;
CNT [ 0] - начальное значение счетчика
CCR1 [ 0] - значение в регистре 1-го канала, странно как-то
CEN [ 1] - разрешить тактирование счетчика
UIE [ 1] - разрешить дергать контроллер прерываний при обновлении счетчика, т.е. из FFFF в 0000
CC1IE [ 1] - разрешить дергать контроллер прерываний при совпадении с регистром 1-го канала,
а в нем 0000, т.е. опять же при переходе FFFF в 0000 счетчика.

чего я напутал?

а га, CC1E [ 1] - это переключение в захват,
т.е. по фронту на ноге 1-го канала счетчик будет копироваться в регистр ентого канала и генериться прерывание, стоп но на этой же ноге сброс счетчика, т.е. опять прерывания одновременны? чего-то я запутался :)

Автор:  a797945 [ Вс окт 18, 2020 10:41:13 ]
Заголовок сообщения:  Re: STM32 каскадирование таймеров и одновременные прерывания

предыдущий мой опус следовало б стереть, да теперь поздно.

я б, наверное, не каскадировал, а в обработчике по флагу переполнения наращивал 32-битную переменную, по флагу захвата забирал ccr.
А если все таки каскадировать - без прерываний аппаратно - первый в режиме Сброс, остальные просто ведомые, вх.сигнал (по кому захватывать) подать на все; по прерыванию от первого забираем все ccr, ведомые таймеры на исходную (первый на автомате).

хотя, скорее всего, я просто не понял задачу kuratora

Автор:  AVI-crak [ Вс окт 18, 2020 11:45:42 ]
Заголовок сообщения:  Re: STM32 каскадирование таймеров и одновременные прерывания

kurator - для таймеров st не нужна асма, это не старинный пик - где всё было программным. Более того, таймеры от st спроектированы так - чтобы регистрировать и отмерять время недостижимое классическим программным способом.
Для начала сформулируйте основную задачу, что именно вам нужно сделать (не как сделать а именно что сделать). С подробным описанием возможностей и требований к будущему девайсу. Что-то мне подсказывает, что решение очень простое.

Автор:  КРАМ [ Вс окт 18, 2020 18:33:28 ]
Заголовок сообщения:  Re: STM32 каскадирование таймеров и одновременные прерывания

kurator - для таймеров st не нужна асма, это не старинный пик - где всё было программным. Более того, таймеры от st спроектированы так - чтобы регистрировать и отмерять время недостижимое классическим программным способом.

Какой то эпичный бред.
Что про "асму", что про пики, что про таймеры в СТм.

Автор:  alex_ [ Ср июн 21, 2023 19:22:17 ]
Заголовок сообщения:  Re: STM32 каскадирование таймеров и одновременные прерывания

Уважаемые, кто в курсе, можно ли 2 счётчика заставить считать синхронно, если да, то как?
Что на данный момент, таймер 4 считает импульсы энкодера и настроен в режиме мастера, Т12 в режиме слейв, в результате переполнения Т4 получаем Т12 +1
Хотелось чтобы они считали тики вместе, только у каждого разная "верхушка" т.е. переполнение, например у Т4 наступает при 7123 импульса а у Т12 через 33, и по каждому переполнению генерится прерывание, это реально сделать, или такое надо делать по другому?

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/