DMA LÀ GÌ

  -  

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

– Trong những project mcu bạn phải đọc và ghi tài liệu. Chẳng hạn bạn cần hiểu tài liệu trường đoản cú nước ngoài vi nlỗi ADC với ghi những cực hiếm gọi được vào RAM. Hoặc vào trường hòa hợp không giống bạn phải gửi 1 khối tài liệu sử dụng SPI. khi đó bạn cần phải thực hiện hiểu tài liệu từ RAM cùng ghi nó vào tkhô hanh ghi SPI data. Bình thường ví như 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 gian đáng chú ý nhằm xử trí. Trong các trường phù hợp này, để rời bài toán cpu bận rộn và giành thời hạn đến đông đảo thao tác khác thì sinh hoạt hầu như mcu thông dụng đều sở hữu hỗ trợ DMA (direct memory access). Nó sẽ triển khai vấn đề giao tiếp cùng với memory mà lại ko buộc phải dùng mang lại cpu.Bạn đang xem: Dma là gì

* DMA của STM32 :

STM32 gồm 2 bộ DMA cùng với 12 kênh (7 kênh DMA1 với 5 kênh DMA2), mỗi bộ thống trị vấn đề truy cập bộ nhớ từ 1 hoặc những ngoại vi. DMA cũng có thể có tính năng phân xử độ ưu tiên giữa các DMA request.Quý khách hàng đã xem: Dma là gì

– 12 kênh DMA độc lập, hoàn toàn có thể tùy chỉnh được. 7 kênh DMA1 cùng 5 kênh DMA2

– Software trigger được cung ứng cho mỗi kênh, với được thiết kế bởi vì phần mềm.

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

Quý khách hàng sẽ xem: Dma là gì

– Độ ưu tiên giữa những kênh DMA rất có thể lập trình sẵn bởi ứng dụng (có 4 cung cấp ưu tiên là very high, high, medium, low) hoặc Hartware.

– Phụ nằm trong vào size giữa nguồn và đích (byte, half word, word). Địac chỉ nguồn/đích đề nghị tương xứng cùng với kích thước dữ liệu.

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

+ Memory khổng lồ memory

+ Peripheral khổng lồ memory

+ Memory to lớn peripheral

+ Peripheral lớn peripheral

– cũng có thể truy cập vào Flash, Sram, APB1, APB2 và AHB nhỏng nguồn và đích.

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

 

 


*

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

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

Xem thêm: Bệnh Cường Giáp Trạng ( Hyperthyroidism Là Gì, Bệnh Cường Giáp (Hyperthyroidism)

Trước Khi bước vào phân tích code của ví dụ thì mình vẫn mày mò biến đổi cấu tạo của DMA đã có được tư tưởng sẵn bao gồm phần đa tkhô giòn ghi tác dụng ra sao :

Cấu trúc thay đổi init DMA bao gồm 11 nhân tố cùng ý ngh ĩa của từng nguyên tố nhỏng sau :– DMA_PeripheralBaseAddr , DMA_MemoryBaseAddr : Xác định tác động của nước ngoài vi cùng liên hệ của bộ nhớ mang lại DMA channel, tuyệt nói theo cách khác là xác định can dự mối cung cấp cùng đích trong bài toán Bàn bạc dữ liệu. –DMA_DIR : Chọn phía gửi dữ liệu từ nước ngoài vi cho bộ nhớ tuyệt từ bỏ bộ lưu trữ mang lại ngoại vi.

/** defgroup DMA_data_transfer_direction **/ #define DMA_DIR_PeripheralDST ((uint32_t)0x00000010) #define DMA_DIR_PeripheralSRC ((uint32_t)0x00000000)

DMA_PeripheralInc, DMA_MemoryInc :

+ DMA_PeripheralInc : Đối cùng với nước ngoài vi bạn nên disable mode này bởi nếu như khách hàng bật mode này thì những lần gửi dữ liệu thì tương tác nước ngoài vi đã tăng dần đều, vấn đề đó là không cần thiết và vô cùng nguy nan nếu nh ư chúng ta không nắm rõ liên can trỏ đến tiếp theo. + DMA_MemoryInc : Đối cùng 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 tương tác bộ lưu trữ của các bạn vì ví dụ đổi mới ADCValue tất cả đến 3 phần tử, còn nếu như không tăng liên quan lên thì chỉ tuyệt nhất tất cả đổi mới ADCValue là bao gồm dữ liệu.– DMA_PeripheralDataSize , DMA_MemoryDataSize : Chọn size mảng dữ liệu ADCValue có : Byte, Haftword với 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 và NonCircular mode

+ Chọn mode DMA cơ chế vòng tròn, Có nghĩa là việc chuyển đổi liên tiếp tái diễn. Khi circular mode được actived thì số dữ liệu được transfer sẽ tự động reload lại với đầy đủ cấu hình thiết lập đã làm được lập trình theo mọi thông số config cho channel. + Nếu channel được config ngơi nghỉ chế độ concircular mode thì đang không có DMA request được tạo ra sau những 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 ,bao gồm 4 độ ưu tiên bao hà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 cơ mà ko buộc phải request từ ngoại vi, chế độ này được Gọi là memory khổng lồ memory mode. Nếu bit MEM2MEM trong thanh hao ghi DMA_CCRx được set thì channel sẽ init transfer ngay sau khi được enable bằng software tức thị enable bit EN trong tkhô nóng ghi DMA_CCRx. Quá trình transfer đã ngừng mọi khi tkhô hanh ghi DMA_CNDTRx zero. Memory to memory mode không được thực hiện đôi khi 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 thích hợp từ bỏ 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 & destination arraysuint32_t source;uint32_t destination;//initialize arrayfor (i=0; i Bắt đầu so sánh :

Đầu tiên họ tạo thành 2 mảng tài liệu là : source với destination. Kích thước của mảng được xác định vì ARRAYSIZE, trong ví dụ này kích cỡ là 800.Trong ví dụ này,ta sử dụng tinh thần của Led để báo cho biết quy trình transfer dữ liệu start cùng stop trong cả hai mode : DMA cùng CPU. 

+ Sau kia lựa chọn DMA mode memory khổng lồ memory(DMA_InitStructure.DMA_M2M = DMA_M2M_Enable)

+ Chọn normal DMA mode xuất xắc nói một cách 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 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ừ đối với tất cả peripheral và memory address.

Xem thêm: Top 13 Game Đi Canh Hay Nhất, Top 6 Game Đi Cảnh Miễn Phí Hot Nhất Hiện Nay

+ Sau khi vẫn cấu hình cửa hàng source với destination, cũng giống như kích cỡ tài liệu nhằm gửi. Ta sử dụng hàm

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

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