К1921ВГ015 общее

32-разрядные микроконтроллеры разработки АО "НИИЭТ"

Модераторы: ea, dav, bkolbov, Alis, pip, _sva_

RabidRabbit
Сообщения: 17
Зарегистрирован: 10 июн 2025, 12:11
Предприятие: HomeWork

DMA: циклический режим Basic

Сообщение RabidRabbit »

День добрый!
Кто-нибудь запускал передачу по DMA (память->периферия) в циклическом режиме Basic?
У меня передача отрабатывает ровно 1 раз, после чего в конфиге канала поле N_MINUS_1 с тем же значением, что и до передачи и следующая передача не идёт, чтобы её запустить, нужно сделать DMA->CFG_bit.MASTEREN = 1 и DMA->ENSET = ChannelMask.
При этом если запускать две подряд Basic передачи (не циклических), вторая нормально запускается по DMA->ENSET = ChannelMask.
После них опять же запускается циклическая передача по DMA->ENSET = ChannelMask, но после одного цикла такое впечатление, что сбрасываются DMA->CFG_bit.MASTEREN и бит разрешения работы канала.
При этом в Errata описано, что нельзя включать циклический режим на более чем одном канале, так у меня ровно один канал и используется.
Наверняка я сам где-то накосячил, но всё же если у кого циклический режим DMA работает - скажите :)
RabidRabbit
Сообщения: 17
Зарегистрирован: 10 июн 2025, 12:11
Предприятие: HomeWork

РП: "Работа с периферией в режиме «разборка-сборка»"

Сообщение RabidRabbit »

В "Руководстве Пользователя", в таблице "Таблица 10.11 – Пример размещения управляющих данных для альтернативной структуры" для конфигов A, B, C и D неправильно указаны адреса в памяти. Если следовать схеме на "Рисунок 10.5" и описанию в параграфе "Функционирование", адреса должны идти так:

Код: Выделить всё

Управляющие   4000_018Ch Не используется  XXXX_XXXXh
данные для    4000_0188h CHANNEL_CFG      CYCLE_CTRL = 111b, 2R = 4, N = 3
задачи D      4000_0184h DST_DATA_END_PTR 4000_AE00h
              4000_0180h SRC_DATA_END_PTR 4000_A000h

Управляющие   4000_017Ch Не используется  XXXX_XXXXh
данные для    4000_0178h CHANNEL_CFG      CYCLE_CTRL = 111b, 2R = 2, N = 8
задачи C      4000_0174h DST_DATA_END_PTR 4000_BE00h
              4000_0170h SRC_DATA_END_PTR 4000_B000h

Управляющие   4000_016Ch Не используется  XXXX_XXXXh
данные для    4000_0168h CHANNEL_CFG      CYCLE_CTRL = 111b, 2R = 8, N = 5
задачи B      4000_0164h DST_DATA_END_PTR 4000_CE00h
              4000_0160h SRC_DATA_END_PTR 4000_C000h

Управляющие   4000_015Ch Не используется  XXXX_XXXXh
данные для    4000_0158h CHANNEL_CFG      CYCLE_CTRL = 001b, 2R = 4, N = 4
задачи A      4000_0154h DST_DATA_END_PTR 4000_DE00h
              4000_0150h SRC_DATA_END_PTR 4000_D000h
И соответственно в параграфе "Инициализация" для регистра первичных управляющих данных SRC_DATA_END_PTR должно быть указано значение 4000_018Ch.
dezna
Сообщения: 64
Зарегистрирован: 20 дек 2024, 08:23
Предприятие: avtomatica

Re: К1921ВГ015 общее

Сообщение dezna »

Добрый день!
такое ощущение что все разработчики НИИЭТ ушли в отпуск дружно...
напишу таки, может им пригодится.

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

по DMA
RabidRabbit писал(а): 23 июн 2025, 13:11 День добрый!
Кто-нибудь запускал передачу по DMA (память->периферия) в циклическом режиме Basic?
У меня передача отрабатывает ровно 1 раз, ...
я запускал, работло, но у меня было несколько каналов, и они друг друга выносили, но циклическая передача происходила не останавливаясь, но не так как нужно.
отказался от нее...
взял режим пинг-понг.
сделал достаточное количество циклов передачи, что бы хватало времени проверять структуру и переинициализировать.

PS
для разработчиков НИИЭТ:
хотелось бы иметь отдельный регистр задания количества передач. иногда 1024 это оч мало. мне пришлось перейти на одном канале на режим разборка-сборка чтоб обеспечить более 2т передач.
как-то так.
к примеру у СТМ - отдельный регистр 16 бит.
а вот у аналог-девайса как раз ваш вариант.
для аналогового сопроцессора этого достаточно, а вот для передач блоками - маловато...
RabidRabbit
Сообщения: 17
Зарегистрирован: 10 июн 2025, 12:11
Предприятие: HomeWork

Re: К1921ВГ015 общее

Сообщение RabidRabbit »

dezna писал(а): 26 июн 2025, 10:53 по DMA
я запускал, работло, но у меня было несколько каналов, и они друг друга выносили, но циклическая передача происходила не останавливаясь
Провёл натурный эксперимент. Канал DMA от TMR0. Если делать так

Код: Выделить всё

DMA->CIRCULARSET = 0x7FFFFFu;
то циклический режим работает. А если так

Код: Выделить всё

DMA->CIRCULARSET = (1u << DMA_CH_TMR0)
- то не работает.
Для себя сделал вывод, что циклический режим вообще нельзя использовать.
fog
Сообщения: 15
Зарегистрирован: 21 май 2025, 09:32
Предприятие: ***

Re: К1921ВГ015 общее

Сообщение fog »

Настроил WDT на 8 секунд просто проверить
Безымянный62.png
Безымянный62.png (3.64 КБ) 2428 просмотров

Код: Выделить всё

    RCU->CGCFGAPB_bit.WDTEN = 1;
    RCU->RSTDISAPB_bit.WDTEN = 1;
    RCU->WDOGCLKCFG_bit.CLKSEL = 0;	// HSICLK
    RCU->WDOGCLKCFG_bit.DIVN = 1;
    RCU->WDOGCLKCFG_bit.DIVEN = 1;
    RCU->WDOGCLKCFG_bit.CLKEN = 1;
    RCU->WDOGCLKCFG_bit.RSTDIS = 1;	//
    //
    WDT->LOAD = 2000000U;
    //
    WDT->CTRL_bit.INTEN = 1;		// включить таймер, загрузка с LOAD
    WDT->CTRL_bit.RESEN = 1;		// включить сброс CPU
WDT срабатывает через 16 секунд вместо 8, что за хрень?
RabidRabbit
Сообщения: 17
Зарегистрирован: 10 июн 2025, 12:11
Предприятие: HomeWork

Re: К1921ВГ015 общее

Сообщение RabidRabbit »

fog писал(а): 27 июн 2025, 09:32 WDT срабатывает через 16 секунд вместо 8, что за хрень?
По-моему ответ на Ваш вопрос находится в РП на "Рисунок 19.1 – Алгоритм работы сторожевого таймера".
fog
Сообщения: 15
Зарегистрирован: 21 май 2025, 09:32
Предприятие: ***

Re: К1921ВГ015 общее

Сообщение fog »

Понятно.
den666
Сообщения: 3
Зарегистрирован: 25 июн 2025, 22:39
Предприятие: ИП СИНЯКОВ ДЕНИС ЮРЬЕВИЧ

Re: К1921ВГ015 общее

Сообщение den666 »

Добрый день!
Есть вопрос по таймауту UART, в описании сказано что он срабатывает если нет передачи в течении 32бит и буфер при этом не пуст. Получается что при использовании DMA таймаут никогда не сработает т.к. буфер все время опустошается? Пробовал так делать, таймаут не срабатывает, если без DMA все работает.
Аватара пользователя
ejsan
Сообщения: 43
Зарегистрирован: 15 авг 2022, 21:17
Предприятие: vbrspb.ru

Re: К1921ВГ015 общее

Сообщение ejsan »

den666 писал(а): 03 июл 2025, 11:48 Добрый день!
Есть вопрос по таймауту UART, в описании сказано что он срабатывает если нет передачи в течении 32бит и буфер при этом не пуст.
Сам не пробовал, но, может, тогда и задавать порог для DMA где-то посередине буфера. DMA-сессию сделать короче этой величины, а по прерыванию таймаута вытягивать остаток.
Вообще таймаут вам для чего? Делаете MODBUS RTU? Это, конечно, моё личное мнение, но MODBUS сам по себе это такое медленное легаси, что там DMA уже ничего не ускорит. На прерываниях сделал, всё нормально работает.
den666
Сообщения: 3
Зарегистрирован: 25 июн 2025, 22:39
Предприятие: ИП СИНЯКОВ ДЕНИС ЮРЬЕВИЧ

Re: К1921ВГ015 общее

Сообщение den666 »

ejsan писал(а): 05 июл 2025, 17:04
den666 писал(а): 03 июл 2025, 11:48 Добрый день!
Есть вопрос по таймауту UART, в описании сказано что он срабатывает если нет передачи в течении 32бит и буфер при этом не пуст.
Сам не пробовал, но, может, тогда и задавать порог для DMA где-то посередине буфера. DMA-сессию сделать короче этой величины, а по прерыванию таймаута вытягивать остаток.
Вообще таймаут вам для чего? Делаете MODBUS RTU? Это, конечно, моё личное мнение, но MODBUS сам по себе это такое медленное легаси, что там DMA уже ничего не ускорит. На прерываниях сделал, всё нормально работает.
Таймаут нужен для приема пакетов разной, не известной длинны. Пока обхожусь прерыванием по таймауту без DMA, т.к. пакеты меньше буфера FIFO (32 байта).
Еще может кто подсказать по бутлоадеру, может у кого то есть рабочий пример?
Ответить

Вернуться в «32-разрядные микроконтроллеры»