Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

stm32f4 cmsis ADC -DMA

Сб апр 11, 2020 04:05:12

У меня вопрос почему в Ф1 каналы а в ф4 стримы и каналы.И какой принцип настройки DMA stm32f4.Что и как настраивать.Мне алгоритм бы.Поток или канал что в первую очередь настраивается?

Добавлено after 59 seconds:
В алгоритме примером АЦП

Re: stm32f4 cmsis ADC -DMA

Сб апр 11, 2020 08:18:59

Когда начали делать новые серии (а F1 - это самая старая серия), то призадумались, что старый подход узковат, жмет яйки и мешает танцевать. Конкретно - надо было завести кучу периферии на несколько функциональных элементов ДМА, обеспечив более широкую свободу выбора.. Собственно, есть единичный функциональный блок ДМА, который обеспечивает передачу между источником и назначением. В F1 такой единичный блок назывался КАНАЛОМ. У каждого канала был список запросов, которыми активируется передача по ДМА. Часть запросов могла переназначаться - ремапиться с канала на канал, занимался этим ремап.
В F4 и остальных пошли другим путем. Единичный блок назвали ПОТОКОМ. А ремапы назвали каналами.
Отсюда, для F4 по табличке выбираем ПОТОК, с помощью которого будет происходить трансфер. И с помощью КАНАЛОВ выбираем запросы от периферии, подключенные к ПОТОКУ.

Иными словами, придерживаясь описания из мануала: есть запросы ДМА. Каждый запрос адресуется на КАНАЛ ДМА. У каждого ПОТОКА есть 8 КАНАЛОВ, которым соответствуют запросы. Смотрим в табличку и выбираем ПОТОК. Затем выбираем КАНАЛ с запросом от нужного нам источника или назначения.
Конкретно для ADC смотрим таблички: ADC есть в DMA2. Причем, для ADC1 у нас ПОТОК - Stream 0, КАНАЛ запроса - Channel 0. А для ADC2 есть выбор - ПОТОК либо Stream 2, либо Stream3, и КАНАЛ запроса будет у них одинаковый - Channel 1.
Конкретно выражаясь в коде, для AdC1 пишем для регистров DMA2 Stream 0, в этих регистрах выбираем (подключаем) Канал 0 битами CHSEL.
Вложения
Безымянный.png
(26.73 KiB) Скачиваний: 369

Re: stm32f4 cmsis ADC -DMA

Сб апр 11, 2020 12:16:57

Я имею ввиду алгоритм настройки DMA F4

Re: stm32f4 cmsis ADC -DMA

Сб апр 11, 2020 12:52:21

Для DMA2 Stream 0:
1. В регистре DMA2_S0CR выбираем канал 0 битами CHSEL (дефолтное значение 000)
-1а. Выбираем размер передаваемых данных - 16 бит / 16 бит, битами MSIZE, PSIZE
-1б Выбираем инкремент адресов памяти битом MINC,
-1в. Выбираем направление передачи Periph-to-Memory битом DIR (дефолтный режим)
При неободимости включаем прерывание по завершению передачи
2. В регистр S0PAR записываем адрес регистра данных АЦП
3. В регистр S0M0AR записываем адрес софтового буфера (массив)
4. В регстр S0NDTR записываем число транзакций (измерений)
5. Включаем поток битом EN.

У АЦП включаем запрос на DMA, настраиваем триггер запуска.

Re: stm32f4 cmsis ADC -DMA

Сб апр 11, 2020 13:37:22

ivan dimir, Ты когда читать научишься ? https://www.google.ru/search?newwindow= ... g0Q4dUDCAo

Re: stm32f4 cmsis ADC -DMA

Сб апр 11, 2020 15:48:35

Ведь я не программист.Я простой электрик.Инфы много. Но алгоритм меня интересует.Регистры я как нибудь осилю.Спасибо за информацию.Даже не знаю как вас отблагодарить.

Добавлено after 3 minutes 43 seconds:
Ещё один вопрос DMA1 и DMA2.Здесь есть понятие приоритета?.Или они независимо работают.?

Re: stm32f4 cmsis ADC -DMA

Сб апр 11, 2020 15:56:10

:)))) Лучшей благодарностью будет освоение темы :)
DMA1 и DMA2 почти равноправны. По крайней мере, в плане приоритетов у них нет разницы.
И да, вовсе не обязательно выжимать изо всех сил работу именно на регистрах. Есть HAL. Его не почитают те, кто начинал давно, но для нынешних начинающих HAL - это не зазорно. Многие пользуются. Дело сугубо личное. Есть как плюсы, так и минусы. Но вот прям однозначно стопудового разграничения в общем то нет.

Re: stm32f4 cmsis ADC -DMA

Сб апр 11, 2020 16:21:15

Куб HAL.LL для работы и для анализа.Но интереснее что рутинее и после регистров понятнее HAl LL становятся.

Re: stm32f4 cmsis ADC -DMA

Сб апр 11, 2020 16:27:13

Я , например, на ф303 использую СПЛ, но, если нужно , делаю вставки на ЦМСИС и Ассемблере.

Re: stm32f4 cmsis ADC -DMA

Вс июн 21, 2020 15:44:49

void DMA_init(void)
{

RCC->AHB1ENR|= RCC_AHB1ENR_DMA2EN;
DMA2_Stream0->CR = 0;
DMA2_Stream0->PAR |=(uint32_t)& ADC1->DR;
DMA2_Stream0->M0AR |=(uint32_t)& TIM4->CCR1;
DMA2_Stream0->NDTR =DMA_SxNDT_0;

DMA2_Stream0->CR&= ~DMA_SxCR_PINC;
DMA2_Stream0->CR&= ~DMA_SxCR_MINC;
DMA2_Stream0->CR|= DMA_SxCR_PSIZE_0;
DMA2_Stream0->CR|= DMA_SxCR_MSIZE_0;
DMA2_Stream0->CR&=~ DMA_SxCR_CHSEL_0 ;
DMA2_Stream0->CR&=~ DMA_SxCR_CHSEL_1;
DMA2_Stream0->CR&=~ DMA_SxCR_CHSEL_2 ;
DMA2_Stream0->CR&=~ DMA_SxCR_PFCTRL;//DMA master
DMA2_Stream0->CR|= DMA_SxCR_PL;
DMA2_Stream0->FCR|=DMA_SxFCR_DMDIS;//отключить fIFO
DMA2_Stream0->CR&=~ DMA_SxCR_DIR;
DMA2_Stream0->CR|= DMA_SxCR_CIRC;
DMA2_Stream0->CR|= DMA_SxCR_EN;//вкл DMA2_Stream0


}
может я ошибаюсь но мне кажется что так настраивается и включается поток.

Re: stm32f4 cmsis ADC -DMA

Вс июн 21, 2020 16:33:44

DMA2_Stream0->M0AR |=(uint32_t)& TIM4->CCR1;

:shock: Это вообще что такое???
Тут должен быть стартовый адрес массива в ОЗУ куда будут забрасываться данные из АЦП.
Семплирующий АЦП источник вообще фиолетов для ДМА.
Скажем, вы назначили в качестве запускающего преобразования ДМА некий таймер, тогда в настройках АЦП вы и указываете этот таймер как запускающий. А у ДМА в качестве источника реквестов выступает сам АЦП (флаг завершения преобразования). Вы выбираете тот канал потока, в котором указан выбранный АЦП. Если мне не изменяет память - это нулевой канал для этого потока.

И маска по ИЛИ тут вообще не вперлась - весь регистр - это адрес и ничего более. Поэтому только равенство. Это касается и регистра PAR.
А если говорить шире, то вы должны понимать, что ПЕРЕД тем, как вы маской определяете группу бит, вы должны обеспечить этой группе нейтральное (нулевое) состояние, иначе при переопределении этой группы возникнет логическое ИЛИ из того что там было и того, что вы пытаетесь присвоить...
Обратите внимание как подобны экзерсисы делаются в функциях SPL... Иногда полезно смотреть как уже реализовано другими, чтобы не творить деревянные велосипеды с квадратными колесами.

Re: stm32f4 cmsis ADC -DMA

Вс июн 21, 2020 16:52:08

я пытаюсь с помощью ацп через дма управлять шим одного канала.В stm32f103 этот вариант прошёл тут не знаю.Поэтому спрашиваю варианты .Или ещё один ДМА стрим использовать?.Там правда функция периферия- периферия есть .DMA2_Stream0->M1AR а для чего два буфера.И в каком виде писать адрес?И как понять что DMA потоком может управлять периферия? Каким это образом.В каком виде?

Re: stm32f4 cmsis ADC -DMA

Вс июн 21, 2020 17:08:39

То есть вы сырые данные из АЦП прямо пишите в ШИМ? Тогда ладна... )))
Просто вы прямо побитно вписываете в регистры то, что можно писать напрямую числом.
DMA2_Stream0->NDTR =DMA_SxNDT_0;
DMA2_Stream0->NDTR =1; // это количество транзакций, зачем там пользоваться именами бит?
Адреса присваиваем напрямую без маски:
DMA2_Stream0->PAR = (uint32_t)& ADC1->DR;
DMA2_Stream0->M0AR = (uint32_t)& TIM4->CCR1;
Обратите внимание, что вначале у вас CR обнуляется, а потом следуют маски на биты.

Добавлено after 5 minutes 54 seconds:
И как понять что DMA потоком может управлять периферия? Каким это образом.В каком виде?

Транзакция сама по себе не генерируется. Кто то должен ее инициировать. То есть сгенерировать ЗАПРОС (request). Это может быть любая периферия из списка разрешенных. Выбором канала вы определяете этот источник запросов.
Так, если вы для передатчика УАРТа назначите источником запросов сам этот УАРТ (то есть флаг пустого буфера передатчика), то байты будут пересылаться УАРТом без зазора. А если выберете некий таймер с периодом следования байт, то байты будут следовать именно с этим периодом...

Re: stm32f4 cmsis ADC -DMA

Вс июн 21, 2020 17:27:04

Так PFCTRL я имею ввиду этот бит.This bit is set and cleared by software. 0: The DMA is the flow controller 1: The peripheral is the flow controller This bit is protected and can be written only if EN is ‘0’. When the memory-to-memory mode is selected (bits DIR[1:0]=10), then this bit is automatically forced to 0 by hardware.

Добавлено after 8 minutes 5 seconds:
То что DMA есть функции инициализации запроса 1 периферия-память. 2 память-периферия.3 память-память.Это я понял а вот почему два буфера R DMA_SxM0AR DMA_SxM1AR и почему два буфера?Зачем?

Re: stm32f4 cmsis ADC -DMA

Вс июн 21, 2020 17:36:51

PFCTRL - это выбор из двух вариантов, либо транзакции будут управляться периферией, либо непосредственно самим контроллером ДМА. Например, при транзакциях из ОЗУ в ОЗУ нет необходимости генерировать запросы периферией, тогда транзакции будут генерироваться по мере арбитража шины в пользу ДМА. То есть максимально быстро.

Добавлено after 8 minutes 49 seconds:
почему два буфера R DMA_SxM0AR DMA_SxM1AR и почему два буфера?Зачем?

Затем, что иногда данные нужно перенаправлять в разные буферы и этим занимается бит CR<CT> при условии включенного двойного буфера. Дергаете это бит и управляете назначением потока.

Re: stm32f4 cmsis ADC -DMA

Вс июн 21, 2020 19:49:33

хорошо как же вот этот битs DIR[1:0] DMA_SxCR ?

Re: stm32f4 cmsis ADC -DMA

Вс июн 21, 2020 20:48:49

Это совершенно не о том. DIR - это направление передачи, а CT - это при двухбуферном режиме позволяет изменять буфер на лету, не останавливая поток. Перезагрузить адресные регистры на лету невозможно.
Вы загрузили в два адресных регистра разные адресаи запустили ДМА. В какой то момент дернули CT в 1 и данные начали сыпаться в нулевой буфер. Потом опять дернули в 0 - и они снова пошли в первый буфер и так далее. Направление при этом неизменно - периферия-память.
ЗЫ. Я тут поднаврал с PFCTRL, извините. Это несколько о другом. Для тех видов периферийных модулей, которые способны управлять ДМА в части сигнала о завершении передачи, возможно не указывать длину пакета транзакций, а включить этот режим, тогда периферия сама остановит ДМА, завершив пакет транзакций. При этом счетчик автоматически будет загружен предельным значением (а не значением из регистра NDTR) при старте потока.

Re: stm32f4 cmsis ADC -DMA

Вс июн 21, 2020 21:03:44

вот я об этом же.PFCTRL а какие периферийные модули могут управлять ДМА?Я в это только начал вникать.А по поводу два буфера так я могу управлять и другим каналом ШИМ.?одновременно?

Re: stm32f4 cmsis ADC -DMA

Вс июн 21, 2020 21:11:22

PFCTRL доступен для UART, например. При использовании полного набора сигналов для COM (CTS/RTS), эти сигналы могут завершать пакет. При этом можно узнать о длине пакета из регистра NDTR, определив для него дополнение (0xFFFF-NDTR).
Одновременно управлять двумя ШИМами он может в том смысле, что в данный момент он будет управлять одним из них, а после смены бита CT - другим. При этом в первом останется последнее значение перед переключением. Пересылать транзакции сразу по двум адресам ДМА не может ПО ОПРЕДЕЛЕНИЮ. Дорога (шина) всего одна.

Re: stm32f4 cmsis ADC -DMA

Вс июн 21, 2020 21:20:32

PFCTRL доступен для UART, UART управляет работой DMA. USART управляет регистром NDTR и тем самым работу DMA?.А таймер 1и 8 не могут управлять?
Ответить