Dma là gì ? định nghĩa, ví dụ, giải thích direct market access

 – DMA (Direct memory access): là một lý lẽ truyền tài liệu tốc độ cao tự nước ngoài vi tới cỗ nhớ tương tự như từ bỏ bộ nhớ lưu trữ cho tới bộ nhớ. Dữ liệu có thể được dịch rời một cách gấp rút nhưng mà ko cần tới tác vụ từ CPU, tiết kiệm ngân sách và chi phí tài nguyên CPU cho những vận động không giống.quý khách sẽ xem: Dma là gì

– Trong những project mcu bạn cần phát âm cùng ghi tài liệu. Chẳng hạn bạn cần gọi dữ liệu từ bỏ nước ngoài vi như ADC với ghi các giá trị phát âm được vào RAM. Hoặc vào ngôi trường phù hợp không giống bạn cần gửi 1 khối hận dữ liệu thực hiện SPI. khi đó bạn phải thực hiện phát âm dữ liệu trường đoản cú RAM và ghi nó vào thanh ghi SPI data. Bình thường xuyên giả dụ sử dụng cpu để làm việc này thì nó sẽ bị mất một khoảng thời hạn đáng chú ý nhằm xử trí. Trong mọi ngôi trường phù hợp này, để tránh Việc cpu mắc cùng giành thời gian cho số đông thao tác làm việc không giống thì sinh sống đầy đủ mcu thịnh hành đều phải có cung cấp DMA (direct memory access). Nó đã triển khai vấn đề tiếp xúc với memory mà lại không bắt buộc dùng mang lại cpu.Quý khách hàng sẽ xem: Dma là gì

* DMA của STM32 :

STM32 bao gồm 2 bộ DMA với 12 kênh (7 kênh DMA1 cùng 5 kênh DMA2), mỗi cỗ quản lý Việc truy vấn bộ nhớ lưu trữ xuất phát điểm từ 1 hoặc những nước ngoài vi. DMA cũng có tính năng phân xử độ ưu tiên giữa những DMA request.Quý Khách đang xem: Dma là gì

– 12 kênh DMA tự do, hoàn toàn có thể thiết lập được. 7 kênh DMA1 cùng 5 kênh DMA2

– Software trigger được cung ứng cho từng kênh, với được thiết kế vì chưng phần mềm.

You watching: Dma là gì ? định nghĩa, ví dụ, giải thích direct market access

Quý khách hàng sẽ xem: Dma là gì

– Độ ưu tiên giữa các kênh DMA hoàn toàn có thể lập trình sẵn bởi vì ứng dụng (bao gồm 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à đích (byte, half word, word). Địac chỉ nguồn/đích cần tương xứng cùng với kích cỡ dữ liệu.

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

+ Memory to lớn memory

+ Peripheral lớn memory

+ Memory lớn peripheral

+ Peripheral khổng lồ peripheral

– cũng có thể truy cập vào Flash, Sram, APB1, APB2 và AHB nlỗi mối cung cấp và đích.

– Dữ liệu truyền dấn hỗ trợ cho tới 65536

 

 


*

2. Tìm hiểu cách lập trình sẵn DMA trong STM32 trải qua ví dụ thế thể

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

See more: Những Bài Hát Bolero Song Ca Hay Nhất 2021, Những Bài Hát Song Ca Bolero Hay Nhất (Vol

Trước lúc bước vào so sánh code của ví dụ thì mình vẫn tìm hiểu biến chuyển cấu tạo của DMA đã làm được có mang sẵn bao hàm đều tkhô cứng ghi công dụng ra làm sao :

Cấu trúc thay đổi init DMA bao gồm 11 nguyên tố với ý ngh ĩa của từng nguyên tố nlỗi sau :– DMA_PeripheralBaseAddr , DMA_MemoryBaseAddr : Xác định can hệ của ngoại vi cùng liên quan của bộ nhớ lưu trữ mang đến DMA channel, tuyệt có thể nói là xác minh shop mối cung cấp cùng đích vào câu hỏi Bàn bạc dữ liệu. –DMA_DIR : Chọn phía chuyển tài liệu từ bỏ ngoại vi cho bộ nhớ giỏi tự bộ nhớ lưu trữ mang đến ngoại vi.

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

DMA_PeripheralInc, DMA_MemoryInc :

+ DMA_PeripheralInc : Đối với ngoại vi bạn nên disable mode này bởi vì nếu như khách hàng nhảy mode này thì mỗi lần chuyển dữ liệu thì liên can nước ngoài vi vẫn tăng dần, vấn đề này là không quan trọng với khôn cùng nguy khốn nếu như nh ư các bạn không nắm rõ địa chỉ trỏ đến tiếp theo. + DMA_MemoryInc : Đối 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 cần tăng cửa hàng bộ nhớ của chúng ta bởi vì ví dụ vươn lên là ADCValue bao gồm mang lại 3 phần tử, nếu như không tăng can hệ lên thì chỉ độc nhất vô nhị gồm phát triển thành ADCValue là có dữ liệu.– DMA_PeripheralDataSize , DMA_MemoryDataSize : Chọn kích cỡ mảng tài liệu ADCValue gồm : Byte, Haftword với Word.

/** defgroup DMA_peripheral_data_form 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 chính sách vòng tròn, có nghĩa là Việc chuyển đổi thường xuyên lặp lại. khi circular mode được actived thì số dữ liệu được transfer sẽ tự động hóa reload lại cùng với phần nhiều cấu hình thiết lập đã có được lập trình sẵn theo mọi thông số config mang đến channel. + Nếu channel được config ở chế độ concircular mode thì sẽ không tồn tại DMA request được chế tạo ra 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 ,gồm 4 độ ưu tiên bao hà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 mà lại ko buộc phải request trường đoản cú nước ngoài vi, chính sách này được hotline là memory khổng lồ memory mode. Nếu bit MEM2MEM trong tkhô nóng ghi DMA_CCRx được set thì channel đang init transfer tức thì sau khoản thời gian được enable bằng software tức thị enable bit EN trong tkhô nóng ghi DMA_CCRx. Quá trình transfer đang hoàn thành mỗi một khi tkhô nóng ghi DMA_CNDTRx zero. Memory lớn memory mode không được sử dụng 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 chuyển dữ liệu trong ngôi trường đúng theo trường đoản cú 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 so sánh :

Trước tiên họ tạo ra 2 mảng tài liệu là : source và destination. Kích thước của mảng được khẳng định bởi vì ARRAYSIZE, trong ví dụ này form size là 800.Trong ví dụ này,ta thực hiện tâm trạng của Led nhằm báo cáo quá trình transfer tài liệu start cùng stop vào cả 2 mode : DMA cùng CPU. 

+ Sau kia chọn DMA mode memory khổng lồ memory(DMA_InitStructure.DMA_M2M = DMA_M2M_Enable)

+ Chọn normal DMA mode hay nói một cách khác là nonCircular mode(DMA_InitStructure.DMA_Mode = DMA_Mode_Normal).

+ Chọn chế độ ưu tiên mang lại 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ừ bỏ đối với cả peripheral với memory address.

See more: Bạn Đã Biết Chiều Cao Của Snsd Là Bao Nhiêu Chưa?

+ Sau khi sẽ cấu hình cửa hàng source và destination, tương tự như form size tài liệu để gửi. Ta sử dụng hàm

+ Để bắt interrupt lúc quy trình DMA transfer complete trên channel1. Ta cấu hình interrupt như 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 lúc bước đầu đổi khác bằng DMA thì ta nhảy led on để báo tinh thần ban đầu LEDToggle(LEDG) . lúc quy trình biến đổi vừa hoàn thành thì nó sẽ tạo nên ra 1 interrupt complete và thực hiển đảo tâm trạng led vào interrupt này nhằm báo cho biết.

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 & Global interrupt pending bits

DMA_ClearITPendingBit(DMA1_IT_GL1);

//wait for DMA transfer to 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 cho GPIOC pin 9 với LEDB (CPU) được liên kết mang lại GPIOC pin 8, Để quan tiền ngay cạnh rõ rộng quy trình transfer ta kết nối 2 pin này với OSC như sau :