ملاحظات تطوير مكتبة HAL - GPIO
المبدأ الأساسي
GPIO هو مخرج / مدخل عام (General Purpose Input Output).
لنأخذ مثالًا على رقاقة F103C8T6 (الصورة أعلاه) ، بالإضافة إلى الأرجل الملونة (مصدر الطاقة وبعض الوظائف الأخرى) ، يُطلق على جميع الأرجل باسم GPIO. يمكننا أن نرى مدى تعميمها.
وظيفة GPIO هي إدخال / إخراج إشارة كهربائية. دعنا نلقي نظرة على الهيكل الداخلي لها:
- الدبابيس I/O على اليمين هي دبابيس الرقاقة الفعلية. يمنع المقاومتان الثنائيتان المحمية إلى حد ما تدمير الرقاقة بسبب الجهد الغير طبيعي الخارجي.
- الإطار المحاط بالخط الأحمر هو وظيفة الإدخال (قراءة الرقاقة للإشارة الخارجية). المقاومتان الموصلتان بالتبديل ، هما لتحقيق وظيفة الإدخال السحب العلوي / السحب السفلي. إذا لم يتم إغلاق البابين ، فإننا نسميه إدخالًا عائمًا (لا يوجد مستوى مرجعي). جميع طرق الإدخال الثلاثة تعطي قيم رقمية (مستوى عالي / منخفض). بالإضافة إلى ذلك ، هناك وظيفة الإدخال التناظرية ، كما يوحي الاسم ، وهي قراءة الكمية التناظرية على الدبوس. (سنتطرق إلى وظيفة الإدخال المشتركة لاحقًا).
- الإطار المحاط بالخط الأزرق هو وظيفة الإخراج. هناك 4 أنماط للإخراج: الدفع والسحب والدفع المشترك والسحب المشترك.
أنماط الإدخال والإخراج
أنماط الإدخال:
- إدخال عائم: لا سحب علوي ولا سحب سفلي ، هذا هو الوضع الافتراضي بعد إعادة تعيين STM32.
- إدخال سحب علوي: قم بإغلاق التبديل الذي يحتوي على مقاومة السحب العلوي للحفاظ على مستوى المرجع عاليًا ، وعندما يكون إشارة الإدخال منخفضة ، يتم تنشيطها.
- إدخال سحب سفلي: قم بإغلاق التبديل الذي يحتوي على مقاومة السحب السفلي للحفاظ على مستوى المرجع منخفضًا ، وعندما يكون إشارة الإدخال عالية ، يتم تنشيطها.
- إدخال تناظري: في هذا الوضع ، لا يوجد سحب علوي ولا سحب سفلي ، ولا يمر عبر المقاومة المنطقية TTL ، يقرأ STM32 مباشرة الإشارة التناظرية على الدبوس.
أنماط الإخراج:
- إخراج سحب: يشير سحب إلى تصريف المصدر (الدبوس العلوي للمفتاح العلوي) ، يتم استخدام هذا الوضع فقط للمفتاح السفلي. نعلم أن المفتاح MOS هو عنصر قابل للتحكم بالجهد. فهمه كصنبور ماء ، عند إدخال إشارة جهد منخفض على بوابة MOS العلوية (الدبوس الأيسر) ، يتم توصيل MOS السفلي.
- إخراج الدفع: هناك نوعان من أنماط الدفع ، النوع الأول هو إدخال إشارة جهد منخفض على بوابتي MOS في نفس الوقت ، في هذه الحالة يتم قطع MOS العلوي وتوجيه التيار من VDD إلى الدبوس الخارجي ، ويكون المستوى العالي على الدبوس. النوع الثاني هو العكس ، إدخال إشارة جهد عالي على بوابتي MOS في نفس الوقت ، في هذه الحالة يتم قطع MOS العلوي وتوجيه التيار من الدبوس الخارجي إلى GND الداخلي ، ويكون المستوى المنخفض على الدبوس.
- الدفع المشترك
- السحب المشترك
مراجع الدوال GPIO الشائعة
قراءة حالة GPIO ، وإرجاع مستوى عالي / منخفض:
كتابة حالة GPIO ، وكتابة مستوى عالي / منخفض:
عكس مستوى GPIO:
تشغيل LED
قبل المتابعة إلى التجربة التالية ، يجب تكوين معلمات مختلفة مثل تنزيل المنفذ التسلسلي والساعة في CubeMX. لن نتطرق إلى ذلك هنا ، يرجى الرجوع إلى المقالة HAL 库开发笔记 - 环境配置 لمعرفة كيفية التكوين.
تكوين GPIO في CubeMX
قم بتعيين المنفذ المناسب للمصباح LED كمخرج وقم بتعيين المستوى الابتدائي.
على اللوحة الخاصة بي ، يجب تعيين دبوس PD4
و PI3
هذين GPIO كمخرج (GPIO_Output
). إذا كنت ترغب في تشغيل المصباح عند تشغيل الطاقة ، فقم بتعيين المستوى الابتدائي على منخفض (Low
).
تكوين GPIO في الكود
إذا تم التكوين بشكل صحيح ، يمكن تشغيل مصابيح LED المستخدم عند تشغيل الطاقة.
إذا كنت ترغب في إضافة تأثير وميض للمصابيح ، فما عليك سوى إضافة بضعة أسطر من الكود في منطقة الكود الخاصة بالمستخدم في الحلقة الرئيسية:
/* USER CODE BEGIN 3 */
HAL_Delay(500);
HAL_GPIO_TogglePin(GPIOD ، GPIO_PIN_4);
HAL_GPIO_TogglePin(GPIOI ، GPIO_PIN_3);
}
/* USER CODE END 3 */
يمكن تحقيق تأثير وميض المصابيح.
تحكم الأضواء باستخدام الأزرار
بعد تعلم إخراج GPIO ، سنتعلم الآن وضع الإدخال لـ GPIO باستخدام الأزرار.
تكوين GPIO في CubeMX
بعد تكوين منفذ GPIO الذي ينتمي إليه المصابيح وفقًا للطريقة المذكورة أعلاه ، استنادًا إلى مخطط الأزرار المدمج:
قم بتعيين GPIO المرتبط بالزر (PI8) كإدخال (GPIO_Input). استنادًا إلى المخطط الأساسي ، حدد السحب العلوي الداخلي (Pull-up). قم بتوليد الكود.
تكوين GPIO في الكود
أضف الكود التالي في منطقة الكود الخاصة بالمستخدم في الحلقة الرئيسية:
/* USER CODE BEGIN 3 */
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==0)
{
HAL_Delay(100);
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==0)
{
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
}
}else{
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
}
}
/* USER CODE END 3 */
بهذه الطريقة يمكن تحقيق تأثير تشغيل الأضواء عند الضغط على الزر وإيقاف تشغيلها عند رفع الضغط عنه.
هناك العديد من الأشخاص الذين لا يفهمون ماذا يعني GPIO_PIN_SET
و GPIO_PIN_RESET
. في الواقع ، تقوم هاتين المتغيرتين بتعيين مستوى الجهد العالي / المنخفض للمنفذ GPIO فقط. يعتمد ما إذا كانت المصابيح مشتعلة أو مطفأة على مخطط الدائرة.
بالإضافة إلى ذلك ، يقوم HAL_Delay(100)
بإزالة اهتزاز الزر في الكود. ومع ذلك ، يستخدم الدالة HAL_Delay()
الاستطلاع ، مما يستهلك الموارد ويتسبب في تعليق النظام. في المقالة التالية ، سنستخدم المقاطعات الأجهزة لحل هذا العيب.
المراجع والشكر
عنوان النص: https://wiki-power.com/
يتم حماية هذا المقال بموجب اتفاقية CC BY-NC-SA 4.0، يُرجى ذكر المصدر عند إعادة النشر.تمت ترجمة هذه المشاركة باستخدام ChatGPT، يرجى تزويدنا بتعليقاتكم إذا كانت هناك أي حذف أو إهمال.