تصحيح أخطاء الميكروكونترولر ARM Cortex-M بواسطة UART

في هذه المقالة سأخبرك بكيفية استخدام سجلات التصحيح ونقاط التوقف في وحدات التحكم الدقيقة المبنية على نوى ARM Cortex-M

المقدمة


هل تعلم أن نوى ARM Cortex-M في المتحكمات الدقيقة يمكنها تصحيح نفسها؟
اتضح أنهم يستطيعون.

عند قراءة الدليل المرجعي الفني على القلب ، وجد Cortex M3 أنه يحتوي على مقاطعة DebugMon. بعد ذلك ، قمت بتحليل جميع السجلات المرتبطة به. نتيجة لذلك ، اكتشفت أن MK يمكن أن يقع في هذه المقاطعة إذا كان تسجيل الكمبيوتر الشخصي وأحد سجلات FP_COMP متساوية.
هذا يعني أنه يمكننا تحديد نقاط توقف في البرامج الثابتة المصححة. يمكنك أيضًا فرض مقاطعة DebugMon بتعيين بت MON_PEND من تسجيل DEMCR على 1.

الاختيار النظري


نظرًا لأن هذه السجلات موجودة في عائلة ARM Cortex-M الأساسية بالكامل ، فإننا نأخذ أول لوحة تصحيح تظهر. اتضح لي أن stm32f723e-disco بالنسبة لي. لكي لا تضيع الوقت في كتابة كود التهيئة للأجهزة الطرفية ، نستخدم CubeMX
من الأجهزة الطرفية ، نحتاج فقط إلى UART6 متصل بـ ST-Link و LED على اللوحة:

الإعدادات في CubeMX
image

نقوم بإنشاء المشروع وفتح IDE على الفور.

من أجل عدم الخلط في السجلات المرتبطة بالتصحيح ، نقدم على الفور تعريفات لها في التعليمات البرمجية:

تسجيل التعاريف
#define DHCSR (*(uint32_t*)0xE000EDF0)
#define DCRSR (*(uint32_t*)0xE000EDF4)
#define DCRDR (*(uint32_t*)0xE000EDF8)
#define DEMCR (*(uint32_t*)0xE000EDFC)

#define NUMOFBKPTS 8

typedef struct {
  uint32_t FP_CTRL;
  uint32_t FP_REMAP;
  uint32_t FP_COMP[NUMOFBKPTS];
} fp_t;

#define FP ((fp_t*)0xE0002000)


للتحقق من أن مشروعنا يعمل ، من حيث المبدأ ، اكتب رمزًا يومض مع LED:

وميض LED
  while (1)
  {
    for (int i=0;i<1000000;i++)
      asm("nop");
    
    HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_7);
  }


يومض مؤشر LED بنجاح ، مما يعني أنه تم تجميع المشروع بنجاح وإطلاقه.

أضف الخط إلى هذه الحلقة:

asm("BKPT #0");

يعتبر إدراج أداة التجميع هذا نقطة توقف للبرامج. الآن ، عند تصحيح الأخطاء عبر ST-Link ، سيتوقف البرنامج دائمًا عند هذا الخط. نخرج من تصحيح الأخطاء في IDE ويبدأ مصباح LED في الوميض كما كان من قبل.

ولكن ماذا قدم لنا؟

وحقيقة أنه يمكننا التقاط نقطة توقف عن طريق مقاطعة DebugMon.

نكتب معالجها:

معالج DebugMon
void DebugMon_Handler(void)
{
  while (1)
  {
    if ((USART6->ISR & USART_ISR_TXE) != 0U)
    {
      USART6->TDR = '!';
    }
  }
}


نحن نجمع ونومض ولم يتغير شيء. لتمكين مقاطعة DebugMon ، تحتاج إلى رفع بت MON_EN في تسجيل DEMCR.

الآن ، عند تصحيح الأخطاء عبر ST-Link ، سيتوقف البرنامج كما كان من قبل على هذا الخط. بمجرد الخروج من وضع التصحيح ، ستظهر علامات التعجب في النهاية الطرفية:

إخراج المحطة
image

بعد ذلك ، تحقق من الأمر نفسه مع سجل FP_COMP.

نجد عنوان أي تعليمات في حلقة الوظيفة الرئيسية باستخدام IDE وتفعيل نقطة التوقف:

FP->FP_COMP[0] = 0x080017CC | 1; //     = 0x080017CC

عندما يتم تعطيل مصحح الأخطاء للأجهزة ، يدخل المتحكم أيضًا في مقاطعة DebugMon.

كيفية استخدامها


باستخدام السجلات أعلاه ومقاطعات DebugMon ، من الممكن تصحيح متحكم بدون مصحح SWD / JTAG. يصبح من الممكن أيضًا تصحيح البرامج الثابتة للجهاز الذي يوجد به اتصال ، ولكن الوصول إلى دبابيس SWD أمر صعب.

يتبع…

All Articles