STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

[uquote="a797945",url="/forum/viewtopic.php?p=3459622#p3459622"]я не компилятор собирался учить, а себя.[/uquote]"Premature optimization is the root of all evil"©
Реклама
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: STM32 новичку в ARM что к чему

Сообщение uldemir »

Вопрос к спецам CubeMX, остальные могут выдохнуть и расслабиться. Что нужно еще сделать, чтобы таймер сконфигурённый в кубе запустился? Вот, сконфигурил его - а ничего не происходит. Зашел отладчиком - прескалер, коэффициент деления появились, а вот CEN и еще кое что, никто не взвёл.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Re: STM32 новичку в ARM что к чему

Сообщение a797945 »

VladislavS
Вы обо мне слишком высокого мнения, со мной все гораздо проще (бывает по несколько недель за компом не бываю)

вот это для меня была новость:
написано if((Count != 0) & ((tmp1 == 0xFF) | (tmp1 != (Status |0x80))))
по сути, если первое сравнение "лож", то остальные проверки можно не делать,
но железяка собирает по написанному, как апп. схему, сказано три входа - значит три надо опросить.
теперь надо пошурупить, где я смогу такие свои конструкции разветвить на коротких проверках.
теперь понятно что значит "писать простые алгоритмы" :)))
а ведь в какой-нибудь умной книжке про это написано.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

Для вас будет ещё большим открытием, что & и && это разные операции :)
Реклама
Эиком - электронные компоненты и радиодетали
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Re: STM32 новичку в ARM что к чему

Сообщение a797945 »

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

:) Спасибо

uldemir
я не знаком с кубом, но и Вы не озвучили - что должно пинать таймер (какое событие) или "вручную".
Реклама
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: STM32 новичку в ARM что к чему

Сообщение uldemir »

a797945 писал(а):я не знаком с кубом
тогда выдохните.
ок, я уже добрался до номального тырнета и нашел ответ на свой вопрос.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
Аватара пользователя
bezzabotna
Встал на лапы
Сообщения: 134
Зарегистрирован: Пн ноя 07, 2016 12:14:14

Re: STM32 новичку в ARM что к чему

Сообщение bezzabotna »

Здравствуйте.
Проблема с FatFS
Сначала все было ок, данные на cd карту записывались нормально, но в один не прекрасный момент при отладке забыла написать f_close. После этого все сломалось, данные больше не записывались через мк, доступ к карте через юсб просил форматирования.
Ок. Отформатировала, уже отдельно через другой картридер(FAT 32 размер кластера 4096). Поставила соответствующую настройку кластера в ffconf.h. Раньше до моего косяка он был 512 байт и все работало, но мне в любом случае надо бы размер кластера побольше. Данных будет много и надо их побыстрее записывать.
После форматирования доступ к карте по юсб работает корректно, но доступ через мк (SDIO) так и не работает. Даже не монтируется.
Как решить проблему?
Я конечно все понимаю, но этого я не понимаю.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="bezzabotna",url="/forum/viewtopic.php?p=3460241#p3460241"]Раньше до моего косяка он был 512 байт и все работало, но мне в любом случае надо бы размер кластера побольше. Данных будет много и надо их побыстрее записывать.[/uquote]
Верни 512, на физическом уровне у карт все равно блоки именно такого размера, так что быстрее вряд ли будет, а вот не работать вообще может запросто.
Аватара пользователя
bezzabotna
Встал на лапы
Сообщения: 134
Зарегистрирован: Пн ноя 07, 2016 12:14:14

Re: STM32 новичку в ARM что к чему

Сообщение bezzabotna »

Вернула. Но этого оказалось недостаточно. Файл все равно не монтировался. В общем проблема решилась откатом программы к работающему состоянию. И форматирование с кластером 2048.
Я конечно все понимаю, но этого я не понимаю.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: STM32 новичку в ARM что к чему

Сообщение pokk »

Подскажите если в каком нибудь stm32Fx возможность, подключить событие(изменения состояния на выводе) как запрос DMA в режиме память-память ? Хочу что бы автоматически(без вхождения в обработчик прерываний) получилось , по выводу INT DMA получила запрос на считывание и по (FSMC) из периферии считался/записался блок данных.
Пролистал stm32f103, там DMA(память память ) запускается только битом EN. :(
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="pokk",url="/forum/viewtopic.php?p=3460753#p3460753"]Пролистал stm32f103, там DMA(память память ) запускается только битом EN. :([/uquote]
При копировании из памяти в память не обязательно выбирать режим Mem2Mem, например, если частота опроса порта задается таймером, то источником будет периферия. Тут главное понять, что один запрос DMA не инициирует всю передачу целиком(если не считать режим Burst), нужно много таких запросов, т.е. таймер должен работать пока вся передача не завершится.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: STM32 новичку в ARM что к чему

Сообщение pokk »

[uquote="Reflector",url="/forum/viewtopic.php?p=3460808#p3460808"]например, если частота опроса порта задается таймером, то источником будет периферия.[/uquote]
Эх увы, одиночный импульс, точнее уровень 1/0
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="pokk",url="/forum/viewtopic.php?p=3460832#p3460832"]Эх увы, одиночный импульс, точнее уровень 1/0[/uquote]
Суть не в этом, по уровню тебе нужно запустить таймер, который будет пинать DMA столько раз, сколько нужно. Просто схема получается более сложная, но думаю вполне реализуемая.
jcxz
Мудрый кот
Сообщения: 1726
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: STM32 новичку в ARM что к чему

Сообщение jcxz »

[uquote="Reflector",url="/forum/viewtopic.php?p=3460834#p3460834"]Суть не в этом, по уровню тебе нужно запустить таймер, который будет пинать DMA столько раз, сколько нужно. Просто схема получается более сложная, но думаю вполне реализуемая.[/uquote]
..... И получить или:
1) Ненадёжную систему: события идут часто, и очередное событие от таймера может быть потеряно, так как не обработалось ещё предыдущее, потому что шина как раз загружена процессором или другими DMA-каналами. В результате - по запросам от таймера данные считываются из памяти-источника в FIFO-буфер DMA, но не успевают записаться в память-приёмник, потому что она как раз сейчас сильно занята -> FIFO переполняется -> данные теряются. Такое будет происходить от случая к случаю - как карта ляжет.
2) Очень медленную пересылку, потому что (для борьбы с п.1) период таймера пришлось сильно увеличить.
PS: Такой трансфер нужно делать только единым блоком, по одному сигналу запроса.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="jcxz",url="/forum/viewtopic.php?p=3460856#p3460856"]..... И получить или:
1) Ненадёжную систему: события идут часто, и очередное событие от таймера может быть потеряно, так как не обработалось ещё предыдущее, потому что шина как раз загружена процессором или другими DMA-каналами. В результате - по запросам от таймера данные считываются из памяти-источника в FIFO-буфер DMA, но не успевают записаться в память-приёмник, потому что она как раз сейчас сильно занята -> FIFO переполняется -> данные теряются. Такое будет происходить от случая к случаю - как карта ляжет.[/uquote]
Слишком много домыслов, лично я без понятия насколько часто у него там идут события и какая сопутствующая нагрузка. Нужен был вариант решения, если в итоге передача при помощи DMA не подходит в принципе, то какой с меня спрос :)
2) Очень медленную пересылку, потому что (для борьбы с п.1) период таймера пришлось сильно увеличить.
Я писал проги под ЛА и осциллы, там задержка между транзакциями DMA от 2 тактов(для F4 и DCMI), если без таймера, а таймер добавляет еще такт. Это в идеальном случае, если мк в сон вгонять, но если, допустим, запустить DMA и дожидаться окончания передачи проверяя флаг, то искажения захваченной осциллогамы будут крайне незначительными, т.е. CPU читающий команды из флеша и DMA сохраняющий данные в RAM практически не мешают друг другу, а для некоторых конфигураций и серий мк они не пересекаются совсем. Так что не нужно заранее драматизировать, возможно времени там более чем достаточно.
PS: Такой трансфер нужно делать только единым блоком, по одному сигналу запроса.
Burst я упомянул, но он применим далеко не всегда и на время такой передачи можно заблокировать вообще все. А как иначе?
jcxz
Мудрый кот
Сообщения: 1726
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: STM32 новичку в ARM что к чему

Сообщение jcxz »

[uquote="Reflector",url="/forum/viewtopic.php?p=3460894#p3460894"]Слишком много домыслов, лично я без понятия насколько часто у него там идут события и какая сопутствующая
нагрузка. Нужен был вариант решения, если в итоге передача при помощи DMA не подходит в принципе, то какой с меня спрос :)[/uquote]
А разве не Вы предложили формировать DMA-запросы от таймера? Количество DMA-запросов - по размеру блока. Событие у автора одно - изменение на внешнем пине. По нему нужно стартовать передачу блока. Вы предложили (как я понял) запустить таймер по этому событию, чтобы он сформировал N сигналов (по размеру блока) с фиксированным периодом?
Вот почему так не стоит делать я и написал.

[uquote="Reflector",url="/forum/viewtopic.php?p=3460894#p3460894"]Я писал проги под ЛА и осциллы, там задержка между транзакциями DMA от 2 тактов(для F4 и DCMI), если без таймера, а таймер добавляет еще такт. Это в идеальном случае, если мк в сон вгонять, но если, допустим, запустить DMA и дожидаться окончания передачи проверяя флаг, то искажения захваченной осциллогамы будут крайне незначительными, т.е. CPU читающий команды из флеша и DMA сохраняющий данные в RAM практически не мешают друг другу, а для некоторых конфигураций и серий мк они не пересекаются совсем. Так что не нужно заранее драматизировать, возможно времени там более чем достаточно.[/uquote]
Ну если так, если "искажения захваченной осциллогамы будут крайне незначительными" и Вы считаете это нормальным, что данные иногда теряются, то тогда да - можно. :)))
Я кстати и писал об этом.
Но я бы не стал даже включать такой осциллограф или ЛА, который иногда теряет данные.
Кроме CPU, проверяющего флаг, могут быть и другие задачи (под РТОС), а также ISR. А также могут быть в этот момент активны другие DMA-каналы. И все эти транзакции к памяти могут идти как в ту же память, которая сейчас копируется через DMA, так и в другую. И при этом всё будет работать по-разному, т.е. - по-разному глючить конечно, работой это назвать нельзя.
Я про это всё тоже написал.

[uquote="Reflector",url="/forum/viewtopic.php?p=3460894#p3460894"]
PS: Такой трансфер нужно делать только единым блоком, по одному сигналу запроса.
Burst я упомянул, но он применим далеко не всегда и на время такой передачи можно заблокировать вообще все. А как иначе?[/uquote]
Burst тут как бы вообще не при делах. burst - это размер пересылки, выполняемой за один цикл арбитража памяти, без переарбитража. Блок DMA-пересылки как правило состоит из множества burst-ов (если burst используется).
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="jcxz",url="/forum/viewtopic.php?p=3460913#p3460913"]А разве не Вы предложили формировать DMA-запросы от таймера? Количество DMA-запросов - по размеру блока. Событие у автора одно - изменение на внешнем пине. По нему нужно стартовать передачу блока. Вы предложили (как я понял) запустить таймер по этому событию, чтобы он сформировал N сигналов (по размеру блока) с фиксированным периодом?[/uquote]
Если выбран режим Mem2Mem, то задал, допустим, скопировать 10 байт поштучно, включил DMA и он все скопировал, а если режим Periph2Mem, то пришел запрос DMA от периферии и скопировался 1 байт, т.е. скобы скопировать все нужно 10 запросов. Если не нравится таймер, который может периодически формировать нужные запросы, а при наличии RCR даже точное их количество, то предлагай свой более простой вариант.
Ну если так, если "искажения захваченной осциллогамы будут крайне незначительными" и Вы считаете это нормальным, что данные иногда теряются, то тогда да - можно. :)))
Я кстати и писал об этом.
Там было два случая, в одном ничего не теряется, во втором потери незначительны, что должно было иллюстрировать загрузку CPU и DMA. Естественно каждый видит то, что ему больше нравится :)
Кроме CPU, проверяющего флаг, могут быть и другие задачи (под РТОС), а также ISR. А также могут быть в этот момент активны другие DMA-каналы. И все эти транзакции к памяти могут идти как в ту же память, которая сейчас копируется через DMA, так и в другую. И при этом всё будет работать по-разному, т.е. - по-разному глючить конечно, работой это назвать нельзя.
Давай ближе к реальности, а не знаю какой проект у автора и не вижу смысла комментировать проблемы в других вымышленных проектах.

[uquote="Reflector",url="/forum/viewtopic.php?p=3460894#p3460894"]Burst тут как бы вообще не при делах. burst - это размер пересылки, выполняемой за один цикл арбитража памяти, без переарбитража. Блок DMA-пересылки как правило состоит из множества burst-ов (если burst используется).[/uquote]
В том и смысл, чтобы раз дернуть DMA и передать не байт, а сразу некое их ограниченное подмножество.
jcxz
Мудрый кот
Сообщения: 1726
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: STM32 новичку в ARM что к чему

Сообщение jcxz »

[uquote="Reflector",url="/forum/viewtopic.php?p=3460966#p3460966"]Если выбран режим Mem2Mem, то задал, допустим, скопировать 10 байт поштучно, включил DMA и он все скопировал[/uquote]
Это же без DMA-запросов. pokk то зачем такой режим? Ему нужно: по единственному DMA-запросу скопировать весь блок байт. DMA-запрос должен формироваться от внешнего пина.
[uquote="Reflector",url="/forum/viewtopic.php?p=3460966#p3460966"]а если режим Periph2Mem, то пришел запрос DMA от периферии и скопировался 1 байт, т.е. скобы скопировать все нужно 10 запросов.[/uquote]
А это - с DMA-запросами, но на один запрос - копирование только 1 байта. Это тоже не то, что нужно pokk.

[uquote="Reflector",url="/forum/viewtopic.php?p=3460966#p3460966"]Если не нравится таймер, который может периодически формировать нужные запросы, а при наличии RCR даже точное их количество[/uquote]
Причём тут периодические запросы? Запрос у pokk - единственный, и по нему весь блок должен быть скопирован. Если я правильно понял.

[uquote="Reflector",url="/forum/viewtopic.php?p=3460966#p3460966"], то предлагай свой более простой вариант.[/uquote]
Не работал с stm32f103 и не знаю возможностей его DMA-контроллера, поэтому ничего не предлагаю. Но знаю что на других МК такое сделать возможно.

[uquote="Reflector",url="/forum/viewtopic.php?p=3460894#p3460894"]В том и смысл, чтобы раз дернуть DMA и передать не байт, а сразу некое их ограниченное подмножество.[/uquote]
Вот именно. А burst - это из другой оперы совсем.

PS: Вообще - даже не зная возможностей DMA-контроллера stm32f103, можно предложить такой вариант:
По DMA-запросу (изменение на внешнем пине) DMA-канал1 делает пересылку в регистр управления DMA-канала2 одного слова, в котором установлен бит EN. Таким образом разрешая работу DMA-канала2. А DMA-канал2 уже заранее запрограммирован на пересылку желаемого блока. Запрограммирован, но не разрешён.
Вот и всё.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="jcxz",url="/forum/viewtopic.php?p=3460980#p3460980"]Причём тут периодические запросы? Запрос у pokk - единственный, и по нему весь блок должен быть скопирован. Если я правильно понял.[/uquote]
Пусть количество принимаемых DMA байт равно 10, пришел байт по USART/SPI, генерится запрос и DMA забирает принятый байт, счетчик уменьшается на 1 и дальше DMA ждет следующего принятого байта и, соответственно, следующего риквеста. Когда придут все 10 байт DMA выставит флаг TransferComplete. То же самое с таймером, каждый Update генерит запрос DMA и счетчик уменьшается на 1, этот запрос(как и любой другой) не запускает автоматическую передачу всего блока, как некоторые могут подумать. У ADC есть continuous mode, в таком случае он может непрерывно генерить запросы для DMA, причем с задаваемым фиксированным интервалом. А если чтение идет с порта или FSMC, которые в чистом виде слейвы, то они сами ничего не генерят и единственный запрос сторонней периферии приведет к передаче 1/2/4 байт, если без Burst. По крайней мере я не знаю о режимах STM32 в которых можно было бы по запросу периферии передать весь блок целиком...

Добавлено after 3 minutes 57 seconds:
[uquote="jcxz",url="/forum/viewtopic.php?p=3460980#p3460980"]PS: Вообще - даже не зная возможностей DMA-контроллера stm32f103, можно предложить такой вариант:
По DMA-запросу (изменение на внешнем пине) DMA-канал1 делает пересылку в регистр управления DMA-канала2 одного слова, в котором установлен бит EN. Таким образом разрешая работу DMA-канала2. А DMA-канал2 уже заранее запрограммирован на пересылку желаемого блока. Запрограммирован, но не разрешён.
Вот и всё.[/uquote]
О, это уже вариант который вполне может оказаться рабочим, но нужно проверять.
jcxz
Мудрый кот
Сообщения: 1726
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: STM32 новичку в ARM что к чему

Сообщение jcxz »

[uquote="Reflector",url="/forum/viewtopic.php?p=3460993#p3460993"]О, это уже вариант который вполне может оказаться рабочим, но нужно проверять.[/uquote]
Это рабочий вариант. Я так делал. Правда не на STM32.
Если в DMA-контроллере этого STM32 есть режим свЯзных списков, то можно сделать так, чтобы по завершении передачи всего блока DMA-каналом2, следующим элементом свЯзного списка, он заново переинициализировался на передачу нового блока.
Ответить

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