قم بتنزيل البرامج الثابتة على STM32 عبر USB

الصورة

في مشروعي ، أستخدم متحكم STM32F103C8 وإطار stm32duino . يقدم هذا النسخ من Arduino محمل إقلاع خاص يسمح لك بتحميل البرامج الثابتة عبر USB ، دون استخدام مكونات خارجية مثل ST-Link أو محول USB-UART.

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

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

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

دعونا نرى كيف يعمل محمل الإقلاع. لتبدأ بمثال وحدات تحكم AVR. لماذا تذكرته؟ لقد تحولت من Arduino وتوقعت دون وعي نفس السلوك. ولكن في STM32 تحول كل شيء بشكل مختلف. لذلك ، أود أن أتحدث عن الفرق بين هذين المتحكمين الدقيقين.

لذا في الميكروكونترولر AVeg ATMega ، يمكن حجز قدر معين من الذاكرة لمحمل الإقلاع بالقرب من نهاية الفلاش. باستخدام بت المصهر يمكنك التحكم من أي عنوان سيبدأ البرنامج. إذا لم يكن هناك محمل إقلاع ، يبدأ البرنامج من العنوان 0x0000. إذا كان هناك برنامج bootloader ، فإنه يبدأ من عنوان آخر (على سبيل المثال ، في ATMega32 مع 0x3C00 ، إذا كان حجم برنامج bootloader هو 2 كيلو بايت).

الصورة

عندما يقوم محمل الإقلاع بعمله ، فإنه ينقل التحكم إلى البرنامج الرئيسي من العنوان 0x0000. على سبيل المثال يبدأ البرنامج دائمًا عند 0x0000. يعمل المحول البرمجي والرابط مع حقيقة أن الرمز سيكون موجودًا في بداية مساحة العنوان.

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

الصورة

لذلك عند تجميع البرامج الثابتة ، يجب أن تعرف أين سيكتب برنامج تحميل التمهيد البرامج الثابتة وتعديل العناوين وفقًا لذلك.

هذا كله مع النظرية. دعنا ننتقل إلى الممارسة. فيما يلي تعليمات خطوة بخطوة حول كيفية ربط محمل إقلاع USB بميكروكنترولر سلسلة STM32F1xx ، وربما لبعض الآخرين أيضًا.

ومع ذلك ، هناك بعض القيود على الدوائر الكهربية. هنا ، لسوء الحظ ، لست قويًا. يحتاج ITP إلى مقاومة سحب 1.5 كيلو لمنفذ PA12 (المعروف أيضًا باسم USB D +). هذا يسمح لمحمّل الإقلاع بالاتصال والفصل عن USB في الوقت المناسب.

التعليمات:

  • تنزيل github.com/rogerclarkmelbourne/STM32duino-bootloader . يوجد في الدليل STM32F1 \ binaries بالفعل حزمة من برامج تحميل التمهيد المجمعة لألواح مختلفة. يشير الفهرس الموجود في نهاية اسم الملف إلى مكان توصيل مؤشر LED. في حالة لوحتي حيث تم توصيل LED بالدبوس C13 ، استخدمت الملف generic_boot20_pc13.bin.

  • نومض وفقًا للتعليمات . نعم ، ستحتاج هنا إلى محول USB-UART ، ولكن يمكنك أيضًا استخدام مصحح أخطاء .

  • أصبح الميكروكونترولر جاهزًا الآن للوميض من خلال محمل إقلاع USB. ولكنك لا تزال بحاجة إلى إصلاح البرامج الثابتة نفسها. وعليك أن تفعل شيئين:

    • امنح الرابط عنوان بدء. في CooCox ، يتم ذلك في إعدادات المشروع ، علامة التبويب ارتباط ، قسم مناطق الذاكرة ، عنوان بدء IROM1. يأخذ محمل الإقلاع أول 8 كيلوبايت ، مما يعني أن عنوان بدء البرنامج الثابت سيكون 0x0800000 + 0x2000 = 0x08002000. ربما يجب أيضًا تقليل حقل الحجم بمقدار 8 كيلو.

    • في مكان ما في بداية البرنامج قبل تهيئة المحيط ، قم بإجراء مكالمة

      NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000); 


      تحديث 05/17/2018: لا توجد وظيفة NVIC_SetVectorTable () في الإصدار الحديث من STM32Cube. بدلاً من ذلك ، يمكنك إصلاح عيب VECT_TAB_OFFSET في ملف system_stm32f1xx.c (أو ما شابه ذلك لوحدة التحكم الدقيقة الأخرى)

  • يمكن أخذ تعبئة البرامج الثابتة من مشروع stm32duino . في دليل الأدوات ، ابحث عن برنامج نصي يسمى maple_upload. لقد استخدمت إصدار Windows فقط - maple_upload.bat.

  • تشغيل مثل هذا:

     "maple_upload.bat" COM20 2 1EAF:0003 "Path\To\Firmware.bin" 

    بدلاً من COM20 ، تحتاج إلى استبدال المنفذ الخاص بك حيث يتم إرفاق وحدة التحكم الدقيقة.

    المدفق هو شيء رقيق للغاية ، ولا يحب المسارات النسبية. لذلك يجب تحديد مسار البرامج الثابتة بالكامل.

    1EAF: 0003 هو VID و PID

    2 - هذه هي معلمة AltID ، والتي تشير إلى أنه يجب تحميل البرنامج الثابت عند 0x08002000 (اقرأ هنا ).

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

لكي لا تضغط على إعادة التعيين في كل مرة ، تستخدم الألواح القائمة على libmaple / stm32duino خدعة. يستمعون إلى منفذ تسلسلي USB. إذا ظهرت إشارة DTR هناك وتم إرسال تسلسل مفاتيح البايت ، فسيتم إعادة تحميل وحدة التحكم الدقيقة في أداة تحميل التشغيل. انظر إلى دالة rxHook () .

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

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

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


All Articles