MCC – K42 – настройка модуля DMA

Visits: 738


MCC – в версии v.3.95.0 и начиная ядра 4.85.0 конфигуратор предоставляет графический интерфейс для настройки модуля DMA.

Для начала: Посмотреть какая версия МСС можно в закладке версии, если у вас не так, обновите МСС и задайте последнюю версию ядра, а иначе ничего не получиться.

Модуль DMA в конфигураторе представлен как системный ресурс:

При выборе нам предоставиться окно настройки:

В первой колонки – DMA Channels – видны доступные модули. Устанавливая птичку мы можем активировать соответствующий модуль.

Во второй колонке – Scr Module – нам будет предоставлено возможность выбрать источник данных:

Выбор предоставляется из тех модулей которые вы загрузили в ресурсы проекта:

Колонка три – Src Region – выбор области памяти, тип памяти, из которой будут получены данные:

SFR – область регистров, физические регистры

GPR – область ОЗУ, оперативная память микроконтроллера

Program Flash – область флэш памяти

Data EEPROM – область EEPROM

Выбор региона будет определяться выбором источника, если вы выберите модуль (например, SPI), предоставленный во второй колонке Scr Module, то вам будет предоставлена возможность выбора только область регистров SFR

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

Рассмотрим случай когда вам необходимо читать данные из буфера расположенного в оперативной памяти, для это во второй колонке оставим выбор –NONE– далее в колонке – Src VarName – зададим имя области или буфера данных, имя массива, область данных расположенных в оперативной памяти.

В колонке – Src VarSize – зададим размер данных в байтах, например, размер нашего буфера 100 байт

В колонке – Src Mode – укажем режим работы при чтении данных с источника, в нашем варианте мы указали на начало массива расположенного в памяти, данные необходимо читать и перемещать, т.е увеличивать, поэтому выбираем значение incremented.

В колонке – Src Message Size – зададим размер наших данных, т.е размер данных который необходимо передать в приемник для выполнения одной полноценной передачи данных в байтах.

При генерации и получим два файла библиотеки dma1, при этом в заголовочном файле dma1.h будет внесен наш буфер

По умолчанию массив описан как uint16_t но мы можем это изменить указав требуемый размер данных, также мы можем его перенести в необходимые для нас файлы, но при этом необходимо будет указать через #include расположение нашего буфера.

Т.е надо понимать что параметры Src VarName и Src VarSize влияют на создание массива uint16_t video_bufer[100]; а вот параметр Src Message Size – укажет DMA какое количество байт необходимо за один цикл передать от источника к приемнику.

Теперь перейдем куда нам необходимо передавать данные.

В нашем примере введем модуль SPI1 Его выбираем в открывающемся списке из активных модулей (модуль необходимо за ранее добавить в ресурсы проекта).

В колонке – Dst Module – выбираем устройство приема данных (SPI1).

В колонке – Dst Region– выбираем тип памяти (при выборе модуля, МСС автоматически ограничит наш выбор памяти, SFR)

В колонке – Dst SFR – выбираем имя регистра куда будут перемещаться данные SPI1TXB

В колонки – Dst VarName и Dst VarSize – мы пропускаем, так как они не имеют смысл для выбора Dst Module – SPI1, Dst Region – SFR, Dst SFR – SPI1TXB. Эти колонки предназначены для описания указателей если данные будут передаваться в область памяти.

В следующих полях

В колонке – Dst Mode – выберем unchanged – указатель остается неизменным после каждого завершения передачи, потому, что у нас всего одна ячейка памяти куда переносятся данные, это передатчик модуля SPI.

В колонках – Start Trigger – и – Abort Trigger – устанавливаем значение при необходимости, когда необходимо событие для запуска модуля DMA или его остановки. Если установлено значение –, то запуск и остановка возможна, например одним из вариантов это установкой или снятием бита DGO в регистре DMAxCON0. Этот вариант напомню считается мягкой остановкой модуля, с возможностью возобновления работы с места остановки.

В этом варианте если мы запустим работу модуля DMA будет выполнена передача всего одного байта. Т.к. приемник позволяет за один раз всего один байт и по этому размер его равен единицы. Вследствие чего перезагрузка указателя остановит работу модуля DMA.

В этими настройками нам необходимо будут проверять состояние бита и когда он будет аппаратно сброшен устанавливать его для активации новой транзакции:

        while (DMA1CON0bits.DGO);
        DMA1CON0bits.DGO = 1;

Но как показала практика такой метод не совсем эффективен. Если нам необходимо выполнить за раз передачу всех данных с буфера, то необходимо организовать запуск модуля через прерывания от внешнего события или от самого себя.  Для этого воспользуемся колонкой Start Trigger для определения условия перезапуска. Выберем, что бы модуль перезапускается от после выполнения события от передачи данных передатчиком модуля SPI

Для большего понимания логики, необходимо еще настроить режим работы. Например, нам необходимо, чтобы данные из нашего буфера постоянно, после запуска DMA извлекались из буфера и передавались на SPI модуль, для этого необходим в регистре DMAxCON1: сбросить бит остановки DSTP (от счетчика приемника). При этом перезагрузка указателя модуля приемника не будет вызывать сброс флага SIRQEN разрешения запуска по внешнему событию. А когда чтение с буфера достигнет конца, после перезагрузки указателя источника SSTP, только тогда работа модуля DMA  приостановиться.

Вариант настройки регистра

В этом варианте, только после передачи всех данных, будет выполнена остановка модуля DMA.

Для запуска необходимо выполнить функцию DMA1_StartTransferWithTrigger() из библиотеки DMA или команду DMA1CON0bits.SIRQEN = 1; что в принципе одно и тоже.

По логике если и перевести SSTP в состояние not cleared передача с буфера будет, после запуска модуля, выполняться непрерывно.

 

Выполним генерацию, в регистрах вы можете увидеть следующие настройки.

void DMA1_Initialize(void)
{
    //Source Address : video_bufer
    DMA1SSA = &video_bufer;
    //Destination Address : &SPI1TXB
    DMA1DSA = &SPI1TXB;
    //DMODE unchanged; DSTP not cleared; SMR GPR; SMODE incremented; SSTP not cleared; 
    DMA1CON1 = 0x02;
    //Source Message Size : 1
    DMA1SSZ = 100;
    //Destination Message Size : 1
    DMA1DSZ = 1;
    //Start Trigger : SIRQ None; 
    DMA1SIRQ = 0x15;
    //Abort Trigger : AIRQ None; 
    DMA1AIRQ = 0x00;
	
    // Clear Destination Count Interrupt Flag bit
    PIR2bits.DMA1DCNTIF = 0; 
    // Clear Source Count Interrupt Flag bit
    PIR2bits.DMA1SCNTIF = 0; 
    // Clear Abort Interrupt Flag bit
    PIR2bits.DMA1AIF = 0; 
    // Clear Overrun Interrupt Flag bit
    PIR2bits.DMA1ORIF =0; 
    
    PIE2bits.DMA1DCNTIE = 0;
    PIE2bits.DMA1SCNTIE = 0;
    PIE2bits.DMA1AIE = 0;
    PIE2bits.DMA1ORIE = 0;
	
    //EN enabled; SIRQEN disabled; DGO not in progress; AIRQEN disabled; 
    DMA1CON0 = 0x80;
	
}

При компиляции препроцессор выдаст сообщение

mcc_generated_files/dma1.c:62:13: warning: incompatible pointer to integer conversion assigning to 'volatile __uint24' (aka 'volatile unsigned __int24') from 'uint16_t (*)[100]' [-Wint-conversion]
    DMA1SSA = &video_bufer;
            ^ ~~~~~~~~~~~~
mcc_generated_files/dma1.c:64:13: warning: incompatible pointer to integer conversion assigning to 'volatile unsigned short' from 'volatile unsigned char *' [-Wint-conversion]
    DMA1DSA = &SPI1TXB;

Для этого рекомендую изменить строки

    //Source Address : video_bufer
    DMA1SSA = (uint24_t)&video_bufer;
    //Destination Address : &SPI1TXB
    DMA1DSA = (uint16_t)&SPI1TXB;

 

Более подробно про модуль DMA в PIC18 читаем в статье PIC18 – модуль DMA


Это может быть интересно


  • LCD драйвер – UC1601sLCD драйвер – UC1601s
    Visits: 1566 http://svetomuzyka.narod.ru/project/UC1601s.html Читайте обновление на http://catcatcat.d-lan.dp.ua/?page_id=178 В данный момент можно приобрести в ООО “Гамма” несколько типов индикаторов на драйвере UC1601s. RDX0048-GC, RDX0077-GS, RDX0154-GC и RDX0120-GC выполнены по технологии COG.
  • Простой цифровой милливольтметр постоянного токаПростой цифровой милливольтметр постоянного тока
    Visits: 4034 Простой цифровой вольтметр постоянного тока. Три диапазона измерений с автоматическим переключением 1 – 0,001 – 0,999 V, 2 – 0,01-9,99 V, 3 – 0,1-99,9. Четыре управляемых выхода с возможностью задания функции контроля …
  • Проблемы классической светомузыкиПроблемы классической светомузыки
    Visits: 2043 Светомузыка – что это такое? Определение: Светомузыка  (жаргонное: цветомузыка)  — вид искусства, основанный на способности человека ассоциировать звуковые ощущения со световыми восприятиями. Такое явление в неврологии получило название …
  • LED модуль P10 (1R) V706ALED модуль P10 (1R) V706A
    Visits: 7643 Это еще одно чудо от китайского брата. Это монохромные матрицы, называются они P10 (1R) V706A, ну типа  R-красные, но не верьте паяют светики и зеленые и синие, в общем …
  • WiFi ESP8266 – AT команды связанные с функцией Wi-FiWiFi ESP8266 – AT команды связанные с функцией Wi-Fi
    Visits: 5230 AT команды связанные с функцией Wi-Fi Функции Wi-Fi подключения, запускаться из командной строки Команда Описание  1 AT+CWMODE Проверка, настройка режима работы Wi-Fi (sta/AP/sta+AP), (не рекомендуется для новых проектов). 2 …
  • Проект с использованием MCC часть 12-2Проект с использованием MCC часть 12-2
    Visits: 1003 Настало время для изучения шины I2C. Изучать будем на примере работы с индикатором RET012864E. Что изменили со старой схемы: В прошлой теме я затупил и не добавил подтягивающие резисторы …
  • Проект с использованием MCC часть 04Проект с использованием MCC часть 04
    Visits: 1107 Теперь простого горения светиков нам не достаточно, заставим их мигать. Для начала используем первобытно простой способ, но достаточно простой. Используем функции delay, напрягаться откуда они берутся не будем, самое …
  • Customs codes for exportCustoms codes for export
    Visits: 88   Митні коди (HS Code) для надсилання посилок за кордон. Для відправки товару за кордон на сьогодні необхідно зазначати митні коди. Часто визначення коду займає багато часу. Для …
  • Проект с использованием MCC часть 10Проект с использованием MCC часть 10
    Visits: 797 Алгоритм управления освещением от нажатия кнопки. Обработка удержания кнопки: Мы должны проверить кнопка в настоящий момент нажата и флаг удержания установлен, если да Проверить таймер удержания “отработал” – …
  • MCC PIC24 – модуль OUTPUT COMPARE – режиме ШИМMCC PIC24 – модуль OUTPUT COMPARE – режиме ШИМ
    Visits: 1100 Во многих системах управления, для формирования управляющих сигналов требуется модуль ШИМ, он позволяет не только формировать импульсы заданной длительности, но и с применением обычного RC фильтра строить простые …



 

Поделись этим!

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

Продолжайте читать

НазадДалее