Dma là gì

 – DMA (Direct memory access): là một trong những chế độ truyền dữ liệu vận tốc cao tự ngoại vi tới bộ nhớ cũng như từ bỏ bộ nhớ cho tới bộ nhớ lưu trữ. Dữ liệu có thể được dịch rời một cách nhanh lẹ mà lại ko cần cho tới tác vụ từ CPU, tiết kiệm ngân sách và chi phí tài nguim CPU cho những hoạt động không giống.

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

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

* DMA của STM32 :

STM32 gồm 2 cỗ DMA cùng với 12 kênh (7 kênh DMA1 với 5 kênh DMA2), mỗi bộ làm chủ Việc truy vấn bộ nhớ xuất phát điểm từ một hoặc những nước ngoài vi. DMA cũng có thể có tính năng phân xử độ ưu tiên thân những DMA request.

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

– Software trigger được cung cấp cho mỗi kênh, cùng được thiết kế bởi ứng dụng.

– Độ ưu tiên thân những kênh DMA có thể lập trình sẵn vì ứng dụng (gồm 4 cung cấp ưu tiên là very high, high, medium, low) hoặc phần cứng.

– Phụ thuộc vào size thân nguồn cùng đích (byte, half word, word). Địac chỉ nguồn/đích bắt buộc cân xứng cùng với kích thước tài liệu.

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

+ Memory to memory

+ Peripheral lớn memory

+ Memory khổng lồ peripheral

+ Peripheral to peripheral

– Có thể truy vấn vào Flash, Sram, APB1, APB2 với AHB nlỗi nguồn cùng đích.

– Dữ liệu truyền nhấn cung cấp cho tới 65536

 

 


*

2. Tìm hiểu giải pháp lập trình DMA trong STM32 trải qua ví dụ nắm thể

Mỗi channel được điều khiển vày 4 thanh khô 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ô nóng ghi được giành riêng là : DMA interrupt status register và interrupt flag clear register. Các channel của DMA rất có thể tạo thành 3 interupt là : transfer finished, half-finished and transfer error.

Bắt đầu với cùng một ví dụ là tiến hành quá trình gửi tài liệu giữa 2 mảng. Trong số đó gồm 2 trường vừa lòng là tất cả áp dụng DMA với không sử dụng DMA mà lại để cpu thực hiện thông thường. Sau kia so sánh thời gian trong 2 trường phù hợp bên trên.

Trước Khi lấn sân vào đối chiếu code của ví dụ thì mình vẫn tìm hiểu đổi mới cấu trúc của DMA đã có được có mang sẵn bao gồm mọi tkhô giòn ghi tính năng như thế nào :

Cấu trúc trở nên init DMA tất cả 11 yếu tắc và ý ngh ĩa của từng yếu tắc nlỗi sau :– DMA_PeripheralBaseAddr , DMA_MemoryBaseAddr : Xác định hệ trọng của nước ngoài vi và liên tưởng của bộ nhớ lưu trữ cho DMA channel, xuất xắc nói cách khác là khẳng định ảnh hưởng mối cung cấp cùng đích trong bài toán trao đổi tài liệu. –DMA_DIR : Chọn hướng đưa dữ liệu trường đoản cú ngoại vi đến bộ lưu trữ hay từ bỏ bộ 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_BufferSize : Kích thước của mảng tài liệu.

Xem thêm: With The Aim For Là Gì Và Cấu Trúc Cụm Từ Aim At Trong Câu Tiếng Anh

DMA_PeripheralInc, DMA_MemoryInc :

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

/** defgroup DMA_peripheral_data_kích cỡ */ #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 và NonCircular mode

+ Chọn mode DMA chính sách vòng tròn, tức là việc chuyển đổi liên tiếp lặp lại. lúc circular mode được actived thì số dữ liệu được transfer đã auto reload lại cùng với hầu như thiết lập đã được lập trình theo các thông số config cho channel. + Nếu channel được config nghỉ ngơi chế độ concircular mode thì đang không tồn tại DMA request được sinh sản 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 có thể được kích hoạt nhưng mà ko phải request từ bỏ nước ngoài vi, cơ chế này được call là memory to lớn memory mode. Nếu bit MEM2MEM vào thanh hao ghi DMA_CCRx được mix thì channel đã init transfer tức thì sau khoản thời gian được enable bởi software nghĩa là enable bit EN trong thanh khô ghi DMA_CCRx. Quá trình transfer sẽ xong mọi khi tkhô nóng ghi DMA_CNDTRx zero. Memory lớn memory mode ko được áp 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 gửi dữ liệu trong trường hợp từ bỏ memory cho memory :

#include “stm32f10x.h”#include “leds.h”#define ARRAYSIZE 800volatile uint32_t status = 0;volatile uint32_t i;int main(void){//initialize source và 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 ra 2 mảng tài liệu là : source và destination. Kích thước của mảng được khẳng định vị ARRAYSIZE, vào ví dụ này kích cỡ là 800.Trong ví dụ này,ta sử dụng tinh thần của Led để thông báo quá trình transfer dữ liệu start và stop vào cả 2 mode : DMA với CPU. 

+ trước hết ta cần cấu hình enable clock đến DMA1 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE).

+ Sau kia bước đầu thông số kỹ thuật trải qua cấu tạo DMA_InitStructure như đã so sánh trên. Trong ví dụ này ta lựa chọn DMA1 channel1, call hàm DMA_DeInit(DMA1_Channel1) nhằm chắc chắn rằng DMA được remix về cực hiếm mặc định ban sơ.

+ Sau kia lựa chọn DMA mode memory 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 cơ chế ưu tiên cho kênh DMA này laafe Medium (DMA_InitStructure.DMA_Priority = DMA_Priority_Medium).

+ Chọn size 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 tất cả peripheral với memory address.

Chú ý : Nếu kích cỡ dữ liệu của 2 yếu tố trên không giống nhau,ví dụ điển hình 32-bit source với 8-bit destination thì DMA vẫn thực hiện thành 4 chu kỳ luân hồi cùng với mỗi chu kỳ là 8 bit.

+ Sau Khi vẫn thông số kỹ thuật ảnh hưởng source cùng destination, cũng tương tự size dữ liệu để gửi. Ta sử dụng hàm

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

+ Bây giờ đồng hồ thì DMA rất có thể chuẩn bị sẵn sàng để transfer tài 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 thông số kỹ thuật 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 biến hóa bằng DMA thì ta bật led on nhằm báo tinh thần bước đầu LEDToggle(LEDG) . Khi quá trình biến hóa vừa chấm dứt thì nó sẽ khởi tạo ra 1 interrupt complete với thực hiển đảo tinh thần led vào interrupt này để 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 and Global interrupt pending bits

DMA_ClearITPendingBit(DMA1_IT_GL1);

+ bởi vậy đó là code bỏ phần chuyển tài liệu bởi DMA ,tiếp sau là phần chuyển tài liệu bằng CPU thông thường cùng ta cũng thực hiện tâm trạng của LED nhằm quan cạnh bên thời hạn đổi khác.

//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 đến GPIOC pin 9 cùng LEDB (CPU) được kết nối cho GPIOC pin 8, Để quan liêu sát rõ rộng quá trình transfer ta liên kết 2 pin này cùng với OSC nlỗi sau :

Leave a Reply

Your email address will not be published. Required fields are marked *

CÙNG CHUYÊN MỤC MỚI

  • #4621: cream pie là gì vậy mấy thím?

  • Hư vinh là gì

  • Bankai là gì

  • Vàng mười là gì

  • x

    Welcome Back!

    Login to your account below

    Retrieve your password

    Please enter your username or email address to reset your password.