24 битный таймер

ssss
Offline
Зарегистрирован: 01.07.2016

nik182 пишет:

Ну что вы право дело пристали с намбер ту? Открываем примеры STM 

И причём здесь это? Хадварно! Хардварно значит без кода и прерываний, только инит, а дальше оно само!

Logik
Offline
Зарегистрирован: 05.08.2014

nik182 пишет:

Так?

Да. Спасибо. Вижу что Вас в один ряд с ssss ставить нельзя. Сорри.

nik182
Offline
Зарегистрирован: 04.05.2015

ssss пишет:

nik182 пишет:

Ну что вы право дело пристали с намбер ту? Открываем примеры STM 

И причём здесь это? Хадварно! Хардварно значит без кода и прерываний, только инит, а дальше оно само!

Ну хоть код посмотрите :-)  - только один инит ! Дальше оно само. Ни прерываний ничего! Всё хардверно.

ssss
Offline
Зарегистрирован: 01.07.2016

nik182 пишет:

Ну хоть код посмотрите :-)  - только один инит ! Дальше оно само. Ни прерываний ничего! Всё хардверно.

И что тогда по вашему делает

void TIM4_IRQHandler(void)

)))))))))))))))))))))))))))))))))))))))))))

 

nik182
Offline
Зарегистрирован: 04.05.2015

http://www.longlandclan.yi.org/~stuartl/stm32f10x_stdperiph_lib_um/STM32...

В упор не вижу где. На какой строке? Там вообще TIM1 используется. В примере STM. 

ssss
Offline
Зарегистрирован: 01.07.2016

nik182 пишет:

В упор не вижу где. На какой строке? Там вообще TIM1 используется. В примере STM. 

Скрин из поста номер 50 подойдёт?

 

 

nik182
Offline
Зарегистрирован: 04.05.2015

Достаточно номера строки из примера по ссылке.

ssss
Offline
Зарегистрирован: 01.07.2016

nik182 пишет:

    328          void TIM4_IRQHandler(void)
    329          {
   \                     TIM4_IRQHandler: (+1)
   \   00000000   0xB580             PUSH     {R7,LR}
    330            if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)
   \   00000002   0x2102             MOVS     R1,#+2
   \   00000004   0x.... 0x....      LDR.W    R0,??DataTable16_1  ;; 0x40000800
   \   00000008   0x.... 0x....      BL       TIM_GetITStatus
   \   0000000C   0x2800             CMP      R0,#+0
   \   0000000E   0xD02C             BEQ.N    ??TIM4_IRQHandler_0
    331               { TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);
   \   00000010   0x2102             MOVS     R1,#+2
   \   00000012   0x.... 0x....      LDR.W    R0,??DataTable16_1  ;; 0x40000800
   \   00000016   0x.... 0x....      BL       TIM_ClearITPendingBit
    332                 GPIOB->ODR = pulsearr[cpulse][2]; 
   \   0000001A   0x.... 0x....      LDR.W    R0,??DataTable16_3
   \   0000001E   0x.... 0x....      LDR.W    R1,??DataTable16_4
   \   00000022   0x6809             LDR      R1,[R1, #+0]
   \   00000024   0x2206             MOVS     R2,#+6
   \   00000026   0x4351             MULS     R1,R2,R1
   \   00000028   0x4408             ADD      R0,R0,R1
   \   0000002A   0x8880             LDRH     R0,[R0, #+4]
   \   0000002C   0x.... 0x....      LDR.W    R1,??DataTable16_5  ;; 0x40010c0c
   \   00000030   0x6008             STR      R0,[R1, #+0]
    333                 cpulse++; if (cpulse < npulse) 
   \   00000032   0x.... 0x....      LDR.W    R0,??DataTable16_4
   \   00000036   0x6800             LDR      R0,[R0, #+0]
   \   00000038   0x1C40             ADDS     R0,R0,#+1
   \   0000003A   0x.... 0x....      LDR.W    R1,??DataTable16_4
   \   0000003E   0x6008             STR      R0,[R1, #+0]
   \   00000040   0x.... 0x....      LDR.W    R0,??DataTable16_4
   \   00000044   0x6800             LDR      R0,[R0, #+0]
   \   00000046   0x.... 0x....      LDR.W    R1,??DataTable16_6
   \   0000004A   0x6809             LDR      R1,[R1, #+0]
   \   0000004C   0x4288             CMP      R0,R1
   \   0000004E   0xD21A             BCS.N    ??TIM4_IRQHandler_1
    334                 TIM_SetCompare1(TIM4,pulsearr[cpulse][0]);     
   \   00000050   0x.... 0x....      LDR.W    R0,??DataTable16_3
   \   00000054   0x.... 0x....      LDR.W    R1,??DataTable16_4
   \   00000058   0x6809             LDR      R1,[R1, #+0]
   \   0000005A   0x2206             MOVS     R2,#+6
   \   0000005C   0x4351             MULS     R1,R2,R1
   \   0000005E   0x5A41             LDRH     R1,[R0, R1]
   \   00000060   0x.... 0x....      LDR.W    R0,??DataTable16_1  ;; 0x40000800
   \   00000064   0x.... 0x....      BL       TIM_SetCompare1
   \   00000068   0xE00D             B.N      ??TIM4_IRQHandler_1
    335               }                                 
    336             else
    337               {
    338                 TIM_ClearITPendingBit(TIM4, TIM_IT_Update); 
   \                     ??TIM4_IRQHandler_0: (+1)
   \   0000006A   0x2101             MOVS     R1,#+1
   \   0000006C   0x.... 0x....      LDR.W    R0,??DataTable16_1  ;; 0x40000800
   \   00000070   0x.... 0x....      BL       TIM_ClearITPendingBit
    339                 flPulse=1; LEDP_OFF;
   \   00000074   0x2001             MOVS     R0,#+1
   \   00000076   0x.... 0x....      LDR.W    R1,??DataTable16_7
   \   0000007A   0x6008             STR      R0,[R1, #+0]
   \   0000007C   0xF44F 0x4000      MOV      R0,#+32768
   \   00000080   0x.... 0x....      LDR.W    R1,??DataTable17_1  ;; 0x40010814
   \   00000084   0x6008             STR      R0,[R1, #+0]
    340               };
    341          }
   \                     ??TIM4_IRQHandler_1: (+1)
   \   00000086   0xBD01             POP      {R0,PC}          ;; return
    342          

Так?

Ну что вы право дело пристали с намбер ту? Открываем примеры STM 

....\arm\examples\ST\STM32F10x\stm32f10x_stdperiph_lib\Project\STM32F10x_StdPeriph_Examples\TIM\DMA\main.c

получите пример без единой софтверной команды кручения таймера через DMA. Настраивается под свои нужды на раз.

Это ваш пост?

nik182
Offline
Зарегистрирован: 04.05.2015

В 50 посте ассемблер из поста 41. Я ещё раз повторю. Есть пример загрузки регистров таймера через DMA. Я привёл ссылку. Ассемблерный код это не намбер ту. Это намбер ван. Намбер ту это пример STM.

ssss
Offline
Зарегистрирован: 01.07.2016

nik182 пишет:

В 50 посте ассемблер из поста 41. Я ещё раз повторю. Есть пример загрузки регистров таймера через DMA. Я привёл ссылку. Ассемблерный код это не намбер ту. Это намбер ван. Намбер ту это пример STM.

Чудесно! На 328-й хардварно, без прерываний, получится? Или всё таки нет?

И кстати! Ваш пример из СПЛ не даёт ответа на поставленную задачу.

nik182
Offline
Зарегистрирован: 04.05.2015

Намбер ту это пример STM. Только использовать надо чуть на выверт. Массив из 8 элементов {GPIO_BSRR_BR0, GPIO_BSRR_BS0,GPIO_BSRR_BR1, .... GPIO_BSRR_BR3}, таймер пинает ДМА. DMA по кругу пишет в регистр GPIOх->BSRR массив. Всё. На выходе имеем то что надо. Ядро может спать. Код - сами. Ровно 16 строк + объявления. 

На 328 так не получится. 
З.Ы. В приведённом коде надо добавить массив и изменить назначение DMA. Использовать строка в строку.
 
ssss
Offline
Зарегистрирован: 01.07.2016

nik182 пишет:

Код - сами. Ровно 16 строк + объявления. 

Спасибо великодушно! )))))))))))))))

Только я на этот вопрос и отвечал на том форуме. И никакие ЖПИО там и даром не нужны. Там всё рулилось пинами таймера.

Цитата:

На 328 так не получится. 

Вот и выяснили!

ssss
Offline
Зарегистрирован: 01.07.2016

nik182 пишет:

В приведённом коде надо добавить массив и изменить назначение DMA. Использовать строка в строку.

Да не получится там строка в строку. Из-за этого вопрос и возник, в общем то. Но это уже не суть.

nik182
Offline
Зарегистрирован: 04.05.2015

Ну да. Только пины таймера всёж привязаны к ногам, а такой подход можно назначить на любые ноги, использовать таймер 6 - вообще безногий. 

ssss
Offline
Зарегистрирован: 01.07.2016

Это уже другая пестня! У 6-го таймера 4 канала? Разве?

nik182
Offline
Зарегистрирован: 04.05.2015

Как  это не получится? DMA_PeripheralBaseAddr = (uint32_t)TIM1_CCR3_Address; поменять на DMA_PeripheralBaseAddr = (uint32_t)&GPIOх->BSRR; и размер на 8.

nik182
Offline
Зарегистрирован: 04.05.2015

В этом подходе каналы не нужны. Таймеру достаточно по переполнению пинать DMA на запись следующего значения. Сори передумал. Значения 4. Но каждое равно  (GPIO_BSRR_BR0|GPIO_BSRR_BS1),(GPIO_BSRR_BR1|GPIO_BSRR_BS2),(GPIO_BSRR_BR2|GPIO_BSRR_BS3),(GPIO_BSRR_BR3|GPIO_BSRR_BS0) - сбрасывает один бит и устанавливаем другой.

ssss
Offline
Зарегистрирован: 01.07.2016

Да по разному можно, только не на 328-й. ))))))))))

nik182
Offline
Зарегистрирован: 04.05.2015

Только если использовать 4 канала то уже надо жертвовать либо ацп и SPI, либо ещё чем. А так один канал DMA только занят. 

a5021
Offline
Зарегистрирован: 07.07.2013

ssss пишет:
Хардварно значит без кода и прерываний, только инит, а дальше оно само!

OCnM = 011 ?

arduino328
Offline
Зарегистрирован: 01.09.2016

ssss пишет:

a5021 пишет:

Я предложил не следовать этому совету.

Т. е. вы ничего не предложили. Или предложили оставаться дураком на ардуине?

Эсесовец, так ты и есть дурак и на СТМ и на Ардуине - ты же сам ранее сообщал, что не умеешь программировать СТМ, а Ардуины у тебя вообще нет.

arduino328
Offline
Зарегистрирован: 01.09.2016

ssss пишет:

dimax пишет:

Ну так поделились бы готовым рабочим кодом.

Я вас умоляю! Какой там код!? Чтобы соединить два таймера там пару строчек инита таймеров. Всё! К тому же это всё есть в апнотах.

Цитата:

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

Никто не публикует потому что там действительно всё просто.

Цитата:

А так бы интересно было посмотреть на код того-же частотометра на ARM, с комментариями, описанием принципа работы, с примерными характеристиками.. :)

Примерные характеристики можно прикинуть на калькуляторе, там теория с практикой совпадает, так как всё практически хардварно.

Эсесовец, ты же не умеешь СТМ программировать (сам в этом признавался), поэтому и кодов у тебя никаких нет. Только на калькуляторе считать умеешь ))))))))

arduino328
Offline
Зарегистрирован: 01.09.2016

ssss пишет:

nik182 пишет:

Да собственно именно так и написано. Только интервалы не приходится щелкать. 32 бит таймера достаточно без ухищерий. Да и кучу других задач параллельно решать.

От слов "кучу других задач параллельно решать" у некоторых тут мозг просто рвёт на части.

Вот тебе его и оторвало ))))))))

arduino328
Offline
Зарегистрирован: 01.09.2016

ssss пишет:

dimax пишет:

Вот о чём я и говорю. Все говорят что просто, а код не показывают.

"Код ничто, главное идея."(с)

Цитата:

Вам, как миссионеру от STM

Хоть вы не начинайте. Никакого отношения к СТМ я не имею.

Ну вот эсесовец опять признался, что СТМ программировать не умеет.

arduino328
Offline
Зарегистрирован: 01.09.2016

ssss пишет:

не дёргай поводок

Эсесовца на поводок посадили ))))))))))))))))

ssss
Offline
Зарегистрирован: 01.07.2016

arduino328, кто посмел тебя с клетки выпустить и намордник снять? ))))))))))

ssss
Offline
Зарегистрирован: 01.07.2016

nik182 пишет:

Только если использовать 4 канала то уже надо жертвовать либо ацп и SPI, либо ещё чем. А так один канал DMA только занят. 

Был вопрос, был ответ. Ответ вопрошающего устроил более чем полностью. Устроил бы его ваш вариант я не знаю, а мне так это вообще не интересно.

Кстати, какова минимальная длительность импульсов вашего варианта? В моём варианте полная шкала.

a5021
Offline
Зарегистрирован: 07.07.2013

Мой вариант в №70 подходит?

ssss
Offline
Зарегистрирован: 01.07.2016

a5021 пишет:

Мой вариант в №70 подходит?

А что это? Ты ж знаешь, я ИАРом пользуюсь только на СТМ8, да и то не юзаю задротных ИАРовских фишек.

Да там всё просто.

DMA конфигурируем на запись из буфера памяти в DMAR, кольцевой режим. В буфере лежат значения регистров CCR1 - CCR4, 4x4=16 значений.

Выставляем в DIER таймера бит UDE.

В DCR выставляем трансфер в 4 слова и смещение адреса CCR1.

В счётчик ДМА заносим 16.

Запускаем все это хозяйство. Сначала ДМА, потом таймер.

 

 

a5021
Offline
Зарегистрирован: 07.07.2013

Какой, нахрен, иар? Это биты 4..6 регистра TIMx_CCMR1. Смысл, пин выхода канала перещелкивается при совпадении регистра сравнения. Выставляем нужные значения регистров сравнения по всем каналам и с выходов получаем смещенные друг от друга импульсы одинаковой частоты. Все это без дма и прочей фисгармонии.

ssss
Offline
Зарегистрирован: 01.07.2016

Да заряди картинку на Салеае и посмотрим.

Тогле там предлагалось, но отверглось.

"В регистр ARR - период/2
В регистры сравнения на 90 ... сдвинутый эквивалентный код.
Выхода сравнений в режим переключения (togle)."

"Примерно усек. Но это если сами импульсы перекрываются, как на картинке стр. 15 AN2592.
А если импульсы очень коротки, т.е. их длительность значительно менее полупериода и задержек между фазами, они никак между собой не перекрываются. Т.е. toggle mode уже не пройдет, т.к. задержка между импульсами значительно больше их длительности.
Получается в этом случае уже не сделать?"

Хотели такое.

 

a5021
Offline
Зарегистрирован: 07.07.2013

Какая-то синтетическая задача. Посмотреть бы, где такое могло потребоваться.

ssss
Offline
Зарегистрирован: 01.07.2016

Не знаю. Но периодически подобные вопросы возникают.

nik182
Offline
Зарегистрирован: 04.05.2015

Эх. Погорячился я. Вариант 2 не проходит. Нельзя заставить DMA по одному перебирать значения массива. Он по одному может выбрасывать только одно значение. Четыре значения выбрасывает за раз. Так что если нужны любые ноги, у меня только вариант 1. Конечно не совсем без участия ядра. Шести фазная генерация встроена ТIМ1. Может её как то можно приспособить на 4 фазы?

ssss
Offline
Зарегистрирован: 01.07.2016

nik182 пишет:

Эх. Погорячился я. Вариант 2 не проходит. Нельзя заставить DMA по одному перебирать значения массива. Он по одному может выбрасывать только одно значение. Четыре значения выбрасывает за раз.

Можно заюзать два канала ДМА, а можно и один, если немного подумать. Так что может и прокатить. Но не суть. Несколько вариантов на СТМ32 против одного на 328-й. Вот за это мне СТМ32 и нравятся, можно из нескольких решений выбрать наиболее подходящее.

arduino328
Offline
Зарегистрирован: 01.09.2016

ssss пишет:

arduino328, кто посмел тебя с клетки выпустить и намордник снять?

Эсесовец опять голос из преисподней подал. Испугался что ли? ))))))))

arduino328
Offline
Зарегистрирован: 01.09.2016

ssss пишет:

я ИАРом пользуюсь только на СТМ8

Ну наконец-то эсесовец до программирования СТМ дошёл, но только до 8-разрядного. ))))))))