Dma Là Gì

     
vincitysdaimo.com chia sẻ mọi đồ vật về game / phần mềm / Thủ Thuật giành riêng cho máy tính với phần lớn tin hay nhất và phần nhiều thông tin kỹ năng hỏi đáp.

 – DMA (Direct memory access): là một cơ chế truyền dữ liệu vận tốc cao từ nước ngoài vi tới cỗ nhớ cũng như từ bộ nhớ tới bộ nhớ. Dữ liệu hoàn toàn có thể được dịch chuyển một cách lập cập mà ko cần tới tác vụ trường đoản cú CPU, tiết kiệm tài nguyên CPU cho các chuyển động khác.

Bạn đang xem: Dma là gì

Đang xem: Dma là gì

– trong vô số nhiều project mcu bạn cần đọc và ghi dữ liệu. Chẳng hạn bạn yêu cầu đọc dữ liệu từ ngoại vi như ADC và ghi những giá trị gọi được vào RAM. Hoặc vào trường hợp khác bạn cần gửi 1 khối tài liệu sử dụng SPI. Lúc đó bạn cần phải thực hiện tại đọc dữ liệu từ RAM và ghi nó vào thanh ghi SPI data. Thông thường nếu thực hiện cpu để triển khai việc này thì nó sẽ ảnh hưởng mất một khoảng thời hạn đáng kể để xử lý. Một trong những trường phù hợp này, để tránh việc cpu bận bịu và giành thời hạn cho những thao tác làm việc khác thì ở đều mcu phổ cập đều có hỗ trợ DMA (direct memory access). Nó sẽ triển khai việc tiếp xúc với memory nhưng không buộc phải dùng mang đến cpu.

* DMA của STM32 :

STM32 gồm 2 bộ DMA với 12 kênh (7 kênh DMA1 và 5 kênh DMA2), mỗi bộ quản lý việc truy nã cập bộ nhớ lưu trữ từ một hoặc những ngoại vi. DMA cũng có tính năng phân xử độ ưu tiên giữa những DMA request.

– 12 kênh DMA độc lập, bao gồm thể tùy chỉnh cấu hình được. 7 kênh DMA1 cùng 5 kênh DMA2

– Software trigger được hỗ trợ cho từng kênh, và được lập trình bởi vì phần mềm.

– Độ ưu tiên giữa những kênh DMA có thể lập trình bởi phần mềm (có 4 cung cấp ưu tiên là very high, high, medium, low) hoặc phần cứng.

– dựa vào vào size giữa nguồn và đích (byte, half word, word). Địac chỉ nguồn/đích phải tương xứng với kích thước dữ liệu.

– cung cấp truyền cài giữa:

+ Memory khổng lồ memory

+ Peripheral to lớn memory

+ Memory to peripheral

+ Peripheral to peripheral

– hoàn toàn có thể truy cập vào Flash, Sram, APB1, APB2 cùng AHB như nguồn với đích.

– tài liệu truyền nhận hỗ trợ tới 65536

 

 

*

2. Tìm hiểu cách lập trình sẵn DMA vào STM32 thông qua ví dụ cụ thể

từng channel được tinh chỉnh và điều khiển bởi 4 thanh ghi : Memory address, peripheral address, number of data and configuration. Và tất cả các channel đều phải sở hữu 2 thanh ghi được giành riêng rẽ là : DMA interrupt status register và 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 & transfer error.

bước đầu với 1 lấy ví dụ như là thực hiện các bước chuyển tài liệu giữa 2 mảng. Trong đó có 2 trường hợp là có sử dụng DMA với không áp dụng DMA nhưng mà để cpu thực hiện bình thường. Tiếp nối so sánh thời gian trong 2 trường đúng theo trên.

trước lúc đi vào so sánh code của ví dụ thì mình sẽ tò mò biến cấu trúc của DMA sẽ được tư tưởng sẵn bao hàm những thanh ghi chức năng như vắt nào :

Cấu trúc đổi thay init DMA bao gồm 11 thành phần với ý ngh ĩa của từng yếu tắc như sau :– DMA_PeripheralBaseAddr , DMA_MemoryBaseAddr : Xác định địa chỉ cửa hàng của ngoại vi và địa chỉ cửa hàng của bộ nhớ lưu trữ cho DMA channel, hay nói theo cách khác là xác định địa chỉ cửa hàng nguồn và đích trong việc trao đổi dữ liệu. –DMA_DIR : tính hướng chuyển tài liệu từ ngoại vi đến bộ lưu trữ hay từ bộ nhớ lưu trữ đế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 cỡ của mảng dữ liệu.

DMA_PeripheralInc, DMA_MemoryInc :

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

+ lựa chọn mode DMA cơ chế vòng tròn, tức là việc thay đổi liên tục lặp lại. Lúc circular mode được actived thì số dữ liệu được transfer sẽ tự động hóa reload lại cùng với những thiết lập cấu hình đã được lập trình theo những thông số config mang đến channel. + nếu channel được config ở chính sách concircular mode thì sẽ không tồn tại DMA request được tạo thành 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 rất có thể được kích hoạt mà không bắt buộc request từ nước ngoài vi, chế độ này được hotline là memory to memory mode. Giả dụ bit MEM2MEM trong thanh ghi DMA_CCRx được mix thì channel đã init transfer ngay sau khoản thời gian được enable bởi software tức là enable bit EN trong thanh ghi DMA_CCRx. Quy trình transfer sẽ chấm dứt mỗi khi thanh ghi DMA_CNDTRx zero. Memory to lớn memory mode ko được sử dụng đồng thời 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 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 and destination arraysuint32_t source;uint32_t destination;//initialize arrayfor (i=0; i bước đầu phân tích :

Đầu tiên chúng ta tạo ra 2 mảng tài liệu là : source và destination. Kích cỡ của mảng được xác định bởi ARRAYSIZE, trong ví dụ như này form size là 800.Trong lấy ví dụ này,ta thực hiện trạng thái của Led để báo hiệu quy trình transfer tài liệu start với stop trong cả hai mode : DMA với CPU. 

+ Đầu tiên ta phải cấu hình enable clock cho DMA1 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE).

Xem thêm: Làm Cơm Trộn Hàn Quốc Đơn Giản Tại Nhà, Làm Cơm Trộn Hàn Quốc Thật Dễ Dàng Chỉ Với 4 Bước

+ Sau đó bắt đầu cấu hình thông qua kết cấu DMA_InitStructure như đã phân tích bên trên. Trong lấy một ví dụ này ta chọn DMA1 channel1, hotline hàm DMA_DeInit(DMA1_Channel1) để chắc chắn rằng rằng DMA được reset về quý hiếm mặc định ban đầu.

+ kế tiếp chọn DMA mode memory khổng lồ memory(DMA_InitStructure.DMA_M2M = DMA_M2M_Enable)

+ lựa chọn normal DMA mode hay còn gọi 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 dữ liệu để transfer là 32-bit world (DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word). Tương tự với tất cả peripheral cùng memory address.

Chú ý : Nếu form size dữ liệu của 2 nhân tố trên không giống 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ỳ với mỗi chu kỳ là 8 bit.

+ sau khi đã cấu hình showroom source cùng destination, cũng giống như kích thước dữ liệu để gửi. Ta sử dụng hàm

DMA_Init(DMA_Channel1, &DMA_InitStructure) để init các thông số kỹ thuật cấu hình bên trên vào thanh ghi.

+ bây giờ thì DMA có thể sẵn sàng nhằm transfer dữ liệu, bất cứ lúc nào lệnh sau được tiến hành DMA_Cmd(DMA_Channel1, ENABLE).

+ Để bắt interrupt khi quá trình DMA transfer complete bên 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 khi bắt đầu chuyển đổi bằng DMA thì ta bật led on nhằm báo trạng thái bước đầu LEDToggle(LEDG) . Khi quá trình thay đổi vừa dứt thì nó sẽ tạo nên ra 1 interrupt complete và thực hiển đảo trạng thái led trong interrupt này nhằm báo hiệu.

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

DMA_ClearITPendingBit(DMA1_IT_GL1);

+ do đó đó là code dồn phần chuyển tài liệu bằng DMA ,tiếp theo là phần chuyển dữ liệu bằng CPU bình thường và ta cũng áp dụng trạng thái của LED để quan sát thời gian chuyển đổi.

Xem thêm: Quảng Cáo Pia Là Gì ? 1 Pia Da Bò Bằng Bao Nhiêu M2? Quảng Cáo Pia Là Gì

//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ụ như này, LEDG (DMA) được kết nối đến GPIOC sạc 9 và LEDB (CPU) được liên kết đến GPIOC pin sạc 8, Để quan tiếp giáp rõ hơn quá trình transfer ta kết nối 2 pin này với OSC như sau :

*

– Transfer sử dụng DMA mất 214μs:

*

– trong những khi sử dụng CPU để copy memory memory mất 544μs (gần cấp 3 lần so với thực hiện DMA):

*

– lấy ví dụ này cho thấy thêm tốc độ truyền tài liệu nhanh hơn đáng kể so với việc thực hiện CPU thông thường và lợi ích lớn tuyệt nhất là CPU trọn vẹn rảnh rổi trong lúc transfer và hoàn toàn có thể làm trọng trách khác hoặc chỉ đơn giản dễ dàng là vào chính sách sleep mode.

– hy vọng ví dụ này giúp bạn có một phát minh về tầm đặc biệt DMA . Với DMA bạn có thể làm vô số công việc ở mức harward .