- الاتصال التسلسلي على STM8S103F3P6
- دبابيس الاتصال التسلسلي على STM8S103F3P6
- مخطط الدائرة للاتصال التسلسلي STM8S
- إعداد STVD للاتصال التسلسلي
- برمجة STM8S للاتصالات التسلسلية
- التحكم في LED من الشاشة التسلسلية
- مكتبة المسلسل STM8S نظرة أعمق
غالبًا ما تستغرق برمجة وحدة تحكم دقيقة جديدة وقتًا أطول بسبب أساليب معالجة السجل الجديدة وعدم معرفة ما الذي يفعله بالضبط. الشيء نفسه ينطبق على التصحيح أيضًا دون أن يقول. هذا هو السبب في أن المبرمجين يستخدمون في كثير من الأحيان نقاط التوقف في التعليمات البرمجية الخاصة بهم ويتنقلون خلالها باستخدام مصحح الأخطاء. ولكن قد يتطلب استخدام مصحح أخطاء أجهزة إضافية (غالية الثمن في معظم الأوقات) ووقتًا إضافيًا أيضًا لكونك من محبي Arduino ، هناك شيء واحد يمكننا أن نتفق عليه جميعًا وهو استخدام عبارات الطباعة التسلسلية لتصحيح الأخطاء وفهم الكود الخاص بنا مما يجعل الحياة أسهل كثيرًا. ما الذي يمكننا نسخه على STM8s باستخدام مترجم C الكوني ومكتبات SPL؟ حسنًا ، هذا ممكن جدًا ، وهذا بالضبط ما سنفعله في هذا البرنامج التعليمي الثالث من سلسلة البرامج التعليمية الخاصة بنا.يمكنك أيضًا التحقق من بدء استخدام STM8S (البرنامج التعليمي 1) والتحكم في STM8S GPIO (البرنامج التعليمي 2) إذا كنت جديدًا تمامًا هنا. أيضًا ، استكشفنا إمكانية برمجة STM8S مع Arduino للمبتدئين السريع. كل ما يقال دعنا ندخل في البرنامج التعليمي.
الاتصال التسلسلي على STM8S103F3P6
من ورقة بيانات STM8S103F3P6 ، يمكننا أن نرى أن وحدة التحكم 8 بت الخاصة بنا تدعم اتصال UART في العديد من الأوضاع المختلفة. تحتوي وحدة التحكم أيضًا على دبوس إخراج على مدار الساعة للاتصال المتزامن UART ويمكنها أيضًا دعم SmarCard و IrDA و LIN. لكننا لن نستكشف أيًا من ذلك في هذا البرنامج التعليمي فقط للابتعاد عن التعقيد. سوف نتعلم كيفية القيام بالقراءة والكتابة البسيطة UART.
يوفر البرنامج التعليمي أيضًا ملفًا رئيسيًا يسمى stm8s103 serial.h باستخدامه يمكنك تنفيذ أوامر UART بسيطة مثل Serial start و Serial read والطباعة التسلسلية وما إلى ذلك. بشكل أساسي ، ستتمكن من طباعة char و int و string إلى جهاز العرض التسلسلي وقراءة الحرف أيضًا من الشاشة التسلسلية. في نهاية هذا البرنامج التعليمي ، ستتمكن من التحكم في مؤشر LED من الشاشة التسلسلية والحصول على تعليقات حول حالة LED. يعتمد ملف الرأس المذكور أعلاه على مكتبات SPL ، لذا تأكد من أنك اتبعت البرنامج التعليمي للبدء.
دبابيس الاتصال التسلسلي على STM8S103F3P6
لنبدأ من جانب الأجهزة. بإلقاء نظرة سريعة على المسامير الموجودة على المتحكم الدقيق STM8S103F3P6 الوارد أدناه ، يمكننا أن نرى أن المسامير 1 و 2 و 3 سيتم استخدامها لاتصالات UART.
من بين الثلاثة ، الدبوس 1 هو دبوس ساعة UART والذي سيتم استخدامه فقط أثناء اتصال UART المتزامن ، لذلك لن نحتاج إليه هنا. الدبوس 2 هو دبوس جهاز الإرسال UART والرقم 3 هو دبوس مستقبل UART. لاحظ أن هذه المسامير يمكن أن تتضاعف أيضًا كدبوس تناظري أو دبوس GPIO عادي.
مخطط الدائرة للاتصال التسلسلي STM8S
مخطط الدائرة بسيط للغاية هنا ، نحتاج إلى توصيل ST-LINK 2 الخاص بنا للبرمجة ومحول USB إلى TTL لقراءة البيانات التسلسلية. لاحظ أن وحدة التحكم STM8S الخاصة بنا تعمل بمستوى منطق 3.3 فولت ، لذا تأكد من أن محول USB إلى TTL يدعم أيضًا منطق 3.3 فولت. يظهر مخطط الدائرة الكاملة أدناه.
يجب عليك توصيل ST-link في منفذ USB واحد ومحول USB إلى TTL في منفذ USB آخر بجهاز الكمبيوتر المحمول ، بحيث يمكنك برمجة البيانات ومراقبتها في نفس الوقت. اتصال UART بسيط ، ما عليك سوى توصيل الأرض ودبوس Rx / Tx الخاص بالميكروكونترولر STM8S بمسامير Tx / Rx الخاصة بمحول USB إلى TTL. هنا قمت بتشغيل وحدة التحكم باستخدام دبوس Vcc الخاص بـ ST-Link وتركت دبوس vss لمحول TTL مفتوحًا ، يمكنك أيضًا القيام بذلك في الاتجاه المعاكس. هناك العديد من أنواع محول USB إلى TTL في السوق ، فقط تأكد من أنه يمكن أن يعمل على إشارات منطقية 3.3 فولت وإلقاء نظرة بسيطة على دبابيس Tx و Rx و GND وقم بإجراء الاتصال الموضح أعلاه. يتم عرض إعداد الجهاز الخاص بي أدناه.
لعمل طريقة اتصال تسلسلي ، قمنا بتوفير ملف الرأس STM8S_Serial.h . باستخدام ملف الرأس هذا ، يمكنك تنفيذ وظائف بسيطة مثل Arduino للاتصال التسلسلي.
يمكنك العثور على جميع الملفات المطلوبة لهذا المشروع على صفحة STM8S103F3_SPL Github الخاصة بنا. إذا كنت بحاجة إلى ملف الرأس هذا فقط ، فيمكنك تنزيله من الرابط أدناه.
تنزيل STM8S_Serial.h
إعداد STVD للاتصال التسلسلي
للعمل مع الاتصال التسلسلي ، سنستخدم العديد من وظيفة ملف الرأس STM8S_Serial.h التي ناقشناها سابقًا. لكن المكتبة لها تبعيات أخرى ، العديد من ملفات الرأس و C ذات الصلة بـ SPL UART والساعة. من هذه النقطة ، من الأفضل تضمين جميع ملفات الرأس و C في مشروعنا لتجنب حدوث خطأ في الترجمة. تبدو بيئة عملي STVD هكذا.
تأكد من قيامك بتضمين جميع ملفات مصدر SPL وملف تضمين كما فعلنا في أول برنامج تعليمي لدينا. وتأكد أيضًا من إضافة ملف الرأس stm8s103_serial.h . لا يوجد ملف C لهذا العنوان.
برمجة STM8S للاتصالات التسلسلية
بمجرد أن يصبح إعداد مشروع STVD جاهزًا ، يمكننا البدء في كتابة الكود الخاص بنا في ملف main.c. يمكن العثور على الكود الكامل لهذا البرنامج التعليمي في أسفل هذه الصفحة. وتفسير ذلك على النحو التالي.
تتمثل الخطوة الأولى في تضمين ملفات الرأس المطلوبة ، وهنا أضفت ملف الرأس الرئيسي (stm8s) وملف الرأس stm8s_103_serial الذي قمنا بتنزيله للتو.
// العناوين المطلوبة # تتضمن "STM8S.h" #include "stm8s103_serial.h" //https://github.com/CircuitDigest/STM8S103F3_SPL/blob/master/stm8s103٪20Libraries/stm8s103_Serial.h
بعد ذلك ، نستخدم وحدات ماكرو التصميم لتحديد دبابيس الإدخال والإخراج. هنا سيتم التحكم فقط في مؤشر LED الموجود على اللوحة والمتصل بـ pin5 من المنفذ B ، لذلك نمنحه اسمًا باسم test_LED .
#define test_LED GPIOB، GPIO_PIN_5 // اختبار LED متصل بـ PB5
بالانتقال إلى داخل الوظيفة الرئيسية ، سنعرف الدبوس كإخراج. إذا لم تكن معتادًا على وظائف GPIO الأساسية ، فارجع إلى البرنامج التعليمي STM8S GPIO.
// Pin defanitions // Declare PB5 كدفع سحب دبوس الإخراج GPIO_Init (test_LED، GPIO_MODE_OUT_PP_LOW_SLOW) ؛
ثم نقوم بتهيئة منافذ الاتصال التسلسلي الخاصة بنا بمعدلات باود 9600. بالنسبة لأولئك الجدد ، 9600 هو معدل السرعة التي سيتم بها نقل بتات البيانات أثناء الاتصال. إذا قمت بتعيين 9600 هنا ، فيجب عليك أيضًا تعيين نفس الشيء على برنامج المراقبة. ثم نطبع سلسلة "أدخل الأمر" وننتقل إلى السطر التالي.
Serial_begin (9600) ؛ // تهيئة الاتصال التسلسلي بمعدل باود 9600 Serial_print_string ("أدخل الأمر") ؛ // طباعة سلسلة Serial_newline () ؛ // الانتقال إلى السطر التالي
بالانتقال إلى حلقة while اللانهائية ، نستخدم وظيفة Serial_available للتحقق مما إذا كان هناك أي بيانات تسلسلية واردة. إذا كانت الإجابة بنعم ، فنحن نقرأها ونحفظها في متغير يسمى ch ونطبعها أيضًا باستخدام Serial_print . ثم إذا كانت القيمة المستلمة 0 ، فسنقوم بإيقاف تشغيل مؤشر LED وإذا كانت 1 ، فسنقوم بتشغيل مؤشر LED
إذا (Serial_available ()) {Serial_print_string ("لقد ضغطت:") ؛ ch = Serial_read_char () ؛ Serial_print_char (الفصل) ؛ Serial_newline () ، إذا (ch == '0') GPIO_WriteHigh (test_LED) ؛ // LED OFF إذا (ch == '1') GPIO_WriteLow (test_LED) ؛ // LED قيد التشغيل}
مع هذا ، اكتملت برمجة هذا البرنامج التعليمي ، ما عليك سوى تحميل الكود الوارد في أسفل هذه الصفحة وستتمكن من التحكم في LED من الشاشة التسلسلية.
التحكم في LED من الشاشة التسلسلية
بمجرد تحميل الشفرة ، يمكنك فتح أي شاشة تسلسلية بمعدلات باود 9600. لقد استخدمت شاشة Arduino التسلسلية نفسها لسهولة استخدامها. اضغط على زر إعادة الضبط وستظهر لك الرسالة "أدخل أمرًا". ثم إذا قمت بإدخال 1 والضغط على إدخال ، يجب أن يتم تشغيل المصباح الموجود على اللوحة ، وبالمثل بالنسبة لـ 0 ، يجب إيقاف تشغيله.
يمكن العثور على العمل الكامل في الفيديو المرتبط أسفل هذه الصفحة. إذا كان لديك أي أسئلة ، فيرجى تركها في قسم التعليقات. يمكنك أيضًا استخدام منتدياتنا لنشر أسئلة فنية أخرى.
مكتبة المسلسل STM8S نظرة أعمق
بالنسبة للعقول الفضوليّة التي تريد معرفة ما يحدث بالفعل داخل ملف رأس STM8S103F3_Serial ، اقرأ…
يعمل ملف الرأس هذا بشكل جيد مع برمجة مستوى المبتدئين ، ولكن إذا كنت تستخدم إصدارًا مختلفًا من وحدة تحكم STM8S أو تبحث عن بعض الخيارات المتقدمة ، فقد ترغب في تعديل هذا الرأس قليلاً أو العمل مباشرة مع مكتبات SPL. لقد كتبت ملف الرأس هذا تمامًا كما هو الحال مع ملف الرأس UART1 ، يكون شرح ملف الرأس الخاص بي كما يلي.
قراءة شخصية من Serial Monitor
تساعد هذه الوظيفة في قراءة حرف واحد تم إرساله إلى وحدة التحكم الدقيقة من الشاشة التسلسلية.
char Serial_read_char (باطل) {while (UART1_GetFlagStatus (UART1_FLAG_RXE) == RESET) ؛ UART1_ClearFlag (UART1_FLAG_RXNE) ، العودة (UART1_ReceiveData8 ()) ، }
ننتظر حتى يتم تعيين علم RXE لاستكمال الاستقبال ثم مسح العلم للإقرار بالاستلام. أخيرًا ، نرسل بيانات 8 بت المستلمة كنتيجة لهذه الوظيفة.
طباعة حرف على Serial Monitor
تنقل هذه الوظيفة حرفًا واحدًا من متحكم دقيق إلى الشاشة التسلسلية.
void Serial_print_char (قيمة char) {UART1_SendData8 (قيمة) ؛ بينما (UART1_GetFlagStatus (UART1_FLAG_TXE) == إعادة تعيين) ؛ // انتظر الإرسال}
تكتب الوظيفة ببساطة قيمة 8 بت وتنتظر حتى يكتمل الإرسال عن طريق التحقق من UART1_FLAG_TXE إلى SET
بدء الاتصال التسلسلي
تعمل هذه الوظيفة على تهيئة الاتصال التسلسلي بمعدل البث بالباود المطلوب.
باطل Serial_begin (uint32_t baud_rate) {GPIO_Init (GPIOD، GPIO_PIN_5، GPIO_MODE_OUT_PP_HIGH_FAST) ؛ GPIO_Init (GPIOD ، GPIO_PIN_6 ، GPIO_MODE_IN_PU_NO_IT) ، UART1_DeInit () ، // Deinitialize UART peripherals UART1_Init (baud_rate، UART1_WORDLENGTH_8D، UART1_STOPBITS_1، UART1_PARITY_NO، UART1_SYNCMODE_CLOCK_DISABLE، UART1_MODE_TXRX_ENABLE) ؛ // (BaudRate، Wordlegth، StopBits، Parity، SyncMode، Mode) UART1_Cmd (ENABLE) ؛ }
بصرف النظر عن معدل البث بالباود ، هناك معلمات أخرى يجب تعيينها للاتصال التسلسلي ، مثل عدد بتات البيانات ، وعدد بتات التوقف ، والتكافؤ ، وما إلى ذلك. الأكثر شيوعًا (على غرار Arduino) هو بيانات 8 بت بتوقف واحد وبدون تماثل وبالتالي سيكون هذا هو الإعداد الافتراضي. يمكنك تغييره إذا لزم الأمر.
طباعة عدد صحيح على Serial Monitor
في معظم الأوقات ، إذا كنا نستخدم جهاز عرض تسلسلي للتصحيح أو المراقبة ، فقد نرغب في طباعة متغير من النوع int إلى الشاشة التسلسلية. هذه الوظيفة تفعل ذلك بالضبط
void Serial_print_int (int number) // Funtion لطباعة قيمة int إلى الشاشة التسلسلية {char count = 0 ؛ رقم الحرف = "" ؛ while (number! = 0) // تقسيم int إلى مصفوفة char {digit = number٪ 10 ؛ العد ++ ؛ رقم = رقم / 10 ؛ } while (count! = 0) // طباعة مجموعة أحرف في الاتجاه الصحيح {UART1_SendData8 (digit + 0x30) ؛ بينما (UART1_GetFlagStatus (UART1_FLAG_TXE) == إعادة تعيين) ؛ // انتظر إرسال العد-- ؛ }}
يأخذ قيمة عدد صحيح ويحولها إلى مصفوفة أحرف في حلقة while الأولى ، ثم في حلقة while الثانية ، سنرسل كل حرف مشابه لوظيفة char الخاصة بنا.
طباعة خط جديد
هذه وظيفة بسيطة لطباعة سطر جديد. القيمة السداسية للقيام بذلك هي "0x0a" ، نحن فقط نرسلها عبر استخدام أمر الإرسال 8 بت.
باطل Serial_newline (باطل) {UART1_SendData8 (0x0a) ؛ بينما (UART1_GetFlagStatus (UART1_FLAG_TXE) == إعادة تعيين) ؛ // انتظر الإرسال}
طباعة سلسلة على الشاشة التسلسلية
وظيفة مفيدة أخرى هي طباعة السلاسل على الشاشة التسلسلية.
باطل Serial_print_string (سلسلة أحرف) {. شار أنا = 0 ؛ بينما (سلسلة! = 0x00) {UART1_SendData8 (سلسلة) ؛ بينما (UART1_GetFlagStatus (UART1_FLAG_TXE) == إعادة تعيين) ؛ أنا ++ ؛ }}
مرة أخرى ، تحول هذه الوظيفة أيضًا السلسلة إلى مصفوفة أحرف وترسل كل حرف. كما نعلم ، فإن كل السلاسل تنتهي لاغية. لذلك علينا فقط الاستمرار في اجتياز ونقل الأحرف حتى نصل إلى 0x00.
التحقق مما إذا كانت البيانات التسلسلية متاحة للقراءة
تتحقق هذه الوظيفة من وجود أي بيانات تسلسلية في المخزن المؤقت جاهزة للقراءة.
bool Serial_available () {if (UART1_GetFlagStatus (UART1_FLAG_RXNE) == TRUE) ترجع TRUE ؛ آخر إرجاع FALSE ؛ }
يقوم بالتحقق من العلامة UART1_FLAG_RXNE ، إذا كانت صحيحة ، فإنها ترجع true وإذا لم تكن كذلك ، فإنها ترجع خطأ.