STM32 каскадирование таймеров и одновременные прерывания

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
kurator
Родился
Сообщения: 15
Зарегистрирован: Пт окт 29, 2010 15:26:32

STM32 каскадирование таймеров и одновременные прерывания

Сообщение kurator »

Добрый день! Кто подскажет, почему не запускается прерывание переполнения (т.е. не формируется событие переполнения) в режиме захвата. Из-за этого не получается запустить ведомый таймер или отработать прерывание переполнения. Измеритель частоты на 3 каскадах работает нормально. Пробовал различные комбинации с TIM1...TIM4. В режиме захвата, каждый таймер измеряет ШИМ нормально.
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25390
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: STM32 каскадирование таймеров и одновременные прерывания

Сообщение КРАМ »

Может стоит привести код инициализации таймера?
Реклама
Аватара пользователя
240265
Электрический кот
Сообщения: 1029
Зарегистрирован: Сб мар 09, 2013 11:29:22
Откуда: 40RUS, Жуков

Re: STM32 каскадирование таймеров и одновременные прерывания

Сообщение 240265 »

А чо, так не видно чтоли ? :)))
IVL ex UA6PJ
kurator
Родился
Сообщения: 15
Зарегистрирован: Пт окт 29, 2010 15:26:32

Re: STM32 каскадирование таймеров и одновременные прерывания

Сообщение kurator »

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

;Инициалиафция 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
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Re: STM32 каскадирование таймеров и одновременные прерывания

Сообщение a797945 »

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

не особо знаю асму, все не проверял, но это бросилось в глаза :
MOV32 R0,#TIM1_DIER_UIE ;
STR Unit, [R0]
что здесь должно загрузиться в R0?
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25390
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: STM32 каскадирование таймеров и одновременные прерывания

Сообщение КРАМ »

Это бит-бендинг, насколько я понимаю в колбасных обрезках.... По адресу бита устанавливается единица
Реклама
jcxz
Мудрый кот
Сообщения: 1731
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: STM32 каскадирование таймеров и одновременные прерывания

Сообщение jcxz »

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

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

PPS: А прерывание не вызывается видимо потому, что оно не разрешено в NVIC. Или потому, что не прописан адрес ISR в вектор таблицы прерываний. Или потому, что неправильно прописано расположение таблицы прерываний. Или потому что прерывания глобально запрещены. Или по 100500 другим причинам... :dont_know:
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25390
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: STM32 каскадирование таймеров и одновременные прерывания

Сообщение КРАМ »

[uquote="jcxz",url="/forum/viewtopic.php?p=3907065#p3907065"]Видимо значение неуказанных символических имён предлагается угадать экстрасенсам?[/uquote]
Полагаю, что они объявлены в стандартном inc-файле МК в проекте.
Из контекста следует. И отличается от маски бит в CMSIS именем периферии:
#TIM1_DIER_UIE
kurator
Родился
Сообщения: 15
Зарегистрирован: Пт окт 29, 2010 15:26:32

Re: STM32 каскадирование таймеров и одновременные прерывания

Сообщение kurator »

Тому кто начинал программировать с языков высокого уровня психологически трудно перейти на Ассемблер, по себе знаю. Но жизнь заставила, нужно было делать ассемблерные вставки для ускорения работы программ. С тех пор пишу на Ассемблере. Если есть вопросы отвечу.
jcxz
Мудрый кот
Сообщения: 1731
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: STM32 каскадирование таймеров и одновременные прерывания

Сообщение jcxz »

[uquote="КРАМ",url="/forum/viewtopic.php?p=3907182#p3907182"]Полагаю, что они объявлены в стандартном inc-файле МК в проекте.[/uquote]"Noll" и "Unit" объявлены? :dont_know: Сильно сомневаюсь. И из контекста вопроса их значение тоже угадать невозможно.

Добавлено after 5 minutes 38 seconds:
[uquote="kurator",url="/forum/viewtopic.php?p=3907206#p3907206"]Но жизнь заставила, нужно было делать ассемблерные вставки для ускорения работы программ. С тех пор пишу на Ассемблере.[/uquote]Ускорение инициализации периферии? Серьёзно??? А какой смысл? :dont_know:
Да и нет там у вас там никакого ускорения, а наоборот - плохим знанием ассемблера вы сделали код более громоздким и тормозным чем его сделал бы нормальный компилятор. Одна только многократная загрузка адресов регистров одного и того же таймера чего стоит! Нафига так делать?? :dont_know:

PS: Чтобы программировать на асме действительно эффективно и от этого была польза и смысл, надо сперва изучить систему команд МК. Чего вы не сделали, как видно по коду.
kurator
Родился
Сообщения: 15
Зарегистрирован: Пт окт 29, 2010 15:26:32

Re: STM32 каскадирование таймеров и одновременные прерывания

Сообщение kurator »

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. У меня конкретный вопрос. Я никогда не пользовался одновременно несколькими прерываниями, в частности - Обновлением и Захвата. Возможно это? Если возможно, то как? У меня не получается.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25390
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: STM32 каскадирование таймеров и одновременные прерывания

Сообщение КРАМ »

[uquote="jcxz",url="/forum/viewtopic.php?p=3907610#p3907610"]Сильно сомневаюсь.[/uquote]
Я имел ввиду дефайн адреса бита, а не Noll и Unit, которые совершенно очевидны и без комментариев автора.

Добавлено after 4 minutes 25 seconds:
[uquote="kurator",url="/forum/viewtopic.php?p=3907645#p3907645"]Возможно это?[/uquote]
Конечно возможно. Какие биты разрешений подняты, такие и будут генерировать прерывания. Только их нужно в обработчике сортировать. Сейчас лениво лезть в проект, но у меня по какому то (не помню) таймеру в 407-м генерируются прерывания и по ШИМу (увы, не по захвату) и по апдейту. Причина банальна. Автор проекта, который я по наследству правил, не удосужился оставить конкретные ноги под медленный ШИМ и пришлось делать ШИМ ногодрыгом из прерываний.

Добавлено after 2 minutes 37 seconds:
[uquote="jcxz",url="/forum/viewtopic.php?p=3907065#p3907065"]А прерывание не вызывается видимо потому, что оно не разрешено в NVIC. Или потому, что не прописан адрес ISR в вектор таблицы прерываний. Или потому, что неправильно прописано расположение таблицы прерываний. Или потому что прерывания глобально запрещены.[/uquote]
Причина конечно есть, но поскольку РАЗДЕЛЬНО прерывания генерируются, то ни одна из перечисленных причин не катит. Вектор у таймера один, к слову. А IVT вообще должен формировать линкер...
kurator
Родился
Сообщения: 15
Зарегистрирован: Пт окт 29, 2010 15:26:32

Re: STM32 каскадирование таймеров и одновременные прерывания

Сообщение kurator »

Я может не правильно сформулировал задачу. Дело в том что по отдельности каждое прерывание работает (по очереди запрещал),а вот вместе нет - сбоит. Такое впечатление, что наезжают друг на друга прерывания. Хотя старался разводить их измеряемым сигналом. Отработку прерываний уменьшал до 0,8 мкС.
У меня создалось впечатление, что сигналы запуска и захвата каким-то образом запускают прерывание обновления.
Спасибо! Появились идеи, попробую проверить.
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Re: STM32 каскадирование таймеров и одновременные прерывания

Сообщение a797945 »

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

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
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Re: STM32 каскадирование таймеров и одновременные прерывания

Сообщение a797945 »

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

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

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

Re: STM32 каскадирование таймеров и одновременные прерывания

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

kurator - для таймеров st не нужна асма, это не старинный пик - где всё было программным. Более того, таймеры от st спроектированы так - чтобы регистрировать и отмерять время недостижимое классическим программным способом.
Для начала сформулируйте основную задачу, что именно вам нужно сделать (не как сделать а именно что сделать). С подробным описанием возможностей и требований к будущему девайсу. Что-то мне подсказывает, что решение очень простое.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25390
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: STM32 каскадирование таймеров и одновременные прерывания

Сообщение КРАМ »

[uquote="AVI-crak",url="/forum/viewtopic.php?p=3908662#p3908662"]kurator - для таймеров st не нужна асма, это не старинный пик - где всё было программным. Более того, таймеры от st спроектированы так - чтобы регистрировать и отмерять время недостижимое классическим программным способом.[/uquote]
Какой то эпичный бред.
Что про "асму", что про пики, что про таймеры в СТм.
Аватара пользователя
alex_
Опытный кот
Сообщения: 781
Зарегистрирован: Сб июн 01, 2013 22:24:21
Откуда: ПФО

Re: STM32 каскадирование таймеров и одновременные прерывания

Сообщение alex_ »

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

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