La cloche.

Il y a ceux qui ont lu cette nouvelle devant vous.
Abonnez-vous pour recevoir des articles frais.
E-mail
Nom
Nom de famille
Comment voulez-vous lire la cloche
Sans spam

Ce clone Arduino propose un chargeur de démarrage spécial qui vous permet de verser du firmware via USB, sans utiliser de composants externes de l'adaptateur Type St-Link ou USB-UART.

Aujourd'hui, je devais travailler avec un contrôleur nu sous Coocox et sans STM32DUININO. Mais quel est le problème. Même une ampoule de fantalass simple à travers ce chargeur de démarrage ne fonctionne pas.

Traitons avec. Peut-être que mes calculs sembleront à une banalité de quelqu'un. Mais je commence juste à étudier les contrôleurs STM32 et à trouver un problème tué au moins une demi-journée. Soudain, cet article réduira le développement du temps de quelqu'un.

Je n'ai rien contre ST-Link et d'autres debuggers. Mais dans mon appareil prêt à l'emploi, ce ne sera pas, mais sera certainement USB. Pourquoi ne pas avoir immédiatement la possibilité de mettre à jour le firmware via USB? Personnellement, je trouve de cette façon commode. Surtout depuis que j'ai toujours connecté la dentelle sur laquelle est alimenté et USB série.

Voyons comment fonctionne le chargeur de démarrage. Pour commencer, sur l'exemple des contrôleurs AVR. Pourquoi suis-je souvenu de lui? Je suis passée d'Arduino et je suis inconsciemment attendu au même comportement. Mais dans la STM32, il s'est avéré différent. Par conséquent, je veux parler de la différence de ces deux microcontrôleurs.

Donc. DANS microcontrôleurs AVR ATMEGA SOUS Le chargeur de démarrage peut être réservé de la mémoire plus proche de la fin du flash. À l'aide de bits à fusible, vous pouvez ajuster à partir de quelle adresse commencera le programme. S'il n'y a pas de chargeur de démarrage - le programme commence à partir de l'adresse 0x0000. Si le chargeur de démarrage est - il commence à partir d'une autre adresse (disons, dans ATMEGA32 de 0x3C00, si la taille du chargeur de démarrage est sélectionnée 2K).

Lorsque le chargeur de démarrage a fait ses affaires, il transmet la gestion du programme principal de l'adresse 0x0000. Ceux. Le programme commence toujours à partir de l'adresse 0x0000. Le compilateur et le linteau opèrent avec le fait que le code sera au début de l'espace d'adressage.

Dans les microcontrôleurs STM32, tout n'est pas le cas. Tous les programmes commencent par des adresses 0x0800000. Butloider n'est pas quelque chose de spécial. C'est le même programme qui commence à partir de la même adresse initiale. En cours de fonctionnement, le chargeur de démarrage peut prendre le micrologiciel (via USB ou UART, lire depuis le lecteur flash, pour prendre du satellite, pour obtenir du sous-espace, Whatver ...) et écrivez-le aux adresses supérieures à la chargeur lui-même. Bien sûr, bien sûr, à la fin de son travail, transférer la gestion du programme principal.


Donc, lors de la compilation du micrologiciel, vous devez savoir où le chargeur de démarrage enregistrera le micrologiciel et ajustera les adresses en conséquence.

Sur cela avec la théorie, tout. Aller à la pratique. Au dessous de instruction étape par étape Comment fixer le chargeur USB aux microcontrôleurs STM32F1XX et peut-être d'autres aussi.

Il y a cependant quelques restrictions sur les circuits. Ici, je ne suis malheureusement pas fort. YATP a besoin d'une résistance de serrage 1.5k pour le port PA12 (il est également USB D +). Cela permet au chargeur de beaux moments Il est temps de se connecter et de se déconnecter de USB.

  • Maintenant, le microcontrôleur est prêt à appuyer via le chargeur de démarrage USB. Mais vous avez toujours besoin de corriger le firmware lui-même. Et vous avez besoin de 2 choses:
    • Spécifiez la ligne l'adresse de départ. À COOCOX, cela se fait dans les paramètres du projet, l'onglet Lien, la section Zones de mémoire, l'adresse de démarrage de l'adresse IROM1. Le chargeur de démarrage prend les 8 premiers kilo-octets, ce qui signifie que l'adresse de départ du micrologiciel sera 0x0800000 + 0x2000 \u003d 0x08002000. La taille de la taille, probablement, vaut également réduit de 8K.
    • Quelque part au début du programme avant que l'initialisation de la périphérie fait un défi

      Nvic_setVectortable (nvic_vecttab_flash, 0x2000);

      Mise à jour 17.05.2018: Dans la version moderne de STM32CUBE, la fonction nvic_setVectortable () n'est pas. Au lieu de cela, vous pouvez dans le fichier System_STM32F1XX.C (ou similaire à un autre microcontrôleur) FIX DEFINE VOTE_TAB_OFFSETRE

  • Le firmware baie que vous pouvez prendre du projet STM32DUININO. Dans le répertoire des outils, recherchez un script sous le nom Maple_Upload. Je n'ai utilisé que la version Windows - Maple_Upload.bat.
  • Lancez comme ceci:

    "Maple_upload.bat" COM201 2 1EAF: 0003 "chemin \\ to \\ firmware.bin"
    Au lieu de COM20, vous devez remplacer votre port où se ferme le microcontrôleur.

    Le mandrin est très doux, les chemins relatifs n'aiment pas. Donc, le chemin du firmware doit être complètement spécifié.

    1af: 0003 est vid et pid

    2 est le paramètre Altid, qui indique que le micrologiciel doit être versé sur 0x08002000 (lu).

  • Autres petites nuances. Avant de verser le micrologiciel, vous devez démarrer le chargeur de démarrage. Le moyen le plus simple consiste à appuyer sur le bouton de réinitialisation. Après cela, le chargeur de démarrage démarrera et attendra un micrologiciel pendant quelques secondes. Si personne n'a exécuté Maple_Upload à ce moment-là, le chargeur de démarrage transmettra le contrôle du micrologiciel principal.

    Pour cette raison, la gêne occasionnée peut survenir. Si le microcontrôleur est également éclairé et suspendu, il n'écoute plus au port. Par conséquent, il ne peut pas entendre la séquence clé et surchargé dans le chargeur de démarrage. Alors seulement réinitialiser pour aider.

    C'est tout. J'espère que mon article va briser la lumière sur la manière dont le chargeur fonctionne dans STM32 et comment charger le firmware via port USB. Malheureusement, le seuil d'entrée est toujours élevé, mais tout à coup, quelqu'un mon article aidera à la surmonter.

    Tout microcontrôleur STM32 peut clignoter Usart_1 Et d'autres interfaces, voir en détail. Pour ce faire, dans mk, un chargeur système spécial est cousu dans Mémoire système. (Spec. Zone de mémoire) Au stade de la production, il ne peut pas être supprimé ou modifié. Ce chargeur de démarrage est initialisé par "Pull-ups" Pina boot_0 sur "Plus", après quoi il s'attend à une arrivée du micrologiciel.

    Via USART peut être téléchargé des fichiers annon.bin ou.hex.

    La description est faite sur l'exemple de la fraise bleue, mais tout est dit équitablement pour tout STM32.

    Les panneaux de la découverte et des nucléo peuvent également clignoter via Usart.

    Pour travailler, vous aurez besoin d'un convertisseur USB sur UART ...

    S'il n'y a rien de tel, c'est-à-dire les deux options pour transformer les arduins dans le convertisseur ...

    transformation

    1 . Fermer Réinitialiser. sur le Gnd. (Peut ne pas rouler).
    2 . Le chargement d'elle est un croquis aussi simple:

    SETUPH VOID () (Pinmode (0, entrée); Pinmode (1, entrée);) Vide boucle () ()

    Pour vérifier si ARDUIN fonctionne en tant que convertisseur, fermez RX et TX, ouvrez et envoyez des caractères. S'ils sont retournés, cela signifie que tout fonctionne.

    Avant le firmware, vous devez serrer la broche BOOT0 sur le "PLUS", il traduira le MK en mode "System beurre". Sur le tableau décrit, cela est effectué en permanent le cavalier ...

    Si le conseil est la marque

    Sur les conseils d'entreprise (découverte, nucléo), vous devez également resserrer la broche boot0 sur le plus, mais simplement cela ne fonctionnera pas. Prenez le schéma de votre conseil et trouvez les cavaliers correspondants là-bas ...

    Vous devez rechercher quelque chose comme ceci:

    Je ne me souviens pas de quel conseil ce régime, mais l'essence est la suivante: dans ce cas, PIN Boot_0. Resserrement de «moins» à travers la résistance R16 et le cavalier SB16. Si vous retirez le cavalier SB16, la broche se serrera à travers la résistance R17 et vous pouvez clignoter. Après le firmware, vous devez tout retourner à la place.

    Le cavalier peut ressembler à une résistance.

    Connectez le convertisseur et STM comme suit ...

    photo

    Convertisseur Rx <-> PA9 STM.
    Convertisseur Tx. <-> PA10 STM.
    Convertisseur Gnd. <-> Gnd. STM.

    ... et connectez le convertisseur et la STM sur l'ordinateur.

    Instructions du micrologiciel pour

    Si vous voulez, vous pouvez emporter sur le site ST (au bas de la page).

    Cliquez sur Réinitialiser sur le tableau.

    Aller au dossier Démonstrateur de chargeur flash. Et lancement Démonstrateur de chargeur flash.exe.

    Sélectionnez le port SOM du convertisseur et cliquez sur Suivant...

    Avertissement Supprimer la protection (protection en écriture)

    Un tel message ...

    ... signifie que la carte est verrouillée. Il n'y a rien de terrible, enlevez simplement la protection avec le bouton Supprimer la protection. Et prochain clic d'accord.

    La défense a été supprimée.


    Si une autre erreur donne des erreurs, alors n'a pas appuyé sur Réinitialisation ou quelque chose avec le convertisseur.

    Si le feu de circulation donne la lumière verte, nous appuyez audacieusement. Suivant...

    Zhmem. Suivant...

    En points Télécharger sur le périphérique. Spécifiez le chemin du fichier souhaité.bin ou.hex et cliquez sur Suivant...

    Tout est prêt, renvoyez le cavalier à sa position d'origine et cliquez sur Réinitialiser.

    Instructions du micrologiciel pour

    Téléchargez et déballer quelque part.

    Dans le dossier correspondant à votre système d'exploitation, copiez le fichier STM32FLASH dans le dossier HOME.

    Cet utilitaire est dans les répars d'Ubuntu, je ne sais pas dans d'autres catastrophes, alors je poste.

    Avant le firmware, appuyez toujours sur Réinitialiser sur le tableau.

    Dans le terminal, donnez la commande:

    ./stm32flash -w /home/dima/myfile.bin -v -g 0x0 / dev / ttyusb0
    Le nom et le chemin du fichier que vous aurez le vôtre. Les fichiers hexagonaux peuvent également clignoter cet utilitaire.

    Si vous jurez de droite, donnez à l'équipe ...

    Sudo chmod 777 / dev / ttyusb0

    ... ou courez l'utilitaire à travers sudo.

    Protection des records

    Si ce message est apparu ...

    ... alors donnez deux équipes à tour de rôle:

    ./stm32flash -u / dev / ttyusb0 ./stm32flash -k / dev / ttyusb0

    Le premier supprime la protection contre l'enregistrement, la deuxième lecture.

    Si vous aviez un chargeur de démarrage Arduin, il sera couvert pour la restaurer simplement vers la voie décrite ci-dessus

    Supposons que vous ayez publié votre appareil sur le marché et nous craignons que quelqu'un commence à la copier ... Vraiment - simplement connecter le programmateur à notre appareil et lisez le micrologiciel, par exemple, via l'utilitaire de l'utilitaire ST-Link ( Cible.Relier.).

    Bien sûr, vous pouvez simplement déchirer les jambes du microcontrôleur ... mais les développeurs de St Microelectronics offrent une alternative à mieux. Tout MK a un système de sécurité (lecture de la protection). Son essence est extrêmement simple - si dans un registre spécial (option octets), une certaine valeur est définie - alors la possibilité de déboguer et de lecture du micrologiciel est désactivée. Dans ce mode, vous allez également disparaître en clignotant MK. Bien entendu, cette protection peut être désactivée en modifiant la valeur dans le registre des octets d'option, cependant, dans ce cas, la mémoire du programme sera couverte, ce qui signifie que personne ne peut le copier.

    Modifiez la valeur dans le registre que vous pouvez à l'aide du même utilitaire ST-Link, Cible.Option d'octets ...Lire la protection.Activer.


    Désactiver, respectivement, de la même manière. Ce n'est pas entièrement pratique s'il y a beaucoup d'appareils. Vous pouvez activer la protection par programme.

    Pour mettre en œuvre la défense, il est pratique d'utiliser la bibliothèque périphérique standard et spécifiquement STM32F10X_FLASH.C contient la fonction dont vous avez besoin. Le registre lui-même, ainsi que le travail avec la mémoire flash est décrit dans le document. Cependant, avant cela, rappelez-vous comment protéger l'inclusion multiple des fichiers d'en-tête est mise en œuvre. Nous avons utilisé des directives de préprocesseur telles que:

    • #Define - la directive indique le préprocesseur de remplacer la chaîne dans le fichier, cependant, si l'argument (ce qui se situe à la fin) ne spécifie pas l'identifiant lui-même (le fait qu'au milieu) au système et peut être vérifié par d'autres Directives (c'est-à-dire que vous pouvez écrire une condition que le code spécifique sera effectué ou inversement);
    • #Ifndef - La directive peut être lue comme "sinon certainement", mais l'autre #Ifdef est plus approprié - "si définitivement";
    • #Endif - directive indiquant la fin de la condition.

    Créez un identifiant qui dira que cet assembly est final. Bien que cette chaîne soit commentée - le code est placé entre #Ifdef et #endif ne sera pas exécuté.

    // # définir la libération

    Lorsque l'ensemble ultime est suffisant pour désierger simplement la ligne et clignoter le périphérique.

    #IfDef version // code ici édition

    Et maintenant par l'essence même. Nous avons déjà compris comment travailler avec la mémoire flash interne du microcontrôleur. Avant d'enregistrer les bits de protection, vous devez déverrouiller l'accès à la mémoire, puis vous devez effectuer les opérations nécessaires et bloquer l'accès à nouveau. Il s'avère ce qui suit:

    #Ifdef version #warning "La protection est activée. Débogou est désactivé" si (flash_gedreadoutProtStatus () \u003d\u003d reset) (flash_unlock (); flash_readoutProtection (Activer); flash_lock ();) #endif

    Aujourd'hui, nous protégerons le firmware sur la STM32 de la lecture de Kul Hakers. Pour ne pas tirer le caoutchouc, voici un morceau de code:

    #Ifdef ndebug si (flash_gedreadoutProtStatus () \u003d\u003d réinitialisation) (flash_unlock (); flash_readoutProtection (Activer); flash_lock ();) #endif

    Il n'est pas difficile de deviner, la pièce utilise la bibliothèque de STM. Un tel morceau de code est très pratique - le contrôleur lui-même installe sa protection lorsque vous démarrez d'abord, et le premier lancement est facile à organiser après le micrologiciel. Ici, c'est la liberté de la tyrannie de Fuuz!

    Oui, je sais sur Holivor sur la "bibliothèque vs appel direct aux registres". Ma position ici est telle - si vous avez besoin d'une vitesse élevée ou si vous avez très peu de mémoire, mais vous devez faire appel directement aux registres. Si la vitesse n'est pas importante et que la mémoire est grande, il est préférable d'utiliser la bibliothèque - le programme est donc écrit plus rapide et il s'avère plus lisible.

    Supprimer la protection
    Le contrôleur, nous avons été protégés. Mais le problème est - vous devez corriger notre programme et avec la protection déficient, vous ne pouvez rien faire avec le contrôleur - vous ne pouvez pas écrire. Comment supprimer la protection? Immédiatement, je vous avertit - les gars de ST ont tout fait à droite et que tout le firmware est détruit avec une protection.

    Pour supprimer la protection, nous aurons besoin d'un utilitaire ST-Link. Vous pouvez le télécharger.

    Nous exécutons le programme et choisissons cet article ou cliquez simplement sur Ctrl-B:

    Dans le "début du statut de la protection de la lecture, sélectionnez Désactivé". Et cliquez sur le bouton Appliquer:

    Avec le bit de protection, toute la mémoire est effacée:

    Sécurisé, nous sommes pour un souceur sûr.



    Dans mon projet, j'utilise le microcontrôleur STM32F103C8 et le cadre STM32DUININO. Ce clone Arduino propose un chargeur de démarrage spécial qui vous permet de verser du firmware via USB, sans utiliser de composants externes de l'adaptateur Type St-Link ou USB-UART.

    Aujourd'hui, je devais travailler avec un contrôleur nu sous Coocox et sans STM32DUININO. Mais quel est le problème. Même une ampoule de fantalass simple à travers ce chargeur de démarrage ne fonctionne pas.

    Traitons avec. Peut-être que mes calculs sembleront à une banalité de quelqu'un. Mais je commence juste à étudier les contrôleurs STM32 et à trouver un problème tué au moins une demi-journée. Soudain, cet article réduira le développement du temps de quelqu'un.

    Je n'ai rien contre ST-Link et d'autres debuggers. Mais dans mon appareil prêt à l'emploi, ce ne sera pas, mais sera certainement USB. Pourquoi ne pas avoir immédiatement la possibilité de mettre à jour le firmware via USB? Personnellement, je trouve de cette façon commode. Surtout depuis que j'ai toujours connecté la dentelle sur laquelle est alimenté et USB série.

    Voyons comment fonctionne le chargeur de démarrage. Pour commencer, sur l'exemple des contrôleurs AVR. Pourquoi suis-je souvenu de lui? Je suis passée d'Arduino et je suis inconsciemment attendu au même comportement. Mais dans la STM32, il s'est avéré différent. Par conséquent, je veux parler de la différence de ces deux microcontrôleurs.

    Donc. Dans les microcontrôleurs AVR ATMEGA, vous pouvez réserver un certain nombre de mémoire plus près de la fin du flash. À l'aide de bits à fusible, vous pouvez ajuster à partir de quelle adresse commencera le programme. S'il n'y a pas de chargeur de démarrage - le programme commence à partir de l'adresse 0x0000. Si le chargeur de démarrage est - il commence à partir d'une autre adresse (disons, dans ATMEGA32 de 0x3C00, si la taille du chargeur de démarrage est sélectionnée 2K).


    Lorsque le chargeur de démarrage a fait ses affaires, il transmet la gestion du programme principal de l'adresse 0x0000. Ceux. Le programme commence toujours à partir de l'adresse 0x0000. Le compilateur et le linteau opèrent avec le fait que le code sera au début de l'espace d'adressage.

    Dans les microcontrôleurs STM32, tout n'est pas le cas. Tous les programmes commencent par des adresses 0x0800000. Butloider n'est pas quelque chose de spécial. C'est le même programme qui commence à partir de la même adresse initiale. En cours de fonctionnement, le chargeur de démarrage peut prendre le micrologiciel (via USB ou UART, lire depuis le lecteur flash, pour prendre du satellite, pour obtenir du sous-espace, Whatver ...) et écrivez-le aux adresses supérieures à la chargeur lui-même. Bien sûr, bien sûr, à la fin de son travail, transférer la gestion du programme principal.


    Donc, lors de la compilation du micrologiciel, vous devez savoir où le chargeur de démarrage enregistrera le micrologiciel et ajustera les adresses en conséquence.

    Sur cela avec la théorie, tout. Aller à la pratique. Vous trouverez ci-dessous une instruction étape par étape Comment visser le chargeur USB sur les microcontrôleurs de la série STM32F1XXXXXXX, et peut-être d'autres aussi.

    Il y a cependant quelques restrictions sur les circuits. Ici, je ne suis malheureusement pas fort. YATP a besoin d'une résistance de serrage 1.5k pour le port PA12 (il est également USB D +). Cela permet au chargeur de démarrage de se connecter et de se déconnecter de USB aux moments souhaités.

  • Maintenant, le microcontrôleur est prêt à appuyer via le chargeur de démarrage USB. Mais vous avez toujours besoin de corriger le firmware lui-même. Et vous avez besoin de 2 choses:
    • Spécifiez la ligne l'adresse de départ. À COOCOX, cela se fait dans les paramètres du projet, l'onglet Lien, la section Zones de mémoire, l'adresse de démarrage de l'adresse IROM1. Le chargeur de démarrage prend les 8 premiers kilo-octets, ce qui signifie que l'adresse de départ du micrologiciel sera 0x0800000 + 0x2000 \u003d 0x08002000. La taille de la taille, probablement, vaut également réduit de 8K.
    • Quelque part au début du programme avant que l'initialisation de la périphérie fait un défi

      Nvic_setVectortable (nvic_vecttab_flash, 0x2000);

  • Le firmware baie que vous pouvez prendre du projet STM32DUININO. Dans le répertoire des outils, recherchez un script sous le nom Maple_Upload. Je n'ai utilisé que la version Windows - Maple_Upload.bat.
  • Lancez comme ceci:

    "Maple_upload.bat" COM201 2 1EAF: 0003 "chemin \\ to \\ firmware.bin"
    Au lieu de COM20, vous devez remplacer votre port où se ferme le microcontrôleur.

    Le mandrin est très doux, les chemins relatifs n'aiment pas. Donc, le chemin du firmware doit être complètement spécifié.

    1af: 0003 est vid et pid

    2 est le paramètre Altid, qui indique que le micrologiciel doit être versé sur 0x08002000 (lu).

  • Autres petites nuances. Avant de verser le micrologiciel, vous devez démarrer le chargeur de démarrage. Le moyen le plus simple consiste à appuyer sur le bouton de réinitialisation. Après cela, le chargeur de démarrage démarrera et attendra un micrologiciel pendant quelques secondes. Si personne n'a exécuté Maple_Upload à ce moment-là, le chargeur de démarrage transmettra le contrôle du micrologiciel principal.

    Pour cette raison, la gêne occasionnée peut survenir. Si le microcontrôleur est également éclairé et suspendu, il n'écoute plus au port. Par conséquent, il ne peut pas entendre la séquence clé et surchargé dans le chargeur de démarrage. Alors seulement réinitialiser pour aider.

    C'est tout. J'espère que mon article va briser la lumière sur la manière dont le chargeur fonctionne dans STM32 et comment télécharger le micrologiciel via un port USB. Malheureusement, le seuil d'entrée est toujours élevé, mais tout à coup, quelqu'un mon article aidera à la surmonter.

    La cloche.

    Il y a ceux qui ont lu cette nouvelle devant vous.
    Abonnez-vous pour recevoir des articles frais.
    E-mail
    Nom
    Nom de famille
    Comment voulez-vous lire la cloche
    Sans spam