Débuter avec stm32 ou ne pas répéter mes erreurs

image


Une courte histoire sur le râteau rencontré sur la façon de connaître ARM sur l'exemple de stm32f103c8t6 et stm32l151rct6.


Ma connaissance des microcontrôleurs a commencé avec AVR. J'ai travaillé sur eux pendant un certain temps, allant des planches avec des pistes rayées et de l'assembleur dans AtmelStudio4 au butin normal et aux makefiles auto-écrits pour travailler dans le bloc-notes (dans mon cas, KWrite) et la ligne de commande.


Mais il est temps de mettre un bâton dans leurs frères aînés - ARM. Le choix d'une famille spécifique a été long et passif (car il n'y avait pas de besoin direct, donc je n'étais pas pressé), mais finalement il s'est retrouvé sur stm32f1, car c'était peut-être la plus populaire. Acheter un programmeur, une carte de débogage comme Discovery ou une pilule bleue? Que faites-vous, je suis un maître des AVR-cams! N'importe quelle planche peut être fabriquée LUT, et même selon vos besoins, sans trop de kit carrosserie. Par conséquent, j'achète un stm32f103c8t6 nu et commence à chamaniser avec la trace de la carte. De quoi aurai-je besoin? Au moins deux ports doivent être apportés aux peignes ... oups, il n'est pas pratique d'afficher les ports entièrement. Eh bien, je vais avoir 8 jambes chacune - du port A les plus jeunes (0-7), de B les plus âgés (8-15). Toujours, bien sûr, les LED et les boutons, comme sans indication et contrôle. Voici ce qui me surprend dans les cartes de débogage terminées, c'est le manque d'au moins 2-3 LED et 1-2 boutons qui n'entreraient en conflit avec rien. Comment imaginent-ils le débogage? Sous les boutons PA8, PA9 eux-mêmes sont demandés, ils sont idéalement situés. USB, cavaliers BOOT0, BOOT1 et un connecteur de batterie pour montres sont également utiles. Et des connecteurs pour le quartz, donc c'est très beau (je n'ai jamais utilisé les connecteurs pour le quartz par la suite). Pour l'alimentation, le contrôleur n'a pas besoin de plus de 3,6 V, et avec USB est de 5 V. Il est nécessaire d'installer un stabilisateur. J'ai beaucoup lu comment les gens choisissent les stabilisateurs avec une faible chute de tension ... pourquoi? La différence est de un vol et demi, mais il y a assez de chêne 78l33. Et maintenant le connecteur JTAG. Le connecteur de programmation d'Atmel avait un ISP10 ou ISP6 standard. JTAG est probablement également une chose standard. Il s'avère que oui ... mais seulement pour un seul fabricant ou même un appareil. Nous regardons le connecteur sur st-link: beau, 10 broches. Nous examinons un programmeur pour AVR: oups, déjà à 20 broches. Nous regardons ailleurs: des connecteurs plus incompatibles avec le dieu des normes incompatibles. Eh bien, si c'est le cas, nous inventerons le nôtre. Si quoi que ce soit, l'adaptateur entre eux ne sera pas plus compliqué que l'adaptateur ISP-6 à ISP-10. Tout semble être prêt, vous pouvez faire des frais. En fin de compte, un pas de 0,5 mm est tout à fait réalisable à un niveau amateur, je n'ai même pas eu à peindre avec un marqueur.


Maintenant, comment le flasher. Puisqu'il y a USB, il est probablement capable de le traverser. J'ai lu la fiche technique - oui, elle ne peut pas via USB, mais elle peut l'être via UART1. Oups, j'ai oublié de le retirer. De plus, il entre également en conflit avec le bouton, avec celui qui se bloque sur PA9. Bon, d'accord, je le publierai sur les publications, mais il reste encore un bouton. Un peu de chamanisme et la carte est prête et même définie dans stm32flash.


image


image


Il semble être réglé avec du fer, il est temps de passer au code. Après avoir lu plusieurs articles sur Internet, j'ai trouvé une archive prête à l'emploi sous gcc-arm-none-eabi. Je découvrirai exactement comment définir la séquence d'assemblage plus tard. Jusqu'à présent, je fais des mondes salutaires sur les boutons et les LED. Puisque c'est ma première connaissance de cette famille, aucun wrapper comme HAL n'est juste un travail manuel avec des registres. Cependant, il s'agit d'une approche tout à fait naturelle, il me semble, on ne pourrait pas le mentionner. Cela m'ennuie un peu tout le temps de tirer la puissance et BOOT0 sur la carte, mais bon, un jour je ferai un programmeur JTAG. Curieusement, je ne suis pas monté sur le râteau avec l'horloge éteinte. Il a rappelé sa jeunesse quand il a écrit le traitement 3D sur TurboPascal. Ici, j'ai un affichage sur ili9341 de raspberry pi et un contrôleur à 72 MHz. C'est ce qui s'est produit - jusqu'à 200 points par modèle et 11 images par seconde. Bien entendu, toutes les matrices de transformation sont comptées en nombres à virgule fixe.



À un moment donné, j'ai voulu faire fonctionner un appareil portable pendant longtemps sur la batterie. J'ai regardé la fiche technique et j'étais bouleversé: le fameux ARM en consommation est bien pire que le même AVR-ok! Si ce dernier (piqué sur le premier contrôleur qui s'est avéré être ATmega88p) avait une consommation de 0,8 μA, en tenant compte des heures, alors le premier, même dans le mode de sommeil le plus économique *, avait 25 μA ± 1,4 μA au RTC. Ce n'est pas bon. Cependant, stm32f103 n'est pas positionné comme une série économique. Je regarde le site Web de STmicroelectronics pour d'autres séries de contrôleurs et sélectionne la série stm32l1: en plus de consommer environ 1 μA, il y a aussi un capteur capacitif et un contrôleur LCD. Certes, la fréquence maximale est inférieure, seulement 36 MHz (ou 24 MHz si l'USB est utilisé), mais je vais y survivre en quelque sorte. Il a été décidé: je prends un couple de stm32l151rct6 directement à partir de 32 Ko de RAM (il y a aussi 256 Ko de flash, mais je peux à peine imaginer comment il peut être martelé. Sauf avec une merde absolument sauvage ou des fichiers de données).


  • ) ne confondez pas les modes veille (veille, arrêt) avec l'arrêt (veille)

En parallèle, je crée le programmateur st-link v2 à partir du stm32f103 de rechange, simplement parce que je suis fatigué de jouer avec BOOT0 et la puissance, et c'est plus rapide. Cependant, je quitterai la programmation UART - vous ne savez jamais quoi. Il y avait aussi un peu de chamanisme, mais rien d'exceptionnel. À moins de trouver la ligne de commande pour openocd s'est avéré être un problème. Pour les générations futures, je la quitterai:


openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c "init" -c "reset halt" -c "flash write_image erase "$(firmware).bin" 0x08000000" -c "reset run" -c "exit" 

Pour stm32l151, il est bien sûr nécessaire de corriger la cible en "target / stm32l1.cfg"


image


image


Je vais courir un peu en avance dans la chronologie, mais pas pour revenir. Messieurs, ne économisez pas sur l'épaisseur du PCB! Ou au moins ajoutez des accessoires, ou n'utilisez pas de composants smd. Il se trouve que sur la carte de programmation, je n'ai fourni que deux trous de montage à des endroits aléatoires. Et les lieux étaient assez éloignés du connecteur JTAG. Et après un certain temps, j'ai remarqué que le programmeur est instable. Cela fonctionne, alors non, puis via UART, vous devez effacer la "victime", puis la ramasser. Il s'est avéré que la résistance provenant de la sortie du contrôleur vers le connecteur s'est cassée. Il est juste tombé du bloc de contact du corps. J'ai soudé la résistance. Puis il a soudé le reste. Puis il s'est rendu compte que même cette petite déformation de la planche qui se produisait lors du collage-tirage du câble était suffisante pour les composants malheureux. En conséquence, j'ai collé une sauvegarde juste à côté du connecteur. Tout en tenant.


Comme le lecteur l'a déjà deviné, la programmation se fait également dans un éditeur de texte, tandis que la compilation et le firmware sont dans la console. Naturellement, l'achat d'une carte de débogage pour l151 ne m'a pas plus inspiré que n'importe quel IDE. Frottant les traces du râteau laissées par la première carte, je multiplie la seconde (en comptant le programmeur comme troisième, mais ce n'est toujours pas une carte de débogage). Puisque j'allais déboguer un appareil économe en énergie, j'ai besoin de me soucier de l'alimentation. Je ne changerai pas le stabilisateur 78l33, mais j'ai déchiré sa sortie avec un cavalier pour pouvoir le piquer avec un ampèremètre (j'espère tout de même pour un micro-ampèremètre, mais voilà). Laissez les peignes être les mêmes que sur la carte précédente - compatibilité! Eh bien, quelques LED et boutons, bien sûr. Le râteau avec UART1 brille de manière attrayante, mais je mets toujours son connecteur et ne le mets pas sur le front. Bien sûr, j'ai déjà JTAG, mais l'assurance ne fera pas de mal. Tout comme le précédent (et la carte de programmation aussi), il était possible de se séparer d'un côté, même s'il n'y a pas trop de cavaliers.


Mais lorsque le contrôleur a été scellé, un problème est survenu. J'ai en quelque sorte naïvement cru qu'il devrait y avoir une clé sur le corps du microcircuit indiquant la première jambe. Qui s'attendrait à ce que bien fait de ST produise DEUX clés, symétriquement. Alors de quel côté le souder maintenant? En pensant, j'ai décidé que ce n'étaient pas des clés, mais des approfondissements technologiques. On ne sait jamais, par exemple pour positionner la puce dans la fabrication. Ou appuyez sur la base pour la remplir de plastique. Ensuite, vous devez naviguer par l'inscription. Il est logique que l'inscription soit lisible si le microcircuit est positionné «standard», c'est-à-dire lorsque la première jambe est dans le coin supérieur gauche. Alors il a commencé à souder. Soit un défaut de LUT, soit des mains tordues, mais le microcircuit a été soudé de travers, je l'ai remarqué à temps avant de le souder complètement. Peu importe, il existe une ancienne méthode pour souder les mille-pattes à l'aide d'une lame de rasoir: elle n'est pas mouillée par la soudure et assez mince pour ne pas trop se plier. Il s'est avéré que les mains ne sont toujours pas assez droites, car les jambes sont pliées. Mais pas vers le haut, mais sur le côté, enfin, du moins pas très bien, et ils ont réussi à les redresser. La deuxième tentative de soudure était déjà au microscope, mais avant cela, j'ai décidé de corriger les jambes. Et l'un d'eux s'est interrompu. De quoi sont-ils faits, que vous ne pouvez pas plier-plier une fois? Les composants de sortie n'ont pas un tel problème. Eh bien, c'est tout, je pense que la puce du mariage devra en souder une autre. Mais du coup ce n'est pas une étape critique? Eh bien là, une conclusion d'ordre général, ou l'un des repas. Jusqu'à présent, je l'ai scellé sans elle, et là, on le verra. Cette fois, j'ai réussi à souder uniformément, bien que la jambe soit montée sur I2C, avec laquelle je voulais m'amuser, mais au moins pas sur des connecteurs vitaux comme USB, JTAG, UART ou BOOT. Je le connecte - cela ne fonctionne pas, les programmeurs ne voient pas la carte. Depuis quelque temps, le chaman avec des jambes à souder, mais cela n'aide pas. Un coup d'œil à la fiche technique tombe sur une photo du contrôleur situé quelque part au sous-sol du document. Voici comment vous pourriez trouver l'inscription BOKOM?! C'est-à-dire que si vous tournez le contrôleur pour que l'inscription soit lue, la première jambe sera dans le coin inférieur gauche. En cours de route, il s'est avéré que l'un des «recoins technologiques» est toujours la clé. Certes, cela n'explique pas comment le distinguer du symétrique ... Bon, au moins un indice. Je soude le contrôleur avec un sèche-cheveux de bâtiment pour ne pas casser les conclusions, et cette fois je le soude sur le côté. La sortie interrompue va exactement à la sortie TX de UART1, c'est-à-dire au connecteur de programmation et de débogage. C'est complètement mauvais, mais avant de changer le contrôleur, vous devez au moins vous assurer qu'avec l'orientation j'ai deviné que lors de la soudure pour vivre, ne le tuez pas avec une connexion incorrecte. Je connecte le programmeur - cela fonctionne. Hourra. Il reste peu de choses - soudez les connecteurs, les diodes et autres faisceaux. Les commentaires suggéraient une autre voie - faire le tour de la terre: ils sont généralement connectés à l'intérieur du boîtier et ne sont pas situés complètement symétriques. Certes, compte tenu de l'étape des conclusions, il peut être difficile de tirer les bonnes conclusions. Quoi qu'il en soit, c'est le moyen le plus fiable.


Je ne veux pas travailler avec le contrôleur sans UART1, et c'est encore pire que maintenant. Et si c'est le cas, c'est tout de même de changer, alors je décide de jouer un chirurgien et de faire du contrôleur une jambe prothétique à partir des cheveux de MGTF. Juste à portée de main se trouve une bonne colle électriquement conductrice, avec laquelle les cheveux collent de manière décisive à la plate-forme sur le corps de la puce. Cette colle qui a pénétré sur les jambes voisines est impitoyablement enlevée avec un scalpel. Et que voulez-vous entrer dans la plate-forme demi-millimètre et ne pas entrer dans les jambes saillantes adjacentes? Je vérifie - cela fonctionne. Jusqu'à ce qu'il tombe, et pour ne pas tomber plus tard, versez du cyanoacrylate.


C'est peut-être ainsi que j'aurais utilisé cette planche si la jambe n'était pas retombée. Et il est recouvert de colle. Cependant, il est assez doux et coupé avec un scalpel, il est donc nettoyé avec succès. Mais pour une raison quelconque, je ne veux pas utiliser le même adhésif électriquement conducteur pour la deuxième fois. Je vais essayer de souder la jambe. La pointe habituelle du fer à souder ne s'y glissa pas, mais le cône était inclus dans le kit (en fait, le cône était à l'origine le seul, mais en raison de son inconvénient évident, il a été remplacé par celui habituel, avec un affûtage en forme de coin), qui s'y glisse complètement. Curieusement, «l'opération de transplantation» a réussi et la jambe a fonctionné comme il se doit (une photo rapprochée de la jambe sur KDPV).


image


image


Donc, le fer est prêt, il est temps de passer au code. Ce serait bien de trouver un exemple prêt à l'emploi sous gcc et la bibliothèque CMSIS. Quoi de mieux pour cela que le site officiel du fabricant? Il s'est avéré que STmicroelectronics ne partage pas mon optimisme. Le fait que la navigation sur le site se fasse à travers un lieu indécent est déjà familier, il est désormais difficile de trouver un site fait par des personnes pour des personnes. Mais ils ne permettent rien de télécharger depuis le site! Peut-être qu’ils l’autoriseraient après l’inscription, mais avant cela, je n’avais pas envie de m’inscrire quelque part, et après une telle attitude envers les développeurs, encore plus. Pourquoi diable avez-vous besoin de mon courrier ou que demandez-vous là-bas? Collecter des données personnelles, envoyer du spam? Traversez la forêt et je la trouverai dans le domaine public! Soit dit en passant, j'ai été un peu surpris que le package correspondant ne soit pas dans le référentiel, mais peut-être que ST a proposé une sorte d'hémorroïdes sous licence. Par conséquent, j'envoie les rayons de la diarrhée aux commerçants qui ont mis au point une telle politique, et pour un site inconfortable aussi.


Quoi qu'il en soit, la bibliothèque a été parfaitement trouvée sur Internet (je ne donnerai aucun lien, on ne sait jamais ce qu'il adviendra du site). Une alternative est de télécharger l'environnement de développement ou CubeMX, où ces bibliothèques sont intégrées. Il est vrai que les télécharger à partir du site officiel est tout aussi impossible, nous examinons donc les logiciels tiers et les installons sur une machine virtuelle, au cas où «si quelque chose se passait».


Nous avons compris le fer et les sortes aussi. Il est enfin temps de traiter avec le contrôleur. La première surprise attendait en essayant d'utiliser du code tiers sous Discovery. Ils ont utilisé le contrôleur stm32l152, qui à première vue est presque le même que le stm32l151 que j'ai installé. En plus des différences mineures, il s'est avéré que le module LCD n'était pas installé dans le contrôleur "my". Un peu décevant, mais je n'avais toujours pas prévu de l'utiliser. Bien qu'une telle différence aurait pu être plus clairement distinguée qu'une note de bas de page dans la fiche technique. Par ailleurs, dans une fiche technique, il est recommandé dans ce cas de connecter la broche VLCD à l'alimentation, sur ma photo la résistance 0 ohm correspondante n'est pas soudée, mais en réalité je l'ai installée. Sans cela, cela fonctionne aussi, mais ne surchargez pas les connexions internes. Le comportement de l'horloge temps réel s'est révélé plus intéressant. Ils ne voulaient pas obstinément travailler, et sur Internet ils écrivent simplement "fais-le, fais-le, ça marche". Mais ça ne marche pas. Dans certains endroits, cependant, il a été fait mention de «problèmes connus avec RTC dans cette série». Quoi qu'il en soit, la montre est toujours enroulée, mais uniquement sur le générateur RC intégré. Les tentatives de verrouillage du quartz d'horloge ont conduit à l'attente sans fin du bit de préparation LSE. J'ai essayé de vérifier si les jambes du microcircuit étaient tombées des pistes de la carte et les ai tirées en mode GPIO normal. Le quartz à haute fréquence est tombé. WTF?! En général, ces deux quartz ne veulent pas travailler ensemble, mais au moins séparément ils fonctionnent à tout le moins.


Et puis j'ai deviné: la superglue, qui était remplie de la moitié du contrôleur (c'est liquide, vous ne pouvez pas l'appliquer avec précision, et qui aurait pensé ...) donne une fuite et du quartz interfère avec leurs pointes. Eh bien, ce n'est pas difficile de gratter la colle de l'extérieur, mais après tout, elle est engourdie même sous le fond de la puce. Et s'il y a suffisamment de fuites pour le quartz, cela affectera la consommation. Je regarde dans Google, que les gens enlèvent le cyanoacrylate. Il offre de l'eau chaude (quoi ???) et du diméthylsulfoxyde. Je ne crois pas à l'eau chaude, alors j'achète du DMSO. Après plus d'une heure de découverte d'une goutte de produit chimique à la surface de la colle, je n'ai pas remarqué la différence. Mais ils ont remarqué du quartz et ont commencé à travailler plus ou moins normalement (je me demande pourquoi? Dimexide a remplacé l'humidité absorbée par la colle?). Cependant, cela ne m'a pas convaincu, et les restes de colle sont toujours une horreur ... pour rien qui sont sur le dessous de la planche et ne sont pas particulièrement visibles. Soit dit en passant, l'eau chaude que j'ai lavée avec du dimexide n'a pas affecté la colle (je ne suis pas surpris). J'ai découvert qu'il existe un dissolvant de colle, dans le même tube que la colle elle-même, uniquement en violet. Eh bien, au moins ça devrait marcher! Il s'est avéré que cela peut fonctionner et fonctionne, mais sa consistance ressemble à de la crème sure et ne tient tout simplement pas sous le microcircuit. Eh bien, à quoi ça sert, gomme?! Dehors, je peux le nettoyer. Dernière chance: l'acétone est rarement mentionnée. J'ai un peu peur pour les pièces en plastique, mais juste les remplacer est facile. Je verse de l'acétone dans un bocal en verre, j'y jette une planche et je la laisse toute la nuit. Le lendemain matin, il s'est avéré que l'acétone fonctionne vraiment, et comment! Il n'y avait aucune trace de colle. De plus, le poussoir de l'un des boutons s'est dissous. Fait intéressant, le second survivant, probablement, était en plastique plus stable. J'ai été un peu surpris que l'autre plastique soit resté intact, même les inscriptions ont survécu. Eh bien, excellent, mais le bouton peut être remplacé.


Nous avons maintenant réussi à lancer RTC à partir du quartz de la montre, à toucher le mode veille et à communiquer avec d'autres périphériques. Et aussi, pour qu'il soit complètement timide, il a apposé des signatures sur le tableau. Mais pas avec un marqueur (soudain se baigner à nouveau dans des solvants?) Mais gratté avec un scalpel. Pendant des siècles!


Eh bien, pour les générations futures, je vais laisser des exemples de code pour les deux contrôleurs, ainsi que des bibliothèques, des makefiles, etc. Il ne reste plus qu'à installer gcc-arm-none-eabi, openocd, stm32flash et autres bagatelles.
stm32f103
stm32l151


Dans les commentaires, il leur a été conseillé à plusieurs reprises de ne pas faire de LUT et de commander la fabrication de planches à des professionnels. Pour le prototypage, comme ici - je ne vois aucune raison. Une autre chose est si vous avez besoin d'une carte multicouche, ou d'une étape encore plus petite, ou d'un boîtier BGA, ou de quelque chose d'autre qui est difficile à faire à la maison. Et, bien sûr, dans la fabrication de la version finale de l'appareil et la réplication. Ce n'est pas bon si le client démonte le boîtier soudé à partir de PCB, et il découvrira une planche sciée tordue sans masque et avec des cavaliers de MGTF.


Conclusions:


  1. Vous pouvez faire des tableaux de débogage pour vous-même si vous le souhaitez, ils ne sont pas pires que ceux achetés. Mais le programmeur de débogueur est toujours préférable d'acheter s'il n'est pas trop cher. Bien sûr, vous pouvez le faire, mais vous ne changerez pas le schéma, et si c'est le cas, ce ne sera pas mieux que l'achat. Moins cher, très probablement aussi. Sauf si le contrôleur superflu reste ou avec un problème de livraison.
  2. N'oubliez pas le connecteur de programmation de sauvegarde UART1, eh bien, en même temps, les cavaliers BOOT0, BOOT1. En plus de la programmation proprement dite, il est très pratique de déboguer un programme en utilisant UART.
  3. Il y a deux clés sur le boîtier LQFP64, dont l'une est fausse. Vous devrez naviguer jusqu'à l'inscription afin de regarder avec vos pieds vers la gauche.
  4. Le soudage des composants avec une petite étape se fait uniquement au microscope. Sinon, il est difficile de déterminer si tout a disparu et s'il y a "morve". Eh bien, que ce soit sur un équipement "professionnel" comme un sèche-cheveux spécial, de la pâte à souder, etc. Je ne sais pas ici, j'écris sur la technologie amateur.
  5. N'économisez pas sur l'épaisseur du PCB. Il se plie et cela peut être suffisant pour endommager les résistances CMS et, probablement, les condensateurs. Cela ne fait pas peur à la sortie, et les composants aux conclusions courbées (transistors, microcircuits) survivront probablement.
  6. La fabrication de connecteurs pour le quartz est une perte de temps. Vous ne les changerez pas, alors soudez simplement sur la carte.
  7. Boire un mille-pattes avec une lame de rasoir n'est possible que dans les cas les plus extrêmes, lorsqu'il n'y a pas de sèche-cheveux. Sinon, le risque de l'endommager est trop grand.
  8. Même si la jambe est tombée du microcircuit, elle peut être restaurée! Même lorsque le pas est de 0,5 mm. L'essentiel est d'utiliser de la soudure, pas de la colle conductrice.
  9. Ne remplissez jamais la puce avec de la colle cyanoacrylate (super glue)! Il n'a pas les caractéristiques électriques, voire mécaniques, appropriées.
  10. L'acétone est mieux adaptée pour éliminer la superglue des zones difficiles à atteindre. Il se dissout complètement. L'essentiel est de s'assurer que les composants environnants ne sont pas affectés. Des endroits non difficiles d'accès peuvent être retirés mécaniquement.

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


All Articles