نبدأ في دراسة ميكروكنترولر باستخدام مثال STM32F030f4p6



0. قبل قراءة المقال


تحتوي هذه المقالة على الأهداف التالية:

  1. عرض كيفية العمل بشكل خاص مع هذا المنتدى ؛
  2. إظهار النهج الذي يمكنك من خلاله كتابة برنامج LED الوامض ، والاعتماد فقط على الوثائق والمنطق ؛
  3. تقديم المواد بلغة مفهومة لشخص غير معتاد على ميكروكنترولر.

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

سنحتاج إلى الوثائق التالية:

  1. ورقة البيانات STM32F030x4 (يمكنني استخدام المستند اعتبارًا من يناير 2017 DocID024849 Rev 3) ؛
  2. RM0360 دليل مرجعي STM32F030x4 / x6 / x8 / xC (يمكنني استخدام المستند اعتبارًا من أبريل 2017 DocID025023 Rev 4) ؛
  3. لوحة الدوائر.

يمكنك تنزيل هذه المستندات من السحابة .
لن يتم اعتبار الموقت في المقالة ولن يشارك في الكود.
لم يتم استخدام مبرمج ST-LINK. للعمل مع اللوحة ، تم استخدام محول USB-COM (RS232 يعتمد على PL2303HX) ، والذي يحاكي منفذ COM.

محول الصور

تم جمع كل شيء على جهاز ظاهري يعمل بنظام Windows XP Professional 2002 SP3 يعمل من خلال VirtualBox الإصدار 5.2.22r126460 على مضيف Windows X.

1. تثبيت برنامج تشغيل محول USB-COM


ليس هناك أي مساعدة لنظام التشغيل Windows ، قم بتنزيله من الموقع الرسمي Prolific (أول رابط لطلب "برنامج غزير الإنتاج" في Google) لبرنامج تشغيل USB إلى برنامج تشغيل Windows UART / Serial / Printer PL2303 (تحتاج إلى برنامج التشغيل القياسي ). أو يمكنك تحميل من سحابة بلدي.

تثبيت برنامج التشغيل ، إعادة التشغيل ورؤية منفذ COM الجديد.

لقطة شاشة مع اسم المثبت ومنفذ COM الجديد

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

إعدادات منفذ COM


2. ملء البرامج الثابتة وخارجها


2.0 تنزيل الأداة المساعدة للعمل مع اللوحة


نقوم بتنزيل الأداة المساعدة FLASHER-STM32 من موقع STM على الويب (في الوصف الذي يطلق عليه STM32 Flash أداة العرض لودر (UM0462)) ، سيكون عليك التسجيل في هذا التطبيق ، ولكنه ليس مخيفًا - في النهاية سنقوم بإسقاط أرشيف الرمز البريدي مع المثبت ؛ التالي-> التالي-> التالي ... ويتم تثبيت كل شيء. للراحة ، أقوم بإنشاء اختصار لهذا التطبيق في مجلد العمل.

إليك الأداة (لقطة شاشة للموقع)


بشكل افتراضي ، المسار إلى الأداة المساعدة C: برنامج Files \ STMicroelectronics \ Software \ Flash Loader Demo \ STMFlashLoader Demo.exe .

2.1 فارق بسيط


هناك الطائر BOOT على متن الطائرة.

  • عندما يتم إغلاق العبور ، يقوم المتحكم الدقيق بتحميل الإرشادات من ذاكرته (على سبيل المثال ، برنامج يكتبه مبرمج).
  • عندما يكون الطائر مفتوحًا ، سيتلقى متحكم المعلومات على خطي RX و TX ، أي سيتم وميض من منفذ COM (من المحول في حالتي).

2.2 تكوين الأداة المساعدة




قم بتشغيل هذا التطبيق ، إنه في الواقع أبسط (يحتوي على الحد الأدنى من الإعدادات). في النافذة الأولى ، حدد:

  1. واجهة (لدي COM-3) ؛
  2. السرعة التي سيتواصل بها الكمبيوتر وجهاز التحكم الدقيق (IMHO ، القيمة العادية 9600) ؛
  3. عدد وحدات البت في البيانات (لسبب ما ، هذه النافذة غير متاحة لي ، لكن هذا غير مهم حتى الآن) ؛
  4. التكافؤ (ليس لدي تكافؤ ، أي لا شيء) ؛
  5. صدى (لدي قبالة) ؛
  6. وقت الانتظار (لدي 10 ثوان).

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

الهدف قابل للقراءة إذا تم اكتشاف المتحكم بنجاح


ترتيب الخطوات التي تساعد دائمًا:

  1. أولاً ، تحتاج إلى التحقق مما إذا كان العبور BOOT على اللوحة مغلقًا.
  2. ثانياً ، على أي حال ، قم بإيقاف تشغيل وحدة التحكم الدقيق ويفضل أن تكون خطوط TX و RX القادمة من المحول إلى اللوحة (لا يمكنك فصل الأرض).
  3. ثالثًا ، في البرنامج ، اضغط على "العودة إلى النهاية" ، أي إلى الصفحة الأولى ، أو حتى إغلاقه وإعادة تشغيله (بشكل عام ، يتجمد أحيانًا). من المهم أن تبدأ دائمًا من الصفحة الأولى قبل كل اتصال باللوحة من خلال هذا البرنامج.
  4. رابعا ، التقط الأسلاك من المهايئ إلى اللوحة وحاول الاتصال مرة أخرى في البرنامج (تأكد من الصفحة الأولى!).

إذا فشل كل شيء آخر ، يمكنك محاولة إيقاف تشغيل كل شيء ، وإعادة تشغيل الكمبيوتر ، ومحاولة إعادة الاتصال باللوحة.

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

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

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

اختيار الجهاز المستهدف


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



حدد شريحة (16K) في الهدف والمضي قدمًا.


يتم تقديم اختيار من 4 إجراءات باستخدام شريحة:

  1. محو الذاكرة (كامل أو حدد منطقة معينة) ؛
  2. إرسال البرامج الثابتة إلى الجهاز ؛
  3. قراءة البرامج الثابتة من الجهاز ؛
  4. تمكين / تعطيل الكتابة أو قراءة الحماية.

2.3 قراءة البرامج الثابتة من اللوحة


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

حدد صفحات الذاكرة لقراءتها


إذا قمت فقط بتحميل البرامج الثابتة على اللوحة أو قراءة البرنامج الثابت من اللوحة ، فلا يوجد فرق بين تنسيقات الملفات هذه. فيما يلي صفحة تقدم ، حيث يتم تجميد العملية في بعض الأحيان بنسبة 99٪ لفترة طويلة (وليس بالضرورة 99) ، ولكن بعد بضع ثوانٍ من المفترض أن تكتمل بنجاح - في الواقع ، بعد ذلك لم يعطِ مجلس الإدارة السلوك الذي يتوافق مع البرامج الثابتة المحمّلة. ببساطة ، تحتاج إلى إعادة توصيل كل شيء وإعادة ملء البرامج الثابتة ، لا يوجد شيء حرج في هذا الأمر.

تم حفظ ملف البرنامج الثابت ، ويمكن في المستقبل تحميله على اللوحة.

ومع ذلك ، إذا تم تثبيت حماية القراءة ، لا يمكن قراءة البرنامج الثابت.

نافذة التقدم


2.4 امض اللوح


املأ الآن ملف البرنامج الثابت ، فيما يلي كتابة التعليمات البرمجية المصدر الخاصة به. في المستقبل ، أقول إننا سنحمّل ملفات bin و hex ، لأن بيئة التطوير سوف تصدر لهم. الإعدادات الإضافية لملفات s19 و hex متطابقة ؛ بخلافهم ، في ملف bin ، يمكنك تحديد العنوان الذي سيتم تسجيل البرنامج الثابت منه ، بشكل افتراضي في الأداة المساعدة هو 8000000 (مناسب لنا).

التحضير للتسجيل


قبل التسجيل ، يمكنك مسح ذاكرة الفلاش الخاصة بجهاز التحكم عن طريق اختيار أحد الخيارات الثلاثة التالية:

  • محو الصفحات اللازمة (مسح المقاطع اللازمة من الذاكرة) ؛
  • لا محو (بدون تنقية) ؛
  • محو عام (تنظيف كامل).

في الواقع ، التنظيف هو عملية كتابة الأصفار على الذاكرة.

لا تزال هناك بايت اختياري ، لكن حتى الآن لا يمكنك لمسها. انقر فوق "التالي" ، انتظر حتى تكتمل العملية وستنتهي.

إذا كنت ترغب في تسجيل البرامج الثابتة الخاصة بي ، يمكنك العثور عليها في السحابة ، ملف blink.bin . عند استخدام هذه البرامج الثابتة ، يجب أن يومض مصباح LED المدمج في الوميض من قدم PA4.

3. كتابة التعليمات البرمجية


3.0 تثبيت بيئة تطوير CooCox CoIDE


يمكنك تنزيل IDE من موقع SoftPedia.com ، قبل أن تتمكن من تنزيله من موقع STM ومن موقع IDE نفسه ، لكن منذ توقف IDE عن الدعم ، أصبح ذلك مستحيلًا. لا يوجد شيء حرج في أن IDE لم يعد مدعومًا ، لا ، لأن لكتابة التعليمات البرمجية ، الشيء الرئيسي هو المترجم. لقد قمت بتنزيل كلا الإصدارين ، لكنني أستخدم الإصدار 1.7.8.
تم وصف الإطلاق الأول للبيئة بشكل جيد هنا ، التالي-> التالي-> التالي ... ولا شيء معقد. سأضيف فقط أنه من الأفضل أولاً إنشاء مشروع ، ثم كل شيء آخر.

ومع ذلك ، إذا فقدت علامة التبويب مستودع ، يمكنك العثور عليها في القائمة عرض -> مستودع .
يمكنك تنزيل أدوات (برنامج التحويل البرمجي) للبيئة هنا أو مطالبة Google "gnu tools for arm" ؛ لقد قمت بتنزيل خيار يتضمن sha1.exe في النهاية.

3.1 إطار المصدر


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

هذه هي الطريقة التي سيبدو بها المشروع عندما تم إنشاؤه للتو ، أي لا يوجد سوى الملف الرئيسي main.c ولا شيء أكثر


حدد CMSIS BOOT وستحدد البيئة تلقائيًا M0 Cmsis Core ، لأنه التبعيات تتطلب هذا.

الآن نحصل على الحد الأدنى من مجموعة المصادر


تجميع المشروع (رمز البناء ، أو مفتاح F7). لأسباب غير معروفة بالنسبة لي ، لم يتم جمع ملف hex (هناك تحذير في وحدة التحكم) ؛ قمت بإعادة تثبيت IDE والمترجم عدة مرات ، وأعدت إنشاء المشروع ، لكن لسبب ما هذه النتيجة على الجهاز الظاهري ؛ على جهاز كمبيوتر آخر (غير افتراضي ، ولكن حقيقي) كل شيء واحد على واحد والإخراج يعمل عرافة. لحسن الحظ ، هناك بن.

تم تجميع المشروع بنجاح


أنصحك أن تنتبه إلى حجم الملف ، ويمكن رؤيته في نهاية الإخراج في وحدة التحكم ، أو يمكنك رؤيته بالوسائل القياسية (هنا ، بالمناسبة ، يمكنك أن ترى أن عرافة فارغة) ؛ في الوقت نفسه ، تظهر لقطة الشاشة هذه أن ملفات البرامج الثابتة موجودة في مجلد المشروع ، ثم Debug / bin /


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

3.2 خوارزمية الأصابع


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

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

بعد ذلك ، يجب على المتحكم الدقيق تشغيل المصباح ، والانتظار لفترة ، وإيقاف تشغيل المصباح ، والانتظار لفترة ، وتشغيله ، ...

نتيجة لذلك ، ستبدو الخوارزمية مثل هذا



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

وفقًا لهذه الخوارزمية ، سنكتب الرمز.

3.3 العمل مع الوثائق


أوصي بقراءة هذا الجزء من المقالة مع الملف المفتوح stm32f0xx.h ، والذي يقع في مجلد cmsis_boot لمشروعنا ، والوثائق المفتوحة.

3.3.1 اختيار مصدر الساعة


أولا ، تحتاج إلى توفير الطاقة إلى متحكم. يتلقى المتحكم الدقيق 5 فولت من المحول (يقاس بمقياس متعدد) ، لكن السؤال الذي يطرح نفسه هو "ما هو التردد الذي يعمل به المتحكم الدقيق في" ، لأنه من المعروف أن الإلكترونيات تعمل على ترددات مختلفة. أولاً ، افتح ورقة البيانات ، في المحتويات ، يمكنك رؤية قسمين لهما معنى: إدارة الطاقة ، الساعات وبدء التشغيل . الأول هو حول وسائط الجهد المنخفض والطاقة. يخفي القسم الثاني ما يهمنا في الوقت الحالي. بالفعل في الجملة الأولى تقول "يتم اختيار مذبذب RC 8 MHz الداخلي كساعة وحدة المعالجة المركزية الافتراضية عند إعادة التعيين " ، مما يعني أنه افتراضيًا بعد إعادة ضبط MC ، يتم اختيار سلسلة RC 8 MHz الداخلية كمصدر رئيسي للساعة .
بعد ذلك ، يأتي مخطط شجرة الساعة غير المفهوم ، والذي سننظر فيه لاحقًا.


شجرة الساعة

بالمعنى الدقيق للكلمة ، يمكنك الاعتماد على العبارة "افتراضيًا بعد إعادة تعيين عضو الكنيست ..." وقراءة هذا الجزء من المقالة قطريًا.

الآن تحتاج إلى تشتيت انتباه المجلس والبحث عن مؤشر LED الداخلي. أعلم أن الثنائيات الموجودة في الدوائر يتم الإشارة إليها بواسطة D1 ، D2 ... ، أي D == الصمام الثنائي ، على لوحتي بالقرب من المقاوم R7 هو الصمام الثنائي D1 .

صورة المجلس


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



في الرسم البياني ، نرى أن كاثود الصمام الثنائي متصل بالأرض من خلال وصلة المرور J2 ، ويتم توصيل الأنود بدبوس PA4 من خلال المقاوم. يعني PA4 الإخراج الرابع للمنفذ A ، مما يعني أنه لإشعال وإيقاف تشغيل مؤشر LED ، سيكون من الضروري توفير الجهد لإخراج PA4 .

بعد ذلك ، تحتاج إلى تحديد كيفية تطبيق الجهد على هذا الإخراج. بالنسبة لي ، لم يكن هذا أمرًا بديهيًا على الإطلاق ، ولفترة طويلة من الوقت حرثت الوثائق على طول وعبر حتى صادفت الرسم التخطيطي لـ Block في قسم الوصف في بداية ورقة البيانات. وفيها رأيت المسار النفيس PA [15: 0] <=> منفذ GPIO A <=> وحدة فك ترميز AHB <=> مصفوفة الحافلات <=> Cortex-M0 ، أي المنفذ A هو منفذ إدخال / إخراج للأغراض العامة ومتصل بحافلة AHB .

مخطط كتلة
(الصورة قابلة للنقر)


ألاحظ أنه من المعتاد في الإلكترونيات تقسيم مخرجات المتحكم الدقيق إلى منافذ ، وعادة ما يكون للمخرج 16 ناتجًا. يوضح الرسم التخطيطي أن المنافذ A و B و C تحتوي على 16 فقط ، لكن المنافذ D و F بها أقل (يمكن أن يكون أقل من 16 دبوسًا ، أكثر - لا).

دعنا نعود إلى مخطط شجرة الساعة ونجد الناتج الذي وقعه AHB . سوف نتعرف على معدل تكرار هذا الإخراج. إلى AHB هي إشارة HCLK ، والتي تترك مقسم HPRE . يستقبل هذا الفاصل إشارة SYSCLK من المفتاح SW . سيتم استخدام أي من الإشارات في دخل SW كما يتم تعيين SYSCLK برمجياً - ثم سنقوم بتعيين هذا في التعليمات البرمجية. يتم تقديم الاختيار:

  1. HSI - إشارة من مولد داخلي عالي التردد ، يتم إنتاجها بواسطة مرنان كوارتز بتردد 8 ميجاهرتز ، والذي قمت بلحمته قبل العمل مع هذه اللوحة ؛
  2. PLLCLK - إشارة من مضاعف التردد PLLMUL ؛
  3. HSE - إشارة من مولد خارجي عالي التردد.

أي خيار مناسب لمهمتنا ، أقترح اختيار أبسط وأكثرها تكلفة - HSI .

سنذهب إلى الدليل المرجعي ونفتح القسم 7 إعادة التعيين والتحكم في الساعة (RCC) ، وتحديداً 7.2.6 اختيار ساعة النظام ، حيث صادفنا مرة أخرى صياغة مماثلة موجودة في ورقة البيانات: "بعد إعادة ضبط النظام ، يتم اختيار مذبذب HSI كنظام الساعة "- أي ليس علينا القيام بأي شيء ، فسوف يبدأ عضو الكنيست في HSI .

للتأكد من أن MK سوف يعمل حقًا من هذا المصدر ، سأكتب هذا بشكل صريح في البرنامج ؛ قم بالتمرير إلى السجلات المسؤولة عن إعادة التعيين والتسجيل عن بعد (القسم 7.4 سجلات RCC ). السجل الأول الموضح في الوثائق هو سجل التحكم في الساعة (RCC_CR) ؛ فيما يلي وصف للبت ، وهو المسؤول عن ماذا.

سجل التحكم على مدار الساعة


نحن مهتمون بـ HSION صفر بت ، وهو المسؤول عن تشغيل المرنان ( 0 - إيقاف ، 1 - على).

وبالتالي ، سيكون من الضروري كتابة واحدة إلى سجل RCC_CR . (صفر بت واحد ، أو 2 0 = 1).

الآن نجد في ملف stm32f0xx.h تعريف RCC ( #define RCC ).

RCC-> RC


كما ترون ، هذا هو الهيكل الموجود في RCC_BASE ؛ العنوان 0x40021000 ، إذا قمت بتوسيع كل تعريف ، يمكن رؤية نفس العنوان في الدليل المرجعي في القسم 2.2.2 خريطة الذاكرة وتسجيل عناوين الحدود وفي ورقة البيانات في القسم 5 تعيين الذاكرة (منطقة AHB ).

لكتابة وحدة لتمكين HSI في سجل CR RCC block ، تحتاج إلى سطر من التعليمات البرمجية

RCC->CR |= 0x1; 

3.3.2 ضبط الساقين


إن إرسال إشارة إلى سفح وحدة التحكم في ميكروكنترولر لإشعال مؤشر LED وإيقاف الإشارة بحيث يكون مؤشر LED خارجًا هي إجراءات بسيطة ، وبالتالي فإن هذا ينطبق على وظائف GPIO (منافذ الإدخال والإخراج للأغراض العامة).

بشكل افتراضي ، أرجل MK غير متصلة ، أي الإخراج هو عدم اليقين. من الضروري توصيل أحد المنافذ ، حيث تعمل ساقه على تشغيل الصمام. في وقت سابق ، قررنا أن منافذ GPIO متصلة بحافلة AHB - تحتاج إلى الحصول على هذه الحافلة. متابعة للتصفح خلال القسم 7.4 من سجلات RCC ( سجلات التحكم وإعادة الضبط) ، نجد القسم 7.4.6 AHB بساعة تمكين الساعة المحيطية ( RCC_AHBENR ، سجل تمكين ساعة ناقل AHB ). في وقت سابق ، قررت أن مصباح LED متصل بساق PA4 - وبالتالي ، أحتاج إلى كتابة وحدة في الجزء 17 من السجل من أجل إخراج المنفذ A.

AHB على مدار الساعة الطرفية تمكين التسجيل


وفقا لذلك ، يجب أن يكون الرمز

 RCC->AHBENR |= (1 << 17); 

أو ، وهو نفس الشيء

 RCC->AHBENR |= 0x20000; 

إما باستخدام ملف تعريف # stm32f0xx.h الكتابة

 RCC->AHBENR |= RCC_AHBENR_GPIOAEN; 

RCC-> AHBENR


لدينا منفذ بالطاقة A ، والآن نحتاج إلى إبلاغ MK بأن PA4 سيعمل على الخروج - سنقرأ القسم 8 I / Os للأغراض العامة (GPIO) ؛ تقول مقدمة القسم بالفعل "يحتوي كل منفذ إدخال / إخراج للأغراض العامة على أربعة سجلات تكوين 32 بت ( GPIOx_MODER و GPIOx_OTYPER و GPIOx_OSPEEDR و GPIOx_PUPDR ) ، وسجليان للبيانات 32 بت ( GPIOx_IDR و GPIOx_ODR ) ..." - لكل منفذ هناك 4 سجلات ضبط و 2 سجل بيانات في المنفذ - هذا ما نحتاج إليه (تكوين المنفذ A ، أو بالأحرى إخراج PA4 ، وإرسال دوري و 0 إليه ). للحصول على فهم أفضل (لما يحدث) ، يمكنك قراءة هذا القسم ، لكنني انتقل إلى القسم 8.4 من سجلات GPIO وقم بتكوين المنفذ وفقًا للأوصاف.

  1. وضع المنفذ - الخروج. وفقًا للوثائق ، من الضروري كتابة 01 في المنطقة المقابلة ( MODER4 ) من السجل المقابل ( GPIOA_MODER ) ، أي البتات 9 و 8 : في البتة التاسعة يجب أن تكون صفرية ، في الوحدة الثامنة:

     GPIOA->MODER |= (1 << 8); //  

     GPIOA->MODER |= 0x100; //  

     GPIOA->MODER |= GPIO_MODER_MODER4_0; 

    سجل وضع منفذ GPIO


    GPIOA-> مدير


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

    بعد الوثائق ، من الضروري أن تكتب الصفر في الجزء الرابع. تنص الوثائق أيضًا على أنه بعد إعادة التعيين سيكون هناك صفر.

     GPIOA->OTYPER &= ~(1 << 4); //  

     GPIOA->OTYPER &= ~0x10; //  

     GPIOA->OTYPER &= ~GPIO_OTYPER_OT_4; 

    تسجيل GPIO نوع إخراج المنفذ


  3. سرعة الانتاج. في حالتنا ، لا يهم ، ولكن من أجل الإخلاص سأكتب هنا صفر.

     GPIOA->OSPEEDR &= ~(1 << 8); //  

     GPIOA->OSPEEDR &= ~0x100; //  

     GPIOA->OSPEEDR &= ~GPIO_OSPEEDER_OSPEEDR4_0; 

    تسجيل GPIO سرعة إخراج المنفذ


  4. مصعد . بسبب سيؤدي الخرج إلى تشغيل المصباح ، تحتاج إلى سحبه إلى السلطة ، أي سحب المتابعة .

    من الضروري تشديد الدبوس الرابع للمنفذ A ؛ تقول الوثائق أنه لهذا من الضروري كتابة صفر وواحد في 9 و 8 بت ، على التوالي.

     GPIOA->PUPDR |= (1 << 8); //  

     GPIOA->PUPDR |= 0x100; //  

     GPIOA->PUPDR |= GPIO_PUPDR_PUPDR4_0; 

    سجل السحب والإخراج لأسفل منفذ GPIO


    GPIOA-> PUPDR



3.3.3 الصمام على / قبالة وتأخير


سبق أن قرأنا أن كل منفذ له سجلات ، بما في ذلك سجلات بيانات IDR و ODR - سجلات بيانات المدخلات والمخرجات ، على التوالي. الأصفار المنطقية وتلك الموجودة على الساق MK - هل هذه البيانات؟ - نعم ، البيانات. يمكن أن تأتي البيانات من خارج متحكم (يكون الإدخال ) والخروج من متحكم والانتقال إلى جهاز آخر (يكون الإخراج ). الوحدة على الضلع MK هي وجود مستوى الجهد العالي ، أي إذا أحضرت واحدة إلى الخرج ، فسيكون هناك جهد ، وهذا المصباح يمكن أن يشغل LED. إخراج وحدة إلى الساق متحكم هو شيء آخر غير كتابة هذه الوحدة إلى سجل الإخراج ODR .

سجل بيانات خرج منفذ GPIO


وفقًا للوثائق ، نرى أنه لكل منفذ ( A ، B ، C ، D ، F ) يوجد سجل 32 بت. لا يمكن أن يحتوي المنفذ على أكثر من 16 دبوسًا ، ثم يتم استخدام أول 16 بت من السجل. كل بت يتوافق مع رقم المنفذ (دبوس). لإخراج وحدة إلى ساق PA4 ، يحتاج المرء إلى كتابة وحدة إلى بت 4 ، لإخراج صفر - كتابة صفر إلى بت 4 ، أي إزالة الجهد من الإخراج.



GPIOA-> ODR


سيبدو رمز تشغيل الصمام بهذا الشكل

 GPIOA->ODR |= (1 << 4); //  

 GPIOA->ODR |= 0x10; //  

 GPIOA->ODR |= GPIO_ODR_4; 

رمز لإيقاف الصمام

 GPIOA->ODR &= ~(1 << 4); //  

 GPIOA->ODR &= ~0x10; //  

 GPIOA->ODR &= ~GPIO_ODR_4; 

ولكن إذا كتبت السطر لإيقاف تشغيل مؤشر LED بعد تشغيل الخط ، فلن تومض مؤشر LED (إذا كنت مهتمًا بما يحدث - يمكنك المحاولة ؛ لن يحترق أي شيء ، تمت مناقشة ذلك بالفعل أعلاه) - فأنت بحاجة إلى تأخير. يتم استخدام أجهزة ضبط الوقت للتأخير ، ولكن أجهزة ضبط الوقت تستحق مقالة منفصلة (بسبب التعقيد) ، لذلك سنقوم بإجراء تأخير عكاز: سنقود دورة الخمول. هناك نقطة واحدة: إذا تم تمكين تحسين برنامج التحويل البرمجي ، فسيقوم برنامج التحويل البرمجي بقطع دورة الخمول ولن يكون هناك أي تأخير. تأكد من عدم تمكين التحسين. للقيام بذلك ، دعنا نذهب إلى تكوين المشروع (انقر بزر الماوس الأيمن على اسم المشروع في شجرة المشروع) وتحقق من سطر "سلسلة التحكم في الترجمة " في علامة التبويب " ترجمة" : يجب أن تحتوي الوسيطة -O0 (يعني "حوالي الصفر" أن التحسين معطل). إذا قمت بجمع كل شيء وفقًا لتعليماتي ، فمن المرجح أنك ستحصل على -O0 أيضًا لأن كان ذلك افتراضيًا ولم أتطرق لأي شيء هنا. الوسيطات -O1 -O2 -O3 تعني أنه تم تمكين تحسين المستوى المقابل.

مترجم التحقق الأمثل


يمكن كتابة دورة الخمول مثل هذا:

 int t = 4000000; while(t > 0) t--; 

لم أقم بتعيين قيمة t على هذا النحو ، لقد فكرت في هذا الأمر: إذا كان المتحكم يعمل بسرعة 8 ميجاهرتز ، فسيقوم بتنفيذ ما يقرب من 8000.000 تعليمة في الثانية الواحدة ، إذا بالغت بعمق ، فسوف تحتاج إلى تشغيل الدورة بمقدار 4،000،000 مرة.
سوف تحتاج إلى تشغيل دورة الخمول بعد تشغيل المصباح ، وبعد إيقاف تشغيله ، وكل هذه الحلقة معًا.

3.4 كتابة التعليمات البرمجية والجري


فلنضع جميع سطور الكود التي كتبناها من قبل. تحتاج أيضًا إلى تضمين ملف الرأس stm32f0xx.h ، مثل اعتمدنا عليها وأخذنا منها تعاريف الهياكل والعناوين والقيم. يجب أن تكون النتيجة:

 #include "stm32f0xx.h" int main(void) { int t; //  '' RCC->CR |= 0x1; //   HSI RCC->AHBENR |= RCC_AHBENR_GPIOAEN; //   A GPIOA->MODER |= GPIO_MODER_MODER4_0; // PA4   GPIOA->OTYPER &= ~GPIO_OTYPER_OT_4; //  push-pull  PA4 GPIOA->OSPEEDR &= ~GPIO_OSPEEDER_OSPEEDR4_0; //    PA4 GPIOA->PUPDR |= GPIO_PUPDR_PUPDR4_0; //  pull-up  PA4 while(1) { GPIOA->ODR |= GPIO_ODR_4; //    PA4 t = 4000000; while(t > 0) t--; //  GPIOA->ODR &= ~GPIO_ODR_4; //    PA4 t = 4000000; while(t > 0) t--; //  } } 

انقر فوق Rebuild واملأ الرمز الموجود على اللوحة من خلال الأداة المساعدة.



حتى يتمكن المجلس من إطلاق برنامج ثابت جديد ، لا تنسَ إغلاق منفذ توصيل BOOT والقيام بإعادة تعيين (إعادة تعيين).

4. الخلاصة


الرمز مكتوب ، كل شيء يعمل. القوات أنفقت دون قياس. يسعدني أنه بناءً على الوثائق ، اتضح لكتابة رمز العمل ، ويرجع ذلك إلى حد كبير إلى حقيقة أن STM لديها وثائق عالية الجودة.

تتمثل الخطط في كتابة مقال حول كيفية تجميع كل شيء يدويًا ، دون IDE ، من خلال وحدة التحكم ، المدرسة القديمة الحقيقية ، من الناحية المثالية بحيث يمكن القيام بكل هذا من خلال Linux. أنا الآن أعمل على PWM و ADCs (أيضًا في هذا المنتدى) - سأكتب مقالًا عنها أيضًا.

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


All Articles