Dma là gì

 – DMA (Direct memory access): là 1 trong những hiệ tượng truyền tài liệu vận tốc cao trường đoản cú nước ngoài vi cho tới cỗ nhớ tương tự như trường đoản cú bộ nhớ lưu trữ cho tới bộ lưu trữ. Dữ liệu rất có thể được dịch chuyển một biện pháp hối hả nhưng ko cần tới tác vụ trường đoản cú CPU, tiết kiệm chi phí tài nguim CPU cho những chuyển động không giống.

You watching: Dma là gì

– Trong những project mcu bạn phải đọc với ghi dữ liệu. Chẳng hạn bạn cần phát âm dữ liệu tự nước ngoài vi nhỏng ADC và ghi những quý hiếm gọi được vào RAM. Hoặc trong trường hợp không giống bạn cần gửi 1 kân hận tài liệu thực hiện SPI. khi kia bạn phải tiến hành gọi dữ liệu tự RAM và ghi nó vào thanh khô ghi SPI data. Bình thường nếu thực hiện cpu để triển khai Việc này thì nó sẽ bị mất một khoảng thời hạn đáng chú ý nhằm cách xử lý. Trong phần nhiều ngôi trường đúng theo này, nhằm tách bài toán cpu bận rộn với giành thời gian đến đầy đủ thao tác không giống thì làm việc phần đông mcu thịnh hành đều sở hữu cung cấp DMA (direct memory access). Nó vẫn triển khai bài toán tiếp xúc với memory cơ mà không đề nghị cần sử dụng mang lại cpu.

* DMA của STM32 :

STM32 tất cả 2 bộ DMA cùng với 12 kênh (7 kênh DMA1 và 5 kênh DMA2), mỗi cỗ cai quản vấn đề truy vấn bộ nhớ từ một hoặc những ngoại vi. DMA cũng có thể có chức năng phân xử độ ưu tiên giữa các DMA request.

– 12 kênh DMA độc lập, hoàn toàn có thể thiết lập cấu hình được. 7 kênh DMA1 với 5 kênh DMA2

– Software trigger được hỗ trợ cho từng kênh, và được xây dựng bởi vì ứng dụng.

– Độ ưu tiên giữa những kênh DMA hoàn toàn có thể lập trình sẵn vị ứng dụng (tất cả 4 cấp ưu tiên là very high, high, medium, low) hoặc Hartware.

– Prúc nằm trong vào form size thân mối cung cấp với đích (byte, half word, word). Địac chỉ nguồn/đích yêu cầu cân xứng cùng với kích thước dữ liệu.

– Hỗ trợ truyền thiết lập giữa:

+ Memory lớn memory

+ Peripheral to lớn memory

+ Memory lớn peripheral

+ Peripheral to peripheral

– cũng có thể truy vấn vào Flash, Sram, APB1, APB2 cùng AHB như mối cung cấp cùng đích.

– Dữ liệu truyền dấn cung ứng tới 65536

 

 


*

2. Tìm gọi cách thiết kế DMA trong STM32 thông qua ví dụ nỗ lực thể

Mỗi channel được điều khiển và tinh chỉnh bởi 4 thanh hao ghi : Memory address, peripheral address, number of data and configuration. Và toàn bộ những channel đều phải có 2 tkhô hanh ghi được giành riêng là : DMA interrupt status register & interrupt flag clear register. Các channel của DMA hoàn toàn có thể tạo ra 3 interupt là : transfer finished, half-finished và transfer error.

Bắt đầu với một ví dụ là tiến hành các bước chuyển tài liệu giữa 2 mảng. Trong số đó bao gồm 2 trường hợp là có thực hiện DMA và không sử dụng DMA nhưng nhằm cpu triển khai bình thường. Sau đó đối chiếu thời hạn trong 2 ngôi trường thích hợp bên trên.

Trước lúc bước vào phân tích code của ví dụ thì mình đang tò mò vươn lên là cấu trúc của DMA đã có được khái niệm sẵn bao hàm phần nhiều tkhô nóng ghi công dụng ra sao :

Cấu trúc đổi mới init DMA có 11 yếu tố cùng ý ngh ĩa của từng yếu tắc như sau :– DMA_PeripheralBaseAddr , DMA_MemoryBaseAddr : Xác định địa chỉ của ngoại vi với liên quan của bộ nhớ cho DMA channel, xuất xắc nói cách khác là xác định tương tác nguồn và đích trong câu hỏi thương lượng dữ liệu. –DMA_DIR : Chọn hướng đưa tài liệu từ bỏ nước ngoài vi mang đến bộ lưu trữ hay tự bộ nhớ đến ngoại vi.

/** defgroup DMA_data_transfer_direction **/ #define DMA_DIR_PeripheralDST ((uint32_t)0x00000010) #define DMA_DIR_PeripheralSRC ((uint32_t)0x00000000)

DMA_BufferSize : Kích thước của mảng dữ liệu.

See more: Thoi Trang Va Cuoc Song, Sự Kiện, Tin Hot Làng Thời Trang Và Cuộc Sống Vtv3

DMA_PeripheralInc, DMA_MemoryInc :

+ DMA_PeripheralInc : Đối cùng với ngoại vi chúng ta nên disable mode này vày nếu bạn bật mode này thì các lần chuyển tài liệu thì địa chỉ ngoại vi sẽ tăng đột biến, vấn đề này là không quan trọng với vô cùng nguy nan ví như nh ư chúng ta ko nắm vững can hệ trỏ mang đến tiếp theo. + DMA_MemoryInc : Đối cùng với memory bạn cần enable mode này, mỗi một khi chuy ển thay đổi xảy ra bạn phải tăng thúc đẩy bộ lưu trữ của chúng ta bởi ví dụ biến chuyển ADCValue tất cả cho 3 bộ phận, nếu như không tăng liên can lên thì chỉ độc nhất vô nhị có đổi mới ADCValue là gồm dữ liệu.– DMA_PeripheralDataSize , DMA_MemoryDataSize : Chọn kích thước mảng dữ liệu ADCValue tất cả : Byte, Haftword và Word.

/** defgroup DMA_peripheral_data_size */ #define DMA_PeripheralDataSize_Byte ((uint32_t)0x00000000) #define DMA_PeripheralDataSize_HalfWord ((uint32_t)0x00000100) #define DMA_PeripheralDataSize_Word ((uint32_t)0x00000200)– DMA_Mode : Circular mode & NonCircular mode

+ Chọn mode DMA cơ chế vòng tròn, tức là việc đổi khác thường xuyên lặp lại. khi circular mode được actived thì số dữ liệu được transfer đã auto reload lại cùng với đều tùy chỉnh cấu hình đã có được lập trình theo các thông số config cho channel. + Nếu channel được config làm việc cơ chế concircular mode thì đang không tồn tại DMA request được chế tạo sau mỗi lần transfer. /** defgroup DMA_circular_normal_mode */ #define DMA_Mode_Circular ((uint32_t)0x00000020) #define DMA_Mode_Normal ((uint32_t)0x00000000)– DMA_Priority : Xác định độ ưu tiên của kênh DMA ,có 4 độ ưu tiên bao gồm :

+ DMA_Priority_High + DMA_Priority_Low + DMA_Priority_Medium + DMA_Priority_VeryHigh

DMA_M2M : Kênh DMA cũng hoàn toàn có thể được kích hoạt nhưng mà ko đề xuất request từ bỏ nước ngoài vi, chế độ này được gọi là memory to lớn memory mode. Nếu bit MEM2MEM vào thanh ghi DMA_CCRx được mix thì channel đã init transfer ngay sau khoản thời gian được enable bằng software tức thị enable bit EN trong tkhô cứng ghi DMA_CCRx. Quá trình transfer đang chấm dứt mỗi lúc thanh hao ghi DMA_CNDTRx zero. Memory lớn memory mode không được thực hiện bên cạnh đó cùng với Circular mode./** defgroup DMA_memory_to_memory **/#define DMA_M2M_Enable ((uint32_t)0x00004000)#define DMA_M2M_Disable ((uint32_t)0x00000000)Đây là code DMA gửi dữ liệu vào trường phù hợp tự memory đến memory :

#include “stm32f10x.h”#include “leds.h”#define ARRAYSIZE 800volatile uint32_t status = 0;volatile uint32_t i;int main(void){//initialize source & destination arraysuint32_t source;uint32_t destination;//initialize arrayfor (i=0; i Bắt đầu phân tích :

Thứ nhất họ tạo nên 2 mảng dữ liệu là : source cùng destination. Kích thước của mảng được xác định vì chưng ARRAYSIZE, trong ví dụ này kích thước là 800.Trong ví dụ này,ta áp dụng trạng thái của Led nhằm báo hiệu quy trình transfer tài liệu start với stop vào cả hai mode : DMA với CPU. 

+ trước hết ta buộc phải cấu hình enable clock mang lại DMA1 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE).

+ Sau kia ban đầu cấu hình thông qua kết cấu DMA_InitStructure nlỗi đang so sánh bên trên. Trong ví dụ này ta chọn DMA1 channel1, call hàm DMA_DeInit(DMA1_Channel1) để chắc hẳn rằng rằng DMA được remix về cực hiếm mang định lúc đầu.

+ Sau đó lựa chọn DMA mode memory to lớn memory(DMA_InitStructure.DMA_M2M = DMA_M2M_Enable)

+ Chọn normal DMA mode xuất xắc có cách gọi khác là nonCircular mode(DMA_InitStructure.DMA_Mode = DMA_Mode_Normal).

+ Chọn chế độ ưu tiên mang đến kênh DMA này laafe Medium (DMA_InitStructure.DMA_Priority = DMA_Priority_Medium).

+ Chọn kích thước mảng tài liệu nhằm transfer là 32-bit world (DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word). Tương từ đối với cả peripheral với memory address.

Crúc ý : Nếu form size dữ liệu của 2 yếu tố bên trên rất khác nhau,chẳng hạn 32-bit source với 8-bit destination thì DMA sẽ tiến hành thành 4 chu kỳ cùng với mỗi chu kỳ là 8 bit.

+ Sau Lúc đang thông số kỹ thuật can hệ source với destination, cũng như kích cỡ tài liệu nhằm gửi. Ta áp dụng hàm

DMA_Init(DMA_Channel1, &DMA_InitStructure) nhằm init những thông số kỹ thuật thông số kỹ thuật bên trên vào tkhô nóng ghi.

+ Bây giờ thì DMA rất có thể chuẩn bị để transfer tài liệu, bất kể khi nào lệnh sau được thực thi DMA_Cmd(DMA_Channel1, ENABLE).

+ Để bắt interrupt lúc quy trình DMA transfer complete trên channel1. Ta cấu hình interrupt nhỏng sau :

NVIC_InitTypeDef NVIC_InitStructure;

//Enable DMA1 channel IRQ Channel */

NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

Trước Khi bắt đầu chuyển đổi bởi DMA thì ta bật led on nhằm báo tâm lý bắt đầu LEDToggle(LEDG) . khi quy trình biến hóa vừa dứt thì nó sẽ tạo nên ra 1 interrupt complete cùng thực hiển hòn đảo tâm lý led vào interrupt này nhằm báo cáo.

See more: Phiên Bản Phần Mềm Kế Toán Unesco Mien Phi Ên Bản Phần Mềm Unesco Miễn Phí (5

voidDMA1_Channel1_IRQHandler(void)

//Test on DMA1 Channel1 Transfer Complete interrupt

if(DMA_GetITStatus(DMA1_IT_TC1))

status=1;

LEDToggle(LEDG);

//Clear DMA1 Channel1 Half Transfer, Transfer Complete và Global interrupt pending bits

DMA_ClearITPendingBit(DMA1_IT_GL1);

+ bởi thế chính là code dồn phần đưa tài liệu bởi DMA ,tiếp sau là phần đưa dữ liệu bằng CPU bình thường cùng ta cũng thực hiện tâm trạng của LED để quan gần kề thời hạn biến hóa.

//wait for DMA transfer lớn be finished

while(status==0) ;

LEDToggle(LEDB);

for (i=0; i

destination=source;

LEDToggle(LEDB);

– Trong ví dụ này, LEDG (DMA) được liên kết mang lại GPIOC pin 9 cùng LEDB (CPU) được kết nối đến GPIOC pin 8, Để quan lại liền kề rõ rộng quy trình transfer ta kết nối 2 pin này với OSC nlỗi sau :