click

Dma Là Gì – Hướng Dẫn Lập Trình Dma Với Stm32

Dma La Gi Huong Dan Lap Trinh Dma Voi

Dma Là Gì – Hướng Dẫn Lập Trình Dma Với Stm32

 – DMA (Direct memory access): là một trong Một vài, cơ chế truyền tài liệu, vận tốc cao từ ngoại vi tới
bộ nhớ, tàng trữ 
tựa như, từ
bộ nhớ, tàng trữ tới
bộ nhớ, tàng trữ. Tài liệu,
rất có thể, được vận động và di chuyển, một
chiêu trò nhanh lẹ mà hoàn toàn không, cần tới tác vụ từ CPU, tiết kiệm ngân sách chi tiêu, và
ngân sách,
ngân sách, và giá trị tài nguyên CPU cho
các hoạt động sinh hoạt, sinh hoạt
hoạt động giải trí khác. Bài Viết: Dma là gì – Trong vô số nhiều project mcu
bạn phải, đọc và ghi tài liệu,. Ví dụ nổi trội,
bạn phải, đọc tài liệu, từ ngoại vi như ADC và ghi những
giá trị, đọc được vào RAM. Hoặc trong trường hợp khác
bạn phải, gửi 1 khối tài liệu, sử dụng, SPI.
khi đó bạn rất cần phải, triển khai, triển khai đọc tài liệu, từ RAM và ghi nó vào thanh ghi SPI data. Thỉnh thoảng nếu sử dụng, cpu để triển khai
Vấn đề này, thì nó có công dụng, sẽ bị, bị mất một thời gian, đáng nhắc nhở, để giải quyết và xử lý, và xử lý và giải quyết và xử lý,. Một vài, những trường hợp này, để tinh giảm việc cpu bận rộn, và giành thời hạn, cho những thao tác làm việc khác thì ở những mcu thông dụng đều sở hữu,
hỗ trợ, DMA (direct memory access). Nó có công dụng, sẽ bị, triển khai, triển khai việc tiếp xúc với memory mà hoàn toàn không, cần sử dụng, tới, cpu. * DMA của STM32 : STM32 có 2 bộ DMA với 12 kênh (7 kênh DMA1 và 5 kênh DMA2), mỗi bộ quản trị việc
truy vấn
bộ nhớ, tàng trữ
xuất phát xuất phát từ một hoặc nhiều ngoại vi. DMA cũng xuất hiện, tính năng, phân xử độ ưu tiên Một vài, DMA request. – 12 kênh DMA độc lập,
rất có thể, thiết lập được. 7 kênh DMA1 và 5 kênh DMA2 – Software trigger được
hỗ trợ,
cho từng, kênh, và được lập trình bởi ứng dụng. – Độ ưu tiên Một vài, kênh DMA
rất có thể, lập trình bởi ứng dụng (có 4 cấp ưu tiên là very high, high, medium, low) hoặc phần cứng. – Chịu ràng buộc, vào kích thước giữa nguồn và đích (byte, half word, word). Địac chỉ nguồn/đích phải hợp lý và phải chăng với kích thước tài liệu,. –
trợ giúp, truyền tải giữa: + Memory to memory + Peripheral to memory + Memory to peripheral + Peripheral to peripheral –
rất có thể,
truy vấn vào Flash, Sram, APB1, APB2 và AHB như nguồn và đích. – Tài liệu, truyền nhận
hỗ trợ, tới 65536

*

2.
khai thác và
khai thác
chiêu trò lập trình DMA trong STM32 trải qua ví dụ rõ ràng, cụ thể Mỗi channel được điều khiển và tinh chỉnh, và tinh chỉnh và điều khiển, và điều khiển và tinh chỉnh, và tinh chỉnh và điều khiển, bởi 4 thanh ghi : Memory Địa Chỉ, peripheral Địa Chỉ, number of data và configuration. Và toàn diện và tổng thể tổng thể toàn bộ những channel đều sở hữu, 2 thanh ghi được giành riêng là : DMA interrupt status register và interrupt flag clear register. Những channel của DMA
rất có thể, tạo ra 3 interupt là : transfer finished, half-finished và transfer error.
mở đầu, với 1 ví dụ là triển khai, triển khai việc làm chuyển tài liệu, giữa 2 mảng. Trong những số ấy có 2 trường hợp là có sử dụng, DMA và không sử dụng, DMA mà để cpu triển khai, triển khai thỉnh thoảng. Tiếp sau đó, so sánh thời hạn, trong 2 trường hợp trên. Trước khi lấn sân vào, nghiên cứu và phân tích, và điều tra khảo sát, code của ví dụ thì mình sẽ
nguyên cứu biến
cấu trúc của DMA đã được định nghĩa sẵn kể cả những thanh ghi
hiệu quả, thế nào : Kết cấu, biến init DMA gồm 11 thành phần và ý ngh ĩa của từng thành phần như sau :– DMA_PeripheralBaseAddr , DMA_MemoryBaseAddr : Khẳng định chắc chắn,
Vị trí, của ngoại vi và
Vị trí, của
bộ nhớ, tàng trữ cho DMA channel, hay nói
chiêu trò khác là
cam kết
Vị trí, nguồn và đích trong những
việc làm, đàm đạo, tài liệu,. –DMA_DIR : Tính hướng, chuyển tài liệu, từ ngoại vi tới,
bộ nhớ, tàng trữ hay từ
bộ nhớ, tàng trữ tới, ngoại vi. /** defgroup DMA_data_transfer_direction **/ #define DMA_DIR_PeripheralDST ((uint32_t)0x00000010) #define DMA_DIR_PeripheralSRC ((uint32_t)0x00000000) – DMA_BufferSize : Size của mảng tài liệu,. –DMA_PeripheralInc, DMA_MemoryInc : + DMA_PeripheralInc : Nếu như với ngoại vi bạn nên disable mode này do nếu như,
người tiêu dùng bật mode này thì
những lần, chuyển tài liệu, thì 
Vị trí, ngoại vi sẽ tăng dần đều, điều này
đó chính là không thiết yếu và rất rất rất nguy hiểm, nếu nh ư bạn không hiểu nhiều, rõ
Vị trí, trỏ tới, tiếp theo. + DMA_MemoryInc : Nếu như với memory
bạn phải, enable mode này, mọi khi chuy ển đổi xảy ra
bạn phải, tăng
Vị trí,
bộ nhớ, tàng trữ của bạn bởi ví dụ biến ADCValue có tới, 3 thành phần,, còn nếu như không, tăng
Vị trí, lên thì chỉ duy nhất có biến ADCValue là có dữ liệu.– DMA_PeripheralDataSize , DMA_MemoryDataSize : Chọn kích thước mảng tài liệu, ADCValue gồm : Byte, Haftword và Word. /** defgroup DMA_peripheral_data_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, nghĩa là, việc thay đổi tiếp tục, tái diễn,. Khi circular mode được actived thì số dữ liệu được transfer sẽ tự động hóa, hóa reload lại với những thiết lập đã được lập trình theo một số trong những,
thông số kỹ thuật kỹ thuật kỹ thuật config cho channel. + Nếu channel được config ở
chính sách concircular mode thì sẽ không hề, sống sót, DMA request được tạo 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 : Khẳng định chắc chắn, độ ưu tiên của kênh DMA ,có 4 độ ưu tiên kể cả : + DMA_Priority_High + DMA_Priority_Low + DMA_Priority_Medium + DMA_Priority_VeryHigh – DMA_M2M : Kênh DMA cũng xuất hiện, thể được kích hoạt mà hoàn toàn không, cần request từ ngoại vi,
chính sách này được gọi là memory to memory mode. Nếu bit MEM2MEM trong thanh ghi DMA_CCRx được set thì channel sẽ init transfer ngay sau lúc, được enable bằng software nghĩa là enable bit EN trong thanh ghi DMA_CCRx.
quá trình transfer sẽ ngừng mọi khi thanh ghi DMA_CNDTRx zero. Memory to memory mode không được sử dụng, đồng thời với Circular mode./** defgroup DMA_memory_to_memory **/#define DMA_M2M_Enable ((uint32_t)0x00004000)#define DMA_M2M_Disable ((uint32_t)0x00000000)
đó chính là code DMA chuyển tài liệu, trong trường hợp từ memory tới, 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
mở đầu, nghiên cứu và phân tích, và điều tra khảo sát, : Trước tiên toàn bộ
toàn bộ
tất cả chúng ta, tạo ra 2 mảng tài liệu, là : source và destination. Size của mảng được
cam kết bởi ARRAYSIZE, trong ví dụ này kích thước là 800.Trong ví dụ này,ta sử dụng, trạng thái của Led để báo hiệu
quy trình tiến độ transfer tài liệu, start và stop trong cả 2 mode : DMA và CPU. + Trước tiên ta phải
thông số kỹ thuật kỹ thuật kỹ thuật enable clock cho DMA1 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE). Xem Ngay: Trùng Sinh Là Gì – Giải Nghĩa Một Số Thể Loại Truyện + Tiếp sau đó,
bắt đầu
thông số kỹ thuật kỹ thuật kỹ thuật trải qua
cấu trúc DMA_InitStructure như đã nghiên cứu và phân tích, và điều tra khảo sát, phía phía
Phía trên,. Trong ví dụ này ta chọn DMA1 channel1, gọi hàm DMA_DeInit(DMA1_Channel1) để dẫn chứng và vật chứng, và khẳng định chắc chắn, rằng DMA được reset về
giá trị, mặc định thuở đầu. + Tiếp sau đó, chọn DMA mode memory to memory(DMA_InitStructure.DMA_M2M = DMA_M2M_Enable) + Chọn normal DMA mode hay nói một cách khác là nonCircular mode(DMA_InitStructure.DMA_Mode = DMA_Mode_Normal). + Chọn
chính sá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 tài liệu, để transfer là 32-bit world (DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word).
tựa như, với toàn bộ peripheral và memory Địa Chỉ. Chăm chú : Nếu kích thước tài liệu, của 2 thành
Phần hông trên
khác hoàn toàn,ví dụ nổi trội, 32-bit source và 8-bit destination thì DMA sẽ triển khai, triển khai thành 4 chu kỳ luân hồi luân hồi với mỗi chu kỳ luân hồi luân hồi là 8 bit. + Sau lúc, đã
thông số kỹ thuật kỹ thuật kỹ thuật
Vị trí, source và destination,
tựa như, kích thước tài liệu, để gửi. Ta sử dụng, hàm DMA_Init(DMA_Channel1, &DMA_InitStructure) để init những
thông số kỹ thuật kỹ thuật kỹ thuật
thông số kỹ thuật kỹ thuật kỹ thuật phía phía
Phía trên, vào thanh ghi. +
Ngày này, thì DMA
rất có thể, sẵn sàng sẵn sàng sẵn sàng, để transfer tài liệu,, bất kể
lúc nào, lệnh sau được triển khai, triển khai DMA_Cmd(DMA_Channel1, ENABLE). +  Để bắt interrupt khi
quy trình tiến độ DMA transfer complete trên channel1. Ta
thông số kỹ thuật kỹ thuật kỹ thuật interrupt như 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 bật led on để báo trạng thái
bắt đầu LEDToggle(LEDG) . Khi
quy trình tiến độ thay đổi vừa xong thì nó có công dụng, sẽ bị, tạo ra 1 interrupt complete và thực hiển quần
Hòn đảo, trạng thái led trong interrupt này để báo hiệu. 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 và Global interrupt pending bits DMA_ClearITPendingBit(DMA1_IT_GL1); } } + Như vậy
này là code cho phần chuyển tài liệu, bằng DMA ,tiếp sau sau là phần chuyển tài liệu, bằng CPU thỉnh thoảng và ta cũng sử dụng, trạng thái của LED để quan sát thời hạn, thay đổi. Xem Ngay: Caffeine Là Gì – Caffeine Rất tốt, Hay Xấu Cho Sức Khỏe //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 tới, GPIOC pin 9 và LEDB (CPU) được
liên kết tới, GPIOC pin 8, Để quan sát rõ hơn
quy trình tiến độ transfer ta
liên kết 2 pin này với OSC như sau :

Xem Ngay:  Commis Là Gì - Nghề Khách Sạn
*

– Transfer sử dụng, DMA mất 214μs:

*

– Trong
khi sử dụng CPU để copy memory memory mất 544μs (gần gấp 3 lần
Nếu như với, sử dụng, DMA):

*

– Ví dụ
Này đã, đã cho
tất cả chúng ta, biết vận tốc truyền tài liệu, nhanh hơn đáng nhắc nhở,
Nếu như với, việc sử dụng, CPU thỉnh thoảng và quyền lợi và nghĩa vụ, và nghĩa vụ và trách nhiệm, to
Đặc trưng, là CPU tuyệt đối hoàn hảo, hoàn hảo và tuyệt vời nhất, rảnh rổi trong những lúc transfer và
rất có thể, làm nghĩa vụ và trách nhiệm, khác hoặc chỉ đơn giản và giản dị, và dễ dàng và đơn giản, là vào
chính sách sleep mode. –
kỳ vọng ví dụ này khiến cho bạn, có một trí tuệ sáng tạo rất dị về sức
Tác động ảnh hưởng, liên quan, DMA . Với DMA
toàn bộ
tất cả chúng ta, cũng xuất hiện, thể làm rất nhiều lần, việc làm ở tại mức, harward . Thể Loại: San sẻ, giải bày, Kiến Thức Cộng Đồng

Bài Viết: Dma Là Gì – Hướng Dẫn Lập Trình Dma Với Stm32 Thể Loại: LÀ GÌ Nguồn Blog là gì: https://hethongbokhoe.com Dma Là Gì – Hướng Dẫn Lập Trình Dma Với Stm32

Leave a Reply

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