ARM مع Cortex Mx core (باستخدام STM32F10x كمثال)

يستخدم على نطاق واسع ARM Cortex M3 STM32F103c8t6 متحكم 32 متحكم لمشاريع الهواة. بالنسبة إلى أي متحكم تقريبًا ، هناك SDK له ، بما في ذلك ، من بين أشياء أخرى ، ملفات رأس C ++ لتحديد محيط وحدة التحكم.
وهناك ، يتم تعريف المنفذ التسلسلي ، على سبيل المثال ، على أنه بنية بيانات ، ومثيل هذه البنية يقع في منطقة العنوان المحجوزة للتسجيلات ولدينا إمكانية الوصول إلى هذه المنطقة من خلال مؤشر إلى عنوان محدد.
بالنسبة لأولئك الذين لم يصادفوا هذا من قبل ، سوف أصف قليلاً كيف تم تعريفه ، وقد يتخطى هذا القراء الذين هم على دراية بهذا الوصف.
يتم وصف هذه البنية ومثيلها على النحو التالي:
typedef struct { __IO uint32_t CR1; . . . __IO uint32_t ISR; } USART_TypeDef;
يمكنك الاطلاع على مزيد من التفاصيل هنا
stm32f103xb.h ≈ 800 كيلو بايتوإذا كنت تستخدم التعاريف فقط في هذا الملف ، فيجب عليك كتابة مثل هذا (مثال على استخدام سجل حالة المنفذ التسلسلي):
وعليك أن تستخدمها لأن حلول الملكية الحالية المعروفة باسم CMSIS و HAL معقدة للغاية بحيث لا يمكن استخدامها في مشاريع الهواة.
لكن إذا كتبت بـ C ++ ، فيمكنك الكتابة هكذا:
تتم تهيئة مرجع قابل للتغيير بمؤشر. هذا هو القليل من الارتياح ، ولكن لطيفة. والأفضل من ذلك ، بطبيعة الحال ، أن تكتب فئة غلاف صغيرة على هذا ، في حين أن هذه التقنية لا تزال مفيدة.
بالطبع ، أود أن أكتب على الفور فئة المجمع هذه عبر منفذ تسلسلي (EUSART - جهاز إرسال واستقبال غير متسلسل عالمي موسع) ، جذاب للغاية ، مع ميزات متقدمة ، جهاز إرسال واستقبال غير متزامن ، ويكون قادرًا على توصيل متحكمنا الصغير بنظام سطح مكتب أو كمبيوتر محمول ، ولكن متحكم دقيق تتميز Cortex بنظام تسجيل متطور ، وعليك البدء منه ، ثم تكوين دبابيس I / O المقابلة للعمل مع الأجهزة الطرفية ، لأنه في سلسلة STM32F1xx ، كما هو الحال في تدب ميكروكنترولر ARM اللحاء أخرى لا يمكن أن تكوين دبابيس الميناء إلى الإدخال أو الإخراج والعمل في نفس الوقت مع المحيط الخارجي.
حسنًا ، لنبدأ بتشغيل التوقيت. يُطلق على نظام الساعة سجلات RCC للتحكم في الساعة ويمثل أيضًا هيكل بيانات ، المؤشر الذي تم تعيين قيمة عنوان محددة له.
typedef struct { . . . } RCC_TypeDef;
تم تعريف حقول هذا الهيكل على هذا النحو ، حيث يعرّف __IO المتقلبة:
__IO uint32_t CR;
تتوافق مع السجلات من RCC ، ويتم تشغيل البتات الفردية من هذه السجلات أو وظائف عقارب الساعة لمحيط متحكم. كل هذا موصوف جيدًا في
الوثائق (pdf) .
يتم تعريف مؤشر لهيكل كما
#define RCC ((RCC_TypeDef *)RCC_BASE)
عادةً ما يبدو العمل مع وحدات بت السجل دون استخدام SDK كما يلي:
فيما يلي تضمين المنفذ A.
يمكنك تمكين اثنين أو أكثر من البتات دفعة واحدة
يبدو غير عادي بعض الشيء لـ C ++ أو شيء غير عادي. سيكون من الأفضل الكتابة بشكل مختلف ، مثل هذا ، على سبيل المثال ، باستخدام OOP.
يبدو أفضل ، ولكن في القرن الحادي والعشرين سنذهب إلى أبعد من ذلك قليلاً ، استخدم C ++ 17 والكتابة باستخدام قوالب مع عدد متغير من المعلمات أكثر جمالا:
حيث يتم تعريف Rcc مثل هذا:
من هذا ، سنبدأ في بناء غلاف على سجلات الساعة. أولاً ، نعرّف فئة ومؤشر (رابط) بها.
في البداية ، أردت أن أكتب في معيار C ++ 11/14 باستخدام فك متكرر لمعلمات قالب دالة. يتم توفير مقال جيد حول هذا الموضوع في نهاية المقالة ، في قسم الارتباط.
النظر في الدعوة إلى تمكين ميناء على مدار الساعة وظيفة:
Rcc.PortOn<GPort::A>();
ستنشرها دول مجلس التعاون الخليجي في مجموعة من هذه الأوامر:
ldr r3, [pc, #376] ; (0x8000608 <main()+392>) ldr r0, [r3, #24] orr.w r0, r0, #4 str r0, [r3, #24]
هل نجحت؟ تحقق التالي
Rcc.PortOn<GPort::A, GPort::B, GPort::C>();
للأسف ، قامت دول مجلس التعاون الخليجي غير الساذجة بنشر دعوة العودية المتأخرة بشكل منفصل:
ldr r3, [pc, #380] ; (0x8000614 <main()+404>) ldr r0, [r3, #24] orr.w r0, r0, #4 ; APB2ENR |= GPort::A str r0, [r3, #24] ldr r0, [r3, #24] orr.w r0, r0, #28 ; APB2ENR |= Gport::B | GPort::C str r0, [r3, #24] #24]
دفاعًا عن مجلس التعاون الخليجي ، يجب أن أقول إن هذا ليس هو الحال دائمًا ، ولكن فقط في الحالات الأكثر تعقيدًا ، والتي ستظهر عند تنفيذ فئة منفذ الإدخال / الإخراج. حسنًا ، C ++ 17 في عجلة من أمرنا للمساعدة ، أعد كتابة فئة TRCC باستخدام إمكانيات التمرير المدمجة.
الآن اتضح:
ldr r2, [pc, #372] ; (0x800060c <main()+396>) ldr r0, [r2, #24] orr.w r0, r0, #28 ; APB2ENR |= Gport::A | Gport::B | GPort::C str r0, [r3, #24]
وأصبح رمز الفصل أكثر بساطة.
خاتمة: C ++ 17 يسمح لنا باستخدام القوالب مع عدد متغير من المعلمات للحصول على نفس مجموعة الحد الأدنى من التعليمات (حتى عند إيقاف تشغيل التحسين) التي يتم الحصول عليها عند استخدام العمل الكلاسيكي مع متحكم من خلال تعريفات التسجيل ، ولكن في نفس الوقت نحصل على جميع مزايا الكتابة القوية C ++ ، والشيكات أثناء التحويل البرمجي ، يتم إعادة استخدامها من خلال بنية الفئات الأساسية للرمز ، وهكذا.
هنا شيء مثل هذا مكتوب في C ++
Rcc.PortOn<Port::A, Port::B, Port::C>();
والنص الكلاسيكي على السجلات:
RCC->APB2 |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN;
تتكشف في مجموعة الأمثل من التعليمات. إليك الكود الذي تم إنشاؤه بواسطة GCC (التحسين خارج -Og):
ldr r2, [pc, #372] ; (0x800060c <main()+396>) [ RCC] ldr r0, [r2, #0] ; r0 = RCC->APB2 // [ APB2] orr.w r0, r0, #160 ; r0 |= 0x10100000 str r0, [r2, #0] ; RCC->APB2 = r0
الآن يجب عليك متابعة العمل وكتابة فئة منفذ الإدخال والإخراج. العمل مع بتات منفذ الإدخال / الإخراج معقد بسبب تخصيص أربعة بتات لتكوين أرجل منفذ واحدة ، وبالتالي فإن 64 بت من التكوين مطلوبة على منفذ 16 بت ، والتي تنقسم إلى سجلين CRL و CRH 32 بت. بالإضافة إلى ذلك ، يصبح عرض قناع البت أكثر من 1. لكن هنا ، يظهر التمرير خلال C ++ 17 قدراته.

بعد ذلك ، سيتم كتابة فئة TGPIO ، بالإضافة إلى فصول للعمل مع الأجهزة الطرفية الأخرى ، ومنفذ تسلسلي ، و I2C ، و SPI ، و DAP ، وأجهزة توقيت ، وأكثر من ذلك بكثير ، والتي عادة ما تكون موجودة في ARM Cortex microcontrollers ومن ثم سيكون من الممكن أن تلمع بمصابيح LED هذه.
ولكن المزيد عن ذلك في الملاحظة التالية.
مصادر المشروع على جيثب .
مقالات الإنترنت تستخدم لكتابة الملاحظات
قوالب مع عدد متغير من الوسائط في C ++ 11 .
الابتكارات في القوالب .
لغة ++ C ابتكار 17. الجزء 1. الإلتواء والاشتقاق .
قائمة الروابط إلى وثائق ميكروكنترولر STM .
متغير معلمة وحدات الماكرومقالات عن الخبر التي دفعتني إلى كتابة هذه الملاحظة
إشارة المرور على Attiny13 .
القبض على جوليان أسانج من قبل شرطة المملكة المتحدةالفضاء كذاكرة غامضةكُتب بتاريخ 04/12/2019 - يوم سعيد لرواد الفضاء!
PS
الصورة STM32F103c8t6 من CubeMX.
كنقطة بداية ، يتم استخدام النص الذي تم إنشاؤه بواسطة ملحق Eclips للعمل مع
متحكم GNU MCU Eclipse ARM المدمج و
STM CubeMX ، أي أن هناك ملفات وظائف C ++ القياسية و _start () و _init () ، يتم أخذ تعريفات متجهات المقاطعة ARM Embedded ، وسجلات Cortex M3 الأساسية وملفات العمل هي من مشروع تم إنشاؤه بواسطة CubeMX.
PPSعلى تصحيح KDPV مع وحدة تحكم STM32F103c8t6 ممثلة. ليس كل شخص لديه مثل هذا المنتدى ، ولكن ليس من الصعب شرائه ، ومع ذلك ، هذا هو خارج نطاق هذه المقالة.