STM32 новичку в ARM что к чему
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
[uquote="a797945",url="/forum/viewtopic.php?p=3459622#p3459622"]я не компилятор собирался учить, а себя.[/uquote]"Premature optimization is the root of all evil"©
- Реклама
Re: STM32 новичку в ARM что к чему
Вопрос к спецам CubeMX, остальные могут выдохнуть и расслабиться. Что нужно еще сделать, чтобы таймер сконфигурённый в кубе запустился? Вот, сконфигурил его - а ничего не происходит. Зашел отладчиком - прескалер, коэффициент деления появились, а вот CEN и еще кое что, никто не взвёл.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Re: STM32 новичку в ARM что к чему
VladislavS
Вы обо мне слишком высокого мнения, со мной все гораздо проще (бывает по несколько недель за компом не бываю)
вот это для меня была новость:
написано if((Count != 0) & ((tmp1 == 0xFF) | (tmp1 != (Status |0x80))))
по сути, если первое сравнение "лож", то остальные проверки можно не делать,
но железяка собирает по написанному, как апп. схему, сказано три входа - значит три надо опросить.
теперь надо пошурупить, где я смогу такие свои конструкции разветвить на коротких проверках.
теперь понятно что значит "писать простые алгоритмы"
а ведь в какой-нибудь умной книжке про это написано.
Вы обо мне слишком высокого мнения, со мной все гораздо проще (бывает по несколько недель за компом не бываю)
вот это для меня была новость:
написано if((Count != 0) & ((tmp1 == 0xFF) | (tmp1 != (Status |0x80))))
по сути, если первое сравнение "лож", то остальные проверки можно не делать,
но железяка собирает по написанному, как апп. схему, сказано три входа - значит три надо опросить.
теперь надо пошурупить, где я смогу такие свои конструкции разветвить на коротких проверках.
теперь понятно что значит "писать простые алгоритмы"
а ведь в какой-нибудь умной книжке про это написано.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
Для вас будет ещё большим открытием, что & и && это разные операции 
Re: STM32 новичку в ARM что к чему
VladislavS
вот я оболтус, ведь читал когда-то
да за отсутствием практики выветрилось.
Спасибо
uldemir
я не знаком с кубом, но и Вы не озвучили - что должно пинать таймер (какое событие) или "вручную".
вот я оболтус, ведь читал когда-то
да за отсутствием практики выветрилось.
uldemir
я не знаком с кубом, но и Вы не озвучили - что должно пинать таймер (какое событие) или "вручную".
- Реклама
Re: STM32 новичку в ARM что к чему
тогда выдохните.a797945 писал(а):я не знаком с кубом
ок, я уже добрался до номального тырнета и нашел ответ на свой вопрос.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
- bezzabotna
- Встал на лапы
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Re: STM32 новичку в ARM что к чему
Здравствуйте.
Проблема с FatFS
Сначала все было ок, данные на cd карту записывались нормально, но в один не прекрасный момент при отладке забыла написать f_close. После этого все сломалось, данные больше не записывались через мк, доступ к карте через юсб просил форматирования.
Ок. Отформатировала, уже отдельно через другой картридер(FAT 32 размер кластера 4096). Поставила соответствующую настройку кластера в ffconf.h. Раньше до моего косяка он был 512 байт и все работало, но мне в любом случае надо бы размер кластера побольше. Данных будет много и надо их побыстрее записывать.
После форматирования доступ к карте по юсб работает корректно, но доступ через мк (SDIO) так и не работает. Даже не монтируется.
Как решить проблему?
Проблема с FatFS
Сначала все было ок, данные на cd карту записывались нормально, но в один не прекрасный момент при отладке забыла написать f_close. После этого все сломалось, данные больше не записывались через мк, доступ к карте через юсб просил форматирования.
Ок. Отформатировала, уже отдельно через другой картридер(FAT 32 размер кластера 4096). Поставила соответствующую настройку кластера в ffconf.h. Раньше до моего косяка он был 512 байт и все работало, но мне в любом случае надо бы размер кластера побольше. Данных будет много и надо их побыстрее записывать.
После форматирования доступ к карте по юсб работает корректно, но доступ через мк (SDIO) так и не работает. Даже не монтируется.
Как решить проблему?
Я конечно все понимаю, но этого я не понимаю.
Re: STM32 новичку в ARM что к чему
[uquote="bezzabotna",url="/forum/viewtopic.php?p=3460241#p3460241"]Раньше до моего косяка он был 512 байт и все работало, но мне в любом случае надо бы размер кластера побольше. Данных будет много и надо их побыстрее записывать.[/uquote]
Верни 512, на физическом уровне у карт все равно блоки именно такого размера, так что быстрее вряд ли будет, а вот не работать вообще может запросто.
Верни 512, на физическом уровне у карт все равно блоки именно такого размера, так что быстрее вряд ли будет, а вот не работать вообще может запросто.
- bezzabotna
- Встал на лапы
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Re: STM32 новичку в ARM что к чему
Вернула. Но этого оказалось недостаточно. Файл все равно не монтировался. В общем проблема решилась откатом программы к работающему состоянию. И форматирование с кластером 2048.
Я конечно все понимаю, но этого я не понимаю.
Re: STM32 новичку в ARM что к чему
Подскажите если в каком нибудь stm32Fx возможность, подключить событие(изменения состояния на выводе) как запрос DMA в режиме память-память ? Хочу что бы автоматически(без вхождения в обработчик прерываний) получилось , по выводу INT DMA получила запрос на считывание и по (FSMC) из периферии считался/записался блок данных.
Пролистал stm32f103, там DMA(память память ) запускается только битом EN.
Пролистал stm32f103, там DMA(память память ) запускается только битом EN.
Re: STM32 новичку в ARM что к чему
[uquote="pokk",url="/forum/viewtopic.php?p=3460753#p3460753"]Пролистал stm32f103, там DMA(память память ) запускается только битом EN.
[/uquote]
При копировании из памяти в память не обязательно выбирать режим Mem2Mem, например, если частота опроса порта задается таймером, то источником будет периферия. Тут главное понять, что один запрос DMA не инициирует всю передачу целиком(если не считать режим Burst), нужно много таких запросов, т.е. таймер должен работать пока вся передача не завершится.
При копировании из памяти в память не обязательно выбирать режим Mem2Mem, например, если частота опроса порта задается таймером, то источником будет периферия. Тут главное понять, что один запрос DMA не инициирует всю передачу целиком(если не считать режим Burst), нужно много таких запросов, т.е. таймер должен работать пока вся передача не завершится.
Re: STM32 новичку в ARM что к чему
[uquote="Reflector",url="/forum/viewtopic.php?p=3460808#p3460808"]например, если частота опроса порта задается таймером, то источником будет периферия.[/uquote]
Эх увы, одиночный импульс, точнее уровень 1/0
Эх увы, одиночный импульс, точнее уровень 1/0
Re: STM32 новичку в ARM что к чему
[uquote="pokk",url="/forum/viewtopic.php?p=3460832#p3460832"]Эх увы, одиночный импульс, точнее уровень 1/0[/uquote]
Суть не в этом, по уровню тебе нужно запустить таймер, который будет пинать DMA столько раз, сколько нужно. Просто схема получается более сложная, но думаю вполне реализуемая.
Суть не в этом, по уровню тебе нужно запустить таймер, который будет пинать DMA столько раз, сколько нужно. Просто схема получается более сложная, но думаю вполне реализуемая.
Re: STM32 новичку в ARM что к чему
[uquote="Reflector",url="/forum/viewtopic.php?p=3460834#p3460834"]Суть не в этом, по уровню тебе нужно запустить таймер, который будет пинать DMA столько раз, сколько нужно. Просто схема получается более сложная, но думаю вполне реализуемая.[/uquote]
..... И получить или:
1) Ненадёжную систему: события идут часто, и очередное событие от таймера может быть потеряно, так как не обработалось ещё предыдущее, потому что шина как раз загружена процессором или другими DMA-каналами. В результате - по запросам от таймера данные считываются из памяти-источника в FIFO-буфер DMA, но не успевают записаться в память-приёмник, потому что она как раз сейчас сильно занята -> FIFO переполняется -> данные теряются. Такое будет происходить от случая к случаю - как карта ляжет.
2) Очень медленную пересылку, потому что (для борьбы с п.1) период таймера пришлось сильно увеличить.
PS: Такой трансфер нужно делать только единым блоком, по одному сигналу запроса.
..... И получить или:
1) Ненадёжную систему: события идут часто, и очередное событие от таймера может быть потеряно, так как не обработалось ещё предыдущее, потому что шина как раз загружена процессором или другими DMA-каналами. В результате - по запросам от таймера данные считываются из памяти-источника в FIFO-буфер DMA, но не успевают записаться в память-приёмник, потому что она как раз сейчас сильно занята -> FIFO переполняется -> данные теряются. Такое будет происходить от случая к случаю - как карта ляжет.
2) Очень медленную пересылку, потому что (для борьбы с п.1) период таймера пришлось сильно увеличить.
PS: Такой трансфер нужно делать только единым блоком, по одному сигналу запроса.
Re: STM32 новичку в ARM что к чему
[uquote="jcxz",url="/forum/viewtopic.php?p=3460856#p3460856"]..... И получить или:
1) Ненадёжную систему: события идут часто, и очередное событие от таймера может быть потеряно, так как не обработалось ещё предыдущее, потому что шина как раз загружена процессором или другими DMA-каналами. В результате - по запросам от таймера данные считываются из памяти-источника в FIFO-буфер DMA, но не успевают записаться в память-приёмник, потому что она как раз сейчас сильно занята -> FIFO переполняется -> данные теряются. Такое будет происходить от случая к случаю - как карта ляжет.[/uquote]
Слишком много домыслов, лично я без понятия насколько часто у него там идут события и какая сопутствующая нагрузка. Нужен был вариант решения, если в итоге передача при помощи DMA не подходит в принципе, то какой с меня спрос
1) Ненадёжную систему: события идут часто, и очередное событие от таймера может быть потеряно, так как не обработалось ещё предыдущее, потому что шина как раз загружена процессором или другими DMA-каналами. В результате - по запросам от таймера данные считываются из памяти-источника в FIFO-буфер DMA, но не успевают записаться в память-приёмник, потому что она как раз сейчас сильно занята -> FIFO переполняется -> данные теряются. Такое будет происходить от случая к случаю - как карта ляжет.[/uquote]
Слишком много домыслов, лично я без понятия насколько часто у него там идут события и какая сопутствующая нагрузка. Нужен был вариант решения, если в итоге передача при помощи DMA не подходит в принципе, то какой с меня спрос
Я писал проги под ЛА и осциллы, там задержка между транзакциями DMA от 2 тактов(для F4 и DCMI), если без таймера, а таймер добавляет еще такт. Это в идеальном случае, если мк в сон вгонять, но если, допустим, запустить DMA и дожидаться окончания передачи проверяя флаг, то искажения захваченной осциллогамы будут крайне незначительными, т.е. CPU читающий команды из флеша и DMA сохраняющий данные в RAM практически не мешают друг другу, а для некоторых конфигураций и серий мк они не пересекаются совсем. Так что не нужно заранее драматизировать, возможно времени там более чем достаточно.2) Очень медленную пересылку, потому что (для борьбы с п.1) период таймера пришлось сильно увеличить.
Burst я упомянул, но он применим далеко не всегда и на время такой передачи можно заблокировать вообще все. А как иначе?PS: Такой трансфер нужно делать только единым блоком, по одному сигналу запроса.
Re: STM32 новичку в ARM что к чему
[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"]
Burst тут как бы вообще не при делах. burst - это размер пересылки, выполняемой за один цикл арбитража памяти, без переарбитража. Блок DMA-пересылки как правило состоит из множества burst-ов (если burst используется).
нагрузка. Нужен был вариант решения, если в итоге передача при помощи DMA не подходит в принципе, то какой с меня спрос
А разве не Вы предложили формировать 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"]
Burst я упомянул, но он применим далеко не всегда и на время такой передачи можно заблокировать вообще все. А как иначе?[/uquote]PS: Такой трансфер нужно делать только единым блоком, по одному сигналу запроса.
Burst тут как бы вообще не при делах. burst - это размер пересылки, выполняемой за один цикл арбитража памяти, без переарбитража. Блок DMA-пересылки как правило состоит из множества burst-ов (если burst используется).
Re: STM32 новичку в ARM что к чему
[uquote="jcxz",url="/forum/viewtopic.php?p=3460913#p3460913"]А разве не Вы предложили формировать DMA-запросы от таймера? Количество DMA-запросов - по размеру блока. Событие у автора одно - изменение на внешнем пине. По нему нужно стартовать передачу блока. Вы предложили (как я понял) запустить таймер по этому событию, чтобы он сформировал N сигналов (по размеру блока) с фиксированным периодом?[/uquote]
Если выбран режим Mem2Mem, то задал, допустим, скопировать 10 байт поштучно, включил DMA и он все скопировал, а если режим Periph2Mem, то пришел запрос DMA от периферии и скопировался 1 байт, т.е. скобы скопировать все нужно 10 запросов. Если не нравится таймер, который может периодически формировать нужные запросы, а при наличии RCR даже точное их количество, то предлагай свой более простой вариант.

[uquote="Reflector",url="/forum/viewtopic.php?p=3460894#p3460894"]Burst тут как бы вообще не при делах. burst - это размер пересылки, выполняемой за один цикл арбитража памяти, без переарбитража. Блок DMA-пересылки как правило состоит из множества burst-ов (если burst используется).[/uquote]
В том и смысл, чтобы раз дернуть DMA и передать не байт, а сразу некое их ограниченное подмножество.
Если выбран режим 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 и передать не байт, а сразу некое их ограниченное подмножество.
Re: STM32 новичку в ARM что к чему
[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 уже заранее запрограммирован на пересылку желаемого блока. Запрограммирован, но не разрешён.
Вот и всё.
Это же без 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 уже заранее запрограммирован на пересылку желаемого блока. Запрограммирован, но не разрешён.
Вот и всё.
Re: STM32 новичку в ARM что к чему
[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]
О, это уже вариант который вполне может оказаться рабочим, но нужно проверять.
Пусть количество принимаемых 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]
О, это уже вариант который вполне может оказаться рабочим, но нужно проверять.
Re: STM32 новичку в ARM что к чему
[uquote="Reflector",url="/forum/viewtopic.php?p=3460993#p3460993"]О, это уже вариант который вполне может оказаться рабочим, но нужно проверять.[/uquote]
Это рабочий вариант. Я так делал. Правда не на STM32.
Если в DMA-контроллере этого STM32 есть режим свЯзных списков, то можно сделать так, чтобы по завершении передачи всего блока DMA-каналом2, следующим элементом свЯзного списка, он заново переинициализировался на передачу нового блока.
Это рабочий вариант. Я так делал. Правда не на STM32.
Если в DMA-контроллере этого STM32 есть режим свЯзных списков, то можно сделать так, чтобы по завершении передачи всего блока DMA-каналом2, следующим элементом свЯзного списка, он заново переинициализировался на передачу нового блока.


