DMA LÀ GÌ

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

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

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

* DMA của STM32 :

STM32 tất cả 2 bộ DMA với 12 kênh (7 kênh DMA1 với 5 kênh DMA2), mỗi bộ cai quản bài toán truy cập bộ lưu trữ xuất phát điểm từ 1 hoặc nhiều nước ngoài vi. DMA cũng đều có công dụng phân xử độ ưu tiên giữa các DMA request.

– 12 kênh DMA chủ quyền, rất có thể tùy chỉnh được. 7 kênh DMA1 với 5 kênh DMA2

– Software trigger được cung cấp cho từng kênh, với được lập trình sẵn vì phần mềm.

– Độ ưu tiên giữa những kênh DMA rất có thể xây dựng do ứng dụng (tất cả 4 cung cấp ưu tiên là very high, high, medium, low) hoặc Hartware.

– Phú ở trong vào form size giữa nguồn và đích (byte, half word, word). Địac chỉ nguồn/đích cần cân xứng với form size dữ liệu.

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

+ Memory to lớn memory

+ Peripheral lớn memory

+ Memory to peripheral

+ Peripheral to lớn peripheral

– cũng có thể truy vấn vào Flash, Sram, APB1, APB2 và AHB nhỏng 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 bí quyết lập trình DMA trong STM32 trải qua ví dụ nắm thể

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

Bắt đầu với 1 ví dụ là thực hiện công việc gửi dữ liệu thân 2 mảng. Trong số đó bao gồm 2 ngôi trường phù hợp là tất cả sử dụng DMA và không thực hiện DMA mà lại để cpu tiến hành bình thường. Sau kia đối chiếu thời gian trong 2 trường đúng theo bên trên.

Trước Lúc bước vào so sánh code của ví dụ thì bản thân đã mày mò phát triển thành cấu tạo của DMA đã có được định nghĩa sẵn bao hàm hầu hết tkhô nóng ghi tác dụng thế nào :

Cấu trúc trở thành init DMA bao gồm 11 thành phần với ý ngh ĩa của từng nguyên tố nhỏng sau :– DMA_PeripheralBaseAddr , DMA_MemoryBaseAddr : Xác định cửa hàng của nước ngoài vi cùng ảnh hưởng của bộ nhớ lưu trữ cho DMA channel, tuyệt có thể nói là xác định shop nguồn và đích trong vấn đề dàn xếp tài liệu. –DMA_DIR : Chọn hướng gửi dữ liệu tự ngoại vi đến bộ nhớ giỏi trường đoản cú bộ nhớ đế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: 08/09/1954: Seato Là Gì Trong Tiếng Việt? Seato Là Gì

DMA_PeripheralInc, DMA_MemoryInc :

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

/** defgroup DMA_peripheral_data_kích thướ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 cơ chế vòng tròn, Tức là Việc thay đổi liên tục lặp lại. khi circular mode được actived thì số dữ liệu được transfer đang tự động hóa reload lại cùng với số đông tùy chỉnh thiết lập đã có được lập trình sẵn theo phần nhiều thông số config mang đến channel. + Nếu channel được config sống chế độ concircular mode thì sẽ không tồn tại DMA request được chế tác 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 hoàn toàn có thể được kích hoạt cơ mà không nên request từ bỏ ngoại vi, chính sách này được Gọi là memory to memory mode. Nếu bit MEM2MEM vào thanh ghi DMA_CCRx được set thì channel vẫn init transfer tức thì sau thời điểm được enable bởi software tức là enable bit EN vào thanh khô ghi DMA_CCRx. Quá trình transfer sẽ hoàn thành mỗi lúc thanh khô ghi DMA_CNDTRx zero. Memory 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 tài liệu vào ngôi trường vừa lòng trường đoản cú memory mang lại 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ắt đầu đối chiếu :

trước hết họ tạo nên 2 mảng tài liệu là : source cùng destination. Kích thước của mảng được xác minh vày ARRAYSIZE, trong ví dụ này form size là 800.Trong ví dụ này,ta sử dụng tinh thần của Led nhằm thông báo quá trình transfer dữ liệu start và stop trong cả 2 mode : DMA và CPU. 

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

+ 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ó cách gọi khác là nonCircular mode(DMA_InitStructure.DMA_Mode = DMA_Mode_Normal).

+ Chọn chính sách ưu tiên đến 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 để 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à memory address.

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

+ Sau Lúc vẫn thông số kỹ thuật cửa hàng source cùng destination, cũng tương tự kích thước dữ liệu để gửi. Ta thực hiện hàm

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

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

+ Để bắt interrupt lúc quy trình DMA transfer complete trên channel1. Ta thông số kỹ thuật interrupt nlỗi 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ước đầu biến đổi bằng DMA thì ta bật led on để báo tâm lý bước đầu LEDToggle(LEDG) . khi quy trình thay đổi vừa chấm dứt thì nó sẽ tạo nên ra 1 interrupt complete cùng thực hiển hòn đảo tinh thần led trong interrupt này nhằm báo cá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 & 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 kết nối đến GPIOC pin 9 và LEDB (CPU) được kết nối mang lại GPIOC pin 8, Để quan lại gần kề rõ rộng quá trình transfer ta kết nối 2 pin này cùng với OSC nlỗi sau :