Easyelectronics.ru

Электроника для всех
Текущее время: 16 окт 2019, 00:03

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 19 ] 
Автор Сообщение
 Заголовок сообщения: STM32F1 Ногодрыг через DMA, куда уходят такты? И др. вопросы
СообщениеДобавлено: 09 апр 2019, 20:28 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 632
Откуда: GMT+6
На МК STM32F103C8 настроил тактирование шин AHB и APB2 на 72 МГц.
Включен один канал DMA, запрос формирую от TIM1.
DMA передает данные из кольцевого буфера SRAM в GPIOB_BSRR.
Кольцевой буфер заполняю в прерываниях DMA Half Transfer и DMA Transfer complete.
Между прерываниями ядро находится в пустом бесконечном цикле
Код:
// Оптимизация -O0
while (1)
{}
Судя по AN2548 (Using the STM32F0/F1/Lx Series DMA controller)
общее время обслуживания запроса DMA:
tTS = tA + tWR + tRD + tAck, где
tA - время арбитража, включая вычисление адреса
tA = 2 AHB такта, если нет передачи с более высоким приоритетом.
tRD - время доступа для чтения периферийных устройств
tRD = 2 APB такта, если частота APB равна AHB.
tWR - время доступа записи SRAM
tWR = 1 AHB такт при одиночной операция чтения / записи.
tAck - время подтверждения DMA (закрытие соединения между периферийным устройством и DMA)
tAck = 1 AHB такт.
Получаем tTS = 6 тактов.
Далее формирую запросы DMA с частотой 6 МГц, состояние GPIO меняется на каждый DMA запрос.
Поднимаю частоту запросов DMA - GPIO меняет состояние не чаще 6,3 МГц.
Получается, что DMA тратит 72/6,3 = 11 или 12 тактов на каждый запрос.
Собственно на что уходят такты?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 Ногодрыг через DMA, куда уходят такты? И др. вопросы
СообщениеДобавлено: 09 апр 2019, 21:35 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6213
Ага.
А теперь то-же, но с делителями по шинам и Flash latency =1. Видимо, частоту камня придется поставить в 25-36 МГц.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 Ногодрыг через DMA, куда уходят такты? И др. вопросы
СообщениеДобавлено: 09 апр 2019, 21:57 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 632
Откуда: GMT+6
Инструкции ядро читает из флеша по шине ICode, так что думаю, что в пустом бесконечном цикле ядро не задействует Bus matrix, а соответственно не должно мешать работе DMA.
Размер буфер я сделал большого размера, так что прерывания происходят редко и не должны влиять на результат.
А вот про изменение делителей шин - хорошая мысль, может удастся выявить зависимость от конкретной шины, завтра попробую.
Вложение:
y1.png
y1.png [ 43.8 Кб | Просмотров: 848 ]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 Ногодрыг через DMA, куда уходят такты? И др. вопросы
СообщениеДобавлено: 10 апр 2019, 00:20 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1015
F1 просто в этом плане самый медленный, как минимум потому, что порты на APB. Я когда делал осцилл, то при чтении с порта в буфер на F1 получалось 9 тактов, на F0/F3 - 5, F407 - 4, а F429 во сне - 3... Это с минимальными делителями шин и без таймеров, с таймером еще минимум такт нужно добавить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 Ногодрыг через DMA, куда уходят такты? И др. вопросы
СообщениеДобавлено: 10 апр 2019, 00:24 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1015
Kelvin писал(а):
Инструкции ядро читает из флеша по шине ICode, так что думаю, что в пустом бесконечном цикле ядро не задействует Bus matrix, а соответственно не должно мешать работе DMA.

По идее да, но __WFI() надежнее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 Ногодрыг через DMA, куда уходят такты? И др. вопросы
СообщениеДобавлено: 10 апр 2019, 17:09 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 632
Откуда: GMT+6
Отключил все прерывания, выставил SYSCLK на 8 МГц.
Менял делитель APB2.
Делитель APB2 | Количество тактов AHB на запрос DMA
  • /1 | 11 тактов
  • /2 | 14 тактов
  • /4 | 20 тактов
  • /8 | 32 такта
Выходит, я не так понял формулы в AN2548

Исходники, если кому интересно
Show main.cpp
Show GpioHelper.h
Show GpioHelper.cpp



Reflector писал(а):
с таймером еще минимум такт нужно добавить.
Почему? Таймер же запускает DMA по шине DMA request, а к регистрам таймера я не обращаюсь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 Ногодрыг через DMA, куда уходят такты? И др. вопросы
СообщениеДобавлено: 10 апр 2019, 17:26 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6213
Flash была на минимуме? А поставьте ей +1... )))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 Ногодрыг через DMA, куда уходят такты? И др. вопросы
СообщениеДобавлено: 10 апр 2019, 17:39 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 632
Откуда: GMT+6
Да. FLASH_ACR = Reset value: 0x0000 0030
Смысл? Ведь у меня DMA ее не использует. Да и с +2 на 72 МГц у DMA те-же 11 тактов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 Ногодрыг через DMA, куда уходят такты? И др. вопросы
СообщениеДобавлено: 10 апр 2019, 18:07 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1015
Kelvin писал(а):
Почему? Таймер же запускает DMA по шине DMA request, а к регистрам таймера я не обращаюсь.

Потому что это теория, а на практике получается по-другому. Проверил на запись в BSRR на F1, без таймера 10 тактов, с таймером - 11, если таймеру задать период 10 тактов, то время передачи массива из 1000 элементов даже немного вырастает(~11.3). У тебя в коде ARR почему-то вообще равен 1...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 Ногодрыг через DMA, куда уходят такты? И др. вопросы
СообщениеДобавлено: 10 апр 2019, 18:28 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6213
А, да, у вас же RAM. Виноват. ))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 Ногодрыг через DMA, куда уходят такты? И др. вопросы
СообщениеДобавлено: 11 апр 2019, 17:10 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 632
Откуда: GMT+6
Reflector писал(а):
У тебя в коде ARR почему-то вообще равен 1
У DMA похоже есть небольшая очередь запросов, а не поместившиеся в эту очередь запросы игнорируются. Соответственно, чтобы узнать максимальную скорость DMA, можно формировать запросы с максимально возможной частотой. Записать 0 в ARR я не могу, поскольку "The counter is blocked while the auto-reload value is null", поэтому там 1.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 Ногодрыг через DMA, куда уходят такты? И др. вопросы
СообщениеДобавлено: 11 апр 2019, 17:41 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 632
Откуда: GMT+6
А теперь вопрос про таймер
Вложение:
y2.png
y2.png [ 86.92 Кб | Просмотров: 589 ]
В RM0008 сказано, что частота ETRP не более 1/4 от CK_INT ("External trigger signal ETRP frequency must be at most 1/4 of CK_INT frequency.")
В Datasheet сказано, что максимальная частота на входах CH1 - CH4 = fTIMxCLK/2 (Параметр "Timer external clock frequency on CH1 to CH4")

Где указана максимальная частота на входе ETR? Или я могу подать на ETR 144 МГц при ETPS[1:0] = 11 и 72 МГц тактовой?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 Ногодрыг через DMA, куда уходят такты? И др. вопросы
СообщениеДобавлено: 13 апр 2019, 11:09 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 632
Откуда: GMT+6
Кто ткет носом в характеристики ETR входа таймера?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 Ногодрыг через DMA, куда уходят такты? И др. вопросы
СообщениеДобавлено: 13 апр 2019, 11:36 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1015
Kelvin писал(а):
Где указана максимальная частота на входе ETR? Или я могу подать на ETR 144 МГц при ETPS[1:0] = 11 и 72 МГц тактовой?

При 72MHz тактовой на ETR(без делителей) можно подать 36MHz, если частоту генерить тем же мк.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 Ногодрыг через DMA, куда уходят такты? И др. вопросы
СообщениеДобавлено: 13 апр 2019, 11:40 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 632
Откуда: GMT+6
А если генератор внешний?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 Ногодрыг через DMA, куда уходят такты? И др. вопросы
СообщениеДобавлено: 13 апр 2019, 12:06 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1015
Kelvin писал(а):
А если генератор внешний?

В лучшем случае F/2, в худшем - F/4.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 Ногодрыг через DMA, куда уходят такты? И др. вопросы
СообщениеДобавлено: 13 апр 2019, 16:24 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 632
Откуда: GMT+6
Reflector писал(а):
В лучшем случае F/2, в худшем - F/4.
Никак нет. В лучшем случае считает до 4*F.

Теперь вопрос: на какую ширину импульса будет реагировать ETR?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 Ногодрыг через DMA, куда уходят такты? И др. вопросы
СообщениеДобавлено: 13 апр 2019, 16:46 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1015
Kelvin писал(а):
Никак нет. В лучшем случае считает до 4*F.

Т.е. ты подал на вход какой-то сигнал и посчитал это лучшим случаем? На каких основаниях?
Сигнал генерируемый на тот же мк ничем не отличается от внешнего, потому для внешнего тоже максимум будет F/2, хотя на практике этого достичь довольно проблематично...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 Ногодрыг через DMA, куда уходят такты? И др. вопросы
СообщениеДобавлено: 13 апр 2019, 18:14 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 632
Откуда: GMT+6
Вложение:
Комментарий к файлу: RM0008 Figure 123. External trigger input block
y8.png
y8.png [ 10.81 Кб | Просмотров: 436 ]
AN4776 General-purpose timer cookbook писал(а):
The main advantage of using the external clock-source mode 2 compared to mode 1 is that the externally provided clock signal frequency can be equal or even higher than the frequency of the internal timer core clock
...
The ETR timer input is the only timer input that features a presacler stage before the resynchronization stage. This presacaler stage is fully asynchronous and can be divided down to eight times less the asynchronous input signal frequency.

В том-же AN4776 видим, как работает делитель частоты
Вложение:
y9.png
y9.png [ 20.59 Кб | Просмотров: 436 ]

Предположим, что схема синхронизации тактируется CK_INT и захватывает сигнал ETRP на каждом нарастающем фронте. Тогда надо, чтобы на каждый из логических уровней ETRP приходилось минимум по 1 нарастающему фронту CK_INT, т.е. частота ETRP была не более CK_INT / 2 (тут следует упомянуть, что если частота ETRP будет в точности равна CK_INT / 2, то при не удачном смещении фаз счетчик не будет считать).

Теперь проверим теорию: подаем на ETR разные частоты до CK_INT*4, замеряем частоту на ОС2
Код:
TIM2->SMCR = TIM_SMCR_ECE | TIM_SMCR_ETPS; //Тактирование от ETR / 8
TIM2->CCMR1 = TIM_CCMR1_OC2M; //OC2 = CNT >= CCR2;
TIM2->CCER = TIM_CCER_CC2E;
TIM2->ARR = 1;
TIM2->CCR2 = 1;
GpioInit(GPIOA, Pin0, GpioModes::Input); //ETR
GpioInit(GPIOA, Pin1, GpioModes::AltFuncPP, GpioSpeeds::Freq50MHz); //OC2
Таким образом на OC2 получаем частоту ETR / 16.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Eddy_Em, Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB