وضع DFU بووتلوأدر STM32 باستخدام CubeMX. تعليمات خطوة بخطوة

لذلك ، كان الدافع وراء عمل هذا mandrigal هو الغياب شبه الكامل لتعليمات خطوة بخطوة باستخدام الأدوات المعتادة التي تقدمها STMicroelectronics.

إن العدد الكبير من محمل الإقلاع الموجود على الشبكة ، والذي يكون مشغولًا جدًا في بعض الأحيان ، يتم "شحذه" للأسف لأي بلورة معينة.

تحتوي المادة المقترحة على الإجراء الخاص باستخدام حزمة CubeMX ، و "أداة تحميل التشغيل" DfuSeDemo ، والأداة المساعدة لإعداد البرامج الثابتة لمدير Dfu ، أي أننا نستخلص قائمة الأمنيات لدينا من الأجهزة ، وننسى سامح مجمع الماكرو ومعلم ورقة البيانات.

طهي البيئة ...

نحتاج إلى CubeMX نفسه ، تنزيل DfuSeDemo + Dfu file manager ، كلها في نفس الحزمة ، STM32 ST-LINK Utility ، نجد كل شيء على موقع STMicroelectronics مجانًا.

لدينا عصا تجريبية مع رقاقة العم STY32F103C8T6 العم لياو

الصورة

ومبرمج ST-Link من هناك.

الصورة

حسنًا ، IDE المفضل لديك ، في هذا العرض التقديمي المحدد ، نستخدم KEIL ، إعدادات التجميع في IDEs الأخرى ليست مختلفة تمامًا.

لذلك دعونا نذهب ...

إطلاق CubeMX وحدد الكريستال الخاص بك ...

الصورة

احتفل بقائمة الامنيات الخاصة بك ...

الصورة

في هذه المهمة المحددة ، نقوم بتنشيط جهاز USB → Device FS ، وبناءً على ذلك ، فئة USB Device → DownLoad Update Firmware ، و RCC → High Speed ​​Clock التي لا تنسى ، مثل Cristal / Ceramic Resonator.

بعد ذلك ، حدد مفتاح الوضع bootloader-a ، في هذا المثال ، استخدم مجرد وصلة boot1 الموجودة.

الصورة

ننظر إلى المخطط الصغير ، ووفقًا لذلك ، يتم إقلاع boot1 بساق PB2 ، لذلك نستخدمه في وضع GPIO_Input.

تم ، قم بتنشيط علامة التبويب تكوين الساعة وابدأ تشغيل جهاز اختيار التكوين.

الصورة
انتقل إلى علامة التبويب Cofiguration ...

الصورة

حدد زر GPIO ...

الصورة

وفي المجال ...

الصورة
اكتب تسمية مخصصة ، فليكن boot1.

بعد ذلك ، قم بإعداد المشروع ...

الصورة

اختر مشروع → الإعداد ...

الصورة

اختيار وملء ....

الصورة

وفقًا لذلك ، نختار IDE Cub الذي سنقوم بإنشاء المشروع ، في حالتنا ، MDK-ARM V5.

ستبقى علامة التبويب Code Generator في هذا النموذج كما هي دون تغيير ...

الصورة

حسنًا ، هذا كل شيء ، نبدأ في توليد المشروع Project → Generate Code

الصورة

في النهاية ، سيطالبك Cub بإطلاق IDE الخاص بك على الفور ... ما يجب عليك فعله.

الصورة

الصورة

نبدأ في تجميع وتجميع والتحميل في الكريستال ... F7 ، F8 ...

الصورة

النتيجة النهائية ...

نحول المسامير الموجودة على لوحنا إلى وضع التشغيل وتوصيل كابل USB ...

الصورة

الصورة

افتح لوحة التحكم في نظام Windows → ← إدارة الأجهزة ← وحدة تحكم USB. وانظر إلى قائمة الأجهزة ، سيقوم Windows بالصدأ قليلاً وتثبيت جهاز STM في برنامج تشغيل وضع DFU (إذا لم يكن بالفعل).

لذلك ، نهض السائق وقرر ، بدء "التمهيد" DfuSeDemo ...

الصورة

نحن ننظر إلى ما اشتعلنا جهاز DFU وانقر نقرًا مزدوجًا على حقل تحديد الهدف ...

الصورة

نحن ننظر بعناية ونتعجب من أن الفلاش حتى العنوان 0x0800C000 مغلق للكتابة ونحن نكتب هذا العنوان ، نحتاجه ...

بالمناسبة ، جربتها على STM32F407VE ، حيث تكون الذاكرة مفتوحة للتسجيل من 0x08000000 ، أي منذ البداية ... لماذا ، في نسختنا ، ليست واضحة ، لا يتم حفرها ، يتم دفنها في مكان ما ، لكن من الواضح أنها غير مكتوبة ، لا يوجد أي خطأ لأن قطعة كبيرة تختفي بدون مالك ... ربما يخبرك شخص ما بحفره ...

لذلك ، "بدأ حلاقة الشعر للتو" ...

نحن بحاجة فقط اثنين من الملفات المصدر ...

الصورة

نفتح لهم في IDE ونحن تصحيح ، نضيف ...

نحن نأخذ في الاعتبار أن CubeMX لا تجتمع عند تجديد الإدراج بين بداية كود المستخدم و USER CODE END ... هناك سنقوم بإضافاتنا ...

لنبدأ مع main.c

/* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ typedef void (*pFunction)(void); pFunction JumpToApplication; uint32_t JumpAddress; /* USER CODE END PV */ . . . /* USER CODE BEGIN 0 */ uint32_t AddressMyApplicationBegin = 0x0800C000; uint32_t AddressMyApplicationEnd = 0x0800FBFC; /* USER CODE END 0 */ . . . /* USER CODE BEGIN 2 */ /* Check if the KEY Button is pressed */ if(HAL_GPIO_ReadPin(boot1_GPIO_Port, boot1_Pin ) == GPIO_PIN_SET) { /* Test if user code is programmed starting from address 0x0800C000 */ if (((*(__IO uint32_t *) USBD_DFU_APP_DEFAULT_ADD) & 0x2FFE0000) == 0x20000000) { /* Jump to user application */ JumpAddress = *(__IO uint32_t *) (USBD_DFU_APP_DEFAULT_ADD + 4); JumpToApplication = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t *) USBD_DFU_APP_DEFAULT_ADD); JumpToApplication(); } } MX_USB_DEVICE_Init(); /*      */ /* USER CODE END 2 */ . . . 

هذا كل شيء مع main.c ...

انتقل إلى usbd_conf.h وإلى

 #define USBD_DFU_APP_DEFAULT_ADD 0x0800000 

تذكرني ...

 #define USBD_DFU_APP_DEFAULT_ADD 0x080C000 //     … 

نمر إلى usbd_dfu_it.c ، هنا المزيد ....

 . . . /* USER CODE BEGIN PRIVATE_TYPES */ extern uint32_t AddressMyApplicationBegin; extern uint32_t AddressMyApplicationEnd; /* USER CODE END PRIVATE_TYPES */ . . . /* USER CODE BEGIN PRIVATE_DEFINES */ #define FLASH_ERASE_TIME (uint16_t)50 #define FLASH_PROGRAM_TIME (uint16_t)50 /* USER CODE END PRIVATE_DEFINES */ . . .   ,    «»  … uint16_t MEM_If_Init_FS(void) { /* USER CODE BEGIN 0 */ HAL_StatusTypeDef flash_ok = HAL_ERROR; //   while(flash_ok != HAL_OK){ flash_ok = HAL_FLASH_Unlock(); } return (USBD_OK); /* USER CODE END 0 */ } . . . uint16_t MEM_If_DeInit_FS(void) { /* USER CODE BEGIN 1 */ HAL_StatusTypeDef flash_ok = HAL_ERROR; //  flash_ok = HAL_ERROR; while(flash_ok != HAL_OK){ flash_ok = HAL_FLASH_Lock(); } return (USBD_OK); /* USER CODE END 1 */ } . . . uint16_t MEM_If_Erase_FS(uint32_t Add) { /* USER CODE BEGIN 2 */ uint32_t NbOfPages = 0; uint32_t PageError = 0; /* Variable contains Flash operation status */ HAL_StatusTypeDef status; FLASH_EraseInitTypeDef eraseinitstruct; /* Get the number of sector to erase from 1st sector*/ NbOfPages = ((AddressMyApplicationEnd - AddressMyApplicationBegin) / FLASH_PAGE_SIZE) + 1; eraseinitstruct.TypeErase = FLASH_TYPEERASE_PAGES; eraseinitstruct.PageAddress = AddressMyApplicationBegin; eraseinitstruct.NbPages = NbOfPages; status = HAL_FLASHEx_Erase(&eraseinitstruct, &PageError); if (status != HAL_OK) { return (!USBD_OK); } return (USBD_OK); /* USER CODE END 2 */ } . . . uint16_t MEM_If_Write_FS(uint8_t *src, uint8_t *dest, uint32_t Len) { /* USER CODE BEGIN 3 */ uint32_t i = 0; for(i = 0; i < Len; i+=4) { /* Device voltage range supposed to be [2.7V to 3.6V], the operation will be done by byte */ if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, (uint32_t)(dest+i), *(uint32_t*)(src+i)) == HAL_OK) { // Usart1_Send_String("MEM_If_Write_FS OK!"); /* Check the written value */ if(*(uint32_t *)(src + i) != *(uint32_t*)(dest+i)) { /* Flash content doesn't match SRAM content */ return 2; } } else { /* Error occurred while writing data in Flash memory */ return (!USBD_OK); } } return (USBD_OK); /* USER CODE END 3 */ } . . . uint8_t *MEM_If_Read_FS (uint8_t *src, uint8_t *dest, uint32_t Len) { /* Return a valid address to avoid HardFault */ /* USER CODE BEGIN 4 */ uint32_t i = 0; uint8_t *psrc = src; for (i = 0; i < Len; i++) { dest[i] = *psrc++; } return (uint8_t*)(dest); /* ,     */ /* USER CODE END 4 */ } . . . uint16_t MEM_If_GetStatus_FS (uint32_t Add, uint8_t Cmd, uint8_t *buffer) { /* USER CODE BEGIN 5 */ switch (Cmd) { case DFU_MEDIA_PROGRAM: buffer[1] = (uint8_t)FLASH_PROGRAM_TIME; buffer[2] = (uint8_t)(FLASH_PROGRAM_TIME << 8); buffer[3] = 0; break; case DFU_MEDIA_ERASE: default: buffer[1] = (uint8_t)FLASH_ERASE_TIME; buffer[2] = (uint8_t)(FLASH_ERASE_TIME << 8); buffer[3] = 0; break; } return (USBD_OK); /* USER CODE END 5 */ } 

في الواقع هذا كل شيء ...

نحن نربط المبرمج ، ورمي لاعبا في وضع البرمجة ، يتم تسجيل F7 ، F8 و botloader ...

هل يمكنني استخدام ...

الآن سنقوم بإعداد طلبنا للتحميل عبر bootloder ...
سوف التطبيق المفضل وميض LED ...

نقوم بإعداد التطبيق وتصحيحه ، وتغيير الأماكن الفردية في برنامج التحويل البرمجي وهيئة البرنامج لتغيير عنوان إطلاق البرنامج ومقاطعة المتجهات ...

وهي في KEIL → تكوين → أدوات فلاش

الصورة

تغيير عنوان بداية البرنامج ...

الصورة

نقول لإنشاء ملف HEX

الصورة

وتغيير عنوان جدول المتجهات ...

جمع برنامج F7 ...

تحويل HEX المستلمة إلى ملف dfo باستخدام الأداة المساعدة Dfu file manager ...

الصورة

حدد ملف HEX الخاص بنا باستخدام الزر S19 أو HEX ... وانقر فوق إنشاء ...

الصورة

نحصل على ملف dfu.

في الواقع ، كل شيء جاهز.

جارٍ التحميل في وحدة التحكم ...

نقوم بتوصيل لوحة تجريبية لدينا مع محمل botloader الذي تم تحميله بالفعل إلى USB ، بعد ضبط وصلات العبور على وضع DFU.

الصورة

يمكنك التحكم في مظهر جهاز STM في وضع DFU في قائمة الأجهزة.
تشغيل "بووتلوأدر".

الصورة
أخبرها ملف dfu ...

الصورة

نضغط Upgrade ونلاحظ نتيجة التحميل ... للثقة ، نضغط على check.

الصورة

كل شيء ناجح ... يمكنك تشغيل ...

إذا خرج الخطأ ، فهذا يعني أن هناك دعامة في مكان ما ...

الصورة

على سبيل المثال ...

لذلك ، سوف نفترض أن كل شيء ناجح ... بدّل العبور إلى وضع التطبيق

الصورة

والتمتع الصمام الثنائي الوامض ...
...
اهوه الكثير من bukoffff. تعبت من نسخ الصور :-)

شكرا لكم جميعا على اهتمامكم ...

Source: https://habr.com/ru/post/ar432398/


All Articles