برمجة المتحكمات الدقيقة الحديثة: المحاضرة 1

ملخص المحاضرة الأولى عن برمجة المتحكمات الدقيقة الحديثة باستخدام مثال STM32 ونظام التشغيل RIOT. يتم تسليم المحاضرات في معهد MIREA لتكنولوجيا المعلومات أيام السبت ، من الساعة 12:50 في قاعة العرض في الطابق الرابع من المبنى D. وتعطي الفصول 1.5 ساعة للمحاضرة نفسها و 3 ساعات للصفوف العملية في مختبر إنترنت الأشياء التابع لأكاديمية Samsung حول موضوع المحاضرة.

مرحبا Giktayms! كما وعدنا ، بدأنا في نشر ملاحظات المحاضرات التي يتم تسليمها في معهد MIREA لتكنولوجيا المعلومات. وفقًا لنتائج المحاضرة التمهيدية الأولى ، قررنا تغيير بنية الدورة قليلاً - بدلاً من المسارين المخططين لخمسة دروس ، سيكون هناك مسار واحد لسبعة دروس. سيجعل هذا من الممكن ترتيب عدد من الأسئلة الداعمة بوتيرة أكثر راحة ، بالإضافة إلى المقالات المجردة التي ستظهر على GT كل أسبوع طوال مارس وأبريل ، وليس في غضون أسبوع ، كما هو مخطط سابقًا.

ومع ذلك ، في سبع محاضرات ، من المستحيل تغطية مثل هذا الموضوع الشامل بالكامل ، لذلك سيكون العرض التقديمي أطروحة في بعض الأماكن - على الرغم من أنه للتعويض عن ذلك ، سنحاول تحديد الاتجاه الذي يريد أولئك الذين يرغبون في فحص هذه المسألة أو تلك بشكل أعمق بشكل مستقل.

تم تصميم الدورة لطلاب السنة الثانية والثالثة المطلعين على لغة سي والمفاهيم الأساسية للإلكترونيات والهندسة الكهربائية. التعارف المسبق مع المتحكمات الدقيقة غير مطلوب.

الغرض من الدورة هو تطوير المهارات التي تسمح لك بالعمل بحرية مع المتحكمات الدقيقة على ARM Cortex-M الأساسية على المستوى الحديث ، وإذا كانت هناك رغبة كهذه ، انتقل إلى مزيد من تعميق معرفتك.



محاضرة اليوم هي الأولى ، لذلك ستفهم المفاهيم العامة: ما هو المتحكم بشكل عام ولماذا هو ضروري ، وما هو البرنامج الثابت وكيف يتم الحصول عليه ، ولماذا نحتاج إلى نظام تشغيل ، وأخيرًا ، وكيفية العمل مع git. نتيجة هذا الدرس هي مستودع GitHub الخاص بك مع رموز مصدر نظام التشغيل ، بالإضافة إلى بيئة بناء تم تكوينها بنجاح على الكمبيوتر المحلي.

متحكم


باختصار ، يعد الميكروكونترولر مثالًا كلاسيكيًا على "نظام على شريحة" ، والذي يتضمن كلاً من قلب المعالج ومجموعة من الأجهزة المساعدة والأجهزة الطرفية ، مما يسمح للمتحكم الدقيق في كثير من الحالات بالاكتفاء الذاتي تمامًا.



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

في وحدة التحكم الدقيقة ، على العكس من ذلك ، على نفس الشريحة مع القلب ، لا يتم فقط تنفيذ الأنظمة الفرعية اللازمة لتشغيلها ، ولكن أيضًا كتلة الأجهزة الطرفية التي قد تكون مطلوبة في مهام عملية مختلفة. علاوة على ذلك ، تتنافس العديد من الشركات المصنعة للمتحكم الدقيق مع بعضها البعض ليس في الأداء الأساسي أو سعة الذاكرة ، ولكن في وفرة ووظائف الأجهزة الطرفية.

تم تطوير وحدات التحكم الدقيقة بالتوازي مع المعالجات الدقيقة لبعض الوقت - على سبيل المثال ، تم تطوير بنية Intel 8051 التي لا تزال موجودة في المنتجات الصناعية في عام 1980. في بعض النقاط ، تبدأ خطوط تطويرها في التقاطع مع المعالجات الدقيقة - على سبيل المثال ، تحتوي الموديلات القديمة من وحدات التحكم الدقيقة على واجهات لذاكرة الوصول العشوائي الخارجية ، ويدمج مصنعو المعالجات الدقيقة المزيد والمزيد من الأجهزة الطرفية على الشريحة (يكفي أن نتذكر أنه في فجر "أجهزة الكمبيوتر الشخصية" حتى تم طلب ذاكرة التخزين المؤقت الخارجية دوائر دقيقة) - ولكن على أي حال ، فإنها لا تزال فرعين مختلفين بشكل كبير عن التطور.

في الواقع ، كان الهدف من إنشاء المتحكم الدقيق هو تقليل تكلفة وتصغير الأجهزة المختلفة التي تتطلب بعض القوة الحاسوبية الصغيرة: استخدام شريحة واحدة ، والتي تكفي لتزويد الطاقة لتشغيلها ، يبسط بشكل كبير تصميم وتصنيع لوحة الدوائر المطبوعة مقارنة بمجموعة من 4-5 شرائح منفصلة .

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

  • نادرًا ما تتجاوز ترددات التشغيل 200 ميجاهرتز ، وغالبًا ما تكون في منطقة عشرات ميغاهيرتز.
  • تكون مساحة ذاكرة الوصول العشوائي (RAM) في حدود الميغابايت ، وغالبًا ما تكون في منطقة عشرات الكيلوبايتات.
  • حجم ذاكرة البرنامج داخل ميغا بايت ، وغالبا في منطقة عشرات إلى مئات الكيلوبايت.

كجزء من الدورة التدريبية ، سوف نعمل مع وحدات التحكم الدقيقة STM32L151CC التي تحتوي على 32 كيلوبايت من ذاكرة الوصول العشوائي ، و 256 كيلوبايت من ROM وأقصى تردد للعمل يبلغ 32 ميجاهرتز (على لوحات Nucleo-L152RE هي شرائح أكثر خطورة قليلاً - 80 كيلوبايت من ذاكرة الوصول العشوائي و 512 كيلوبايت من ROM).

الذاكرة


بشكل عام ، يمكن أن يكون هناك أربعة أنواع من الذاكرة داخل وحدة التحكم الدقيقة:

  1. يتم استخدام الذاكرة الدائمة ( ذاكرة فلاش) لتخزين برامج المستخدم ، وأحيانًا ، بعض إعدادات وحدة التحكم الدقيقة نفسها. إذا ، عند تحديد خصائص وحدة التحكم الدقيقة ، يكتبون مقدار الذاكرة دون تحديد أيها - كقاعدة عامة ، يتعلق الأمر بالفلاش. لا يتم إعادة ضبط محتويات الفلاش عند انقطاع التيار الكهربائي ، وعادة ما تكون فترة تخزين المعلومات فيه في الظروف العادية 10 سنوات على الأقل.
  2. تستخدم ذاكرة الوصول العشوائي لتنفيذ برنامج المستخدم وتخزين البيانات "المؤقتة". تتم إعادة تعيين ذاكرة الوصول العشوائي دائمًا عند إعادة التشغيل أو إيقاف التشغيل ، وقد لا يتم حفظها أيضًا عند دخولك في بعض أوضاع السكون. في وحدات التحكم الدقيقة ، غالبًا ما لا يوجد فصل واضح بين ذاكرة البرنامج وذاكرة البيانات - ونتيجة لذلك ، يمكن العثور على مصطلح "التنفيذ من ذاكرة الوصول العشوائي" ، مما يعني أنه في ذاكرة الوصول العشوائي لا توجد بيانات فقط ، ولكن أيضًا البرنامج نفسه ؛ ومع ذلك ، هذه حالات غريبة للغاية.
  3. EEPROM . تشير أيضًا إلى ذاكرة القراءة فقط ، ولكنها تختلف بشكل كبير عن ذاكرة الفلاش في خصائصها. يحتوي الفلاش على عيبين كبيرين يجعل من غير المناسب حفظ بعض البيانات الحالية من البرنامج - أولاً ، يحتوي الفلاش على عدد محدود من عمليات الكتابة فوق الخلية نفسها ، وثانيًا ، من الممكن غالبًا العمل مع الفلاش فقط في الصفحات الكاملة ، والتي مئات البايت في الحجم ، حتى إذا كنت بحاجة إلى استبدال بايت واحد فقط. لا تحتوي EEPROM على هذه العيوب - عادة ما تكون مدة خدمتها أطول بعشر مرات (من 100 ألف إلى 1 مليون كتابات) ، ومن الممكن العمل فيها مع كل بايت على حدة. لهذا السبب ، يتم استخدام EEPROM للتخزين الدائم للبيانات التي تم إنشاؤها بواسطة البرنامج نفسه (أرشيفات القياس وإعدادات البرنامج ، وما إلى ذلك) ، حجمه النموذجي هو وحدات من وحدات الكيلوبايت ، ولكنه ليس في جميع وحدات التحكم.
  4. ذاكرة النظام مناطق ذاكرة للقراءة فقط ، لا يمكن للمستخدم الوصول إليها للتسجيل ، ولكنها مسجلة في إنتاج وحدة التحكم الدقيقة. عادةً ما تحتوي على رمز قابل للتنفيذ لبرنامج bootloader (حوله أدناه) ، ولكن يمكن أيضًا تخزين بعض ثوابت المعايرة أو الأرقام التسلسلية أو حتى المكتبات المساعدة للعمل مع الأجهزة الطرفية

يمكنك إلقاء نظرة على تنظيم الذاكرة لوحدة تحكم معينة في ورقة البيانات الخاصة بها. هنا ، على سبيل المثال ، توجد ورقة بيانات على STM32L151CC ، في الصفحة 51 منها يتم تقديم بطاقة ذاكرة لهذه العائلة.

من السهل ملاحظة أن جميع أنواع الذاكرة الأربعة ، التي تحدثنا عنها ، تحتل قطعة صغيرة جدًا من البطاقة - وفي معظم الصورة توجد قائمة بجميع الأجهزة الطرفية المتوفرة في وحدة التحكم.

يسجل


والحقيقة هي أن كل شيء - بشكل عام كل شيء - يتم التواصل مع جميع الأجهزة الطرفية لوحدة التحكم الدقيقة وجميع إعداداتها باستخدام عمليتين فقط:

  • اقرأ القيمة على العنوان المحدد
  • اكتب القيمة على العنوان المحدد

كل شيء موجود داخل وحدة التحكم الدقيقة يتم تعيينه بالضرورة لبعض العناوين. تسمى هذه العناوين السجلات (لا تخلط مع سجلات المعالج - تحتوي سجلات المعالجات على بيانات يقوم المعالج بتنفيذ العمليات عليها ؛ تحتوي السجلات التي نتحدث عنها على بعض البيانات الخاصة التي تعين على وجه التحديد حالة وحدات الأجهزة المختلفة لوحدة التحكم الدقيقة).

لذا ، على سبيل المثال ، إذا أردنا ظهور "1" في الجزء الثالث من المنفذ A من وحدة التحكم الدقيقة (PA2 ، الترقيم من البداية) ، فنحن بحاجة إلى كتابة "1" في الجزء الثالث من السجل الموجود على 0x4002014. وإذا تم تكوين هذه المحطة كمدخل ، وعلى العكس من ذلك ، نريد معرفة القيمة الموجودة عليها ، نحتاج إلى قراءة الجزء الثالث من التسجيل على العنوان 0x40020010.

نعم ، للإشارة إلى وحدة التحكم ، هذه الساق هي المدخلات أو المخرجات - تحتاج إلى كتابة القيم المقابلة للبتات المقابلة على العنوان 0x40020000.

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

بالطبع ، يعد العمل باستخدام العناوين الرقمية غير مريح إلى حد ما ، لذلك لكل مكتبة دقيقة على قلب Cortex-M توجد مكتبة CMSIS (واجهة واجهة Cortex Microcontroller Software Interface Standard) ، وأهم مكون بالنسبة لنا هو ملف رأس يصف السجلات المتاحة في وحدة تحكم معينة ويعطيها للقراءة البشرية نسبيًا الأسماء.

باستخدام CMSIS ، ستبدو العمليات الموضحة أعلاه مع قدم السلطة الفلسطينية كما يلي:

int pin_num = 2; /* PA2*/
GPIOA->MODER &= ~(0b11 << (pin_num*2)); /*     PA2    */
GPIOA->MODER |= 0b01 << (pin_num*2); /*     PA2  01 —  */
GPIOA->ODR |= 1 << pin_num; /*   PA2  1 */

GPIOA->MODER &= ~(0b11 << (pin_num*2)); /*     PA2,    */
uint32_t pa2_value = GPIOA->IDR & (1 << pin_num); /*    PA2 */

, — Reference Manual (, , , RM0038, STM32L1). , 900 RM0038 —  , 1500-2000 . -, , —  .

, — . , , «» .

, , — , - ( 1 , , , 1 , , ), .

STM32 Standard Peripherals Library, StdPeriphLib, SPL. , ST LL, — , LibOpenCM3. , STM32 .

, SPL , , , GPIO_Init GPIO_Write.

, , SPL — .

, SPL «» , , STM32 CubeMX. (, , ) STM32.

, , « , - » — « , ». SPL, , , , SPL , —  SPL , . , .

, , , - , , , STM32L1 ATSAMD21 , SPL, .

SPL — , , , SPL.

, SPL —  «» . , :

  • . , (RTC), — - , ( ) (, ), . -, .
  • . , . Arduino loop() , . loop() , , . ( , ).
  • . , , — , : -, , , . - —  , , , , . , API.

—  —  .

, ( 5-20 ), , 70 % .



, , SPL. RIOT OS, STM32 —  SPL .

: , , , , SPL . , SPL , , STM32, , .


, :



  • — , ;
  • — , , : , , ;
  • —  .

, RIOT OS - (IDE) — , , IDE, (, , Arduino IDE —  ; , , ).

, , , , « , , ».

, , Arduino IDE, IDE, — .



, RIOT OS , : HAL cpu ( , , AVR PIC32), — boards, — drivers, — core, — sys, — examples.

, — , ( ) , , , , . — , , .


https://github.com/unwireddevices/RIOT/tree/mirea — RIOT OS, Unwired Devices STM32L1, , , , .

Github, «Clone/Download» «Download ZIP», . GitHub, «Fork» — , .

GitHub Git —  , .


, , - , «Hello world» :

#include <stdio.h>
int main(void)
{
    puts("Hello World!");
    printf("You are running RIOT on a(n) %s board.\n", RIOT_BOARD);
    printf("This board features a(n) %s MCU.\n", RIOT_MCU);
    return 0;
}

example/hello-world main.c ( ).

, , , . - .

1. Windows 8 . , MinGW, . . , Git/GitHub Git for Windows, MinGW. MinGW, MinGW .

, Windows 7 Windows 8, , .

2. Windows 10. Microsoft Store, Ubuntu . Ubuntu Windows, « Windows», « Windows Linux» .

Ubuntu, , MinGW.

(: 64- Linux!), Ubuntu, :

cd /opt
sudo tar xf /mnt/c/Users/vasya/Downloads/gcc-arm-none-eabi-7-2017-q4-major-linux.tar.bz2
export PATH=/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/:$PATH
export PATH=/opt/gcc-arm-none-eabi-7-2017-q4-major/arm-none-eabi/bin/:$PATH
echo "export PATH=/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/:\$PATH" >> ~/.bashrc
echo "export PATH=/opt/gcc-arm-none-eabi-7-2017-q4-major/arm-none-eabi/bin/:\$PATH" >> ~/.bashrc

.bashrc, Ubuntu. $ >> —  , ( ) .bashrc.

arm-none-eabi-gcc --version , , — 7.2.1 ( ).

Git ssh-keygen, ( Ubuntu Windows cat ~/.ssh/id_rsa.pub, Enter — ) GitHub. GitHub git.

NB: Linux, : , Tab ( cd /opt/gcc- cd /opt/gcc-arm-none-eabi-7-2017-q4-major). , — , . , Tab .

NB: Windows , , Windows, Documents/git/RIOT. - MinGW /c/Users/vasya/Documents/git/RIOT, - Ubuntu — /mnt/c/Users/vasya/Documents/git/RIOT. , , , Windows, Notepad++.

3. Linux. Windows 10, , Microsoft Store . gcc-arm-none-eabi — .

, RIOT examples/hello-world, make.

, , unzip ( Windows 10 ), make . Windows 10 ( ):

sudo apt-get install unzip make

make — , «make clean && make»: , . , - , —  , .

NB: RIOT hello-world native, , , x86. unwd-range-l1-r3, stm32,

Building application "mirea" for "unwd-range-l1-r3" with MCU "stm32l1".

- , make — . mirea.elf ( - ).

- :



, , , , , .

, GPIO, — , , — , .

P.S. — 360- ( : « » , , - ):



Source: https://habr.com/ru/post/ar411143/


All Articles