В 50 посте ассемблер из поста 41. Я ещё раз повторю. Есть пример загрузки регистров таймера через DMA. Я привёл ссылку. Ассемблерный код это не намбер ту. Это намбер ван. Намбер ту это пример STM.
В 50 посте ассемблер из поста 41. Я ещё раз повторю. Есть пример загрузки регистров таймера через DMA. Я привёл ссылку. Ассемблерный код это не намбер ту. Это намбер ван. Намбер ту это пример STM.
Чудесно! На 328-й хардварно, без прерываний, получится? Или всё таки нет?
И кстати! Ваш пример из СПЛ не даёт ответа на поставленную задачу.
Намбер ту это пример STM. Только использовать надо чуть на выверт. Массив из 8 элементов {GPIO_BSRR_BR0, GPIO_BSRR_BS0,GPIO_BSRR_BR1, .... GPIO_BSRR_BR3}, таймер пинает ДМА. DMA по кругу пишет в регистр GPIOх->BSRR массив. Всё. На выходе имеем то что надо. Ядро может спать. Код - сами. Ровно 16 строк + объявления.
На 328 так не получится.
З.Ы. В приведённом коде надо добавить массив и изменить назначение DMA. Использовать строка в строку.
В этом подходе каналы не нужны. Таймеру достаточно по переполнению пинать 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) - сбрасывает один бит и устанавливаем другой.
Я вас умоляю! Какой там код!? Чтобы соединить два таймера там пару строчек инита таймеров. Всё! К тому же это всё есть в апнотах.
Цитата:
В последнее время всё чаще и чаще звучат слова, о том как на STM всё лучше и удобнее, но готовых программ при этом никто не публикует.
Никто не публикует потому что там действительно всё просто.
Цитата:
А так бы интересно было посмотреть на код того-же частотометра на ARM, с комментариями, описанием принципа работы, с примерными характеристиками.. :)
Примерные характеристики можно прикинуть на калькуляторе, там теория с практикой совпадает, так как всё практически хардварно.
Эсесовец, ты же не умеешь СТМ программировать (сам в этом признавался), поэтому и кодов у тебя никаких нет. Только на калькуляторе считать умеешь ))))))))
Да собственно именно так и написано. Только интервалы не приходится щелкать. 32 бит таймера достаточно без ухищерий. Да и кучу других задач параллельно решать.
От слов "кучу других задач параллельно решать" у некоторых тут мозг просто рвёт на части.
Какой, нахрен, иар? Это биты 4..6 регистра TIMx_CCMR1. Смысл, пин выхода канала перещелкивается при совпадении регистра сравнения. Выставляем нужные значения регистров сравнения по всем каналам и с выходов получаем смещенные друг от друга импульсы одинаковой частоты. Все это без дма и прочей фисгармонии.
"В регистр ARR - период/2
В регистры сравнения на 90 ... сдвинутый эквивалентный код.
Выхода сравнений в режим переключения (togle)."
"Примерно усек. Но это если сами импульсы перекрываются, как на картинке стр. 15 AN2592.
А если импульсы очень коротки, т.е. их длительность значительно менее полупериода и задержек между фазами, они никак между собой не перекрываются. Т.е. toggle mode уже не пройдет, т.к. задержка между импульсами значительно больше их длительности.
Получается в этом случае уже не сделать?"
Эх. Погорячился я. Вариант 2 не проходит. Нельзя заставить DMA по одному перебирать значения массива. Он по одному может выбрасывать только одно значение. Четыре значения выбрасывает за раз. Так что если нужны любые ноги, у меня только вариант 1. Конечно не совсем без участия ядра. Шести фазная генерация встроена ТIМ1. Может её как то можно приспособить на 4 фазы?
Эх. Погорячился я. Вариант 2 не проходит. Нельзя заставить DMA по одному перебирать значения массива. Он по одному может выбрасывать только одно значение. Четыре значения выбрасывает за раз.
Можно заюзать два канала ДМА, а можно и один, если немного подумать. Так что может и прокатить. Но не суть. Несколько вариантов на СТМ32 против одного на 328-й. Вот за это мне СТМ32 и нравятся, можно из нескольких решений выбрать наиболее подходящее.
Ну что вы право дело пристали с намбер ту? Открываем примеры STM
И причём здесь это? Хадварно! Хардварно значит без кода и прерываний, только инит, а дальше оно само!
Так?
Да. Спасибо. Вижу что Вас в один ряд с ssss ставить нельзя. Сорри.
Ну что вы право дело пристали с намбер ту? Открываем примеры STM
И причём здесь это? Хадварно! Хардварно значит без кода и прерываний, только инит, а дальше оно само!
Ну хоть код посмотрите :-) - только один инит ! Дальше оно само. Ни прерываний ничего! Всё хардверно.
Ну хоть код посмотрите :-) - только один инит ! Дальше оно само. Ни прерываний ничего! Всё хардверно.
И что тогда по вашему делает
voidTIM4_IRQHandler(void))))))))))))))))))))))))))))))))))))))))))))http://www.longlandclan.yi.org/~stuartl/stm32f10x_stdperiph_lib_um/STM32...
В упор не вижу где. На какой строке? Там вообще TIM1 используется. В примере STM.
В упор не вижу где. На какой строке? Там вообще TIM1 используется. В примере STM.
Скрин из поста номер 50 подойдёт?
Достаточно номера строки из примера по ссылке.
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. Настраивается под свои нужды на раз.
Это ваш пост?
В 50 посте ассемблер из поста 41. Я ещё раз повторю. Есть пример загрузки регистров таймера через DMA. Я привёл ссылку. Ассемблерный код это не намбер ту. Это намбер ван. Намбер ту это пример STM.
В 50 посте ассемблер из поста 41. Я ещё раз повторю. Есть пример загрузки регистров таймера через DMA. Я привёл ссылку. Ассемблерный код это не намбер ту. Это намбер ван. Намбер ту это пример STM.
Чудесно! На 328-й хардварно, без прерываний, получится? Или всё таки нет?
И кстати! Ваш пример из СПЛ не даёт ответа на поставленную задачу.
Намбер ту это пример STM. Только использовать надо чуть на выверт. Массив из 8 элементов {GPIO_BSRR_BR0, GPIO_BSRR_BS0,GPIO_BSRR_BR1, .... GPIO_BSRR_BR3}, таймер пинает ДМА. DMA по кругу пишет в регистр GPIOх->BSRR массив. Всё. На выходе имеем то что надо. Ядро может спать. Код - сами. Ровно 16 строк + объявления.
Код - сами. Ровно 16 строк + объявления.
Спасибо великодушно! )))))))))))))))
Только я на этот вопрос и отвечал на том форуме. И никакие ЖПИО там и даром не нужны. Там всё рулилось пинами таймера.
Вот и выяснили!
В приведённом коде надо добавить массив и изменить назначение DMA. Использовать строка в строку.
Да не получится там строка в строку. Из-за этого вопрос и возник, в общем то. Но это уже не суть.
Ну да. Только пины таймера всёж привязаны к ногам, а такой подход можно назначить на любые ноги, использовать таймер 6 - вообще безногий.
Это уже другая пестня! У 6-го таймера 4 канала? Разве?
Как это не получится? DMA_PeripheralBaseAddr = (uint32_t)TIM1_CCR3_Address; поменять на DMA_PeripheralBaseAddr = (uint32_t)&GPIOх->BSRR; и размер на 8.
В этом подходе каналы не нужны. Таймеру достаточно по переполнению пинать 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) - сбрасывает один бит и устанавливаем другой.
Да по разному можно, только не на 328-й. ))))))))))
Только если использовать 4 канала то уже надо жертвовать либо ацп и SPI, либо ещё чем. А так один канал DMA только занят.
OCnM = 011 ?
Я предложил не следовать этому совету.
Т. е. вы ничего не предложили. Или предложили оставаться дураком на ардуине?
Эсесовец, так ты и есть дурак и на СТМ и на Ардуине - ты же сам ранее сообщал, что не умеешь программировать СТМ, а Ардуины у тебя вообще нет.
Ну так поделились бы готовым рабочим кодом.
Я вас умоляю! Какой там код!? Чтобы соединить два таймера там пару строчек инита таймеров. Всё! К тому же это всё есть в апнотах.
В последнее время всё чаще и чаще звучат слова, о том как на STM всё лучше и удобнее, но готовых программ при этом никто не публикует.
Никто не публикует потому что там действительно всё просто.
А так бы интересно было посмотреть на код того-же частотометра на ARM, с комментариями, описанием принципа работы, с примерными характеристиками.. :)
Примерные характеристики можно прикинуть на калькуляторе, там теория с практикой совпадает, так как всё практически хардварно.
Эсесовец, ты же не умеешь СТМ программировать (сам в этом признавался), поэтому и кодов у тебя никаких нет. Только на калькуляторе считать умеешь ))))))))
Да собственно именно так и написано. Только интервалы не приходится щелкать. 32 бит таймера достаточно без ухищерий. Да и кучу других задач параллельно решать.
От слов "кучу других задач параллельно решать" у некоторых тут мозг просто рвёт на части.
Вот тебе его и оторвало ))))))))
Вот о чём я и говорю. Все говорят что просто, а код не показывают.
"Код ничто, главное идея."(с)
Вам, как миссионеру от STM
Хоть вы не начинайте. Никакого отношения к СТМ я не имею.
Ну вот эсесовец опять признался, что СТМ программировать не умеет.
не дёргай поводок
Эсесовца на поводок посадили ))))))))))))))))
arduino328, кто посмел тебя с клетки выпустить и намордник снять? ))))))))))
Только если использовать 4 канала то уже надо жертвовать либо ацп и SPI, либо ещё чем. А так один канал DMA только занят.
Был вопрос, был ответ. Ответ вопрошающего устроил более чем полностью. Устроил бы его ваш вариант я не знаю, а мне так это вообще не интересно.
Кстати, какова минимальная длительность импульсов вашего варианта? В моём варианте полная шкала.
Мой вариант в №70 подходит?
Мой вариант в №70 подходит?
А что это? Ты ж знаешь, я ИАРом пользуюсь только на СТМ8, да и то не юзаю задротных ИАРовских фишек.
Да там всё просто.
DMA конфигурируем на запись из буфера памяти в DMAR, кольцевой режим. В буфере лежат значения регистров CCR1 - CCR4, 4x4=16 значений.
Выставляем в DIER таймера бит UDE.
В DCR выставляем трансфер в 4 слова и смещение адреса CCR1.
В счётчик ДМА заносим 16.
Запускаем все это хозяйство. Сначала ДМА, потом таймер.
Какой, нахрен, иар? Это биты 4..6 регистра TIMx_CCMR1. Смысл, пин выхода канала перещелкивается при совпадении регистра сравнения. Выставляем нужные значения регистров сравнения по всем каналам и с выходов получаем смещенные друг от друга импульсы одинаковой частоты. Все это без дма и прочей фисгармонии.
Да заряди картинку на Салеае и посмотрим.
Тогле там предлагалось, но отверглось.
"В регистр ARR - период/2
В регистры сравнения на 90 ... сдвинутый эквивалентный код.
Выхода сравнений в режим переключения (togle)."
"Примерно усек. Но это если сами импульсы перекрываются, как на картинке стр. 15 AN2592.
А если импульсы очень коротки, т.е. их длительность значительно менее полупериода и задержек между фазами, они никак между собой не перекрываются. Т.е. toggle mode уже не пройдет, т.к. задержка между импульсами значительно больше их длительности.
Получается в этом случае уже не сделать?"
Хотели такое.
Какая-то синтетическая задача. Посмотреть бы, где такое могло потребоваться.
Не знаю. Но периодически подобные вопросы возникают.
Эх. Погорячился я. Вариант 2 не проходит. Нельзя заставить DMA по одному перебирать значения массива. Он по одному может выбрасывать только одно значение. Четыре значения выбрасывает за раз. Так что если нужны любые ноги, у меня только вариант 1. Конечно не совсем без участия ядра. Шести фазная генерация встроена ТIМ1. Может её как то можно приспособить на 4 фазы?
Эх. Погорячился я. Вариант 2 не проходит. Нельзя заставить DMA по одному перебирать значения массива. Он по одному может выбрасывать только одно значение. Четыре значения выбрасывает за раз.
Можно заюзать два канала ДМА, а можно и один, если немного подумать. Так что может и прокатить. Но не суть. Несколько вариантов на СТМ32 против одного на 328-й. Вот за это мне СТМ32 и нравятся, можно из нескольких решений выбрать наиболее подходящее.
arduino328, кто посмел тебя с клетки выпустить и намордник снять?
Эсесовец опять голос из преисподней подал. Испугался что ли? ))))))))
я ИАРом пользуюсь только на СТМ8
Ну наконец-то эсесовец до программирования СТМ дошёл, но только до 8-разрядного. ))))))))