Je travaille avec un STM32F2 (en particulier, le STM32F217IGH6 sur une carte de développement) depuis environ deux mois. De loin, mon plus gros problème était lié à la "configuration", qui comprend le makefile, le script de l'éditeur de liens et le fichier de démarrage.
En particulier, je n'ai pas pu configurer correctement ma table de vecteurs d'interruption et j'ai appelé des gestionnaires d'interruption. ST fournit des exemples adaptés aux IDE commerciaux. Au lieu de cela, j'utilise la recompilation gratuite Yagarto de la chaîne d'outils GCC (et OpenOCD pour charger l'image via JTAG).
Existe-t-il des exemples de projets pour ma carte (ou un proche parent) qui contiennent le makefile, le script de l'éditeur de liens et la combinaison de fichiers de démarrage appropriés pour les IDE non commerciaux qui sont configurés pour appeler les gestionnaires d'interruption?
Réponses:
http://github.com/dwelch67
stm32f4 et stm32vld en particulier, mais les autres peuvent également vous être utiles. mbed et le répertoire mzero sous mbed (cortex-m0).
J'aime l'approche simple et stupide, les scripts de l'éditeur de liens minimaux, le code de démarrage minimal, etc. Le travail est effectué par le code et non par une chaîne d'outils particulière.
La plupart des formes de gcc et binutils (capables de fonctionner avec le pouce) fonctionneront quelque peu avec ces exemples car j'utilise le compilateur pour compiler non pas comme une ressource pour les appels de bibliothèque, je n'utilise pas les scripts de l'éditeur de liens, etc. Les anciens gcc et binutils ne seront pas au courant les parties plus récentes de thumb2, certaines modifications peuvent donc être nécessaires.
Je construis mes propres gcc, binutils et llvm / clang ainsi que l'utilisation de codesourcery par exemple (maintenant le mentor graphique mais vous pouvez toujours obtenir la version gratuite / lite).
Lorsque vous commencez à monter un projet pour une nouvelle cible, vous devez faire un démontage. En particulier pour vous assurer que les éléments sont là où vous les voulez, la table vectorielle par exemple.
Regardez stm32f4d / blinker02 par exemple. Il commence par vectors.s la table exception / vector plus quelques routines de support asm:
Aucune interruption sur cet exemple, mais les autres choses dont vous avez besoin sont ici.
blinker02.c contient le corps principal du code C avec le point d'entrée C que j'appelle notmain () pour éviter de l'appeler main (certains compilateurs ajoutent du courrier indésirable à votre binaire lorsque vous avez un main ()).
vous épargnera un couper-coller. le makefile raconte l'histoire de la compilation et de la liaison. Notez qu'un certain nombre de mes exemples compilent deux binaires ou plus à partir du même code. compilateur gcc, compilateur clang de llvm, pouce seulement et pouce2, différentes optimisations, etc.
Commencez par créer des fichiers objets à partir des fichiers source.
l'éditeur de liens, ld, utilise un script de l'éditeur de liens que j'appelle memmap, ceux-ci peuvent être extrêmement douloureux, parfois pour une bonne raison, parfois non. Je préfère le moins, c'est plus l'approche de la taille unique, tout sauf l'approche de l'évier de cuisine.
Je n'utilise pas .data généralement (enfin presque jamais) et cet exemple n'a pas besoin de .bss alors voici le script de l'éditeur de liens, juste assez pour placer le programme (.text) où il doit être pour ce processeur comme je suis En l'utilisant.
J'ai une région de mémoire pour définir cela, il n'y a rien de spécial à propos du nom ram que vous pouvez appeler foo ou bar ou bob ou ted, cela n'a pas d'importance, il relie simplement les éléments de mémoire aux sections. Les sections définissent des éléments tels que .text, .data, .bss, .rodata et leur emplacement dans la carte mémoire.
quand vous construisez ceci, vous voyez que je démonte tout (objdump -D) vous voyez ceci
L'élément clé à noter est l'adresse à gauche est l'endroit où nous le voulions, le code de vectors.s est le premier dans le binaire dans le binaire dans l'ordre où ils se trouvent sur la ligne de commande ld). Pour démarrer correctement, vous devez vous assurer que votre table vectorielle est au bon endroit. Le premier élément est mon adresse de pile, c'est très bien. Le deuxième élément est l'adresse de _start et il doit s'agir d'un nombre impair. l'utilisation de .thumb_func avant une étiquette provoque cela, vous n'avez donc pas à faire d'autres choses laides.
ainsi 0x08000051 et 0x08000057 sont les entrées vectorielles appropriées pour _start et hang. démarrer les appels notmain ()
Cela semble bon (ils ne montrent pas l'adresse numérotée impaire dans le démontage).
Tout est bien.
Passez à l'exemple blinker05, celui-ci prend en charge les interruptions. et a besoin de RAM, donc .bss est défini.
rappelez-vous que ram et rom sont des noms arbitraires, bob et ted, foo et bar fonctionnent tous très bien.
Ne va pas montrer l'ensemble des vecteurs.s parce que le cortex-m3 a un zillion d'entrées dans la table vectorielle si vous en faites une complète (varie d'un cœur à l'autre et peut-être dans le même cœur en fonction des options choisies par le fournisseur de puces) Les parties pertinentes sont ici après le démontage:
prend quelques essais et erreurs pour placer ce gestionnaire exactement au bon endroit, vérifiez avec votre puce où il doit être, il n'est pas nécessairement au même endroit que celui-ci, et avec autant d'interruptions, vous cherchez peut-être une interruption différente de toute façon. les processeurs cortex-m, contrairement aux bras normaux, font en sorte que vous n'avez PAS BESOIN de code de trampoline pour les interruptions, ils préservent un certain nombre de registres et gèrent la commutation des modes de processeur via le contenu du registre de liens. tant que le matériel et l'abi du compilateur sont suffisamment proches, tout fonctionne. Dans ce cas, j'ai fait le gestionnaire en C, contrairement aux autres plates-formes et au passé, vous n'avez pas besoin de faire quoi que ce soit de spécial avec le compilateur / la syntaxe, faites simplement une fonction (mais ne faites pas de choses stupides dans la fonction / le gestionnaire)
Le makefile pour blinker05 devrait ressembler à l'exemple de blinker02, principalement couper et coller pour la plupart d'entre eux. transformer les fichiers source individuels en objets puis lier. Je construis pour thumb, thumb2 en utilisant gcc et clang. vous pouvez changer la ligne all: à la fois pour n'inclure les éléments gcc que si vous n'avez pas / voulez que clang (llvm) soit impliqué. J'utilise des binutils pour assembler et relier la sortie clang btw.
Tous ces projets utilisent des outils gratuits, prêts à l'emploi et open source. pas d'IDE, ligne de commande uniquement. Oui, je ne plaisante qu'avec Linux et non avec Windows, mais ces outils sont également disponibles pour les utilisateurs de Windows, changent des choses comme rm -f quelque chose en del quelque chose dans le makefile, des choses comme ça lors de la construction sur Windows. Cela ou exécutez linux sur vmware ou virtualbox ou qemu. Ne pas utiliser un IDE signifie que vous choisissez également votre éditeur de texte, je ne m'y attarderai pas, j'ai mes favoris. Notez qu'une caractéristique extrêmement ennuyeuse du programme make gnu est qu'il nécessite de réels onglets dans le makefile, je déteste les onglets invisibles avec passion. Donc, un éditeur de texte pour les makefiles qui laisse des onglets, l'autre pour le code source qui crée des espaces. Je ne connais pas les fenêtres,
J'espère que cela aide, ce n'est pas la puce / carte exacte mais un cortex-m4 bien m4 pas m3, assez proche pour cette discussion. voir le répertoire mbed ou stm32vld pour un cortex-m3 réel (pas assez de différences par rapport au m4 pour les makefiles et le code de démarrage, etc.), mais pas fait par st. Les noyaux du cortex-m3 devraient être les mêmes d'un fournisseur à l'autre, le cortex-m3 et le cortex-m4 sont tous deux ARMv7m et sont plus proches que différents. Le cortex-m0 est un ARMv6m, a à peine assez d'instructions pour le pouce2, les compilateurs ne l'ont pas rattrapé alors utilisez simplement le pouce (faites comme si vous construisiez pour un ARMv4T (pouce seulement) si besoin est). Mon simulateur de pouce est uniquement le pouce, pas le pouce2, il pourrait aussi vous être utile, je pense que je l'ai fait effectuer des interruptions d'une manière ou d'une autre.
la source
Vous pouvez jeter un oeil à ce site où il essaie d'expliquer les bases de l'éditeur de liens et low_level_init dans le code.
Veuillez noter que la page se concentre sur la description du problème, donc le vecteur nvic est plutôt minimal.
Ensuite, vous avez des exemples plus complets dans la "bibliothèque de périphériques standard STM32F2xx", il suffit de regarder dans les sections gcc (car Yagarto est basé sur gcc). Et il y a un exemple de code qui vous aidera à configurer correctement le nvic (table de vecteur d'interruption).
Donc, même si ce n'est pas une réponse complète, j'espère que cela sera utile de toute façon.
la source