انتقل إلى المحتوى

ملاحظات تطوير مكتبة HAL - المقاطعة الخارجية

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

المبدأ الأساسي

الاستطلاع والمقاطعة

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

المقاطعة الخارجية

تنقسم المقاطعات إلى خارجية (مقاطعة) وداخلية (استثناء). المقاطعة الخارجية تتم عن طريق جهاز خارجي يقاطع وحدة المعالجة المركزية (MCU) ، والمقاطعة الداخلية تتم عن طريق برنامج البرامج الثابتة الداخلية.

NVIC

تعني NVIC بالكامل Nested Vectored Interrupt Controller ، وهي وحدة تحكم في المقاطعات المتداخلة. يحتوي على ثلاثة معلمات رئيسية ، وهي: تمكين المقاطعة ، أولوية الاستيلاء ، أولوية الاستجابة. (كلما كانت القيمة أقل ، كانت الأولوية أعلى)

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

أولوية الاستيلاء: تُستخدم لتحديد ما إذا كانت مقاطعة يمكن أن تقاطع برنامج خدمة مقاطعة أخرى وتعمل أولاً. على سبيل المثال ، إذا تم تنشيط مقاطعة A وبرنامج خدمة مقاطعة A قيد التشغيل ، وفي هذا الوقت تم تنشيط مقاطعة B ، إذا كانت أولوية استيلاء مقاطعة B أعلى من A ، فسيتم قطع برنامج خدمة مقاطعة A والانتقال أولاً لتنفيذ برنامج خدمة مقاطعة B ، ثم استئناف تنفيذ A ، وهذا ما يسمى بالتداخل المقاطع. إذا كانت أولوية استيلاء B لا تتفوق على A ، فلا يزال يجب إكمال A أولاً ثم تنفيذ B.

أولوية الاستجابة: إذا تم تنشيط عدة مقاطعات بنفس الأولوية ، فسيتم تشغيل الأولوية الأعلى أولاً.

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

مرجع وظيفة استدعاء المقاطعة

بعد تكوين مقاطعة GPIO وأولوية NVIC ، يمكن تنفيذ الوظيفة من خلال إعادة كتابة وظيفة استدعاء المقاطعة في نهاية ملف stm32f4xx_it.c.

/* USER CODE BEGIN 1 */

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{

}

/* USER CODE END 1 */

التحكم في الأضواء باستخدام مقاطعة الضغط الخارجية

قبل المتابعة إلى التجربة التالية ، يجب تكوين معلمات مختلفة مثل تنزيل المنفذ التسلسلي ، والساعة ، وما إلى ذلك في CubeMX. يرجى الرجوع إلى المقالة HAL 库开发笔记 - 环境配置 للحصول على الخطوات المحددة للتكوين.

تكوين المقاطعة في CubeMX

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

على لوحتي ، يتم تكوين PI8 كوضع GPIO_EXTI8 (مقاطعة خارجية معلقة على الخط 8) ، وتكوينها كمقاطعة تنشيط هبوط الحافة ، وفقًا للمخطط الأصلي ، يتم اختيار السحب العلوي الداخلي (Pull-up). كما هو موضح في الصورة:

ثم ، انقر فوق علامة التبويب NVIC لتمكين المقاطعة التي قمنا بتكوينها:

بالإضافة إلى ذلك ، يجب خفض أولوية الاستيلاء على الموارد بمقدار واحد (من 0 إلى 1 ، سيتم شرح السبب في النص التالي).

تكوين المقاطعات في الشيفرة

ما عليك سوى إضافة الشيفرة التالية في نهاية stm32f4xx_it.c:

stm32f4xx_it.c
/* USER CODE BEGIN 1 */

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    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_TogglePin(LED1_GPIO_Port,LED1_Pin);
        }
    }
}

/* USER CODE END 1 */

يقوم هذا الشيفرة بإعادة كتابة وظيفة استدعاء المقاطعة وإضافة وظيفة تبديل حالة الضوء باستخدام زر التبديل. ومع ذلك ، هناك مشكلة في وظيفة التأخير HAL_Delay() ، لأنها تعتمد على المؤقت SysTick (الذي يولد المقاطعات في فترات زمنية ثابتة) ، لذلك له أولوية مقاطعة محددة. يمكن رؤية أولوية المقاطعات المكونة في الرسم التوضيحي لـ NVIC أعلاه ، حيث يكون لدى SysTick وأولوية الاستيلاء على الموارد المكونة نفس القيمة 0 ، وبالتالي لا يمكن استدعاء SysTick بعد استدعاء المقاطعة الخارجية. لذلك ، يجب خفض أولوية الاستيلاء على الموارد الخارجية (من 0 إلى 1).

بمجرد تحميل الشيفرة وتنفيذها ، يمكنك تبديل حالة الضوء LED عن طريق الضغط على الزر.

المراجع والشكر

عنوان النص: https://wiki-power.com/
يتم حماية هذا المقال بموجب اتفاقية CC BY-NC-SA 4.0، يُرجى ذكر المصدر عند إعادة النشر.

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