جدول المحتويات:

لذا ، يمكنك تحميل أداة تحميل الإقلاع STM32duino في "الحبة الزرقاء" فماذا الآن ؟: 7 خطوات
لذا ، يمكنك تحميل أداة تحميل الإقلاع STM32duino في "الحبة الزرقاء" فماذا الآن ؟: 7 خطوات

فيديو: لذا ، يمكنك تحميل أداة تحميل الإقلاع STM32duino في "الحبة الزرقاء" فماذا الآن ؟: 7 خطوات

فيديو: لذا ، يمكنك تحميل أداة تحميل الإقلاع STM32duino في
فيديو: ⚖️【斗罗大陆】EP01-EP130, Full Version |Soul Land |MULTI SUB |Chinese Animation |Donghua 2024, يوليو
Anonim
لذلك ، يمكنك تحميل أداة تحميل الإقلاع STM32duino في ملف
لذلك ، يمكنك تحميل أداة تحميل الإقلاع STM32duino في ملف
لذلك ، يمكنك تحميل أداة تحميل الإقلاع STM32duino في ملف
لذلك ، يمكنك تحميل أداة تحميل الإقلاع STM32duino في ملف

إذا كنت قد قرأت بالفعل تعليماتي التي تشرح كيفية تحميل أداة تحميل الإقلاع STM32duino أو أي وثائق أخرى مماثلة ، فحاول تحميل مثال على الكود و … قد لا يحدث شيء على الإطلاق.

المشكلة هي أن العديد من الأمثلة ، إن لم يكن كلها ، لـ STM32 "العامة" لن تعمل خارج الصندوق. سيكون من الضروري إجراء تغييرات طفيفة لبدء العمل في لوحة STM32 "Blue Pill" الخاصة بك.

سأحدد 4 أمثلة للرموز لشرح ما يجب تغييره ولماذا. الرموز هي: "BlinkWithoutDelay" و "Fading" و "Dimmer" و "AnalogInSerial".

لاحظ أنني لم أكود أي شيء. أقوم فقط بإصدار تغييرات طفيفة في الرموز التي تم إنشاؤها بواسطة:

ديفيد أ ميليس وتم تعديله مؤخرًا بواسطة توم إجوي ومارتي بوليفار وبعض الحالات بواسطة سكوت فيتزجيرالد

Tom Igoe وتعديله متأخرًا بواسطة Bryan Newbold

لذلك ، أفضل الاحتفاظ بأسماء المؤلفين حتى في الأكواد التي أقوم بتعديلها ، مع الاحتفاظ بائتمان الإنشاء.

الخطوة 1: الدبابيس والدبابيس … لماذا لا تعمل الكود؟

دبابيس ودبابيس …. لماذا الرمز لا يعمل؟
دبابيس ودبابيس …. لماذا الرمز لا يعمل؟

دعنا نلقي نظرة على دبوس STM32 "Blue Pill". يتم تحديد دبابيس الملاحظات على أنها PA1 أو PC2 …. شيء من هذا القبيل.

إذا ألقيت نظرة ، على سبيل المثال ، على مثال رمز "BlinkWithoutDelay" ، فسيتم التصريح عن رقم التعريف الشخصي كـ "33" … لماذا؟

أظن أن هذا لأن السيد مارتي بوليفار نقل هذا الرمز إلى لوحة MAPLE.

أعتقد أنه لم يكن في نيته جعل الكود متوافقًا مع لوحات "Blue Pill".

دبابيس Maple و Maple mini board مُعلنة بأرقام ، مثل Arduino ، على الرغم من أنها تستخدم أرقامًا مثل 33 و 24 وبعضها مثل هذا.

قلت أن الكود لم يكن يعمل؟ غلطتي. قم بتجميع الكود بدون أي خطأ وتحميله بشكل صحيح إلى "Blue Pill" ، لذا أعتقد أنه يعمل بالفعل ، ولكن باستخدام مخرجات GPIO لا نتوقعها. قد لا تكون متاحة حتى.

لذلك من الضروري إجراء تغييرات قليلة في التعليمات البرمجية حتى تعمل كما هو متوقع.

الخطوة 2: دعنا "نحدد" بعض الدبابيس…

دعونا
دعونا

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

لقد استخدمت إعلان دبابيس Arduino مثل هذا:

const int ledPin = 13 ؛

…"

إذا كنت تحبني ، فربما تسأل نفسك: "كيف يمكنني التصريح عن دبابيس بأسماء مثل PC13 ؟؟؟"

الجواب هو: استخدم "# تعريف" جملة C.

لذلك ، وفقًا لرسم pinout ، فإن PC13 هو الدبوس الموجود على اللوحة LED في "BluePill". لاستخدامه ، أود أن أعلن مثل هذا ، مباشرة بعد تعريف المكتبات (# include…) وقبل أي شيء آخر:

#define LedPin PC13

…"

لاحظ أنه لا يوجد "؛" إنهاء السطر ، NOR "=" تعيين.

قارن كلا الرمزين. واحد هو المثال الأصلي الذي تم تحميله من IDE. والثاني هو الذي قمت بضبطه للعمل مع "BluePill".

أوصي بشدة بالإعلان عن جميع الدبابيس التي تنوي استخدامها في الكود. حتى أولئك الذين يعتزمون استخدامها كمدخلات ADC (المزيد عنها لاحقًا).

هذا سيجعل حياتك سهلة.

الخطوة 3: PinMode () … كيف ستستخدم دبابيسك …

قبل المتابعة ، دعنا نفهم وظيفة PinMode ().

مثل Arduino ، فإن STM32 pin لها وظائف متعددة. أبسط طريقة لتحديد واحد أو آخر هي استخدام جملة pinMode ().

يتوفر في Arduino 3 أوضاع فقط ، INPUT ، أو OUTPUT ، أو INPUT_PULLUP.

من ناحية أخرى ، يحتوي STM32 على العديد من نكهات pinMode (). هم انهم:

الإخراج - الإخراج الرقمي الأساسي: عندما يكون الدبوس مرتفعًا ، يتم تثبيت الجهد عند + 3.3 فولت (Vcc) وعندما يكون منخفضًا ، يتم سحبه إلى الأرض

OUTPUT_OPEN_DRAIN - في وضع الصرف المفتوح ، يشير الدبوس إلى "منخفض" بقبول تدفق التيار إلى الأرض و "مرتفع" من خلال توفير مقاومة متزايدة

INPUT_ANALOG - هذا وضع خاص عندما يتم استخدام الدبوس للقراءات التناظرية (وليس الرقمية). تمكن من إجراء تحويل ADC على الجهد عند الدبوس

INPUT_PULLUP - يتم الإبلاغ عن حالة الدبوس في هذا الوضع بنفس الطريقة كما هو الحال مع INPUT ، ولكن يتم "سحب جهد الدبوس" بلطف نحو + 3.3 فولت

INPUT_PULLDOWN - يتم الإبلاغ عن حالة الدبوس في هذا الوضع بنفس الطريقة كما هو الحال مع INPUT ، ولكن يتم "سحب الجهد لأسفل" بلطف باتجاه 0 فولت

INPUT_FLOATING - مرادف لـ INPUT

PWM - هذا وضع خاص عندما يتم استخدام الدبوس لإخراج PWM (حالة خاصة للإخراج الرقمي)

PWM_OPEN_DRAIN - مثل PWM ، باستثناء أنه بدلاً من الدورات المتناوبة من LOW و HIGH ، فإن الجهد على الدبوس يتكون من دورات متناوبة من LOW و عائم (غير متصل)

(ملاحظة: مستخرج من

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

الخطوة 4: AnalogWrite () مقابل PwmWrite () … الإخراج التناظري في نكهتين

AnalogWrite () مقابل PwmWrite () … الإخراج التناظري في نكهتين
AnalogWrite () مقابل PwmWrite () … الإخراج التناظري في نكهتين
AnalogWrite () مقابل PwmWrite () … الإخراج التناظري في نكهتين
AnalogWrite () مقابل PwmWrite () … الإخراج التناظري في نكهتين

قبل استخدام دبابيس GPIO "Blue Pill" ، من الضروري التصريح عن سلوكها ، أي كيف ستعمل. هذا هو بالضبط ما تفعله وظيفة pinMode ().

لذلك ، دعونا نركز الآن على كيفية ضبط الإخراج التناظري الصحيح. يمكن الإعلان عنها إما كوضع OUTPUT أو وضع PWM.

بنفس الطريقة ، يمكن أن تنسب القيم التناظرية إلى GPIO بطريقتين: analogWrite () أو pwmWrite () ، BUT ، analogWrite () لن تعمل إلا إذا كان pinMode () = الإخراج. من ناحية أخرى ، لن يعمل pwmWrite () إلا إذا كان pinMode () = PWM.

لنأخذ PA0 ، على سبيل المثال: إنه مرشح إخراج تناظري / pwm.

analogWrite (): أعلن بهذه الطريقة:

….

# تعريف ledPin PA0

pinMode (ledPin ، الإخراج) ؛

analogWrite (ledPin ، <رقم>) ؛

……"

حيث يجب أن يكون الرقم بين 0 و 255 ، مثل Arduino. في الواقع ، إنه متوافق مع الإصدارات السابقة لـ Arduino.

pwmWrite (): أعلن بهذه الطريقة:

# تعريف ledPin PA0

pinMode (ledPin ، PWM) ؛

pwmWrite (ledPin ، <number.>) ؛

…."

حيث يجب أن يكون الرقم بين 0 ~ 65535 ، دقة أعلى بكثير من Arduino.

في الصور يمكن المقارنة بين رمزين. يمكنك أيضًا رؤية الرمز الأصلي.

الخطوة 5: الاتصال التسلسلي STM32

الاتصال التسلسلي STM32
الاتصال التسلسلي STM32

دعونا نرى كيف يتم ترتيب واجهات USART في STM32. نعم ، واجهات بصيغة الجمع…..

يحتوي "Blue Pill" على 3 من USART (RX / TX 1 ~ 3) ، وإذا كنت تستخدم أداة تحميل التشغيل تسمح لك باستخدام USB ، فهي غير متصلة بأي من تلك الأجهزة.

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

الحالة 1: استخدام USB:

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

في هذه الحالة ، في أي وقت تعلن فيه عن كلمة "مسلسل" بدون فهرس ، يعني الاتصال عبر USB.

إذن ، Serial1 ، يعني TX / RX 1 (Pins PA9 و PA10) ؛ Serial2 ، يعني TX / RX 2 (دبابيس PA2 و PA3) و Serial 3 يعني TX / RX 3 (دبابيس PA10 و PA11).

هذه هي الطريقة التي نعمل بها. سأقدم تغييرات في أمثلة لطريقة الترميز هذه.

شيء آخر: "Serial USB" لا يحتاج إلى التهيئة. بمعنى آخر ، "… Serial.begin (15200) ؛" ليس ضروري.

من الممكن استدعاء أي دالة تسلسلية (Serial.read () ، Serial.write () ، إلخ) بدون أي تهيئة.

إذا كان لسبب ما موجودًا في الكود ، فسيتجاهله المترجم.

الحالة 2: استخدام TTL seria لمحول USB:

بهذه الطريقة ، لا يدعم برنامج bootloader اتصال STM32 USB الأصلي ، لذا فأنت بحاجة إلى محول USB إلى محول تسلسلي متصل بـ TX / RX 1 (دبوس PA9 و PA10) لتحميل الرسومات.

في هذه الحالة ، أي وقت يكون فيه "Serial" بدون فهرس هو رمز ، يعني TX / RX1 (المنفذ المستخدم لتحميل الكود). وهكذا ، يشير Serial1 إلى TX / RX 2 (دبابيس PA2 و PA3) ويشير Serial2 إلى TX / RX 3 (دبابيس PA10 و PA11). لا يتوفر Serial3.

الخطوة 6: تمرير قيمة إلى متحكم دقيق

تمرير قيمة إلى متحكم دقيق
تمرير قيمة إلى متحكم دقيق

مثال باهتة هو طريقة بسيطة لإظهار كيفية تمرير قيمة إلى متحكم دقيق.

من المفترض أن تمرر قيمة من 0 إلى 255 للتحكم في سطوع LED.

لن يعمل كما هو متوقع في Blue Pill بسبب:

  1. لاستخدام وظيفة pwmWrite () ، يجب التصريح عن pinMode () كوضع PWM.
  2. لن تحصل أبدًا على رقم كامل مكون من 3 أرقام. دالة Serial.read () تلتقط محتوى المخزن المؤقت فقط ، وهو "BYTE". إذا كتبت "100" وضغطت على "دخول" ، فسيتم التقاط "0" الأخيرة فقط من المخزن المؤقت. وستكون قيمتها "48" (قيمة ASCII العشرية لـ "0"). إذا كنت تنوي إصدار القيمة "100" ، فمن الضروري كتابة "d". لذلك ، من الصحيح أن نقول إنه سيحول قيمة عشرية لرمز ASCII في سطوع LED ، صحيح ؟؟ … حسنًا ، نوع من …
  3. المشكلة ، تعيين القيم مباشرة من دالة Serial.read () هو إجراء خدعة. يكاد يكون من المؤكد الحصول على قيم غير متوقعة. النهج الأفضل هو تخزين محتوى المخزن المؤقت في متغير مؤقت ثم تعيينه.

كما أوضحت سابقًا في البند 2 ، فإن الكود الذي أدخلته سيسمح بإدخال رمز ASCII وسيتحكم هذا في سطوع LED استنادًا إلى قيمته العشرية ASCII … على سبيل المثال ، "الفضاء" هو القيمة 32 (في الواقع هو أدنى حرف قابل للطباعة يمكنك إدخاله) و "}" هي أعلى قيمة ممكنة (القيمة 126). الشخصيات الأخرى غير قابلة للطباعة ، لذلك لن تفهم المحطة الطرفية أو من الممكن أن تكون مركبًا من الأحرف (مثل "~" مفتاح معطل في لوحة المفاتيح ولن يعمل بشكل صحيح). هذا يعني أن هذا الحرف المركب ، عند إدخاله في المحطة الطرفية ، سيرسل الحرف نفسه وشيء آخر. عادة ما تكون واحدة غير قابلة للطباعة. وهل هذا هو الرمز الأخير الذي سيتم التقاطه. أيضًا ، ضع في اعتبارك أن الوحدة الطرفية الخاصة بك ، في هذه الحالة ، يجب ألا ترسل "إرجاع السطر" أو "تغذية السطر". يجب الانتباه إلى هذا لتعمل التعليمات البرمجية بشكل صحيح.

إذا سقطت فالأمر محير قليلاً ، فسيزداد الأمر سوءًا…..

الخطوة السابعة: وإذا كنت أرغب في كتابة ثلاثة أرقام…. أو أكثر؟؟

وإذا كنت أرغب في كتابة ثلاثة أرقام…. أو أكثر؟؟
وإذا كنت أرغب في كتابة ثلاثة أرقام…. أو أكثر؟؟

لا يعد تلقي أحرف متعددة من اتصال تسلسلي مهمة بسيطة.

المخزن المؤقت التسلسلي هو كومة بايت من FIFO من الأحرف. في أي وقت تستدعي فيه وظيفة Serial.read () ، تتم إزالة الحرف الأول المرسل من الكومة وتخزينه في مكان آخر. عادة متغير char في الكود. ملاحظة ، اعتمادًا على الأجهزة ، عادةً ما يكون هناك مهلة لكيفية احتفاظ المخزن المؤقت للسجل بالمعلومات.

إذا كنت تنوي إدخال أكثر من رقم واحد عبر المسلسل ، فيجب عليك "تكوين" سلسلة حرفًا بحرف ، عند دخولها إلى المخزن المؤقت UART.

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

  1. استخدام بعض أحرف "علامة النهاية" ، مثل "حرف الرجوع" أو "تغذية السطر". بمجرد العثور على حرف "end Mark" ، تنتهي الحلقة.
  2. بدلاً من ذلك ، يمكن أن يكون عدد الأحرف في سلسلة السلسلة محدودًا ، وكذلك عدد الدورات التفاعلية. عندما تصل إلى الحد الأقصى ، دعنا نقول ، 4 ، تكتسب نهايات روتينية بنفسها.

دعنا نلقي نظرة في مثال بسيط كيف نفعل هذا:

  • عيّن حرف "end" مثل '\ n' (وهذا يعني أحرف ASCII لتغذية السطر).
  • التكرار بينما Serial.available () هو صحيح
  • ينتج عن تخزين Serial.read () متغير char مؤقت. تذكر: بمجرد أن يقوم Serial.read () بقراءة المخزن المؤقت ، يكون نظيفًا ويتم تحميل الحرف التالي فيه.
  • زيادة متغير سلسلة مع هذا الحرف
  • إذا كان الحرف الأخير هو "النهاية" ، اخرج من الحلقة.

عادة ، يبدو روتين الحصول على مجموعة الأحرف التسلسلية مثل الصورة.

كان يستند إلى تعديل شامل للكود الأصلي للسيد ديفيد أ ميليس.

لا تتردد في استخدامه واختباره. تذكر: يجب إدخال القيم بتنسيق 3 أرقام.

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

آمل أن تساعدك في استخدام أمثلة في Blue Pill وأن تعطيك بعض التنوير حول كيفية الكود الصحيح لهذه اللوحة الصغيرة.

نراكم في الجوار في تعليمات أخرى.

موصى به: