Mode DFU du chargeur de démarrage STM32 utilisant CubeMX. Instructions étape par étape

Ainsi, le travail de ce mandrigal a été motivé par l'absence presque complÚte d'instructions pas à pas utilisant les outils habituels proposés par STMicroelectronics.

Le grand nombre de bootloaders trouvés sur le réseau, parfois trÚs occupés, sont malheureusement «affûtés» pour un cristal particulier.

Le matériel proposé contient la procédure d'utilisation du package CubeMX, du «bootloader» DfuSeDemo et de l'utilitaire de préparation du firmware du gestionnaire de fichiers Dfu, c'est-à-dire que nous résumons notre liste de souhaits du matériel, pardonnez au macro assembleur et au gourou de la fiche technique.

Cuisiner l'environnement ...

Nous avons besoin de CubeMX lui-mĂȘme, le tĂ©lĂ©chargement du gestionnaire de fichiers DfuSeDemo + Dfu, sont tous dans le mĂȘme package, STM32 ST-LINK Utility, nous trouvons tout sur le site Web de STMicroelectronics gratuitement.

Notre bùton expérimental avec la puce STM32F103C8T6 d'oncle Liao

image

et le programmeur ST-Link Ă  partir de lĂ .

image

Eh bien, votre IDE préféré, dans cette présentation spécifique, nous utilisons KEIL, les paramÚtres de compilation dans d'autres IDE ne sont pas trÚs différents.

Alors allons-y ...

Lancez CubeMX et sélectionnez votre cristal ...

image

Célébrez votre liste de souhaits ...

image

Dans cette tĂąche spĂ©cifique, nous activons le pĂ©riphĂ©rique USB → Device FS et, par consĂ©quent, la classe USB Device → DownLoad Update Firmware, et l'inoubliable RCC → High Speed ​​Clock → Cristal / Ceramic Resonator est celui Ă  bord.

Ensuite, sélectionnez le commutateur de mode bootloader-a, dans cet exemple, utilisez simplement le cavalier boot1 existant.

image

Nous regardons le petit schéma et, conformément à lui, boot1 est attaché à la jambe de PB2, nous l'utilisons donc en mode GPIO_Input.

Terminé, activez l'onglet Configuration de l'horloge et démarrez la machine de sélection de configuration.

image
Aller Ă  l'onglet Cofiguration ...

image

SĂ©lectionnez le bouton GPIO ...

image

Et sur le terrain ...

image
écrire une étiquette personnalisée, que ce soit boot1.

Ensuite, configurez le projet ...

image

Choisissez Projet → Paramùtres ...

image

SĂ©lectionnez et remplissez ....

image

En conséquence, nous choisissons pour quel IDE Cub nous allons générer le projet, dans notre cas, MDK-ARM V5.

L'onglet Générateur de code dans ce mode de réalisation restera inchangé ...

image

Eh bien, c'est tout, nous commençons la gĂ©nĂ©ration du projet Project → Generate Code

image

À la fin, Cub vous demandera de lancer immĂ©diatement votre IDE ... ce que vous devez faire.

image

image

Nous commençons la compilation, l'assemblage et le chargement dans le cristal ... F7, F8 ...

image

Le résultat final ...

Nous basculons les broches de notre carte sur le mode de fonctionnement et connectons le cĂąble USB ...

image

image

Ouvrez le panneau de configuration dans Windows → systĂšme → gestionnaire de pĂ©riphĂ©riques → contrĂŽleur USB. Et regardez la liste des appareils, Windows bruira un peu et installera l'appareil STM en mode DFU (si ce n'est pas dĂ©jĂ  fait).

Alors, le pilote s'est levé et a décidé de démarrer le "boot" DfuSeDemo ...

image

Nous regardons ce que nous avons attrapé DFU Device et double-cliquez sur le champ Select Target ...

image

Nous regardons attentivement et nous émerveillons que le flash jusqu'à l'adresse 0x0800C000 soit fermé pour l'écriture et nous écrivons cette adresse, nous en avons besoin ...

Au fait, je l'ai essayĂ© sur STM32F407VE, oĂč la mĂ©moire est ouverte pour l'enregistrement Ă  partir de 0x08000000, c'est-Ă -dire depuis le tout dĂ©but ... pourquoi, dans notre version ce n'est pas si clair, je n'ai pas creusĂ©, c'est enterrĂ© quelque part, mais ce n'est clairement pas Ă©crit, il n'y a pas comme il faut car un gros morceau disparaĂźt sans propriĂ©taire ... peut-ĂȘtre que quelqu'un vous dira oĂč creuser ...

Donc, "la coupe de cheveux vient de commencer" ...

Nous n'avons besoin que de deux fichiers sources ...

image

Nous les ouvrons dans IDE et nous corrigeons, nous ajoutons ...

Nous tenons compte du fait que CubeMX NE S'ASSOCIE PAS lors de la régénération de l'insert entre le CODE UTILISATEUR COMMENCER et le CODE UTILISATEUR FIN ... là, nous entrerons nos ajouts ...

Commençons par 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 */ . . . 

c'est tout avec main.c ...

allez Ă  usbd_conf.h et Ă 

 #define USBD_DFU_APP_DEFAULT_ADD 0x0800000 

rappelez-vous ...

 #define USBD_DFU_APP_DEFAULT_ADD 0x080C000 //     
 

nous passons Ă  usbd_dfu_it.c, ici plus ....

 . . . /* 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 */ } 

En fait, c'est tout ...

Nous connectons le programmeur, jetons les cavaliers en mode programmation, F7, F8 et botloader sont enregistrés ...

Puis-je utiliser ...

Nous allons maintenant préparer notre application pour le chargement via bootloder ...
L'application préférée clignotera LED ...

Nous préparons et déboguons l'application, et modifions les emplacements individuels dans le compilateur et le corps du programme pour changer l'adresse des vecteurs de lancement et d'interruption du programme ...

À savoir dans KEIL → Configurer → Outils Flash

image

Changer l'adresse du début du programme ...

image

Nous disons de générer un fichier HEX

image

et changer l'adresse de la table vectorielle ...

collecte du programme F7 ...

convertir le HEX reçu en un fichier dfo en utilisant l'utilitaire de gestion de fichiers Dfu ...

image

sélectionnez notre fichier HEX avec le bouton S19 ou HEX ... et cliquez sur Générer ...

image

nous obtenons le fichier dfu.

En fait, tout est prĂȘt.

Chargement dans le contrĂŽleur ...

Nous connectons notre carte expérimentale avec le botloader déjà chargé à USB, aprÚs avoir réglé les cavaliers en mode DFU.

image

Vous pouvez contrÎler l'apparence du périphérique STM en mode DFU dans la liste des périphériques.
lancez le "bootloader".

image
dites-lui notre fichier dfu ...

image

Nous appuyons sur Upgrade et observons le résultat du chargement ... pour plus de confiance, nous appuyons sur check.

image

tout est réussi ... vous pouvez courir ...

si l'erreur est sortie, cela signifie quelque part un montant ...

image

par exemple ...

Donc, nous supposerons que tout est réussi ... mettez le cavalier en mode application

image

et profitez de la diode clignotante ...
...
Uhhhh Tant de bukoffff. Fatigué de copier des photos :-)

Merci Ă  tous pour votre attention ...

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


All Articles