- تجهيز الجهاز
- فهم مخارج GPIO على STM8S103F
- وصف Pinout وتلميحات لاختيار STM8S103F GPIO
- برمجة STM8S لإدخال وإخراج GPIO باستخدام SPL
- تحميل واختبار البرنامج
بالنسبة لوحدات التحكم الدقيقة ، فإن برنامج وميض LED يعادل برنامج "hello world". في برنامجنا التعليمي السابق ، تعلمنا كيفية بدء استخدام STM8S103F3 Development Board وكيفية إعداد IDE والمترجم لبرمجة وحدات تحكم STM8S الخاصة بنا. لقد تعلمنا أيضًا كيفية استخدام المكتبات الطرفية القياسية ، وكيفية تجميع التعليمات البرمجية وتحميلها في وحدة التحكم الدقيقة الخاصة بنا. مع تغطية جميع الأساسيات ، فلنبدأ بالفعل في كتابة التعليمات البرمجية. في هذا البرنامج التعليمي ، سوف نتعلم كيفية أداء وظائف GPIO العامة على وحدات تحكم STM8S. تحتوي اللوحة بالفعل على مؤشر LED داخلي متصل بالطرف 5 من المنفذ B ، وسوف نتعلم كيفية وميض هذا LED وأيضًا إضافة مؤشر LED خارجي والتحكم فيه بضغطة زر. إذا كنت جديدًا تمامًا ، يوصى بشدة بقراءة البرنامج التعليمي السابق قبل المتابعة.
تجهيز الجهاز
قبل الغوص في البرنامج ، دع اتصالات الأجهزة جاهزة. كما ذكرنا سابقًا ، سنستخدم مصباحي LED هنا ، أحدهما مصباح LED على اللوحة سيومض باستمرار والآخر عبارة عن مصباح LED خارجي سيتم تبديله بزر ضغط. الفكرة هي تعلم كل وظائف GPIO في إعداد بسيط. تم توصيل LED الموجود على اللوحة بالفعل بـ PB5 (pin5 of PORTB) ، لذلك قمت للتو بتوصيل مؤشر LED بـ PA3 وزر ضغط بـ PA2 ، كما ترى في الرسم البياني أدناه.
ولكن ، من بين جميع دبابيس الإخراج المتوفرة على جهاز التحكم لدينا ، لماذا اخترت PA3 للإخراج و PA2 للإدخال؟ الأسئلة صحيحة وسأشرح ذلك لاحقًا في هذه المقالة. يتم عرض إعداد الجهاز الخاص بي لهذا البرنامج التعليمي أدناه. كما ترى ، لقد قمت أيضًا بتوصيل مبرمج ST-link الخاص بي بمسامير البرمجة التي لن تقوم ببرمجة لوحتنا فحسب ، بل ستعمل أيضًا كمصدر للطاقة.
فهم مخارج GPIO على STM8S103F
نعود الآن إلى السؤال ، لماذا PA2 للمدخلات ولماذا PA3 للإخراج؟ لفهم ذلك ، دعنا نلقي نظرة فاحصة على pinout للميكروكونترولر الموضح أدناه.
وفقًا لمخطط pinout ، لدينا أربعة منافذ في وحدة التحكم الدقيقة الخاصة بنا ، وهي PORT A و B و C و D يُشار إليها بواسطة PA و PB و PC و PD على التوالي. يتم أيضًا ربط كل دبوس GPIO ببعض الوظائف الخاصة الأخرى. على سبيل المثال ، لا يمكن أن يعمل PB5 (الطرف 5 من المنفذ B) فقط كدبوس GPIO ولكن أيضًا كدبوس SDA لاتصالات I2C وكدبوس إخراج Timer 1. لذلك ، إذا استخدمنا هذا الدبوس لأغراض GPIO البسيطة مثل توصيل مصباح LED ، فلن نتمكن من استخدام I2C و LED في نفس الوقت. للأسف ، فإن LED الموجود على اللوحة متصل بهذا الدبوس ، لذلك ليس لدينا الكثير من الخيارات هنا ، وفي هذا البرنامج ، لن نستخدم I2C ، لذا فهي ليست مشكلة كبيرة.
وصف Pinout وتلميحات لاختيار STM8S103F GPIO
بصراحة ، لن يضر استخدام PA1 دبوس إدخال وسيعمل دبوسًا فقط. لكنني طرحت هذا الأمر عمدًا لإعطائي فرصة لإظهار بعض الفخاخ الشائعة التي قد تقع فيها عند اختيار دبابيس GPIO على متحكم دقيق جديد. أفضل طريقة لتجنب المصائد هي قراءة تفاصيل الدبوس ووصف الدبوس المقدم في ورقة بيانات STM8S103F3P6. بالنسبة إلى تفاصيل وصف دبوس وحدة التحكم الدقيقة STM8S103F3P6 المذكورة في ورقة البيانات ، تظهر أدناه الصور.
يمكن أن تكون دبابيس الإدخال الموجودة في وحدة التحكم الدقيقة الخاصة بنا إما عائمة أو سحبًا ضعيفًا ويمكن أن تكون دبابيس الإخراج إما فتح الصرف أو السحب. تمت مناقشة الفرق بين دبابيس Open Drain و Push-Pull Output بالفعل ، وبالتالي لن ندخل في تفاصيل ذلك. لتوضيح الأمر ببساطة ، يمكن لدبوس إخراج Open Drain أن يجعل الإخراج منخفضًا فقط وليس مرتفعًا ، بينما يمكن أن يجعل دبوس إخراج الدفع والسحب الناتج مرتفعًا وعاليًا.
بصرف النظر عن ذلك من الجدول أعلاه ، يمكنك أيضًا ملاحظة أن دبوس الإخراج يمكن أن يكون إما إخراج سريع (10 ميجاهرتز) أو إخراج بطيء (2 ميجاهرتز). هذا يحدد سرعة GPIO ، إذا كنت ترغب في تبديل دبابيس GPIO بين عالية ومنخفضة بسرعة كبيرة ، فيمكننا اختيار إخراج سريع.
تدعم بعض دبابيس GPIO الموجودة على وحدة التحكم الخاصة بنا True Open Drain (T) و High Sink Current (HS) كما هو مذكور في الصورة أعلاه. يتمثل الاختلاف الكبير بين الصرف المفتوح و True Open Drain في أن الإخراج المتصل بالصرف المفتوح لا يمكن سحبه أعلى من جهد التشغيل لوحدة التحكم الدقيقة (Vdd) بينما يمكن سحب دبوس إخراج الصرف المفتوح الحقيقي أعلى من Vdd. الدبابيس ذات القدرة العالية بالوعة تعني أنها يمكن أن تغرق أكثر. تيار المصدر والمغسلة لأي دبوس GPIO HS هو 20 مللي أمبير ، بينما يمكن أن يستهلك خط الطاقة ما يصل إلى 100 مللي أمبير.
عند إلقاء نظرة فاحصة على الصورة أعلاه ، ستلاحظ أن جميع دبابيس GPIO تقريبًا هي من النوع High Sink Current (HS) باستثناء PB4 و PB5 وهما نوع True Open Drain Type (T). هذا يعني أنه لا يمكن رفع هذه المسامير ، فلن تكون قادرة على توفير 3.3 فولت حتى عندما يكون الدبوس مرتفعًا. هذا هو سبب توصيل مصباح LED الموجود على اللوحة بجهد 3.3 فولت ومؤرض من خلال PB5 بدلاً من تشغيله مباشرةً من دبوس GPIO.
ارجع إلى الصفحة 28 في ورقة البيانات للحصول على وصف دبوس مفصل. كما هو مذكور في الصورة أعلاه ، يتم تكوين PA1 تلقائيًا على أنه سحب ضعيف ولا يوصى باستخدامه كدبوس إخراج. على أي حال ، يمكن استخدامه كدبوس إدخال مع زر ضغط ، لكنني قررت استخدام PA2 فقط لمحاولة تمكين الانسحاب من البرنامج. هذه مجرد بعض الأشياء الأساسية التي ستكون مفيدة عندما نكتب برامج أكثر تعقيدًا. في الوقت الحالي ، لا بأس إذا ارتدت العديد من الأشياء عن رأسك ، فسندخل في الطبقة في البرامج التعليمية الأخرى.
برمجة STM8S لإدخال وإخراج GPIO باستخدام SPL
أنشئ مساحة عمل ومشروعًا جديدًا كما ناقشنا في برنامجنا التعليمي الأول. يمكنك إما إضافة جميع ملفات الرأس والمصدر أو إضافة ملفات gpio و config و stm8s فقط. افتح ملف main.c وابدأ في كتابة برنامجك.
تأكد من أنك قمت بتضمين ملفات الرأس كما هو موضح في الصورة أعلاه. افتح ملف main.c وابدأ تشغيل الكود. يمكن العثور على رمز main.c الكامل في أسفل هذه الصفحة وستتمكن أيضًا من تنزيل ملف المشروع من هناك. شرح الكود كما يلي ، يمكنك أيضًا الرجوع إلى دليل مستخدم SPL أو الفيديو المرتبط أسفل هذه الصفحة إذا كنت مرتبكًا بشأن جزء الترميز.
إلغاء تهيئة المنفذ المطلوب
نبدأ برنامجنا بإلغاء تهيئة المنافذ المطلوبة. كما ناقشنا سابقًا ، سيكون لكل دبوس GPIO العديد من الوظائف الأخرى المرتبطة به بخلاف العمل مثل الإدخال والإخراج العادي. إذا تم استخدام هذه المسامير مسبقًا لبعض التطبيقات الأخرى ، فيجب إلغاء تهيئتها قبل استخدامها. إنها ليست إلزامية ، لكنها ممارسة جيدة. يتم استخدام سطري التعليمات البرمجية التاليين لإلغاء تهيئة المنفذ A والمنفذ B. فقط استخدم بناء الجملة GPIO_DeInit (GPIOx) ؛ واذكر اسم المنفذ بدلاً من x.
GPIO_DeInit (GPIOA) ، // تحضير المنفذ A للعمل GPIO_DeInit (GPIOB) ؛ // تحضير المنفذ B للعمل
إعلان الإدخال والإخراج GPIO
بعد ذلك ، علينا أن نعلن عن المسامير التي سيتم استخدامها كمدخل وأيها كمخرج. في حالتنا ، سيتم استخدام دبوس PA2 كمدخل ، وسنعلن أيضًا عن هذا الدبوس مع سحب داخلي حتى لا نضطر إلى استخدام واحد خارجيًا. بناء الجملة هو GPIO_Init (GPIOx ، GPIO_PIN_y ، GPIO_PIN_MODE_z) ؛ . حيث x هو اسم المنفذ ، و y هو رقم التعريف الشخصي ، و z هو وضع GPIO Pin.
// قم بتعريف PA2 كمدخل سحب دبوس GPIO_Init (GPIOA ، GPIO_PIN_2 ، GPIO_MODE_IN_PU_IT) ؛
بعد ذلك ، علينا أن نعلن عن الدبابيس PA3 و PB5 كإخراج. مرة أخرى ، هناك العديد من أنواع إعلان المخرجات الممكنة ولكننا سنستخدم "GPIO_MODE_OUT_PP_LOW_SLOW" مما يعني أننا سنعلن أنه طرف إخراج من نوع الدفع والسحب بسرعة بطيئة. وبشكل افتراضي ، ستكون القيمة منخفضة. سيكون بناء الجملة هو نفسه.
GPIO_Init (GPIOA ، GPIO_PIN_3 ، GPIO_MODE_OUT_PP_LOW_SLOW) ، // قم بتعريف PB5 على أنه دفع سحب دبوس الإخراج GPIO_Init (GPIOB ، GPIO_PIN_5 ، GPIO_MODE_OUT_PP_LOW_SLOW) ؛
توضح اللقطة أدناه من دليل مستخدم SPL جميع أوضاع GPIO الممكنة (z).
أثناء الحلقة اللانهائية
بعد إعلان الدبوس ، نحتاج إلى إنشاء حلقة لا نهائية بداخلها سنستمر في وميض مؤشر LED إلى الأبد ومراقبة حالة زر الضغط لتبديل مؤشر LED. يمكن للحلقة اللانهائية إما أن تخلق مع الوقت (1) أو مع for (؛ ؛) . لقد استخدمت هنا بينما (1).
بينما (1) {}
التحقق من حالة دبوس الإدخال
علينا التحقق من حالة دبوس الإدخال ، وبناء الجملة للقيام بذلك هو GPIO_ReadInputPin (GPIOx ، GPIO_PIN_y) ؛ حيث x هو اسم المنفذ و y هو رقم التعريف الشخصي. إذا كان الدبوس مرتفعًا ، فسنحصل على "1" وإذا كان الدبوس منخفضًا ، فسنحصل على "0". لقد اعتدنا على داخل حلقة if للتحقق مما إذا كان الدبوس مرتفعًا أم منخفضًا.
إذا (GPIO_ReadInputPin (GPIOA ، GPIO_PIN_2)) // إذا تم الضغط على الزر
عمل دبوس GPIO مرتفع أو منخفض
لعمل دبوس GPIO مرتفع أو منخفض ، يمكننا استخدام GPIO_WriteHigh (GPIOx ، GPIO_PIN_y) ؛ و GPIO_WriteLow (GPIOx ، GPIO_PIN_y) ؛ على التوالي. لقد قمنا هنا بتشغيل مؤشر LED إذا تم الضغط على الزر وإيقاف تشغيله إذا لم يتم الضغط على الزر.
إذا (GPIO_ReadInputPin (GPIOA ، GPIO_PIN_2)) // إذا تم الضغط على الزر GPIO_WriteLow (GPIOA ، GPIO_PIN_3) ؛ // LED ON آخر GPIO_WriteHigh (GPIOA ، GPIO_PIN_3) ؛ //انطلق
تبديل دبوس GPIO
لتبديل دبوس GPIO ، لدينا GPIO_WriteReverse (GPIOx ، GPIO_PIN_y) ؛ سيؤدي استدعاء هذه الوظيفة إلى تغيير حالة دبوس الإخراج. إذا كان الدبوس مرتفعًا ، فسيتم تغييره إلى منخفض ، وإذا كان منخفضًا ، فسيتم تغييره إلى مرتفع. نحن نستخدم هذه الوظيفة لميض مؤشر LED الموجود على PB5.
GPIO_WriteReverse (GPIOB ، GPIO_PIN_5) ؛
وظيفة التأخير
على عكس Arduino ، لا يحتوي المترجم الكوني على وظيفة تأخير محددة مسبقًا. لذلك علينا إنشاء واحد بمفردنا. وظيفة التأخير الخاصة بي معطاة أدناه. سيتم استلام القيمة doe إلى التأخير في المتغير ms وسنستخدم اثنان for loop للاحتفاظ أو تنفيذ البرنامج. Like _asm ("nop") هي تعليمات التجميع التي تعني عدم وجود عملية. هذا يعني أن وحدة التحكم ستدور في حلقة for دون إجراء أي عملية ، مما يؤدي إلى حدوث تأخير.
تأخير باطل (int ms) // تعريف الوظيفة {int i = 0 ؛ int j = 0 ؛ لـ (i = 0 ؛ i <= ms ؛ i ++) {لـ (j = 0 ؛ j <120 ؛ j ++) // Nop = Fosc / 4 _asm ("nop") ؛ // لا تقم بأي عملية // كود التجميع}}
تحميل واختبار البرنامج
الآن وقد أصبح برنامجنا جاهزًا ، يمكننا تحميله واختباره. بمجرد التحميل ، كان جهازي يعمل كما هو متوقع. كان مؤشر LED الأحمر الموجود على اللوحة يومض كل 500 مللي ثانية وكان المصباح الأخضر الخارجي قيد التشغيل في كل مرة ضغطت فيها على المفتاح.
يمكن العثور على العمل الكامل في الفيديو المرتبط أدناه. بمجرد وصولك إلى هذه النقطة ، يمكنك محاولة توصيل المفتاح و LED بمسامير مختلفة وإعادة كتابة الكود لفهم المفهوم. يمكنك أيضًا التلاعب بتوقيت التأخير للتحقق مما إذا كنت قد فهمت المفاهيم بوضوح.
إذا كانت لديك أي أسئلة ، فيرجى تركها في قسم التعليقات أدناه وللأسئلة الفنية الأخرى ، يمكنك استخدام منتدياتنا. شكرا للمتابعة ، أراك في البرنامج التعليمي التالي