يشرح هذا البرنامج التعليمي خطوات تطوير تطبيق STM32 وتصحيحه بشكل فعال في Visual Studio Code باستخدام CMake build generator وأداة Ninja build والمترجم الخليجي .
الأشياء التي سوف تتعلمها
كيفية تثبيت وإعداد جميع الأدوات
كيفية إنشاء مشروع STM32 جديد باستخدام أدوات STM32CubeMX أو STM32CubeIDE
كيفية تثبيت وإعداد الملحقات الموصى بها لـ Visual Studio Code لتسهيل التطوير
كيفية إعداد قوائم CMake وإعدادات CMake المسبقة
كيفية إنشاء نظام البناء للمترجم
كيفية تجميع المشروع مع دول مجلس التعاون الخليجي
كيفية وميض التطبيق وتصحيحه إلى هدف STM32
يستخدم هذا البرنامج التعليمي نظام التشغيل Windows . سيتم تطبيق إجراء مماثل على نظام التشغيل Linux وMAC.
سيساعدك البرنامج التعليمي لتثبيت الأدوات على فهم الأدوات الضرورية المطلوبة للعمل مع STM32 وهو جيد بشكل عام للمبتدئين للوصول إلى السرعة وفهم المتطلبات الضرورية بشكل صحيح.
منذ بعض الوقت، تمتلك ST أداة برمجية جديدة STM32CubeCLT، تتضمن أدوات البناء اللازمة لـ vscode، وتتضمن نظام بناء Ninja ومولد بناء CMake . تعد STM32CubeCLT (أدوات سطر الأوامر) طريقة بسيطة وسهلة للوصول بسرعة إلى سرعة تطوير vscode. سيقوم أيضًا بإعداد متغيرات بيئة البناء الخاصة بك ( المسار في حالة نظام التشغيل Windows) تلقائيًا، مما يسمح لك باستدعاء ninja أو cmake أو أوامر أخرى مباشرة من أداة سطر الأوامر.
من خلال تثبيت STM32CubeCLT ، لن تحصل على أداة STM32CubeIDE الرسومية، ولن تحصل على أي إمكانية لأداة تكوين MCU، بل مجرد أدوات سطر الأوامر لاستدعاء البناء والتصحيح، عادةً من داخل vscode . ستظل بحاجة إلى تثبيت vscode والإضافات الضرورية بشكل منفصل.
الخطوة الأولى هي تثبيت STM32CubeIDE، الذي سيتم استخدامه لبدء مشروع STM32 جديد بسهولة ويأتي مع أداة STM32CubeMX المدمجة - مما يسمح لنا بالتكوين الرسومي.
يوفر STM32CubeIDE أيضًا الأدوات اللازمة اللازمة لاحقًا لتطوير VSCode
ARM لا شيء مترجم دول مجلس التعاون الخليجي
ST-LINK GDBServer لتصحيح الأخطاء
أداة STM32CubeProgrammer لتنزيل التعليمات البرمجية وبرامج تشغيل ST-Link المعنية
مجلد يحتوي على ملفات STM32 SVD
برامج تشغيل ST-Link
إعداد المسار البيئي
يجب إضافة 3
مسارات إلى الإعدادات البيئية من تثبيت STM32CubeIDE، مسار واحد لكل من الأدوات المذكورة أعلاه. في حالة جهاز الكمبيوتر الخاص بي، باستخدام STM32CubeIDE 1.8 (تم التحديث من خلال Eclipse، وبالتالي فإن مسار التثبيت الفعلي الخاص بي لا يزال يعرض الإصدار 1.0.2
) يتم تعريف المسارات على النحو التالي:
مترجم دول مجلس التعاون الخليجي: c:STSTM32CubeIDE_1.0.2STM32CubeIDEpluginscom.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_2.0.0.202105311346toolsbin
خادم ST-Link GDB: c:STSTM32CubeIDE_1.0.2STM32CubeIDEpluginscom.st.stm32cube.ide.mcu.externaltools.stlink-gdb-server.win32_2.0.100.202109301221toolsbin
STM32Cube Programmer CLI: c:STSTM32CubeIDE_1.0.2STM32CubeIDEpluginscom.st.stm32cube.ide.mcu.externaltools.cubeprogrammer.win32_2.0.100.202110141430toolsbin
قد تختلف المسارات الخاصة بك في أرقام الإصدارات
تحقق من إعداد المسار الصحيح، قم بتشغيل:
arm-none-eabi-gcc --version STM32_Programmer_CLI --version ST-LINK_gdbserver --version
يجب أن ينتج عن ذلك مخرجات مشابهة للصورة أدناه
هذه الخطوة ليست ضرورية إذا قمت بتثبيت أدوات الإنشاء باستخدام STM32CubeCLT
قم بتنزيل وتثبيت برنامج CMake.
سيطلب منك معالج التثبيت إضافة CMake إلى المسارات البيئية. حدد الخيار أو قم بإضافة مجلد bin
لمجلد تثبيت CMake إلى المسار البيئي.
هذه الخطوة ليست ضرورية إذا قمت بتثبيت أدوات الإنشاء باستخدام STM32CubeCLT
قم بتنزيل نظام Ninja build من صفحة إصدارات Github. يأتي كبرنامج محمول قابل للتنفيذ، دون الحاجة إلى تثبيت أي شيء. ومع ذلك، يجب أن تكون مرئية على مستوى البيئة، مثل جميع الأدوات السابقة.
تحقق من تثبيت CMake و Ninja ، وقم بتشغيل:
cmake --version ninja --version
يجب أن يكون الإخراج شيء مماثل ل
قم بتنزيل وتثبيت VSCode. بمجرد التثبيت والفتح، ستبدو النافذة مشابهة لتلك الموجودة أدناه.
Visual Studio Code هو محرر نصوص خفيف الوزن مع إمكانية تكبيره باستخدام الامتدادات.
قائمة الامتدادات المفيدة لتطوير STM32 باستخدام CMake:
ms-vscode.cpptools
: تسليط الضوء على بناء الجملة والميزات الأساسية الأخرى لتطوير C/C++
ms-vscode.cmake-tools
: أدوات CMake الأساسية، أداة إنشاء نظام البناء
twxs.cmake
: تسليط الضوء على لون CMake
marus25.cortex-debug
: ملحق تصحيح أخطاء Cortex-M، إلزامي لتصحيح أخطاء STM32 من VSCode
dan-c-underwood.arm
: أداة تمييز تركيب جملة ARM
zixuanwang.linkerscript
: أداة تمييز بناء جملة البرنامج النصي لرابط مجلس التعاون الخليجي
يمكنك تثبيتها عن طريق نسخ الأوامر أدناه في نافذة المحطة الداخلية لـ VSCode.
code --install-extension ms-vscode.cpptools code --install-extension ms-vscode.cmake-tools code --install-extension twxs.cmake code --install-extension marus25.cortex-debug code --install-extension dan-c-underwood.arm code --install-extension zixuanwang.linkerscript
انتقل إلى المحطة الطرفية -> المحطة الطرفية الجديدة لفتح نافذة طرفية جديدة
الطريقة البديلة هي استخدام واجهة المستخدم الرسومية للبحث في الامتدادات والتثبيت يدويًا من هناك.
عند هذه النقطة، تم تثبيت كافة الأدوات بشكل صحيح - أنت على الطريق الصحيح نحو النجاح.
الشرط الأساسي للمضي قدمًا هو أن يكون لديك مشروع عمل سيتم تحويله إلى CMake وتطويره في VSCode . ولهذا الغرض، سأرشدك خلال عملية إنشاء مشروع جديد بسيط باستخدام أدوات البرامج STM32CubeMX أو STM32CubeIDE .
يمكنك تخطي هذا الجزء، إذا كان لديك مشروعك بالفعل للعمل عليه.
لقد استخدمت أداة STM32CubeIDE ولوحة STM32H735G-DK لهذا العرض التوضيحي.
افتح STM32CubeIDE وابدأ مشروعًا جديدًا
حدد STM32 MCU - لقد حددت STM32H735IG والذي يستخدم على لوحة STM32H735G-DK
حدد اسم المشروع ومساره، ثم قم بإنشاء المشروع وانتظر حتى يتم فتح عرض Pinout
مهمتنا هي أن يكون لدينا مشروع بسيط من شأنه تبديل المصابيح. يتم توصيل مصابيح LED بجهازي PC2
و PC3
على التوالي، وهي نشطة منخفضة. يمكن تكوين الدبابيس في وضع الدفع والسحب أو التصريف المفتوح
قم بتعيين المسامير كمخرجات مع تسميات اختيارية مثل LED1
و LED2
على التوالي
إذا كنت تستخدم STM32CubeMX
، فانتقل إلى مدير المشروع ، وقم بتعيين اسم المشروع وتأكد من تحديد STM32CubeIDE
Toolchain
.
انتقل إلى الإعدادات المتقدمة وحدد LL
كبرامج تشغيل للتعليمات البرمجية التي تم إنشاؤها
نحن نستخدم برامج تشغيل LL من أجل البساطة في هذا البرنامج التعليمي
أعد إنشاء المشروع بالضغط على الزر الأحمر أو بحفظ المشروع بالاختصار CTRL + S
تم الآن (إعادة) إنشاء المشروع. الملفات المميزة باللون الأصفر هي مصادر للإنشاء. الأزرق هو البرنامج النصي رابط.
هذا كل شيء بالنسبة للتشغيل الأول، ونحن على استعداد للتجميع. اضغط على CTRL + B
أو انقر على أيقونة المطرقة للبدء. سوف يقوم STM32CubeIDE بتجميع المشروع، يجب أن ترى ما يشبه الصورة أدناه. إنه الآن جاهز لوميض فلاش MCU وبدء تصحيح الأخطاء.
بهذه نهاية الجزء الأول، حيث نجحنا في إنشاء مشروعنا. في هذه المرحلة، نعتبر أن المشروع جاهز للتحويل إلى نظام البناء القائم على CMake.
يمكنك مواصلة تطويرك باستخدام STM32CubeIDE في المستقبل، وإضافة مصادر جديدة، وتعديل التعليمات البرمجية، وتجميع، وفلاش الملف الثنائي، وتصحيح أخطاء وحدة التحكم الدقيقة مباشرة. هذا هو استوديو التطوير المفضل لشركة STM32، والذي تم تطويره وصيانته بواسطة شركة STMicroelectronics.
ومن المتوقع أن يتم إنشاء مشروع للتطوير في VSCode. سوف نمضي قدمًا في برنامج التحويل البرمجي لدول مجلس التعاون الخليجي، ولكن يمكن استخدام برامج أخرى أيضًا.
مع إصدار Visual Studio Code، يستخدم العديد من المطورين الأداة للعديد من لغات البرمجة ولحسن الحظ يمكنهم أيضًا تطوير تطبيقات STM32 باستخدام أداة واحدة. إذا كنت أحد المطورين الذين يحبون VSCode، فإن الطريقة الأكثر أناقة للمضي قدمًا هي نقل المشروع المستند إلى STM32CubeIDE إلى CMake ، وتطوير التعليمات البرمجية في VSCode والتجميع باستخدام نظام بناء Ninja باستخدام برنامج التحويل البرمجي لدول مجلس التعاون الخليجي. إنه سريع وخفيف الوزن.
التطوير في VSCode مخصص للمستخدمين المتوسطين أو ذوي الخبرة. أقترح على جميع مبتدئين STM32 البقاء مع سلسلة أدوات تطوير STM32CubeIDE . سيكون من السهل جدًا المضي قدمًا والتطرق إلى موضوع VSCode لاحقًا.
يتطلب كل تطبيق يستند إلى CMake ملف CMakeLists.txt
في الدليل الجذر ، والذي يصف المشروع ويوفر معلومات الإدخال لإنشاء نظام البناء.
يُطلق على ملف
CMakeLists.txt
الجذر أحيانًا اسم ملف CMake ذي المستوى الأعلى
الأشياء الأساسية الموضحة في ملف CMakeLists.txt
:
معلومات سلسلة الأدوات، مثل تكوين مجلس التعاون الخليجي مع علامات البناء
اسم المشروع
الملفات المصدرية التي يمكن إنشاؤها باستخدام ملفات المترجم أو C أو C++ أو ملفات التجميع
قائمة مسارات التضمين للمترجم للعثور على الوظائف والتعريفات ... ( -I
)
مسار البرنامج النصي رابط
يحدد التجميع، أو يطلق عليه أحيانًا تعريف المعالج المسبق ( -D
)
إعدادات Cortex-Mxx والنقطة العائمة لإنشاء مجموعة التعليمات
تم تثبيت Visual Studio Code وسيتم استخدامه كمحرر إضافي للملفات.
ابحث عن مسار المشروع الذي تم إنشاؤه وافتح المجلد باستخدام VSCode:
الخيار 1: انتقل إلى المجلد باستخدام Explorer، ثم انقر بزر الماوس الأيمن وحدد Open in Code
.
الخيار 2: بدلاً من ذلك، افتح VScode كحل فارغ جديد وأضف المجلد إليه يدويًا. استخدم File -> Open Folder...
لفتح المجلد
الخيار 3: انتقل إلى المجلد باستخدام أداة cmd أو powershell وقم بتشغيل code .
يجب أن تبدو النتيجة النهائية مشابهة لتلك الموجودة أدناه
يجب أن يكون CMake على دراية بـ Toolchain الذي نود استخدامه لتجميع المشروع أخيرًا. نظرًا لأنه يتم عادةً إعادة استخدام نفس سلسلة الأدوات بين المشاريع المختلفة، فمن المستحسن إنشاء هذا الجزء في ملف منفصل لتسهيل إعادة استخدامه. هذه هي إعدادات المترجم العامة ولا ترتبط مباشرة بالمشاريع نفسها.
يمكن استخدام ملف .cmake
البسيط وإعادة استخدامه لاحقًا بين مشاريعك المتنوعة. أنا أستخدم الاسم cmake/gcc-arm-none-eabi.cmake
لهذا البرنامج التعليمي وفيما يلي مثاله:
set(CMAKE_SYSTEM_NAME Generic)set(CMAKE_SYSTEM_PROCESSOR Arm)# بعض إعدادات مجلس التعاون الخليجي الافتراضية # Arm-none-eabi- يجب أن تكون جزءًا من بيئة المسارset(TOOLCHAIN_PREFIXarm-none-eabi-)set(FLAGS "-fdata-sections -ffunction-sections - -specs=nano.specs -Wl,--gc-sections")set(CPP_FLAGS "-fno-rtti -fno-exceptions -fno-threadsafe-statics")# تحديد إعدادات المترجم(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc ${FLAGS})set(CMAKE_ASM_COMPILER) ${CMAKE_C_COMPILER})مجموعة(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++ ${FLAGS} ${CPP_FLAGS})مجموعة(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy)مجموعة(CMAKE_SIZE) ${TOOLCHAIN_PREFIX}الحجم)مجموعة(CMAKE_EXECUTABLE_SUFFIX_ASM ".elf")مجموعة(CMAKE_EXECUTABLE_SUFFIX_C ".elf")مجموعة(CMAKE_EXECUTABLE_SUFFIX_CXX ".elf")مجموعة(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
قم بإنشاء ملف في المجلد cmake/
الخاص بدليل المشروع الجذر.
إذا تم تثبيت البرنامج المساعد لتمييز CMake، فسيقوم VSCode بتمييز أوامر CMake بشكل جيد لك
اكتمل إعداد سلسلة الأدوات. يمكنك إغلاق الملف بحرية والانتقال إلى الخطوة التالية.
نحن بحاجة إلى إنشاء ملف CMakeLists.txt
الرئيسي، والذي يُسمى أيضًا ملف CMake الجذري .
تأكد من تسميته
CMakeLists.txt
بالأحرف الكبيرة والصغيرة الصحيحة.
لقد قمت بإعداد ملف قالب بسيط لك، والذي يمكن إعادة استخدامه لجميع مشاريعك في المستقبل. ستحتاج فقط إلى تغيير أشياء مثل اسم المشروع والملفات المصدر وتضمين المسارات وما إلى ذلك.
cmake_minimum_required(VERSION 3.22)# مجموعة إعدادات برنامج التحويل البرمجي (CMAKE_C_STANDARD 11)set(CMAKE_C_STANDARD_REQUIRED ON)set(CMAKE_C_EXTENSIONS ON)set(CMAKE_CXX_STANDARD 20)set(CMAKE_CXX_STANDARD_REQUIRED) ON)set(CMAKE_CXX_EXTENSIONS ON)set(PROJ_PATH ${CMAKE_CURRENT_SOURCE_DIR})message("نوع البناء: " ${CMAKE_BUILD_TYPE})## إعدادات المشروع الأساسية#project(your-project-name)enable_language(C CXX ASM)## Core أعلام MCU ووحدة المعالجة المركزية ومجموعة التعليمات وFPU يجب ضبط الإعداد # بشكل صحيح لـ MCU#set(CPU_PARAMETERS -mthumb# يحتاج هذا إلى الاهتمام لتعيين MCU-mcpu=cortex-m7 بشكل صحيح -mfpu=fpv5-d16 -mfloat-abi=صعب )# Set linker scriptset(linker_script_SRC ${PROJ_PATH}/path-to-linker-script.ld)set(EXECUTABLE ${CMAKE_PROJECT_NAME})## قائمة الملفات المصدر المراد تجميعها#set(sources_SRCS# ضع هنا ملفاتك المصدرية، واحدة في كل سطر، نسبةً إلى موقع ملف CMakeLists.txt)## تضمين الدلائل#set(include_path_DIRS# ضع هنا دليل التضمين، واحدًا في كل سطر، بالنسبة لموقع ملف CMakeLists.txt)## تعريف الرموز#set(symbols_SYMB# ضع الرموز هنا (يحددها المعالج المسبق)، واحد في كل سطر# قم بتغليفها بعلامات اقتباس مزدوجة لأغراض السلامة )# الملفات القابلة للتنفيذadd_executable(${EXECUTABLE} ${sources_SRCS})# تضمين pathstarget_include_directories(${EXECUTABLE} PRIVATE ${include_path_DIRS})# رمز المشروعstarget_compile_definitions(${EXECUTABLE} PRIVATE ${symbols_SYMB})# خيارات المترجمtarget_compile_options(${EXECUTABLE} PRIVATE${CPU_PARAMETERS}-Wall - ويكسترا -Wpedantic -Wno-unused-parameter# تكوين التصحيح الكامل-Og -g3 -ggdb )# Linker optionstarget_link_options(${EXECUTABLE} PRIVATE-T${linker_script_SRC}${CPU_PARAMETERS}-Wl,-Map=${CMAKE_PROJECT_NAME}.map --specs=nosys.specs -u _printf_float # دعم التنسيق العائم STDIO-Wl,--start-group -LC -lm -لستدك++ -lsupc++ -Wl،--نهاية المجموعة -Wl،--استخدام ذاكرة الطباعة )# تنفيذ ما بعد الإنشاء لطباعة sizeadd_custom_command(TARGET ${EXECUTABLE} POST_BUILDCOMMAND ${CMAKE_SIZE} $<TARGET_FILE:${EXECUTABLE}> )# تحويل الإخراج إلى سداسي عشري وثنائيadd_custom_command(TARGET ${EXECUTABLE} POST_BUILDCOMMAND ${CMAKE_OBJCOPY} -O ihex $<TARGET_FILE:${EXECUTABLE}> ${EXECUTABLE}.hex )# تحويل إلى ملف سلة -> إضافة فحص شرطي?add_custom_command(TARGET ${EXECUTABLE} POST_BUILDCOMMAND ${CMAKE_OBJCOPY} -O ثنائي $<TARGET_FILE:${EXECUTABLE}> ${EXECUTABLE}.bin )
الملفات المصدر هي نفسها الموجودة في مشروع STM32CubeIDE . يمكنك التحقق من الصورة السابقة مع المصادر المميزة باللون الأصفر.
يمكن العثور على الرموز والمسارات المضمنة في STM32CubeIDE ضمن إعدادات المشروع. 2
أدناه توضحان كيف هو الحال في حالة المشروع التجريبي.
يحتاج إعداد Cortex-Mxx إلى اهتمام خاص، خاصة مع إعداد النقطة العائمة. بالنسبة إلى STM32H735xx
، يجب ضبط الإعدادات على النحو التالي.
مجموعة (CPU_PARAMETERS -مالإبهام -mcpu=cortex-m7 # تعيين Cortex-M CPU-mfpu=fpv5-d16 # تعيين نوع النقطة العائمة-mfloat-abi=hard # وضع ABI للأجهزة)
ستكون القاعدة العامة للإعدادات حسب الجدول أدناه
عائلة STM32 | -mcpu | -mfpu | -مطفو-ابي |
---|---|---|---|
STM32F0 | cortex-m0 | Not used | soft |
STM32F1 | cortex-m3 | Not used | soft |
STM32F2 | cortex-m3 | Not used | soft |
STM32F3 | cortex-m4 | fpv4-sp-d16 | hard |
STM32F4 | cortex-m4 | fpv4-sp-d16 | hard |
STM32F7 SP | cortex-m7 | fpv5-sp-d16 | hard |
STM32F7 موانئ دبي | cortex-m7 | fpv5-d16 | hard |
STM32G0 | cortex-m0plus | Not used | soft |
STM32C0 | cortex-m0plus | Not used | soft |
STM32G4 | cortex-m4 | fpv4-sp-d16 | hard |
STM32H5 | cortex-m33 | fpv5-sp-d16 | hard |
STM32H7 | cortex-m7 | fpv5-d16 | hard |
STM32L0 | cortex-m0plus | Not used | soft |
STM32L1 | cortex-m3 | Not used | soft |
STM32L4 | cortex-m4 | fpv4-sp-d16 | hard |
STM32L5 | cortex-m33 | fpv5-sp-d16 | hard |
STM32U0 | cortex-m0plus | Not used | soft |
STM32U5 | cortex-m33 | fpv5-sp-d16 | hard |
STM32WB | cortex-m4 | fpv4-sp-d16 | hard |
STM32WBA | cortex-m33 | fpv5-sp-d16 | hard |
STM32WL CM4 | cortex-m4 | Not used | soft |
STM32WL CM0 | cortex-m0plus | Not used | soft |
هذا الجدول عرضة للأخطاء المحتملة، ولم يتم اختباره باستخدام مترجم دول مجلس التعاون الخليجي لجميع الأسطر. بالنسبة إلى
STM32F7
، انتقل إلى الموقع الرسمي STM32F7xx وتحقق مما إذا كان جهازك يحتوي على FPU مفردة أو مزدوجة الدقة، ثم قم بتطبيق الإعدادات وفقًا لذلك. قائمة المنتجات ليست شاملة.
ملف CMakeLists.txt
النهائي بعد الملفات المصدر، يتضمن المسارات، ويتم تعيين إعدادات MCU الأساسية وتعريفاتها:
cmake_minimum_required(VERSION 3.22)# مجموعة إعدادات برنامج التحويل البرمجي (CMAKE_C_STANDARD 11)set(CMAKE_C_STANDARD_REQUIRED ON)set(CMAKE_C_EXTENSIONS ON)set(CMAKE_CXX_STANDARD 20)set(CMAKE_CXX_STANDARD_REQUIRED) ON)set(CMAKE_CXX_EXTENSIONS ON)set(PROJ_PATH ${CMAKE_CURRENT_SOURCE_DIR})message("نوع البناء: " ${CMAKE_BUILD_TYPE})## إعدادات المشروع الأساسية#project(STM32H735G-DK-LED) # Modifiedenable_language(C CXX ASM)## MCU الأساسية الأعلام ووحدة المعالجة المركزية ومجموعة التعليمات وإعداد FPU# يجب ضبطها بشكل صحيح لـ MCU#set(CPU_PARAMETERS -mthumb# يحتاج هذا إلى الاهتمام لتعيين MCU-mcpu=cortex-m7 المستخدم بشكل صحيح # Modified-mfpu=fpv5-d16 # Modified-mfloat-abi=hard # Modified)# Set linker scriptset(linker_script_SRC ${PROJ_PATH}/STM32H735IGKX_FLASH. لدن) # المجموعة المعدلة (قابلة للتنفيذ ${CMAKE_PROJECT_NAME})## قائمة الملفات المصدر المطلوب تجميعها#set(sources_SRCS # تم التعديل${PROJ_PATH}/Core/Src/main.c${PROJ_PATH}/Core/Src/stm32h7xx_it.c${PROJ_PATH}/Core/Src/syscalls.c${PROJ_PATH}/Core/Src/sysmem.c$ { PROJ_PATH}/Core/Src/system_stm32h7xx.c${PROJ_PATH}/Core/Startup/startup_stm32h735igkx.s${PROJ_PATH}/Drivers/STM32H7xx_HAL_Driver/Src/stm3 2h7xx_ll_exti.c${PROJ_PATH}/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_gpio.c${PROJ_PATH}/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_l l_pwr.c${PROJ_PATH}/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_rcc.c${PROJ_PATH}/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_utils.c )## تضمين الدلائل#set(include_path_DIRS # Modified${PROJ_PATH}/Core/Inc${PROJ_PATH}/Drivers/STM32H7xx_HAL_Driver/Inc${PROJ_PATH}/Drivers/CMSIS/Device/ST/STM32H7xx/Include${PROJ_PATH}/ برامج التشغيل/CMSIS/تشمل )## تعريف الرموز#set(symbols_SYMB # Modified"DEBUG""STM32H735xx""USE_FULL_LL_DRIVER""HSE_VALUE=25000000")# الملفات القابلة للتنفيذadd_executable(${EXECUTABLE} ${sources_SRCS})# Include pathstarget_include_directories(${EXECUTABLE} PRIVATE ${include_path_DIRS})# رمز المشروعstarget_compile_definitions(${EXECUTABLE} PRIVATE ${symbols_SYMB})# خيارات المترجمtarget_compile_options(${EXECUTABLE} PRIVATE${CPU_PARAMETERS}-Wall - ويكسترا -Wpedantic -Wno-unused-parameter# تكوين التصحيح الكامل-Og -g3 -ggdb )# Linker optionstarget_link_options(${EXECUTABLE} PRIVATE-T${linker_script_SRC}${CPU_PARAMETERS}-Wl,-Map=${CMAKE_PROJECT_NAME}.map --specs=nosys.specs -u _printf_float # دعم التنسيق العائم STDIO-Wl,--start-group -LC -lm -لستدك++ -lsupc++ -Wl،--نهاية المجموعة -Wl،--استخدام ذاكرة الطباعة )# تنفيذ ما بعد الإنشاء لطباعة sizeadd_custom_command(TARGET ${EXECUTABLE} POST_BUILDCOMMAND ${CMAKE_SIZE} $<TARGET_FILE:${EXECUTABLE}> )# تحويل الإخراج إلى سداسي عشري وثنائيadd_custom_command(TARGET ${EXECUTABLE} POST_BUILDCOMMAND ${CMAKE_OBJCOPY} -O ihex $<TARGET_FILE:${EXECUTABLE}> ${EXECUTABLE}.hex )# تحويل إلى ملف سلة -> إضافة فحص شرطي?add_custom_command(TARGET ${EXECUTABLE} POST_BUILDCOMMAND ${CMAKE_OBJCOPY} -O ثنائي $<TARGET_FILE:${EXECUTABLE}> ${EXECUTABLE}.bin )
في VSCode، تم تسليط الضوء عليه جيدًا، يبدو هكذا
CMakePresets.json
هو ملف خاص، متاح منذ CMake 3.18
ويوفر تعريفًا لتكوين المستخدم، على غرار تكوين التصحيح والإصدار المعروف في Eclipse. يسمح وجود هذا الملف للمطور بالتغيير بسرعة بين وضع التصحيح والإصدار ، أو حتى بين أداة تحميل التشغيل والتطبيق الرئيسي ، وهذه حالة استخدام شائعة في التطبيقات المضمنة.
لن يركز هذا البرنامج التعليمي على تفاصيل حول الملف، بل هنا هو ملف القالب المقدم
يصف الملف:
مسار إنشاء الدليل لكل تكوين بناء
نوع البناء الافتراضي لكل تكوين ( Debug ، Release ، ...)
المسار إلى واصف سلسلة الأدوات .cmake
تم تكوين
4
إعدادات مسبقة في القالب لكل من تكوينات CMake الافتراضية
{"الإصدار": 3،"تكوين الإعدادات المسبقة": [ {"اسم": "افتراضي"، "خفي": صحيح، "generator": "Ninja"، "binaryDir": "${sourceDir}/build/${presetName}"،toolchainFile": "${sourceDir} /cmake/gcc-arm-none-eabi.cmake"،"cacheVariables": {"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"} }, {"name": "Debug"، "يرث": "default"، "cacheVariables": {"CMAKE_BUILD_TYPE": "Debug"} }, {"name": "RelWithDebInfo"، "يرث": "default"، "cacheVariables": {"CMAKE_BUILD_TYPE": "RelWithDebInfo"} }, {"name": "الإصدار"، "يرث": "افتراضي"، "متغيرات ذاكرة التخزين المؤقت": {"CMAKE_BUILD_TYPE": "الإصدار"} }, {"name": "MinSizeRel"، "يرث": "default"، "cacheVariables": {"CMAKE_BUILD_TYPE": "MinSizeRel"} } ] }
يتوفر الملف المحدث دائمًا في
templates/CMakePresets.json
لقد قمنا بتكوين CMake بمعلومات المشروع ونحن الآن جاهزون لتشغيل أوامر CMake.
يأتي VSCode مع البرنامج المساعد CMake Tools - وهو مساعد رائع لأوامر CMake. عند التثبيت، تتوفر العديد من الخيارات في الجزء السفلي من نافذة VSCode النشطة
كما ترون، لم يتم تحديد الإعداد المسبق للتكوين.
إذا كنت لا ترى مثل هذه المعلومات، فاضغط على
CTRl + ALT + P
وقم بتشغيلCMake: Quick Start
.
الخطوة التالية هي تحديد الإعداد المسبق الحالي. انقر فوق No Configure Preset Selected لفتح نافذة في الجانب العلوي وحدد الإعداد المسبق الخاص بك. لقد قمت باختيار التصحيح من أجل هذا البرنامج التعليمي.
عند تحديده، سيتغير النص إلى التسمية المحددة مسبقًا .
الآن بعد أن أصبح الإعداد المسبق نشطًا، في كل مرة يقوم المستخدم بتعديل ملف CMakeLists.txt
، بفضل ملحق CMake-Tools ، سيقوم VSCode تلقائيًا باستدعاء أمر إنشاء الإنشاء لتطبيق التغييرات الجديدة.
مشروعنا جاهز للبناء والربط. ما لم تفشل خطوة إنشاء بناء CMake، فيجب أن يكون لدينا دليل بناء جاهز لاستدعاء نظام بناء النينجا .
الخطوة التالية هي الضغط على زر البناء - كما هو موضح بالمستطيل الأخضر. سيقوم CMake بتشغيل الأوامر:
قم بتشغيل مولد البناء للإعداد المسبق المحدد
في الواقع، قم ببناء التعليمات البرمجية باستخدام Ninja
إذا تم إنشاؤه بشكل جيد، فإن الخطوة الأخيرة في الإخراج هي طباعة استخدام الذاكرة بأقسام مختلفة.
ونتيجة لذلك، حصلنا على بعض المخرجات في الدليل build/<presetname>/
:
ملف project-name.elf
مع معلومات كاملة قابلة للتنفيذ
ملف project-name.hex
HEX
ملف project-name.bin
BIN
ملف خريطة project-name.map
في التكوين الافتراضي، لا يتم إنشاء ملفات .hex
و .bin
ولا يتم عرض استخدام الذاكرة . يشتمل ملف CMakeLists.txt
المُجهز لدينا على خيارات POST_BUILD
لتنفيذ أوامر إضافية بعد الإنشاء الناجح. الكود موجود بالفعل في ملف CMakeLists.txt
، لذا لا داعي لفعل أي شيء، فقط راقب.
ينفذ الأمر إلى:
طباعة الحجم المستخدم لكل منطقة + استهلاك الذاكرة القابل للتنفيذ النهائي
إنشاء ملف .hex
من الملف القابل للتنفيذ
إنشاء ملف .bin
من الملف القابل للتنفيذ
# تنفيذ ما بعد الإنشاء لطباعة sizeadd_custom_command(TARGET ${EXECUTABLE} POST_BUILDCOMMAND ${CMAKE_SIZE} $<TARGET_FILE:${EXECUTABLE}> )# تحويل الإخراج إلى سداسي عشري وثنائيadd_custom_command(TARGET ${EXECUTABLE} POST_BUILDCOMMAND ${CMAKE_OBJCOPY} -O ihex $<TARGET_FILE:${EXECUTABLE}> ${EXECUTABLE}.hex )# تحويل إلى ملف سلة -> إضافة فحص شرطي?add_custom_command(TARGET ${EXECUTABLE} POST_BUILDCOMMAND ${CMAKE_OBJCOPY} -O ثنائي $<TARGET_FILE:${EXECUTABLE}> ${EXECUTABLE}.bin )
لتعطيل إنشاء ملف
.bin
، ما عليك سوى حذف سطرPOST_BUILD
لـ.bin
وإعادة إنشاء أوامر نظام بناء CMake. قد يكون لإنشاء ملفات.bin
تأثير سلبي عند تقسيم الذاكرة بين ذاكرات الفلاش الداخلية والخارجية. قد يقوم بإنشاء ملفات كبيرة جدًا (>= 2GB
) بها الكثير من الأصفار غير المستخدمة.
توجد قائمة بالأوامر المفيدة التي يجب وضعها في الاعتبار أثناء تطوير المشروع:
بناء التغييرات
مشروع نظيف
إعادة بناء المشروع، مع التنظيف أولاً
مشروع فلاش
من السهل أن ننسى بناء الجملة بالكامل، بدلاً من ذلك دعونا ننشئ ملف .vscode/tasks.json
مع قائمة الأوامر، للتشغيل السريع:
{ "الإصدار": "2.0.0"، "المهام": [ {"type": "cppbuild"، "label": "إنشاء مشروع"، "command": "cmake"، "args": ["--build"، "${command:cmake.buildDirectory}"، "- j", "8"],"options": {"cwd": "${workspaceFolder}"},"problemMatcher": ["$gcc"],"group": {"kind": "build"،" isDefault": حقيقي} }, {"type": "shell"، "label": "إعادة بناء المشروع"، "command": "cmake"، "args": ["--build"، "${command:cmake.buildDirectory}"، "--clean-first"، "-v"، "-j"، "8"]،"options": {"cwd": "${workspaceFolder}"},"problemMatcher": ["$gcc"] , }, {"type": "shell"، "label": "مشروع نظيف"، "command": "cmake"، "args": ["--build"، "${command:cmake.buildDirectory}"، "- -target", "clean"],"options": {"cwd": "${workspaceFolder}"},"problemMatcher": [] }, {"type": "shell"، "label": "CubeProg: Flash project (SWD)"، "command": "STM32_Programmer_CLI"، "args": ["--connect"،"port=swd"،"- -download", "${command:cmake.launchTargetPath}"،"-hardRst"],"options": {"cwd": "${workspaceFolder}"},"problemMatcher": [] }, {"type": "shell"، "label": "CubeProg: مشروع فلاش برقم تسلسلي محدد (SWD) - يجب عليك تعيين الرقم التسلسلي أولاً"،