Developer от Бога

DV

четверг, 6 июля 2017 г.

STM32. DMA controller

DMA Контроллер - блок , обеспечивающий коммутацию между периферийными блоками и оперативной, flash и другой памятью без использования ресурсов центрального процессора. Главная его задача обеспечить высокую скорость передачи данных из периферии в память, из памяти в периферию, и из памяти в память не отвлекая на эту рутинную работу процессор, который в это время может выполнять более вычислительные задачи.
DMA контроллер содержит 8 потоков для данных , в каждом потоке по 8 каналов, на которых находятся источники данных: периферия и память. DMA контроллер не может через один поток пропускать два и больше канала (два и больше разных источника данных - от периферийных блоков или памяти) в один момент времени, так как это нарушает саму суть DMA - обеспечить максимальную скорость передачи данных. В принципе это и не нужно, так как неважно будут ли два источника передавать данные одновременно или по очереди - суммарная скорость теоретически будет одинакова.
Как уже говорилось в прошлых статьях, любой периферийный блок представляет собой совершенно независимое устройство, хотя и интегрированное в общий корпус с процессором. Поэтому передачу и контроль за передачей данных спокойно можно возложить на DMA, а не отвлекать центральный процессор чтоб подсчитывать байты, следить за адресами и передачей данных в целом. Роль процессора заключается только в том, чтоб указать DMA, сколько и куда нужно переместить данных. После проделанной работы DMA сообщит процессору что все готово и можно действовать с учетом дальнейшей программы.

//......DMA....
//.............
#define DMA1_RCC *((uint32_t*)0x40023830)//|=0x200000;
#define DMA_LISR *((uint32_t*)0x40026000)
#define DMA_HISR *((uint32_t*)0x40026004)
#define DMA_LIFCR *((uint32_t*)0x40026008)
#define DMA_HIFCR *((uint32_t*)0x4002600C)
#define DMA_S0CR *((uint32_t*)0x40026010)
#define DMA_S0NDTR *((uint32_t*)0x40026014)
#define DMA_S0PAR *((uint32_t*)0x40026018)
#define DMA_S0M0AR *((uint32_t*)0x4002601C)
#define DMA_S0M1AR *((uint32_t*)0x40026020)
#define DMA_S0FCR *((uint32_t*)0x40026024)
#define DMA_S1CR *((uint32_t*)0x40026028)
#define DMA_S1NDTR *((uint32_t*)0x4002602C)
#define DMA_S1PAR *((uint32_t*)0x40026030)
#define DMA_S1M0AR *((uint32_t*)0x40026034)
#define DMA_S1M1AR *((uint32_t*)0x40026038)
#define DMA_S1FCR *((uint32_t*)0x4002603C)
#define DMA_S2CR *((uint32_t*)0x40026040)
#define DMA_S2NDTR *((uint32_t*)0x40026044)
#define DMA_S2PAR *((uint32_t*)0x40026048)
#define DMA_S2M0AR *((uint32_t*)0x4002604C)
#define DMA_S2M1AR *((uint32_t*)0x40026050)
#define DMA_S2FCR *((uint32_t*)0x40026054)
#define DMA_S3CR *((uint32_t*)0x40026058)
#define DMA_S3NDTR *((uint32_t*)0x4002605C)
#define DMA_S3PAR *((uint32_t*)0x40026060)
#define DMA_S3M0AR *((uint32_t*)0x40026064)
#define DMA_S3M1AR *((uint32_t*)0x40026068)
#define DMA_S3FCR *((uint32_t*)0x4002606C)
#define DMA_S4CR *((uint32_t*)0x40026070)
#define DMA_S4NDTR *((uint32_t*)0x40026074)
#define DMA_S4PAR *((uint32_t*)0x40026078)
#define DMA_S4M0AR *((uint32_t*)0x4002607C)
#define DMA_S4M1AR *((uint32_t*)0x40026080)
#define DMA_S4FCR *((uint32_t*)0x40026084)
#define DMA_S5CR *((uint32_t*)0x40026088)
#define DMA_S5NDTR *((uint32_t*)0x4002608C)
#define DMA_S5PAR *((uint32_t*)0x40026090)
#define DMA_S5M0AR *((uint32_t*)0x40026094)
#define DMA_S5M1AR *((uint32_t*)0x40026098)
#define DMA_S5FCR *((uint32_t*)0x4002609C)
#define DMA_S6CR *((uint32_t*)0x400260A0)
#define DMA_S6NDTR *((uint32_t*)0x400260A4)
#define DMA_S6PAR *((uint32_t*)0x400260A8)
#define DMA_S6M0AR *((uint32_t*)0x400260AC)
#define DMA_S6M1AR *((uint32_t*)0x400260B0)
#define DMA_S6FCR *((uint32_t*)0x400260B4)
#define DMA_S7CR *((uint32_t*)0x400260B8)
#define DMA_S7NDTR *((uint32_t*)0x400260BC)
#define DMA_S7PAR *((uint32_t*)0x400260C0)
#define DMA_S7M0AR *((uint32_t*)0x400260C4)
#define DMA_S7M1AR *((uint32_t*)0x400260C8)
#define DMA_S7FCR *((uint32_t*)0x400260CC)

Комментариев нет:

Отправить комментарий