Étape 7: Bootloader - se débarrasser des PicKit
1. Pourquoi faut-il un chargeur de démarrage ?
Avoir un PicKit autour est nécessaire, cependant avoir traîner notre espace de travail avec sans aucune raison valable n’est pas. Au départ je n’ai pas voulu compliquer ma vie avec des bootloaders, mais plus tard je suis venu à réaliser la vérité : ce projet est mieux sans PicKit. Avoir un seul câble pour la programmation est agréable, surtout si c’est un extrêmement fréquent câble mini USB, chaque amateur a un tas de. Heureusement pour moi, erreurs devaient être fixés sur les deux PCB donc il y avait une bonne occasion d’ajouter des fonctionnalités et du matériel de bootloader. L’en-tête du PDCI cinq broches a été écarté de la conception intentionnellement, et j’ai eu à souder des fils d’envelopper le bootloader-Flash. Bien sûr - que le câblage ne peut pas y rester, il lèverait tout sur la table une fois que le rotor tourne - heureusement la fente USB est compacte et peut rester. Branchez lors de la programmation, prise dehors lors de l’essai et la filature.
2. USB chargeur de démarrage, simple et bon
En regardant la fiche technique du processeur que j’ai décidé d’utiliser un peut voir qu’il y a UART et USB disponible. Si je prends UART, j’ai encore besoin d’un USB-UART convertisseur et un tas de fils - défait le but. Alors le choix de la meilleur, la plus simple et la plus belle est USB. Microchip propose toutes sortes d’exemples de code pour les photos, les chargeurs de démarrage aussi. Si vous téléchargez et installez "Bibliothèques Microchip pour les Applications", il y aura un dossier entier sur toutes sortes d’USB applications, bootloaders, outils et autres choses utiles. Dans le sous-dossier "Bootloaders" J’ai choisi "USB HID Bootloader" et l’ouvrit dans MPLAB X. Après avoir lu à travers elle une couple de fois pour comprendre sa logique, j’ai commencé à mettre en œuvre les modifications pour s’adapter parfaitement les conseils que j’avais l’intention de l’utiliser pour.
3. quelques mots sur les chargeurs de démarrage
Un bootloader est une section spéciale du code qui est écrit dans les microcontrôleurs une fois et offre un moyen de télécharger le firmware sans avoir besoin d’un programmeur (haute tension) spécial, comme le PicKit dans notre cas. Malheureusement, il n’y a aucun moyen d’éviter complètement l’utilisation de la PicKit, le chargeur de démarrage doit entrer dans le PIC en quelque sorte. Le bon côté : vous pouvez emprunter un PicKit, ICD2 ou clignotant PIC d’un ami, et donner à nouveau une fois le bootloader est inscrit dans le microcontrôleur. Après que - selon quel type de programme d’amorçage a flashé, vous pouvez télécharger firmware sur mémoires programmables par UART, USB, CAN ou que ce soit.
L’utilisation de chargeurs de démarrage est simple, mais il est livré avec l’inconvénient de perdre la mémoire programme précieux. Certains chargeurs de démarrage mangent moins de place, certains mangent plus - celui-ci que j’ai décidé de l’utiliser est d’environ 1K. Au démarrage de chaque commandant de bord s’allume à l’adresse 0 et commence l’exécution de tout code le programmeur a écrit là. Si c’est le bootloader = le PIC de circuit le bootloader. Si c’est le code utilisateur = le PIC exécute le code utilisateur. Assez simple !
Afin d’utiliser les deux, nous devons passer en quelque sorte ces deux programmes. Ce passage peut se faire selon une condition, événement ou quoi que - il sera très semblable à une instruction énorme « si ». J’ai choisi cette condition est le niveau de tension sur une broche d’entrée, IO RD3 du Registre PORTD. Cette broche a été connectée à la broche de 5V du connecteur USB à travers une résistance. Si la broche est à 5V, au démarrage, le commandant de bord doit s’exécuter la branche du bootloader de l’énorme « si », si elle est à 0V, le code d’application utilisateur a dû être exécuté. J’ai placé le code utilisateur juste après le code de programme d’amorçage, à adresse 1000h. Le PIC18F4550 vérifie la broche RD3 à plusieurs reprises, donc lorsque le câble USB est supprimé et le 5V disparaît de la RD3, le PIC va sauter le code placé à 1000h, le code d’application utilisateur. Dans le code d’application utilisateur je vérifie à nouveau le niveau de tension sur la RD3, si le programme voit 5V là-dessus, le câble USB est branché à nouveau et le commandant de bord a de sauter pour le chargeur de démarrage. Je fais ce saut en mode bootloader avec une instruction de « RESET » assembly inline.
Puisque le commandant de bord commence à s’exécuter à partir de l’adresse 0, la chose la plus simple et la plus courante à faire est de placer le code de programme d’amorçage là et le code utilisateur juste après le programme d’amorçage. Le code de programme d’amorçage peut être modifié pour vérifier si oui ou non il y a un firmware valide rédigé dans le PIC. Cela se fait en vérifiant le contenu de la mémoire sur adresse h 1006-1007h. Après chaque programmation réussie, les inserts de bootloader "600D » (leet pour le « bien ») à cet endroit, ce qui signifie que le code a été écrit dans le PIC avec succès - c’est ce qu’il obtient vérifié pour la validité. Nous devons spécifier dans les paramètres de projet d’application utilisateur que cet endroit ne devraient pas être remplacés, voir les images pour voir comment c’est fait (les plages ROM sont spécifiées pour ignorer cet emplacement lorsque le code utilisateur de l’application est compilé). Faute de quoi se traduira par des erreurs vraiment difficiles à détecter par la suite. La section où les mensonges du chargeur de démarrage doivent être protégés ainsi : cela se fait en décalant le code d’application utilisateur entière de 1000h (Code décalage paramètre options de l’éditeur de liens). Bootloaders trouvent habituellement au début ou à la fin de la mémoire programme - il faut ne pas vouloir le remplacer !
Je voulais ajouter quelques paramétrage pour cet appareil, c’est pourquoi la gamme 3000-3100 est ainsi protégée. Vous n’avez pas besoin de cela, juste d’un !
4. les problèmes que j’ai touché lorsque vous travaillez avec le bootloader
La compilation du projet se traduira par un fichier hex qui est généré - cela doit être flashé dans le PIC avec un PicKit ou que ce soit. Mine n’a pas voulu démarrer pendant un certain temps, l’outil de chargeur de démarrage USB ne pouvait pas détecter quoi que ce soit. J’ai décidé de faire des mesures sur la broche VUSB du PIC à ma portée et au moment où que j’ai touché la cheville avec la sonde portée le bien connu son USB joué et le jury a reconnu ! J’ai pensé que le problème a disparu, mais dès que j’ai enlevé la sonde, la chose a cessé de fonctionner à nouveau. J’ai réalisé que tout fonctionne quand la sonde de champ d’application est activé, même écrit, réinitialisations - le problème devait être quelque chose qui fixe de la sonde. Puis j’ai pensé : qu’ont portée sondes ? Capacité parasite. Le condensateur sur la broche VUSB a été énorme en valeur et ne pouvait pas filtrer les bruits de haute fréquence. Un condensateur de 100nF fut ajouté en parallèle, et le jury a reconnu immédiatement. Problème résolu !