STM32MP1 - kernels + Linux = متحكم مثالي

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

  1. متحكم عالي الموارد ولا يتطلب واجهة مستخدم رسومية (GUI) صعبة.
  2. تستهلك القليل من الموارد وتعمل في الأجهزة الصلبة في الوقت الحقيقي للجهاز.

وكقاعدة ، تم تحديد الانتقال إلى سلسلة جديدة من وحدات التحكم الدقيقة من خلال تحسين واجهة المستخدم الرسومية: المزيد من الألوان ، دقة أعلى ، عناصر تصميم أكثر تعقيدًا. في وقت من الأوقات ، كانت الفكرة هي استخدام نوع من لوحة Raspberry كواجهة رسومية.

ولكن مع ظهور خط STM32MP1 الجديد للمتحكم الدقيق ، انتهى عذابي وهذا ما حدث حتى الآن.

تحكم مثالي


يجب أن يكون لجهاز التحكم المثالي الخصائص التالية:

  • لديها قدرات رسومات لائقة ، مثل الدعم البسيط لتنسيقات الرسوم المختلفة ، ودعم الخطوط المتجهة
  • كمية كبيرة من الذاكرة للرسومات
  • لوحة مفاتيح USB ودعم الماوس
  • دعم إيثرنت
  • عدد كبير من أجهزة ضبط الوقت للأجهزة
  • جيل PWM
  • عدد كبير من GPIO
  • 16 بت ADC

هذه هي المتطلبات اللازمة لبناء أجهزة مختلفة مع واجهة مستخدم رسومية لائقة.

ولذا كنت سعيدًا جدًا لرؤية سلسلة جديدة من STM: STM32MP1.

أول لقاء


للتعرف على الشريحة الجديدة ، تم شراء لوحة STM32MP157C-DK2. إليك واحدة (صورة من الإنترنت): تم إنشاء



لوحة العرض التوضيحي على شريحة STM32MP157CAC ، والتي تتضمن:

  • 2 نواة A7 ، 650 ميجاهرتز لكل منهما
  • 1 نواة M4 ، 208 ميجاهرتز

ذاكرة


الاختلاف الأول الذي يلفت انتباهك هو عدم وجود ذاكرة فلاش على الشريحة. بالنسبة إلى معالج A7 الأساسي ، وهو في الأساس معالج دقيق ، يعد هذا موقفًا طبيعيًا ويتم تنفيذ التعليمات البرمجية دائمًا من DRAM. تتضمن وحدات التحكم الدقيقة القائمة على M4 عادةً ذاكرة فلاش يتم تخزين التعليمات البرمجية القابلة للتنفيذ فيها.

في هذه البلورة ، تحتوي نواة M4 على ذاكرة الوصول العشوائي فقط ويتم تنفيذ الرمز منها (من ورقة البيانات):

708 كيلوبايت من SRAM الداخلي: 256 كيلوبايت من
AXI SYSRAM + 384 كيلوبايت من AHB SRAM +
64 كيلوبايت من AHB SRAM في مجال النسخ الاحتياطي
و 4 كيلوبايت من SRAM في مجال النسخ الاحتياطي

يحتوي قلب A7 على وحدة تحكم DDR مدمجة (من ورقة البيانات):
تقوم أجهزة STM32MP157C / F بتضمين جهاز تحكم لـ SDRAM خارجي يدعم
الأجهزة التالية:

  • LPDDR2 أو LPDDR3 ، بيانات 16 أو 32 بت ، حتى 1 جيجابايت ، حتى 533 ميجاهرتز.
  • DDR3 أو DDR3L ، بيانات 16 أو 32 بت ، حتى 1 جيجابايت ، حتى 533 ميجاهرتز.

من ناحية ، يبدو أن ذاكرة نواة M4 أقل من نسخة النسخة الموجودة في ذاكرة فلاش ، ولكن من ناحية أخرى ، تعمل ذاكرة RAM على التردد الأساسي. لا تستطيع ذاكرة الفلاش القيام بذلك ، وهنا يجب عليك استخدام مقسم التردد.

تنظيم مكان العمل


نظرًا لأن Linux مطلوب للعمل مع اللوحة ، كان علي تثبيت محرك قرص ثابت إضافي في جهاز الكمبيوتر الخاص بي ونشر Ubuntu 16.04 عليه. ينصح STM بنظام التشغيل هذا.

وضع الهندسة والإنتاج


يمكن أن تبدأ اللوحة بأحد وضعين (يتم تحديده بواسطة مفتاح dip). في الوضع الهندسي ، يعمل النواة M4 بشكل منفصل. في وضع الإنتاج ، يعمل النواة M4 تحت سيطرة النواة A7. لم أستخدم الوضع الهندسي ، لقد عملت فقط في وضع الإنتاج. في هذا الوضع ، لا داعي للقلق بشأن ضبط الساعة الأساسية. يتم تكوين التوقيت أثناء عملية التمهيد عند القيم القصوى. راجعت عدة سجلات في المصحح ، واستنتجت بعض الترددات على MCO ونظرت إلى الذبذبات. يعمل A7 بتردد 650 ميجاهرتز ، M4 بتردد 208 ميجاهرتز.

نواة M4. تنزيل البرامج وتشغيلها


نظرًا لأن M4 يعمل بنظام A7 ، فهذا يعني تشغيل OpenSTLinux. يتم استخدام إطار عمل وحدة التحكم عن بُعد Linux (RPROC) للتحكم في مركز M4. يسمح لك هذا الإطار بتمكين وتعطيل برنامج kernel والتنزيل والتصحيح (ملفات ELF).

لتحميل البرنامج في نواة M4 ، استخدم الأمر التالي:

echo -n <firmware_name.elf >> / sys / class / remoteproc / remoteproc0 / firmware

لبدء البرنامج:

echo start> / sys / class / remoteproc / remoteproc0 / state

للتوقف:

echo stop> / sys / class / remoteproc / remoteprocX / state

نواة M4. SW4STM32


لقد جربت الأوامر المذكورة أعلاه ، كل شيء يعمل :) ولكن للعمل ، تحتاج إلى نوع من IDE العادي. توصي STM باستخدام برنامج AC6 SW4STM32 لهذا الغرض. في الوقت نفسه ، يحتوي موقع OpenSTM32 على عنوان رائع جدًا:
مع نظام Workbench لنظام التشغيل Linux ، لم يكن نظام Linux المضمن في عائلة STM32MP1 من وحدات MPU من ST بسيطًا في الإنشاء والصيانة ، حتى بالنسبة للوافدين الجدد في عالم Linux.
وإذا قمت بتثبيت System Workbench لنظام Linux في System Workbench لـ STM32 ، يمكنك بسهولة تطوير وتصحيح التطبيقات غير المتماثلة التي تعمل جزئيًا على Linux ، وجزئيًا على Cortex-M4.
أي أنه يمكنك كتابة كود لكل من نواة m4 و A7. لكن هذه نسخة مدفوعة. ويسمح لك الإصدار المجاني ، المتاح للتنزيل ، بكتابة التعليمات البرمجية وتصحيحها فقط لـ M4 core.

تم تنزيل IDE SW4STM32 وتثبيته وتجربته. كل شيء يعمل ، لا تختلف عملية الكتابة والتجميع عن الإصدار على Windows.
والفرق الوحيد هو تحميل التعليمات البرمجية وتصحيحها ، لأنه يتم استخدام اتصال Ethenet و SSH لكتابة البرامج. من أجل التصحيح والتوقف بالنقاط ، يتم استخدام لوحة ST LINK المضمنة.

نواة A7. مترجم عبر


لتجميع البرامج على جهاز كمبيوتر ، تقدم STM مترجمًا مشتركًا. يتم وصف عملية تحميل وتشغيل البرنامج النصي عبر المترجم بالتفصيل في ويكي STM32MP1 ، الرابط أدناه. كل شيء تم وفقًا للتعليمات ، كل شيء يعمل كما ينبغي. :)

تشغيل المترجم المشترك للنظام البيئي v1.1.0:

مصدر SDK / environment-setup-cortexa7t2hf-neon-vfpv4-openstlinux_weston-linux-gnueabi
بشكل جيد ، ثم سيتم تجميع
الأمر make
وشفرة المصدر ، وفقًا لـ makefile ، في رموز ARM :)

نواة A7. تنزيل البرامج وتشغيلها


لتحميل البرنامج في لوحة العرض ، استخدم الأمر:

scp gtk_hello_world root@192.168.1.18: / usr / local يقوم

هذا الأمر بتنزيل ملف gtk_hello_world إلى القسم / usr / local الموجود على اللوحة بعنوان IP: 192.168.1.18. الجذر - كلمة المرور الموجودة على اللوحة بشكل افتراضي.

تبادل البيانات بين النواة


قضى معظم الوقت في فهم آلية تبادل البيانات بين النوى. في الأمثلة التي قدمتها STM ، هناك العديد من الخيارات لتنفيذ مثل هذا التبادل. يمكنك العمل مباشرة مع برنامج التشغيل من OpenSTLinux أو استخدام آلية UART الافتراضية. قررت أن أجعل المشاركة عبر المنافذ الافتراضية أبسط.

من ناحية Linux ، يبدو الأمر كما يلي:

افتح الجهاز:

fd = open ("/ dev / ttyRPMSG0"، O_RDWR)؛

ثم نكتب عليها أو نقرأ:

write (fd، "LED_Toggle \ r \ 0"، 10)؛
len = قراءة (fd، buf، sizeof (buf)) ؛

كل شيء بسيط للغاية ، ولكن هناك فارق بسيط بسيط. لكي يظهر جهاز ttyRPMSG0 ، أنت بحاجة إلى نواة M4 للوصول إلى نواة A7 في هذا النموذج:

هذه هي خطوط رمز النواة M4:

VIRT_UART_Init(&huart0); //  
VIRT_UART_RegisterCallback(&huart0, VIRT_UART_RXCPLT_CB_ID, VIRT_UART0_RxCpltCallback) //      .

استقبال البيانات من منفذ افتراضي بواسطة M4 core:

if (VirtUart0RxMsg)
{
      //     VirtUart0ChannelBuffRx
     
      VirtUart0RxMsg = 0;
}

كتابة البيانات إلى المنفذ الظاهري:

VIRT_UART_Transmit(&huart0, TxArray, TXCounter);

كل شيء يعمل ، ولكن هناك فارق بسيط صغير لا أستطيع فهمه حتى الآن. لا يبدأ استقبال البيانات بواسطة نواة A7 ، التي يتم إرسالها بواسطة نواة M4 ، ما لم يكتب نواة A7 سابقًا أي بيانات إلى المنفذ.

يتم تنفيذ هذه الآلية بأكملها من خلال مجموعة من مكتبات OpenAMP خارجية. يجب تضمين هذه المكتبة في مشروع نواة M4 وتهيئتها وفقًا لذلك.

خطط مستقبلية


قم بتثبيت وتكوين Eclipse لكتابة وتصحيح كود A7.
اكتب عرضًا بيانيًا عاديًا ، مثل راسم التذبذب من M4 ADC.
وأخيرًا ، اجعل لوحة التحكم الخاصة بك استنادًا إلى هذه الشريحة. :) Wiki

روابط مفيدة

STM32MP1
OpenSTM32
ST Community
AC6

All Articles