الدرس ٩ : ARM Cortex-M4 Nested Vectored Interrupt Controller - NVIC

يحتوي الدرس على شرح للنقاط الاتية

Difference between Exceptions and Interrupts
Nested Vectored Interrupt Controller (NVIC)
Vector Table in Start Up and Device Header files
NVIC Registers
Priority
Priority Group
System Control Block (SCB)
Core Registers for Exceptions and Interrupts masking
Examples using NVIC

ملف المشروع
L09_NVIC_Examples.zip (229.3% u)

إعجابَين (2)

السلام عليكم ورحمة الله وبركاته , لو سمحت عندي استفسار صغير في اخر الفيديو دقيقة 44 هو انا لما استخدمت FAULTMASK الاتنين (الليدتين) اشتغلوا تمام لما اجي استخدم PRIMASK واعمله DISABLE مع HANDLER الاتنين (الليدتين ) شغالين برده مش عارف ليه

وعليكم السلام ورحمة الله وبركاته
اتاكد انك اتبعت المثال او على الاقل حاول تجربة الاول بدون تغيير.

إعجابَين (2)

انا شغال STM32F10 M3 تمام هو فيه اختلاف بسيط بس هو فيه نفس الكلام اللي حضرتك شرحه عملت initialization لل pC13 و pB0 ,و بعدين initialization لل interrupt وبعد كدة SETPENDING لي ليدتين وبعد كدة كلير لل primask

للتوضيح الليد الاحمر بتاع power

ممكن يكون بسبب اختلاف البروسيسور سلوك ال primask مختلف؟
حاول تبص على ال processor user guide لكل واحد وتتاكد من الموضوع ده

إعجابَين (2)

خالص الشكر و الاحترام لحضرتك يابشمهندس
بس انا دلوقتي لو عايز اتعامل مع صور او فيديو مع الميكروكنترولر يعني مثلا لو عايز اعرض صورة او فيديو علي شاشة lcd ازاي بيتم الموضوع او ازاي بيتم تخزين الصورة او الفيديو في الميموري علي الكمبيوتر …محتاج بس مصدر تعلم منه و انا هحفر مع نفسي

الصورة ببساطة في الكمبيوتر او الميكرو او كبيانات ديجيتل بتكون على هيئة مصفوفة كل عنصر فيها بيكون رقم من صفر ل ٢٥٥ بيحدد لون البكسل في حالة الصورة الرمادية او ٣ ارقام في حالة الصور الملونة بيكونوا للاحمر والاخضر والازرق.
ممكن تجرب مثلا برنامج زي الماتلاب انك تحول صورة لمصفوفة وتخزنها في البرنامج بتاعك ك array.
لو مثلا هتقرأ الصورة من فلاش ميمورى او اي وسط تخزين الصورة بتكون على هيئة format مختلف مثلا png ساعتها لازم يكون عندك library تقدر تقرأ الفورمات ده وتحوله لقيم البكسل.
اما بالنسبة للشاشة فلازم تحدد لون كل بيكسل فيها بناء على مكانه فى الصورة طبعا لو مقاس الصورة يختلف عن مقاس الشاشه فلازم تعمل scale للصورة وبعدها هيكون كل بيكسل في الصورة يقابل كل بيكسل في الشاشه وتقدر تعرض الصورة بسهولة

إعجاب واحد (1)

السلام عليكم باش مهندس أحمد
شكراً لك على المعلومات التي تقدمها لنا

عند تطبيقي لما شرحته ولكن على بيئة Stm32CubeIDE
واجهتني مشكلة في إيقاف المقاطعات
بالتحديد عند إضافة تعليمة CPISD i لملف startup
وهي بالشكل التالي
عند بناء البرنامج يتم البناء بشكل صحيح ولكن من غير حفظ التعديلات ضمن ملف startup
ماهي أنسب طريقة لحل المشكلة؟
شكراً لك على وقتك

الصورة المرفقة لرسالة الخطأ عند بناء البرنامج

وعليكم السلام ورحمة الله وبركاته
هل تحدث المشكلة فقط عند التعديل على هذا الملف؟؟ ام عند حفظ اى ملف ؟؟
اعتقد ان هذه المشكلة لها علاقة بالبرنامج نفسه ولكن التعديل، مثلا جرب اغلاق البرنامج واعادة فتحه، في حالة استمرار المشكل، يمكك عمل هذا التعديل خارج البرنامج مثلا استخدم notepad.

إعجاب واحد (1)

شكراً لك باش مهندس
المشكلة حتى الآن لا تظهر سوى عند محاولة التعديل على ملف الstartup
قمت بتحميل notepad++ نسخت محتوى الملف وعدلت عليه
عند حفظ الملف ظهرت رسالة تقول إن الملف قد يكون محمياً هل تريد الانتقال إلى وضع administrator
عند الدخول في وضع administrator تم حل المشكلة وتم بناء الملف في Stm32CubeIDE
يبدو أن المشكلة حصلت خلال تثبيت البرنامج لأني لم أستطع التعديل على الملف الجديد في CubeIDE

شكراً لك على وقتك

إعجاب واحد (1)

NVIC_SetPriorityGrouping

sets group priority … for which interrupt ??

اللي فهمته انه كل interrupt بيبقى ليه group priority و sub-priority
ولا كدا فاهم الموضوع غلط ؟

ال group priority بيكون قيمة واحدة لكل interrupts الموجودة فمثلا لو قلنا عندنا ال group priority تساوى ٣ فمعناه بناء على الجدول اللي تحت ان البت ٤ الي ٧ هتكون ال priority اللي هي ال pre-empt اما البت ٠ الي ٣ هتكون ال sub-priority

في حالة ال stm32f4 عندنا فقط ٤ بت مستخدمين اللي هما ٤ الي ٧ فلو قلنا ان ال group priority قيمتها ٣ فهيكون عندنا فقط ٤ بت priority لكل انتربت ومش هيكون عندنا sub-priority

اما لو كان الميكروكنترولر فيه ال ٨ بت مستخدمين فهيكون ٤ بت لل sub-priority و ٤ بت لل priority

وفي النهاية نحدد لكل انترنت قيمة ال priority مثلا في حالة ال stm32f4 هتكون قيمة ٤ بت يعنى من ٠ الي ١٥ اما في وفى حالة ميكروكنترولر تانى فيه ال ٨ بت مستخدمين هتكون القيمة من ٠ الي ٢٥٥ وهكذا

إعجاب واحد (1)

تمااام وصلت :heart_decoration:

إعجاب واحد (1)


في الGeneric User Guide موجود الريجيستر دا
إيه الفرق بينه وبين ال
ISPR
اللي بنستخدمه في
NVIC_SetPending
وشكرا جدا لحضرتك

مفيش فرق غير اننا ممكن نستخدمه في حالة ال unprivileged زى ما ذكرت في الفيديو

إعجابَين (2)

شكرا جدا
طيب في لبس تاني مع الNVIC_setPriorityGrouping
,و NVIC_EncodePriority
كدا انا فهمت من حضرتك ان الأولى هي اللي بتعمل التقسيمة بتاعة الريجيستر
و التانية بقدر بقى من خلالها أحدد الpreemption & sub-priority
طيب بالنسبة لأول براميتر في NVIC_EncodePriority هل دا بردو بيقدر يغير في التقسيمة بتاعة الريجيستر ولا المفروض اديهوله حسب ما ما انا عامله بالNVIC_setPriorityGrouping
uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)

ولو … الاتنين مختلفين عن بعض … هياخد بمين
أظنه من الكود … الأول اللي هو الNVIC_setPriorityGrouping بس حابب أتأكد

السلام عليكم ورحمة الله وبركاته
NVIC_setPriorityGrouping هى فقط بتدمج ال preempt و ال sub priority وتعمل return لقيمة ال priority النهائية.

مثلا الميكروكنترولر موصل ال ٨ بت كلهم ولو اختارنا مثلا group 3 فهيكون ٤ بت لل preempt و ٤ بت لل sub مثلا لو اختارنا كل priority فيهم ب ١ فهيكون القيمة النهائية لل priority تساوى 00010001 وهكذا

دا الكود

/**
  \brief   Encode Priority
  \details Encodes the priority for an interrupt with the given priority group,
           preemptive priority value, and subpriority value.
           In case of a conflict between priority grouping and available
           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.
  \param [in]     PriorityGroup  Used priority group.
  \param [in]   PreemptPriority  Preemptive priority value (starting from 0).
  \param [in]       SubPriority  Subpriority value (starting from 0).
  \return                        Encoded priority. Value can be used in the function \ref NVIC_SetPriority().
 */
__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)
{
  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */
  uint32_t PreemptPriorityBits;
  uint32_t SubPriorityBits;

  PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);
  SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));

  return (
           ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |
           ((SubPriority     & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL)))
         );
}

إعجابَين (2)