انتقل إلى المحتوى

مذكرات تطوير مكتبة HAL - DMA

DMA (Direct Memory Access) تسمح بالتواصل المباشر بين أجهزة الأجهزة ذات السرعات المختلفة بدون الحاجة للتكمنة الكبيرة لوحدة المعالجة المركزية (CPU).

المبادئ الأساسية

مفهوم DMA

يوفر DMA نقل البيانات بسرعة عالية بين الأجهزة الخارجية/الذاكرة أو الذاكرة/الذاكرة دون الحاجة إلى استهلاك موارد وحدة المعالجة المركزية.

صورة

كما هو موضح في الصورة أعلاه، تحتوي سلسلة STM32F4 على وحدتي تحكم DMA، مع مجموع 12 قناة (7 في DMA1 و 5 في DMA2). تشترك وحدات تحكم DMA مع النواة Cortex-M3 في نظام البيانات.

بشكل بسيط، عندما تكون وحدة المعالجة المركزية مشغولة في أداء مهمة أكبر أو تكون كسولة لنقل مجموعة كبيرة من البيانات إلى مكان آخر، يمكن أن تكلف وحدة التحكم DMA بهذه المهمة. وعندما تنتهي وحدة التحكم DMA من العمل أو تواجه مشكلة، يمكنها التبليغ لوحدة المعالجة المركزية.

سيناريوهات استخدام DMA

  • التواصل عبر المنافذ المتسلسلة (UART): هذا هو الاستخدام الأكثر شيوعًا، عندما يتعين نقل كميات كبيرة من البيانات من أو إلى المنافذ المتسلسلة، يتم تفويض ذلك إلى DMA لتفريغ وحدة المعالجة المركزية والسماح لها بأداء المهام الأكثر أهمية.
  • محول التناظر إلى رقم (ADC): عادة في وضع مسح القنوات عندما يتعين استخدام ADC، يمكن استخدام DMA للتعامل معه.
  • قراءة وكتابة بطاقة الذاكرة SD: عند الحاجة إلى قراءة أو كتابة كميات كبيرة من البيانات إلى ومن بطاقة الذاكرة SD، غالبًا ما يتم استخدام DMA.

اتجاهات نقل DMA

  • P2P (من الأجهزة الخارجية إلى الأجهزة الخارجية).
  • P2M (من الأجهزة الخارجية إلى الذاكرة): عادة ما تستخدم لنقل البيانات من مستشعرات عبر المنافذ المتسلسلة إلى وحدة المعالجة المركزية.
  • M2P (من الذاكرة إلى الأجهزة الخارجية): عادة ما تستخدم لنقل البيانات من وحدة المعالجة المركزية إلى أجهزة التنفيذ.
  • M2M (من الذاكرة إلى الذاكرة): نقل البيانات داخل وحدة التحكم المركزية، وهو شائع في حالة نقل البيانات بين مخازن البيانات المؤقتة أو القراءة والكتابة من وإلى مخازن البيانات. فقط وحدة تحكم DMA2 قادرة على القيام بعمليات M2M.

أنماط نقل DMA

  • DMA_Mode_Normal: وضع عادي. يتوقف DMA بعد الانتهاء من المهمة، وإذا كان هناك حاجة للمزيد من النقل، يجب بدء النقل يدوياً.
  • DMA_Mode_Circular: وضع نقل دائري. عند الانتهاء من النقل، يتم إعادة تحميل مسجل كمية البيانات تلقائيًا من قبل العتاد لبدء دورة نقل بيانات جديدة.

مراجع دوال DMA الشائعة

إرسال البيانات عبر DMA لمنفذ السلسلة

HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

الوظيفة: إرسال البيانات بالطريقة المباشرة عبر وحدة DMA لمنفذ السلسلة.
المعاملات:

  • UART_HandleTypeDef *huart: اسم UART
```c
HAL_UART_DMAResume(&huart1)
```

الوظيفة: استئناف نقل DMA
القيم المعادة: 0 (جاري الاستئناف) ؛ 1 (اكتمل الاستئناف)

تجربة نقل المسلسلة باستخدام DMA

إعداد DMA داخل CubeMX

لإعداد الجزء المتعلق بالمسلسلة، يُرجى الانتقال إلى المقالة HAL ملاحظات تطوير المكتبة - اتصال المسلسل.

بعد إعداد مؤشرات USART والمقاطعات NVIC، قم بالتبديل إلى علامة تبويب DMA Settings وقم بالتكوين وفقًا للصورة التالية:

  • انقر فوق Add لإضافة قنوات (USART1_RX و USART1_TX).
  • ضبط أولويتيهما على Medium (أولوية متوسطة).
  • وضع نقل DMA على الوضع Normal (وضع عادي).
  • زيادة عنوان الذاكرة DMA تلقائيًا بمقدار بايت واحد في كل مرة.

ثم، في علامة تبويب System Core، ابحث عن DMA وأضف قسمًا جديدًا بعنوان MEMTOMEM كما هو موضح في الصورة التالية:

تكوين DMA داخل الشيفرة

main.c
/* USER CODE BEGIN Init */

uint8_t Senbuff[] = "رسالة مخرجات المسلسل عبر DMA \r\n";  // سلسلة مخصصة للإرسال

/* USER CODE END Init */

......

/* USER CODE BEGIN 3 */

HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
HAL_Delay(1000);

}
/* USER CODE END 3 */

قم بتفليش البرنامج وافتح مساعد المسلسلة، سترى سلسلة مخصصة تُرسل بشكل متكرر.

الإشارات والشكر

عنوان النص: https://wiki-power.com/ يتم حماية هذا المقال بموجب اتفاقية CC BY-NC-SA 4.0، يُرجى ذكر المصدر عند إعادة النشر.

يُرجى ملاحظة أن النص الأصلي تمت ترجمته إلى اللغة العربية وتم الاحتفاظ بالتنسيق الأصلي.

> تمت ترجمة هذه المشاركة باستخدام ChatGPT، يرجى [**تزويدنا بتعليقاتكم**](https://github.com/linyuxuanlin/Wiki_MkDocs/issues/new) إذا كانت هناك أي حذف أو إهمال.