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

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

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

* DMA của STM32 :

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

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

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

– Độ ưu tiên thân các kênh DMA rất có thể lập trình vày phần mềm (tất cả 4 cấp ưu tiên là very high, high, medium, low) hoặc phần cứng.

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

– Hỗ trợ truyền sở hữu giữa:

+ Memory to lớn memory

+ Peripheral to memory

+ Memory to peripheral

+ Peripheral to peripheral

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

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

 

 

*

2. Tìm gọi phương pháp thiết kế DMA trong STM32 trải qua ví dụ nắm thể

Mỗi channel được điều khiển do 4 thanh khô ghi : Memory address, peripheral address, number of data & configuration. Và tất cả các channel đều phải có 2 thanh ghi được giành riêng rẽ là : DMA interrupt status register and interrupt flag clear register. Các channel của DMA 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à triển khai quá trình đưa dữ liệu thân 2 mảng. Trong số đó tất cả 2 ngôi trường vừa lòng là bao gồm sử dụng DMA cùng không sử dụng DMA cơ mà nhằm cpu thực hiện thông thường. Sau kia đối chiếu thời gian vào 2 ngôi trường hòa hợp trên.

Trước khi bước vào so với code của ví dụ thì bản thân vẫn tìm hiểu đổi mới cấu tạo của DMA đã có được tư tưởng sẵn bao gồm số đông tkhô hanh ghi tính năng thế nào :

Cấu trúc biến đổi init DMA gồm 11 yếu tố và ý ngh ĩa của từng nhân tố nhỏng sau :– DMA_PeripheralBaseAddr , DMA_MemoryBaseAddr : Xác định shop của ngoại vi cùng shop của bộ nhớ lưu trữ đến DMA channel, giỏi có thể nói là khẳng định hệ trọng nguồn với đích vào câu hỏi hiệp thương tài liệu. –DMA_DIR : Chọn phía chuyển tài liệu trường đoản cú ngoại vi mang lại bộ nhớ lưu trữ xuất xắc từ bộ lưu trữ mang lại nước 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: Ai Cũng Biết Knet Là Gì ? Top 35 Thuật Ngữ Kpop Thông Dụng Công Ty Du Học Knet Là Gì

DMA_PeripheralInc, DMA_MemoryInc :

+ DMA_PeripheralInc : Đối với ngoại vi chúng ta nên disable mode này vì chưng nếu bạn bật mode này thì các lần đưa tài liệu thì hệ trọng ngoại vi sẽ tăng mạnh, điều này là ko cần thiết và cực kỳ nguy khốn giả dụ nh ư chúng ta ko nắm rõ tác động trỏ đến tiếp theo. + DMA_MemoryInc : Đối cùng với memory bạn phải enable mode này, mỗi khi chuy ển đổi xẩy ra bạn cần tăng liên hệ bộ nhớ của các bạn bởi ví dụ thay đổi ADCValue bao gồm đến 3 bộ phận, nếu như không tăng liên quan lên thì chỉ tốt nhất có đổi thay ADCValue là có dữ liệu.– DMA_PeripheralDataSize , DMA_MemoryDataSize : Chọn form size mảng tài liệu ADCValue bao gồm : Byte, Haftword cùng 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 đổi khác liên tục lặp lại. Khi circular mode được actived thì số dữ liệu được transfer đã auto reload lại cùng với phần nhiều tùy chỉnh cấu hình đã được thiết kế theo đều thông số config mang lại channel. + Nếu channel được config ở chính sách concircular mode thì sẽ không có DMA request được tạo nê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 mà ko phải request tự nước ngoài vi, chế độ này được gọi là memory khổng lồ memory mode. Nếu bit MEM2MEM trong tkhô cứng ghi DMA_CCRx được set thì channel sẽ init transfer ngay lập tức sau khoản thời gian được enable bằng software tức thị enable bit EN vào tkhô cứng ghi DMA_CCRx. Quá trình transfer đang xong xuôi mọi khi tkhô cứng ghi DMA_CNDTRx zero. Memory lớn memory mode không đượ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 gửi tài liệu trong ngôi trường hợp tự memory mang đến 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 so với :

Trước hết bọn họ tạo ra 2 mảng dữ liệu là : source với destination. Kích thước của mảng được xác minh do ARRAYSIZE, vào ví dụ này kích thước là 800.Trong ví dụ này,ta thực hiện trạng thái của Led để đánh tiếng quá trình transfer dữ liệu start cùng stop vào cả 2 mode : DMA cùng CPU. 

+ Sau đó bước đầu thông số kỹ thuật thông qua cấu trúc DMA_InitStructure nlỗi sẽ phân tích bên trên. Trong ví dụ này ta lựa chọn DMA1 channel1, Điện thoại tư vấn hàm DMA_DeInit(DMA1_Channel1) để chắc chắn là rằng DMA được reset về quý giá khoác định ban đầu.

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

+ Chọn normal DMA mode xuất xắc còn được 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 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 tất cả peripheral và memory address.

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

+ Sau Lúc sẽ thông số kỹ thuật can hệ source với destination, cũng tương tự form size tài liệu để gửi. Ta sử dụng hàm

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

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

+ Để bắt interrupt Lúc 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 thay đổi bằng DMA thì ta nhảy led on nhằm báo tâm trạng bắt đầu LEDToggle(LEDG) . Lúc quá trình đổi khác vừa dứt thì nó sẽ khởi tạo ra 1 interrupt complete cùng thực hiển đảo tinh thần led vào interrupt này nhằm thông báo.

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);

//wait for DMA transfer to 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 kết nối cho GPIOC pin 8, Để quan tiền ngay cạnh rõ rộng quá trình transfer ta liên kết 2 pin này cùng với OSC nhỏng sau :

Bài viết liên quan

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *