STM32 Chapitre 2 - processus de démarrage détaillé

STM32 processus de démarrage, les moyens de traitement d'initialisation exécute la première instruction démarre de remise à zéro (fichier compilé) à partir de la CPU pour entrer dans la fonction principale du programme de C entre une partie d'entrée (). Le processus de démarrage est encore relativement importante, bien que difficile, mais doit comprendre.

1. Les différentes séries de différents code de démarrage puce.
2. Démarrer le processus se fait principalement:
Insérer ici l'image Description
3. Ouvrez votre projet, double-cliquez sur le fichier de projet. .Out fichier sortira pour voir la liste de vecteur d' interruption correspondant stocké dans la mémoire flash interne.
Insérer ici l'image Description
Insérer ici l'image Description
4. La séquence remise à zéro
après la réinitialisation matérielle, après que l'interrupteur de réinitialisation. Circuit logique séquentiel à l'intérieur de l'unité CPU exécute d' abord l'opération suivante de deux (codes de programme , par exemple , à flash interne, flash première adresse 0x0800 0000)

  • L'adresse de position de stockage 0x08000000 stockée dans la pile SP dans la pile (MSP).
  • L'adresse de vecteur de position de stockage 0x08000004 dans le compteur de programme PC.
    Retirer de l'adresse physique des points de registre CPU PC à la première instruction de l'exécution du programme, qui est le début d'une Reset_Handler de routine de service d' interruption remise à zéro. Enlever routine de service d' interruption appelle la fonction SystemInit () pour régler l'horloge du système disposé de bus SRAM / SDRAM externe sur le FMC, puis sauter à la bibliothèque de fonctions C __main. Fait par les fonctions de la bibliothèque C __main initialisation du programme utilisateur (par exemple: valeurs initiales variables, etc.), le dernier appel des fonctions écrites par l' utilisateur __main par la fonction main () commence à exécuter le programme C.

Avant d'apprendre le fichier de démarrage premier aperçu des instructions en langage assembleur.
ARM fichiers instructions d'assemblage résumé

Analyse de code spécifique

La première partie de l'analyse de code du
code suivant implémente ouvert pile (Stack) espace pour les variables locales, les appels de fonction, les paramètres de la fonction.

pile d'action pour les variables locales, les appels de fonction, et donc le paramètre de fonction de coût, la taille de la pile ne peut pas dépasser la taille de la SRAM interne. Si la programmation est relativement importante, un grand nombre de variables locales définies, alors vous devez modifier la taille de la pile. Si un jour, vous écrivez le programme semblait étrange erreur inexplicable, et entre un défaut de mal, alors la prochaine fois que vous devez examiner si la pile ou non est pas assez grand, débordait.
Insérer ici l'image Description
Ligne 7. : Directive EQU est une définition de macro, similaire à la #define en langage C . Directive , on entend la « instruction » ne génère pas un code binaire, il ne causera pas l' allocation d'espace variable. 0x00008000 exprimé taille de la pile, faites attention ici est en octets. 0x00008000 = 32768 octets = 32Ko

Ligne 8 : un espace ouvert de données lire et écrire, segments nom Empiler alignés sur 8 octets. directive ARER indique commencera à définir un segment de code ou d'un segment de données. Voici la définition du segment de données. ARER après le mot - clé indique que le segment de la propriété.

  • STACK: représente le nom de cette section, vous pouvez être nommé.
  • NOINIT: Indique le segment de données initial pas besoin de remplir.
  • READWRITE: Cette section représente une lecture et écriture.
  • ALIGN = 3: 3 représente la première adresse conformément à la puissance alignés de deux, à savoir selon l'alignement de 8 octets (adresse à 8 I égal à 0 logarithmiquement).

Ligne 9. : SPACE dire la ligne d'instructions assembleur 0x00000800 octets répartis dans les secteurs de l' espace mémoire contigus STACK.

Ligne 10 : __initial_sp immédiatement placé instruction SPACE indiquant la partie supérieure de l'adresse de la pile. __initial_sp juste une étiquette, une étiquette est principalement utilisé pour indiquer un emplacement de l' espace de mémoire, ce qui équivaut à « adresse » le concept du langage C. Le simple fait indique une adresse de position espace mémoire, du point de vue de la langue C, l'adresse de la variable, ou une fonction de l'adresse d'entrée du tableau d'adresse ne diffère pas dans la nature.

La seconde partie de l'analyse de code de
code suivant implémente ouvert de l' espace tas (tas) , est principalement utilisé pour l' allocation dynamique de mémoire, en fonction de la répartition spatiale de la variable malloc, calloc, realloc et analogues sont sur le tas.
Insérer ici l'image Description
Ces lignes et la première partie de l'instruction de code similaire à ce qui précède. Allouer un espace mémoire contigu pour le nom de segment de section, qui est attribuée un espace tas. taille Heap est 0x00000400, qui est de 1024 octets = 1 Ko.
__heap_base adresse de départ du tas.
__heap_limit indique l'adresse de fin du tas.

analyse de code de la partie 3
Insérer ici l'image Description
, ligne 24 : PRESERVE8 pour le fichier en cours de maintien de la pile 8 octets alignés .
Ligne 25 : indique que l'instruction suivante est un ensemble de POUCE POUCE, CM4 est utilisé POUCE - 2 jeu d'instructions.
Ligne 29 : ZONE définir un segment de code, en lecture seule nom du segment est remis à zéro. READONLY pour lecture seule, la section de code par défaut dit.
30-32 lignes : 3 lignes de déclaration EXPORT trois étiquettes peuvent être déclarées comme des références externes, principalement à l'éditeur de liens utilisé pour les fichiers de bibliothèque de liens ou d' autres documents. Lorsque le noyau en réponse à l' apparition d'une anomalie, la routine de service d'exception (ESR) correspondante sera exécutée. Afin de déterminer l'ESR adresse d'entrée, les utilisations du noyau - ‖ mécanisme de table vecteur. Ici , l'utilisation d'une table de vecteur. La table de vecteurs est en fait un réseau, correspondant chacun à un index inhabituel mot (32 bits entiers), le plus faible est la valeur de l'entrée standard ESR d'élément de l'
adresse. La table vectorielle dans les emplacements d'espace d'adressage peut être configuré pour indiquer au NVIC par un registre déplacement
adresse échelle. Après la réinitialisation, ce registre est égal à zéro. Ainsi, l' adresse 0 ( à savoir, l' adresse FLASH 0), le paquet doit
contenir une table de vecteur, une anomalie à l'affectation initiale. Notez que là , il y a une alternative: pas un type 0
adresse d'entrée, mais donne la valeur initiale du MSP après la réinitialisation.

l' analyse du code partie 4
Insérer ici l'image Description
Tableau vecteur
ci - dessus , ce code est d'établir la table des vecteurs d' interruption, la table des vecteurs d' interruption est positionné dans la partie avant du code. adresse physique particulière est déterminée par liaison des paramètres de configuration (adresse IROM1). Si le programme fonctionne en Flash, la table vecteur d' interruption adresse de départ est 0x08000000. Dans l' exemple MDK, est une option de configuration:
Insérer ici l'image Description
la DCD représente une allocation d'espace de 4 octets. Chaque ligne DCD génère un code binaire de 4 octets. Table de vecteur d' interruption
stocké dans l'adresse d'entrée est en fait la routine de service d' interruption. Quand une exception (qui est, un événement d' interruption) se produit, unité centrale de traitement d' interruption système définit l'adresse d'entrée appropriée affectée au compteur programme PC, puis a commencé à exécuter la routine de service d' interruption.

Partie 5 Analyse de code de la
Insérer ici l'image Description
ligne 53 est : une définition des segments de code régional, en lecture seule nom de segment est .text. READONLY pour lecture seule.
Ligne 56 : en utilisant PROC, ENDP la directive de ce bloc est divisée en une pluralité de processus, de sorte que la structure du programme en plus clair.
57e ligne : FAIBLES d' autres déclarations de la même étiquette de nom l' emporte sur l'étiquette est référencée, qui est si l'extérieur est déclarée, il appelle. Cette déclaration est importante car elle nous permet d'être placés partout dans la routine de service d' interruption dans le fichier C, tant que le nom de la fonction C et de cohérence au nom de la table de vecteur.
Ligne 58 : IMPORT: numéro de référence utilisé pour informer la directive du compilateur à utiliser est défini dans d'autres fichiers source. Mais pour citer dans le fichier source de courant, et quel que soit le fichier source de courant est référencé étiquette, l'étiquette sera ajoutée à la table des symboles du fichier source de courant.
Ligne 61 est : SystemInit () est une fonction de bibliothèque standard, dans la définition générale system_stm32f4xx.c cette bibliothèque. Une fois le rôle principal est de définir l'appel d'horloge du système cette fonction ici, F429 fonction d'horloge de système est configuré pour 180M.
ligne 63: __ principales références numériques d'entrée représentent l' adresse C / C ++ fonctions de la bibliothèque standard dans un sous - programme d'initialisation en temps réel à __main. Un rôle majeur de ce programme est d'initialiser la pile et initialiser le fichier d'image, et enfin passer à la fonction principale dans un programme C. Ceci explique pourquoi tout le programme C doit avoir une fonction principale en tant que point de départ du programme. Parce qu'il est réglementé par la bibliothèque standard C / C de en temps réel, et ne peut être changé. Si nous ne sommes pas ici pour appeler __main, le programme en fin de compte n'appeler notre fichier C à l' intérieur de la principale, si elle est méchant utilisateurs peuvent changer le nom de la fonction principale, alors il vous importons écrivez le nom de la fonction principale. Cette fois -ci que vous écrivez dans les fichiers C à l' intérieur du nom de la fonction principale est pas la principale, mais le __main.
LDR, BLX, instruction BX est noyau CM4:
La commande du noyau

analyse de code partie 6
Insérer ici l'image Description
, ligne 71 : boucle infinie, où les utilisateurs peuvent mettre en œuvre votre propre routine de service d' interruption. Mais peu ici se rendre compte de la routine de service d' interruption, et plus généralement du même nom est une routine de service d' interruption re-écriture dans d' autres fichiers C à l' intérieur, car il est faible SEMAINE définie. Si vous n'écrivez pas de programme serveur d' interruption dans un autre fichier, et cette interruption est activée, entrez ici, le programme coincé dans cet endroit.
Ligne 81 : routine de service d' interruption par défaut (début)
ligne 92: boucle infinie, si l'utilisateur permet la routine de service d' interruption, mais n'a pas écrit de routine de service d' interruption dans le fichier C qui alors entrera ici. Par exemple, dans un programme qui a permis au port série 1 d' interruption, mais ne pas écrire un ART1_IRQHandle de routine de service d' interruption, puis l'interruption du port série, et entrera dans cette boucle sans fin.
Ligne 94 : routine d'interruption de service par défaut (fin).

analyse du code de la partie 7
dernière partie du code de démarrage: Insérer ici l'image Description
Ligne 101 : langage assembleur simple SI ...... ............ .ELSE instruction. Si vous définissez MICROLIB, le programme ne sera pas exécuter le code branche ELSE. __MICROLIB et nous ne connaissent pas bien, il est mis à l'intérieur Option MDK cible.
Insérer ici l'image Description
Outsider, cette étape est un travail de configuration est très important, beaucoup de gens ne prendront pas la fonction série printf, le compilateur a des problèmes, des problèmes de téléchargement, ce sont les mauvaises étapes de configuration. Cible sélectionnée dans le micro-bibliothèque « Use MicroLib », de même que dans la préparation du pilote d'avenir du port série peut utiliser la fonction printf. Et certaines applications si l'unité à virgule flottante FPU STM32, il faut aussi la bibliothèque micro ouverte, ou parfois toutes sortes de phénomènes étranges. FPU options de configuration de commutation sous les options de la micro-bibliothèque « Utilisation unique de précision », la valeur par défaut est activée.

Publié 33 articles originaux · louange gagné 21 · vues 8914

Je suppose que tu aimes

Origine blog.csdn.net/qq_39400113/article/details/105056538
conseillé
Classement