Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2021-ноя-28 02:05

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 10 сообщений ] 
Автор Сообщение
 Заголовок сообщения: Возможно ли реализовать?
СообщениеДобавлено: 2021-сен-24 17:41 
Не в сети

Зарегистрирован: 2013-окт-17 14:52
Сообщения: 17
Здравствуйте, стоит задача непрерывной регистрации цифровых данных микроконтроллером 1986ВЕ1Т. Приём данных начинается с регистрации на выводе МК стартового импульса в 150 нс, далее по этой же линии непрерывно поступают данные, с временем следования одного бита равным 300 нс. В определённые моменты времени стартовый импульс повторяется для синхронизации. Зафиксированные данные требуется записывать во внешнюю Flash-память по её готовности.

Решение пока видится так:
1. Захватом таймера1 фиксируется импульс 150 нс.
2. При выполнении пункта 1, запускается таймер2 на время 300 нс.
3. По окончании времени 300 нс, с помощью DMA, считывается состояние цифрового входа МК и передаётся в буфер до готовности Flash.
4. Накопленный массив состояний входа МК через системную шину записывается во Flash.

Хотелось бы получить следующие ответы:
1. Имеется ли запас производительности у микроконтроллера для решения данной задачи, при условии его функционирования на частоте 144 МГц?
2. Работоспособен ли предложенный мной вариант, если да, хотелось бы попросить помощи в настройке DMA для пересылки состояния порта МК в промежуточный буфер по прерыванию таймера. Спасибо.


Вернуться к началу
 Заголовок сообщения: Re: Возможно ли реализовать?
СообщениеДобавлено: 2021-сен-25 04:49 
Не в сети

Зарегистрирован: 2021-апр-20 00:49
Сообщения: 3
Организация: HomeSweetHome
Решал подобную задачу на значительно меньшей частоте. Насчет 300 мс - надо посмотреть мануал, есть ли там что-нибудь про скорость порта на вход. Скорее всего порта хватит, ядра тоже, скорости флешки - тут уже вам виднее.
А вот с дма на высокой скорости могут быть вопросы, надо пробовать.
Так же на таймерах и дма ручками делал передачу, там были приколы:
void SendWord(uint8_t channel, uint32_t word)
// ...
	MDR_TIMER2->CNTRL = 0U;
	MDR_TIMER2->CNT = 0U;
	while (MDR_TIMER2->CNTRL & TIMER_CNTRL_WR_CMPL);
	DMA_DisableChannel(DMA_TIM2_CCR1);
	DMA_DisableChannel(DMA_TIM2_CCR2);
	// channel configuration code
	DMA_EnableChannel(DMA_TIM2_CCR1);
	DMA_EnableChannel(DMA_TIM2_CCR2);
	MDR_TIMER2->CNTRL = TIMER_CNTRL_CNT_EN;
// ...
Игрался с последовательностями операций, у меня так и не получилось избавиться от непонятного поведения: при включении канала ДМА через DMA_EnableChannel сразу происходила транзакция дма. Если частоту таймера 2 дропнуть, то транзакции не было. Таймер крутится на частоте около 10 кГц и, как видите, вообще отключен при переконфигурации канала дма. Так что осциллограф и дебаг в помощь.
В каком-то примере видел регистры дма, не описанные в мануале, но доступные для ядра. Что-то про активные/неактивные каналы, захваченные запросы и все в таком духе.

По инициализации дма:
#include "MDR_DMA.h"
#include "MDR_RST_CLK.h"

typedef struct
{
	DMA_ChannelConfig_T Primary[32];
	DMA_ChannelConfig_T Alternate[32];
} DMA_Config_T;

DMA_Config_T DMA_Config __attribute__((at(0x20100000), aligned(0x100U))) = {0};

void DMA_Init(void)
{
	MDR_RST_CLK->PER_CLOCK |= RST_CLK_PER_CLOCK_DMA_EN;
	
	MDR_DMA->CTRL_BASE_PTR     = (uint32_t)&DMA_Config.Primary;
	MDR_DMA->CHNL_SW_REQUEST   = 0U;
	MDR_DMA->CHNL_USEBURST_CLR = 0xFFFFFFFF;       // Disable all burst
	MDR_DMA->CHNL_REQ_MASK_SET = 0xFFFFFFFF;       // Disable all req
	MDR_DMA->CHNL_ENABLE_CLR   = 0xFFFFFFFF;       // Disable all channels
	MDR_DMA->CHNL_PRI_ALT_CLR  = 0xFFFFFFFF;       // All channels use primary control structure
	MDR_DMA->CHNL_PRIORITY_CLR = 0xFFFFFFFF;       // All channels low priority
	MDR_DMA->ERR_CLR           = DMA_ERR_CLR_CLEAR_ERRORS;
	
	MDR_DMA->CFG =  DMA_CFG_MASTER_ENABLE | !DMA_CFG_CHNL_PROT_CTRL_Msk;
}

void DMA_EnableChannel(uint8_t channel)
{
	MDR_DMA->CHNL_REQ_MASK_CLR = (1U << channel);
	MDR_DMA->CHNL_ENABLE_SET   = (1U << channel);
}

void DMA_DisableChannel(uint8_t channel)
{
	MDR_DMA->CHNL_REQ_MASK_SET = (1U << channel);
	MDR_DMA->CHNL_ENABLE_CLR   = (1U << channel);
}

uint32_t DMA_GetDataCntLeftPri(uint8_t channel)
{
	return DMA_Config.Primary[channel].n_minus_1;
}

uint32_t DMA_GetDataCntLeftAlt(uint8_t channel)
{
	return DMA_Config.Alternate[channel].n_minus_1;
}
DMA любит управляющие структуры в оперативке 0x20100000. управляющие структуры в 0x20000000, где по умолчанию располагаются переменные, не любит. Не помню есть ли про это в мануале, но у меня иначе не работало. Атрибут aligned в этом случае избыточен, но это точно есть в мануале.
Принимаемые/передаваемые данные тоже кладите в область 0x20100000.

Инициализация приема:
void InitRx(void)
{
	MDR_RST_CLK->PER_CLOCK	|=       RST_CLK_PER_CLOCK_TIM3_EN;
	MDR_RST_CLK->TIM_CLOCK	&=      ~RST_CLK_TIM_CLOCK_TIM3_BRG_Msk;
	MDR_RST_CLK->TIM_CLOCK	|= 2U << RST_CLK_TIM_CLOCK_TIM3_BRG_Pos; //TIM1_CLK = HCLK_FREQ/[2^2 = 4] = HCLK_FREQ/4
	MDR_RST_CLK->TIM_CLOCK	|=       RST_CLK_TIM_CLOCK_TIM3_CLK_EN;

	MDR_TIMER3->CNTRL = !TIMER_CNTRL_CNT_EN         // counter enable
	                  | !TIMER_CNTRL_ARRB_EN        // preloaded ARR
	                  | !TIMER_CNTRL_WR_CMPL        // PSC and ARR written and ready
	                  | !TIMER_CNTRL_DIR            // direction
	                  | !TIMER_CNTRL_FDTS_Msk       // FTDS
	                  | !TIMER_CNTRL_CNT_MODE_Msk   // no monkey buisness w/DIR
	                  | !TIMER_CNTRL_EVENT_SEL_Msk; // no event generation
	while (MDR_TIMER3->CNTRL & TIMER_CNTRL_WR_CMPL);

	uint32_t hclk = CLK_GetHCLK();
	MDR_TIMER3->PSG = (hclk/4U/400000U) - 1U;         // TIM counter at 400kHz
	MDR_TIMER3->ARR = 400000U/10000U/OVERSAMPLE - 1U; // 400kHz / 5 = 8 * 10kHz = 80kHz cycle
	while (MDR_TIMER3->CNTRL & TIMER_CNTRL_WR_CMPL);
	
	MDR_TIMER3->DMA_RE = TIMER_DMA_RE_CNT_ARR_EVENT_RE;
}
Дальше включаю таймер и в цикле мониторю память на наличие посылки по протоколу с учетом оверсемплинга, так как захватить начало передачи таймером возможности нет. Если в вашем случае прием можно обеспечить синхронно, таких танцев с бубном потребоваться не должно.

Интересно было бы узнать, как у вас получится, ибо частота не килогерцы, а дма на миландре, судя по мануалу, арбитраж может производить по праздникам, и уверенности в отсутствии конфликтов на внутренних шинах при такой нагрузке как-то не очень много.


Вернуться к началу
 Заголовок сообщения: Re: Возможно ли реализовать?
СообщениеДобавлено: 2021-сен-26 07:07 
Не в сети

Зарегистрирован: 2017-июн-05 14:53
Сообщения: 24
Организация: ОАП АПЗ
Пробовал реализовать подобную идею на 1986ВЕ91 приём состояния порта - 16 битов с частотой 4МГц.
Результат отрицательный.
Причина: Пока работает только этот фрагмент кода, то вроде бы получается.
Но только начинают работать какие нибудь асинхронные прерывания и посторонние обмены по периферийной шине, протокол рассыпается.
Происходит конкуренция за диспетчеризацию периферийной шины, а она работает на частоте, меньшей, чем ядро.


Вернуться к началу
 Заголовок сообщения: Re: Возможно ли реализовать?
СообщениеДобавлено: 2021-сен-27 15:33 
Не в сети
Support
Аватара пользователя

Зарегистрирован: 2018-авг-10 23:14
Сообщения: 530
Организация: АО «ПКК Миландр»
Откуда: Зеленоград
Shevand писал(а): *
Здравствуйте, стоит задача непрерывной регистрации цифровых данных микроконтроллером 1986ВЕ1Т. Приём данных начинается с регистрации на выводе МК стартового импульса в 150 нс, далее по этой же линии непрерывно поступают данные, с временем следования одного бита равным 300 нс. В определённые моменты времени стартовый импульс повторяется для синхронизации. Зафиксированные данные требуется записывать во внешнюю Flash-память по её готовности.

Решение пока видится так:
1. Захватом таймера1 фиксируется импульс 150 нс.
2. При выполнении пункта 1, запускается таймер2 на время 300 нс.
3. По окончании времени 300 нс, с помощью DMA, считывается состояние цифрового входа МК и передаётся в буфер до готовности Flash.
4. Накопленный массив состояний входа МК через системную шину записывается во Flash.

Хотелось бы получить следующие ответы:
1. Имеется ли запас производительности у микроконтроллера для решения данной задачи, при условии его функционирования на частоте 144 МГц?
2. Работоспособен ли предложенный мной вариант, если да, хотелось бы попросить помощи в настройке DMA для пересылки состояния порта МК в промежуточный буфер по прерыванию таймера. Спасибо.
Здравствуйте!

Обратите, пожалуйста, внимание, что реализация такой задачи перед нами и в рамках известных запросов пользователей не стояла, соответственно, необходимо принимать решение о тестировании самостоятельно с учётом в том числе информации из данного поста.
Shevand писал(а):
1. Имеется ли запас производительности у микроконтроллера для решения данной задачи, при условии его функционирования на частоте 144 МГц?
Важно понимать, за какое время в целом тот же внешний импульс дойдет до кристалла. От нагрузки зависит выходной фронт, который настраивается в регистре PORTx_PWR. Частота работы порта закладывалась при разработке топологии и не может быть больше половины максимальной частоты ядра в 144 МГц. Важно учитывать также время прохождения сигнала через площадку ввода/вывода и переключение фронта из "1" в "0" и "0" в "1". В качестве справки сообщаю, что с вывода микросхемы (внешние устройства не учитываются, но они тоже будут вносить вклад в общее время) данные проходят площадку ввода/вывода за время порядка ~40-50 нс во всем диапазоне температур и переключениях фронта из "1" в "0" и "0" в "1". Далее по кристаллу путь данных занимает ~16 нс, после чего момент фиксации данных может прийтись либо на начало тактового сигнала, либо на конец. В любом случае данные фиксируются в пределах одного такта частоты ядра микроконтроллера. Поверх этого следует также взять 20% запаса на разного рода нестабильности, после чего иметь представление о примерном времени, за которое будет происходить фиксация событий в рамках работы микроконтроллера.

Транзакции по внешней же системной шине складываются из тактов WS_SETUP, WS_ACTIVE и WS_HOLD, соответственно, можно также оценить примерное время в рамках требуемого объема данных.
Shevand писал(а):
2. Работоспособен ли предложенный мной вариант, если да, хотелось бы попросить помощи в настройке DMA для пересылки состояния порта МК в промежуточный буфер по прерыванию таймера. Спасибо.
В силу отсутствия таких реализаций сложно сказать, получится ли сделать такую систему стабильной, поэтому необходимо смотреть на практике, что решает делать сам разработчик. Обратите, пожалуйста, внимание, что блок DMA работает на частоте HCLK, которая равна частоте ядра, и в ходе работы транзакция занимает не менее 7 тактов частоты ядра - при использовании арбитража скорость будет ниже. Тем не менее, для Вашего случая подходит вариант, когда данные в какой-либо массив записываются в ходе выполнения обработчика прерывания от таймера, при этом сразу же в этом обработчике даются указания на запуск посредством DMA транзакций типа "память - память", где источником является адрес массива с Вашими данными, а получателем является адрес на внешней системной шине. Примеры по работе с DMA доступны в рамках установочного пака для IDE Keil: установочный пак всегда доступен для загрузки на официальном сайте компании Миландр, на странице с выпускаемым программным обеспечением - всплывающее меню "Standard Peripherals Library + software pack для Keil MDK 5".

Если по каким-либо причинам в работе с микроконтроллерами компании Миландр блок DMA Вами детально не рассматривался, просьба обратить внимание на статью информационного портала отдела технической поддержки компании Миландр "Начальные сведения о DMA".

Спасибо за обращение.

_________________
Отдел технической поддержки support@milandr.ru

Информационный портал отдела технической поддержки support.milandr.ru


Вернуться к началу
 Заголовок сообщения: Re: Возможно ли реализовать?
СообщениеДобавлено: 2021-сен-28 13:57 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1600
Откуда: Тула
Shevand писал(а): *
Здравствуйте, стоит задача непрерывной регистрации цифровых данных микроконтроллером 1986ВЕ1Т. Приём данных начинается с регистрации на выводе МК стартового импульса в 150 нс, далее по этой же линии непрерывно поступают данные, с временем следования одного бита равным 300 нс. В определённые моменты времени стартовый импульс повторяется для синхронизации. Зафиксированные данные требуется записывать во внешнюю Flash-память по её готовности.
....
Хотелось бы получить следующие ответы:
1. Имеется ли запас производительности у микроконтроллера для решения данной задачи, при условии его функционирования на частоте 144 МГц?
2. Работоспособен ли предложенный мной вариант, если да, хотелось бы попросить помощи в настройке DMA для пересылки состояния порта МК в промежуточный буфер по прерыванию таймера. Спасибо.
А я бы спросил, что ещё и с какой жёсткостью во времени требуется делать?
Так, например, я измерял параметры меандра частотой 500 кГц и всё получалось идеально (точность измерений - один тик тактовой частоты МК). Делал я это при помощи таймера, поллингом регистров CCRx, с отключенными прерываниями, периодично.
И это не мешало работать с МКИО, в т.ч. отдавать результаты измерений онлайн.

_________________
сочувствующий…


Вернуться к началу
 Заголовок сообщения: Re: Возможно ли реализовать?
СообщениеДобавлено: 2021-сен-28 15:56 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 227
Организация: Миландр
Откуда: Миландр
Я не в курсе скоростных характеристик этого МК, но если попробовать этот вход подать
на SPI и попытаться через ДМА сделать захват битового паттерна с провода, а потом разобраться процессором ?
С какой максимальной частотой может принимать SPI?


Вернуться к началу
 Заголовок сообщения: Re: Возможно ли реализовать?
СообщениеДобавлено: 2021-сен-28 18:01 
Не в сети
Support
Аватара пользователя

Зарегистрирован: 2018-авг-10 23:14
Сообщения: 530
Организация: АО «ПКК Миландр»
Откуда: Зеленоград
BY_man писал(а): *
Я не в курсе скоростных характеристик этого МК, но если попробовать этот вход подать
на SPI и попытаться через ДМА сделать захват битового паттерна с провода, а потом разобраться процессором ?
С какой максимальной частотой может принимать SPI?
Здравствуйте!

Блок SSP в микроконтроллерах компании Миландр в исходном виде (1986ВЕ9х) или с доработками (1986ВК018 и др.) используется один и тот же. Общая концепция блока подразумевает, что в режиме ведомого микроконтроллер способен работать на максимальной скорости "MAX_CPU_CLK/12", то есть в случае с 1986ВЕ1Т на скорости 12 МГц - это исходит из того, что для сэмплирования входного сигнала требуется 12 тактов частоты. В целом же идея из Вашего поста интересна и может быть полезна пользователю, спасибо за предложение.

_________________
Отдел технической поддержки support@milandr.ru

Информационный портал отдела технической поддержки support.milandr.ru


Вернуться к началу
 Заголовок сообщения: Re: Возможно ли реализовать?
СообщениеДобавлено: 2021-сен-29 07:13 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 227
Организация: Миландр
Откуда: Миландр
У меня была немного другая мысль. В постановке задачи фигурирует один провод по которому идет информация.
Поэтому SPI должен работать мастером, который передает что угодно, но принимает информацию с заданной линии.
Как slave максимальная частота приема 12 МГц. А мастером, с какой максимальной частотой можно сканировать провод?
Автор назвал только период следования данных - 3.3(3)МГц, но не сказал насколько длинный может быть один пакет
данных.


Вернуться к началу
 Заголовок сообщения: Re: Возможно ли реализовать?
СообщениеДобавлено: 2021-сен-29 09:21 
Не в сети
Support
Аватара пользователя

Зарегистрирован: 2018-авг-10 23:14
Сообщения: 530
Организация: АО «ПКК Миландр»
Откуда: Зеленоград
BY_man писал(а): *
У меня была немного другая мысль. В постановке задачи фигурирует один провод по которому идет информация.
Поэтому SPI должен работать мастером, который передает что угодно, но принимает информацию с заданной линии.
Как slave максимальная частота приема 12 МГц. А мастером, с какой максимальной частотой можно сканировать провод?
Автор назвал только период следования данных - 3.3(3)МГц, но не сказал насколько длинный может быть один пакет
данных.
Здравствуйте!

Теперь я однозначно понял Вашу идею, это действительно интересно. Мастер в блоке SSP 1986ВЕ1Т может отрабатывать на частоте "MAX_CPU_CLK/2", то есть при максимальной частоте 1986ВЕ1Т в 144 МГц, на частоте 72 МГц.

_________________
Отдел технической поддержки support@milandr.ru

Информационный портал отдела технической поддержки support.milandr.ru


Вернуться к началу
 Заголовок сообщения: Re: Возможно ли реализовать?
СообщениеДобавлено: 2021-сен-29 12:20 
Не в сети

Зарегистрирован: 2014-июн-25 09:29
Сообщения: 148
BY_man писал(а): *
У меня была немного другая мысль. В постановке задачи фигурирует один провод по которому идет информация.
Поэтому SPI должен работать мастером, который передает что угодно, но принимает информацию с заданной линии.
Красивая идея! Возьму на вооружение.


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

Часовой пояс: UTC+03:00


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя


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

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB