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

STM32CubeMX زر التنبيه مع المقاطعة: 5 خطوات
STM32CubeMX زر التنبيه مع المقاطعة: 5 خطوات

فيديو: STM32CubeMX زر التنبيه مع المقاطعة: 5 خطوات

فيديو: STM32CubeMX زر التنبيه مع المقاطعة: 5 خطوات
فيديو: ХЭЛ: #5 Как - СПАТЬ с EXTI 2024, شهر نوفمبر
Anonim
STM32CubeMX زر التنبيه مع المقاطعة
STM32CubeMX زر التنبيه مع المقاطعة

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

الخطوة 1: متطلبات الأجهزة والبرامج

متطلبات الأجهزة:

  • مجلس تطوير STM32 ARM
  • كمبيوتر

متطلبات البرنامج:

  • STM32CubeMX
  • كايل uVision5

الخطوة الثانية: فهم المشكلة

فهم المشكلة
فهم المشكلة

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

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

الخطوة 3: تكوين STM32CubeMX

تكوين STM32CubeMX
تكوين STM32CubeMX

لذلك ، نحتاج أولاً إلى تمكين المقاطعة الخارجية لزر الضغط (أفترض هنا أنك تستخدم لوحة اكتشاف STM32F407VG):

  • في علامة التبويب "Pinout & Configuration" ، انقر فوق pin PA0 المتصل بزر الضغط واختر GPIO_EXTI0 الذي يتيح المقاطعة الخارجية على هذا الدبوس.
  • قم بتغيير "تسمية المستخدم" الخاصة بالدبوس إلى "زر_الضغط" أو أي شيء تريده.

بعد ذلك ، نحتاج إلى ضبط المؤقت من أجل إنشاء تأخير زمني قدره 50 مللي ثانية:

  • أدخل قسم "Timers"
  • انقر فوق TIM1
  • اختر "الساعة الداخلية" كمصدر للساعة
  • في التكوين (إذا كنت تريد فهم هذا القسم ، يرجى الرجوع إلى هذا البرنامج التعليمي ، موصى به بشدة "التحكم في محرك سيرفو مع STM32F4 ARM MCU"):

    • تعيين prescaler 32000
    • وفترة العداد حتى 50
  • في علامة التبويب "إعدادات NVIC" ، قم بتمكين كل المقاطعات

تمكين LED كمخرج:

انقر فوق PD12 وقم بتعيينه كـ "GPIO_Output"

ثم قم بتكوين الساعة كما في الصورة أعلاه وقم بإنشاء الرمز.

الخطوة 4: Keil Software Development

أولاً ، نحدد متغير الحالة الذي سيضمن أننا لا نبدأ المؤقت داخل المقاطعة الخارجية عند حدوث الارتداد:

/ * USER CODE BEGIN PFP * / bool state = true ؛ / * نهاية رمز المستخدم PFP * /

ثم نكتب ISR للمقاطعة الخارجية:

باطل HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1) ؛ الدولة = خطأ ؛ } آخر {_NOP () ؛ }}

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

ثم نكتب ISR لمقاطعة المؤقت:

باطل HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef * htim) {/ * منع تحذير تجميع الوسيطة (الوسائط) غير المستخدمة * / UNUSED (htim) ؛

/ * ملاحظة: لا ينبغي تعديل هذه الوظيفة ، عند الحاجة إلى رد الاتصال ،

يمكن تنفيذ HAL_TIM_PeriodElapsedCallback في ملف المستخدم * / إذا كان (HAL_GPIO_ReadPin (Push_Button_GPIO_Port، Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD، GPIO_PIN_12)؛ الدولة = صحيح ؛ HAL_TIM_Base_Stop_IT (& htim1) ؛ }}

/ * نهاية رمز المستخدم 4 * /

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

لذلك ، ستضمن هذه العملية أننا نمنع المشكلة المرتدة.

الخطوة 5: الخاتمة

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

موصى به: