Dma Là Gì ? Định Nghĩa, Ví Dụ, Giải Thích Direct Market Access (Dma) Là Gì

DMA (Direct memory access): là cơ chế truyền dữ liệu tốc độ cao từ ngoại vi đến bộ nhớ cũng như từ bộ nhớ đến bộ nhớ. Dữ liệu có thể được di chuyển nhanh chóng mà không cần bất kỳ hoạt động nào của CPU, giúp tiết kiệm tài nguyên CPU cho các hoạt động khác. Bạn đang xem: Dma là gì

Trong nhiều dự án mcu, bạn cần đọc và ghi dữ liệu. Ví dụ: bạn cần đọc dữ liệu từ một thiết bị ngoại vi như ADC và ghi các giá trị đã đọc vào RAM. Hoặc trong trường hợp khác, bạn cần gửi 1 khối dữ liệu bằng SPI. Sau đó, bạn cần đọc dữ liệu từ RAM và ghi dữ liệu đó vào thanh ghi dữ liệu SPI. Thông thường nếu bạn sử dụng cpu để làm việc này thì sẽ mất một khoảng thời gian khá lớn để xử lý. Trong những trường hợp này, để tránh cpu bận và mất thời gian cho các thao tác khác, các mcus phổ biến đều hỗ trợ DMA (truy cập bộ nhớ trực tiếp). Nó sẽ thực hiện giao tiếp với bộ nhớ mà không cần sử dụng cpu.

Đang xem: Dma là gì

* DMA của STM32:

STM32 có hai đơn vị DMA với 12 kênh (7 kênh DMA1 và 5 kênh DMA2), mỗi kênh quản lý truy cập bộ nhớ từ một hoặc nhiều thiết bị ngoại vi. DMA cũng có chức năng ưu tiên các yêu cầu DMA.

– 12 kênh DMA độc lập, có thể định cấu hình. 7 kênh DMA1 và 5 DMA2 . kênh truyền hình

– Trình kích hoạt phần mềm được hỗ trợ cho từng kênh và được lập trình bởi phần mềm.

Ưu tiên giữa các kênh DMA có thể lập trình bằng phần mềm (rất cao, cao, trung bình, thấp) hoặc phần cứng.

– Phụ thuộc vào kích thước giữa nguồn và đích (byte, nửa từ, từ). Địa chỉ nguồn/đích phải phù hợp với kích thước dữ liệu.

– Hỗ trợ truyền dẫn giữa:

+ Bộ nhớ đến bộ nhớ

+ Ngoại vi bộ nhớ

+ Bộ nhớ ra ngoại vi

+ Ngoại vi đến ngoại vi

– Có thể truy cập Flash, Sram, APB1, APB2 và AHB làm nguồn và đích.

– Hỗ trợ truyền dữ liệu lên đến 65536

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

Mỗi kênh được điều khiển bởi bốn thanh ghi: Địa chỉ bộ nhớ, địa chỉ ngoại vi, số lượng dữ liệu và cấu hình. Và tất cả các kênh đều có 2 thanh ghi chuyên dụng: thanh ghi trạng thái ngắt DMA và thanh ghi xóa cờ ngắt. Các kênh DMA có thể tạo ra ba điểm ngắt: truyền hoàn tất, bán xong và lỗi truyền.

Xem thêm bài viết hay:  Quỹ Thời Gian Tiếng Anh Là Gì, Những Cụm Từ Tiếng Anh Đi Liền Với 'Time'

Hãy bắt đầu với một ví dụ về chuyển dữ liệu giữa hai mảng. Trong đó có 2 trường hợp là dùng DMA và không dùng DMA mà để cpu hoạt động bình thường. Sau đó so sánh thời gian ở 2 trường hợp trên.

Trước khi đi vào phân tích code của ví dụ, mình sẽ tìm hiểu cách định nghĩa biến cấu trúc của DMA bao gồm các thanh ghi chức năng:

Cấu trúc của biến init DMA bao gồm 11 thành phần và ý nghĩa của từng thành phần như sau:– DMA_PeripheralBaseAddr , DMA_MemoryBaseAddr : Chỉ định địa chỉ của thiết bị ngoại vi và địa chỉ của bộ nhớ cho kênh DMA, hay nói cách khác là chỉ định địa chỉ nguồn và đích trong trao đổi dữ liệu. –DMA_DIR : Chọn hướng truyền dữ liệu từ ngoại vi sang bộ nhớ hoặc từ bộ nhớ sang ngoại vi.

/** nhóm DMA_data_transfer_direction **/ #define DMA_DIR_PeripheralDST ((uint32_t)0x00000010) #define DMA_DIR_PeripheralSRC ((uint32_t)0x00000000)

DMA_Kích thước bộ đệm : Kích thước của mảng dữ liệu.

Xem thêm: Lời Phật Dạy Làm Người Tốt, 25 Lời Phật Dạy Thay Đổi Cuộc Đời

DMA_PeripheralInc, DMA_MemoryInc :

+ DMA_PeripheralInc : Đối với thiết bị ngoại vi, bạn nên tắt chế độ này vì nếu bật chế độ này thì mỗi lần truyền dữ liệu địa chỉ thiết bị ngoại vi sẽ tăng dần lên, điều này là không cần thiết và rất nguy hiểm nếu bạn không biết địa chỉ. trỏ đến tiếp theo. + DMA_MemoryInc : Đối với bộ nhớ bạn cần bật chế độ này, mỗi khi chuyển đổi xảy ra bạn cần tăng địa chỉ bộ nhớ vì ví dụ biến ADCValue có đến 3 phần tử, nếu không tăng địa chỉ thì chỉ có biến ADCValue là có dữ liệu.– DMA_PeripheralDataSize , DMA_MemoryDataSize : Chọn kích thước mảng dữ liệu ADCValue bao gồm: Byte, Haftword và Word.

/** nhóm DMA_peripheral_data_size */ #define DMA_PeripheralDataSize_Byte ((uint32_t)0x00000000) #define DMA_PeripheralDataSize_HalfWord ((uint32_t)0x00000100) #define DMA_PeripheralDataSize_Word ((uint3200_t) DMA_Chế độ : Chế độ hình tròn & Chế độ không hình tròn

+ Chọn chế độ DMA mode circle, nghĩa là việc chuyển đổi lặp lại liên tục. Khi chế độ vòng tròn được kích hoạt, dữ liệu được truyền sẽ tự động tải lại với các cài đặt được lập trình theo thông số cấu hình cho kênh. + Nếu kênh được cấu hình ở chế độ hình tròn, sẽ không có yêu cầu DMA nào được tạo sau mỗi lần truyền. /** phân nhóm DMA_circular_normal_mode */ #define DMA_Mode_Circular ((uint32_t)0x00000020) #define DMA_Mode_Normal ((uint32_t)0x00000000)– DMA_Ưu tiên : Xác định mức độ ưu tiên của kênh DMA, có 4 mức độ ưu tiên bao gồm:

Xem thêm bài viết hay:  Gen Z là gì? Những điều bạn cần biết về Gen Z

+ DMA_Priority_High + DMA_Priority_Low + DMA_Priority_Medium + DMA_Priority_VeryHigh

MÃ DMA_M2M : Kênh DMA cũng có thể được kích hoạt mà không cần yêu cầu từ thiết bị ngoại vi, chế độ này được gọi là chế độ bộ nhớ tới bộ nhớ. Nếu bit MEM2MEM trong thanh ghi DMA_CCRx được đặt, kênh sẽ bắt đầu truyền ngay khi nó được bật bằng phần mềm, tức là bật bit EN trong thanh ghi DMA_CCRx. Quá trình truyền sẽ dừng mỗi khi thanh ghi DMA_CNDTRx bằng không. Chế độ bộ nhớ đến bộ nhớ không thể được sử dụng đồng thời với chế độ Thông tư./** defgroup DMA_memory_to_memory **/#define DMA_M2M_Enable ((uint32_t)0x00004000)#define DMA_M2M_Disable ((uint32_t)0x00000000) từ bộ nhớ đến bộ nhớ :

#include “stm32f10x.h”#include “leds.h”#define ARRAYSIZE 800volatile uint32_t status = 0;volatile uint32_t i;int main(void){//khởi tạo mảng nguồn và đíchsuint32_t source;uint32_t đích; // khởi tạo mảngfor ( i=0; i Bắt đầu phân tích:

Đầu tiên chúng ta tạo hai mảng dữ liệu: nguồn và đích. Kích thước của mảng được xác định bởi ARRAYSIZE, trong ví dụ này kích thước là 800. Trong ví dụ này, chúng tôi sử dụng trạng thái của Led để báo hiệu bắt đầu và dừng truyền dữ liệu ở cả chế độ DMA và CPU. .

+ Sau đó bắt đầu cấu hình thông qua cấu trúc DMA_InitStructure như đã phân tích ở trên. Trong ví dụ này, chúng tôi chọn DMA1 channel1, gọi hàm DMA_DeInit(DMA1_Channel1) để đảm bảo rằng DMA được đặt lại về giá trị mặc định ban đầu.

+ Sau đó chọn chế độ DMA để bộ nhớ vào bộ nhớ (DMA_InitStructure.DMA_M2M = DMA_M2M_Enable)

+ 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 cho 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 cần truyền là 32-bit world (DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word). Tương tự với cả địa chỉ ngoại vi và bộ nhớ.

Lưu ý: Nếu kích thước dữ liệu của hai thành phần không giống nhau, chẳng hạn như nguồn 32 bit và đích 8 bit, thì DMA sẽ thực hiện trong 4 chu kỳ với mỗi chu kỳ 8 bit.

Xem thêm bài viết hay:  Lũy kế là gì? Cách tính lũy kế và lỗ lũy kế như nào?

+ Sau khi cấu hình địa chỉ nguồn và đích, cũng như kích thước dữ liệu cần gửi. Chúng tôi sử dụng chức năng

DMA_Init(DMA_Channel1, &DMA_InitStructure) để khởi tạo các tham số cấu hình trên vào thanh ghi.

Bây giờ DMA có thể sẵn sàng truyền dữ liệu, bất cứ khi nào lệnh sau được thực thi DMA_Cmd(DMA_Channel1, ENABLE).

Xem thêm: Khổng Tử Nguyên Tắc – Những Lời Dạy Của Khổng Tử

+ Bắt ngắt khi quá trình truyền DMA hoàn tất trên kênh 1. Ta cấu hình ngắt như sau:

NVIC_InitTypeDef NVIC_InitStructure;

// Kích hoạt Kênh IRQ kênh DMA1 */

NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = BẬT;

NVIC_Init(&NVIC_InitStructure);

Trước khi bắt đầu chuyển đổi bằng DMA, chúng tôi bật đèn led để biểu thị trạng thái bắt đầu LEDToggle(LEDG) . Khi quá trình chuyển đổi vừa kết thúc, nó sẽ tạo ra một ngắt hoàn thành và thực hiện đảo trạng thái led trong ngắt này để báo hiệu.

voidDMA1_Channel1_IRQHandler(void){

// Kiểm tra trên DMA1 Kênh1 Truyền hoàn thành ngắt

nếu(DMA_GetITStatus(DMA1_IT_TC1))

{

trạng thái=1;

LEDChuyển đổi(LEDG);

// Xóa các bit đang chờ xử lý ngắt DMA1 Channel1, Hoàn thành truyền và Toàn cầu

DMA_ClearITPendingBit(DMA1_IT_GL1);

}

}

//đợi quá trình truyền DMA kết thúc

trong khi(trạng thái==0) {};

LEDChuyển đổi(LEDB);

cho (i=0; tôi

{

đích=nguồn;

}

LEDChuyển đổi(LEDB);

– Trong ví dụ này, LEDG (DMA) được kết nối với chân GPIOC 9 và LEDB (CPU) được kết nối với chân GPIOC 8, Để quan sát rõ hơn quá trình truyền chúng ta kết nối 2 chân này với OSC như sau:

Bạn thấy bài viết Dma Là Gì ? Định Nghĩa, Ví Dụ, Giải Thích Direct Market Access (Dma) Là Gì có khắc phục đươc vấn đề bạn tìm hiểu ko?, nếu ko hãy comment góp ý thêm về Dma Là Gì ? Định Nghĩa, Ví Dụ, Giải Thích Direct Market Access (Dma) Là Gì bên dưới để Trường Cao đẳng Nghề Khách sạn Du lịch Quốc tế IMPERIAL có thể thay đổi & cải thiện nội dung tốt hơn cho các bạn nhé! Cám ơn bạn đã ghé thăm Website: imperialhotelschool.edu.vn của Trường Cao đẳng Nghề Khách sạn Du lịch Quốc tế IMPERIAL

Nhớ để nguồn: Dma Là Gì ? Định Nghĩa, Ví Dụ, Giải Thích Direct Market Access (Dma) Là Gì của website imperialhotelschool.edu.vn

Chuyên mục: Là gì?

Viết một bình luận