IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Embarqué Discussion :

STM32L4 blink led [STM32]


Sujet :

Embarqué

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 1
    Par défaut STM32L4 blink led
    Salut ,

    Je debute la programmation du STM32 (STM32L476 RG) et je voulais apprendre a utiliser les registres donc j'ai fait un petit code mais quand j'essai sur le microcontrolleur ca ne marche pas donc je voulais savoir qu'est ce que je dois modifier pour que ca marche .

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
    #include "stm32l4xx.h"
     
     
    int main(void)
    {
    volatile unsigned int i =0;
    RCC -> AHB2ENR|= 1<<0;
    GPIOA->MODER |= 1 << 10;
    while(1)
    {for (i= 0; i < 50000; i++)
    	GPIOA -> BSRR= (1<<5);
    for (i = 0; i < 50000; i++)
    	GPIOA -> BSRR= (1<<21);}
     
    }

    la user led est connecte au PA5 et j'utilise atollic Truestudio


    Merci

  2. #2
    Candidat au Club
    Homme Profil pro
    Frigoriste
    Inscrit en
    Novembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Frigoriste
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2014
    Messages : 4
    Par défaut
    Salut Alakaab,

    J’ai la même carte que toi et je tourne sur éclipse, si tu as trouvé comment faire pour faire clignoter la led ou bien si tu as des bons Tutos je suis preneur.

    Merci d’avance.

  3. #3
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 256
    Par défaut
    Salut,
    C'est surprenant car je viens de regarder la doc du STM32L476 RG et le code tout en haut du message me semble correcte.

    Tu peux essayer le code ci dessous et me dire si ça fonctionne ? Je n'ai pas eu le temps de le tester ce soir, j'essai demain mais faut que je regarde si j'ai le même micro chez moi. J'ai un STM32F303 ça c'est sur mais un L4xx ?

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include "stm32l4xx.h"
     
    int main(void)
    {
       unsigned int i =0;
     
       /* Activation de l'horloge du périphérique GPIOA */
       RCC->AHB2ENR |= 1 << 0;
     
       /* PA5 en sortie classique */
       GPIOA->MODER |= 1 << 10;
     
       while(1)
       {
          for (i= 0; i < 500000; i++)
    	GPIOA->ODR = (1 << 5); /* PA5 à 1 */
          for (i = 0; i < 500000; i++)
    	GPIOA->ODR = (0 << 5); /* PA5 à 0 */
       }
    }

  4. #4
    Candidat au Club
    Homme Profil pro
    Frigoriste
    Inscrit en
    Novembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Frigoriste
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2014
    Messages : 4
    Par défaut
    Salut Vincent,

    Merci pour ta réponse,
    Je viens de tester le code que tu m'a proposé, j'ai posté une video sur le net :

    La LED ne s'allume pas, je voudrais savoir qu'est ce qu'il faut repérer sur la "datasheet" comme info pour allumer la LED .

    J'ai compris qu'il fallait activer l'horloge RCC avec "AHB2ENR", activer le registre GPIOA avec "MODER" puis mettre le Pin 5 du GPIOA sur "HIGH" avec "ODR".
    Mais je n'arrive pas à bien interpréter ce qu'il y a entre les parenthèses.
    Y'a t-il autre chose à paramétrer comme la fréquence de l'horloge ?

    Merci encore.

    ps : Le code en commentaire c'est ce que j'avais testé avant de poster.

  5. #5
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 661
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 661
    Par défaut
    Bonjour,

    ma remarque peut sembler déplacée, mais est-ce que ta LED est correctement câblée ? Tu ne l'as pas mise à l'envers par hasard ? La valeur de sa résistance est correcte ?

  6. #6
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 256
    Par défaut
    Salut,
    Très bonne question Auteur !!!
    Et rassure moi, on est bien entrain de parler d'une carte Nucléo avec la LED sur PA5 ? C'est ce que j'avais en tête en lisant le premier message. On ne parle pas d'une carte Discovery ? Sinon les LED ne sont peut être pas du tout aux mêmes endroits.

    C'est bien cette carte ci-dessous que tu as ?

    Nom : en.nucleo-Lx.jpg
Affichages : 3357
Taille : 157,4 Ko

    ***********************************************

    Sur ta vidéo ça a l'air de fonctionner, je vois bien le registre Output Data Register passer à 1 et j'imagine qu'il a du passer à 0 si la vidéo avait été plus loin (peut être en mettant un point d'arrêt sur cette ligne GPIOA->ODR = (0 << 5); /* PA5 à 0 */ et en regardant l'état des registres comme tu le fais.) Ce soir je ferai un essai sur une de mes cartes Nucléo, je n'aurai peut être pas la même que toi mais je regarderai si je n'ai pas un microcontrôleur proche du STM32L4xx. Ça fait un petit moment que je n'ai pas touché à un micro ARM mais je ne vois pas ce que j'ai oublié.

    ***********************************************

    Citation Envoyé par ziyad88
    Mais je n'arrive pas à bien interpréter ce qu'il y a entre les parenthèses.
    Si tu parles de ça GPIOA->ODR = (0 << 5); c'est juste un 0 que je décale 5x vers la gauche dans le registre. Ce qui revient à mettre le bit 5 du registre à 0. Si j'écris par exemple GPIOA->ODR = (1 << 21);, je décale 21 fois un bit à 1 dans le registre, ce qui revient à mettre le bit 21 à 1. Personnellement je n'aime pas ce style d'écriture, j'ai fais comme ça parce que j'ai repris le programme initial du premier message.


    ***********************************************

    Pour te repérer dans les docs de chez ST, c'est comme chez Texas Instruments, il te faut deux choses :
    - La datasheet (organisation interne du micro, les spécs électriques, etc...) https://www.st.com/resource/en/datas...tm32l476rg.pdf
    - Le reference manual (fonctionnement détaillé de chaque périphérique et des registres associés) https://www.st.com/resource/en/refer...dm00083560.pdf

    Il faut jongler avec les deux !

    Sur les microcontrôleurs 8 et 16 bits propriétaire (MSP430, ATMEL, PIC, etc) on configure les périphériques et c'est partie mais sur ARM il ne faut pas oublier d'activer en plus, et de régler au besoin, l'horloge du périphérique et pour ça il faut savoir sur quel bus d'horloge est connecté le dit périphérique. Datasheet page 17

    Nom : arm1.PNG
Affichages : 3273
Taille : 39,9 Ko

    Le PORTA est connecté sur le bus d'horloge AHB2, note qu'il y a plusieurs bus d'horloge, AHB1, APB1 et APB2 certains bus sont limités en vitesse (ce n'est pas le cas sur ce microcontrôleur) il y a des ponts et des réglages possibles pour permettre des ajustements très fins surtout en terme de consommation puisque plus ça tourne lentement et moins ça consomme.

    Maintenant, il faut aller voir dans le Reference Manual, ce qu'on nous raconte à propose du bus AHB2. Si tu regardes l'image ci dessous tu peux voir que AHB2 est un registre classé dans la fonctionnalité RCC (Reset and Clock Control) d'où le pointeur RCC->AHB2xxx et ce registre AHB2 être "enable" (AHB2ENR) ou "reset" (AHB2RSTR). C'est toujours intéressant d'aller lire ce que fait la fonctionnalité RCC.

    Nom : arm2.PNG
Affichages : 3274
Taille : 48,3 Ko

    Et ci-dessous, on voit qu'il suffit de mettre le bit 0 du registre à 1 pour activer l'horloge du port A (voir la page 252 que je ne mets pas ici.) La doc précise l'utilité de chaque bit de chaque registre.

    Nom : arm3.PNG
Affichages : 3220
Taille : 49,4 Ko

    Concernant le registre 32bits MODER de la fonctionnalité GPIOA, il s'agit de mettre le bit 10 à 1

    Nom : arm4.PNG
Affichages : 3235
Taille : 22,8 Ko

    Et enfin on met à 1 ou à 0 le bit de PA5 via le registre ODR de la fonctionnalité GPIOA

    Nom : arm5.PNG
Affichages : 3241
Taille : 26,5 Ko


    Si tu te demandes comment connaitre les registres nécessaires à telle ou telle fonctionnalités, c'est écrit dans le Reference Manual, regarde le chapitre 8 General-purpose I/Os (GPIO) tout est écrit. Je test ce soir, surement sur un micro STM32 différent mais on s'adaptera !

  7. #7
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 256
    Par défaut
    Je crois avoir trouvé en regardant à nouveau ta vidéo

    La valeur par défaut de chaque bit dans le registre MODER est 11 donc 3 en décimal ou 0x03 en hexa. C'est qui est écrit dans la doc et dans ta vidéo (heureusement )

    Nom : arm6.PNG
Affichages : 3209
Taille : 22,3 Ko

    Donc au démarrage on a tout des bits à 1 partout et l'erreur se situe ici GPIOA->MODER |= 1 << 10; car en faisant un OU bit à bit entre les 32 bits à 1 et la valeur 1 décalé de 10 vers la gauche ça donne ça :
    Code ASM : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       1111 1111 1111 1111 1111 1111 1111 1111
    OU 0000 0000 0000 0000 0000 0100 0000 0000
    ------------------------------------------
    =  1111 1111 1111 1111 1111 1111 1111 1111

    Et c'est pas du tout ce qu'on voulait puisque là on a tout remis à 1, tout est en entrée comme après un reset !

    Nous ce qu'on voulait comme résultat c'est ça :
    Code ASM : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ------------------------------------------
    =  1111 1111 1111 1111 1111 0111 1111 1111

    Soit le bit 10 à 1 et le bit 11 à 0 pour que PA5 soit une sortie donc il faut modifier cette ligne GPIOA->MODER |= 1 << 10; et la transformer en GPIOA->MODER &= 0xFFFFF7FF;

    Citation Envoyé par Vincent PETIT
    Personnellement je n'aime pas ce style d'écriture, j'ai fais comme ça parce que j'ai repris le programme initial du premier message.
    Bah maintenant je me rappelle bien pourquoi je n'aime pas ce style d'écriture

  8. #8
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 661
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 661
    Par défaut
    Citation Envoyé par Vincent PETIT Voir le message
    Très bonne question Auteur !!!
    Et rassure moi, on est bien entrain de parler d'une carte Nucléo avec la LED sur PA5 ?
    ben quand le programme semble fonctionner, on regarde après du côté du matériel si quelque chose cloche D'où ma question.


    @Vincent : au fait, les STM32 font forcément référence aux cartes Nucleo ? Ou on peut trouver des STM32 sur d'autres types de cartes ?

  9. #9
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 256
    Par défaut
    Citation Envoyé par Auteur Voir le message
    ben quand le programme semble fonctionner, on regarde après du côté du matériel si quelque chose cloche D'où ma question.
    Et tu as bien fait car c'est quand tu as écrit ça que je me suis aperçu que j'avais complètement oublié de poser la question principale... est ce qu'on est entrain de programmer un STM32 sur une carte Nucléo..... si le hard n'est pas le Nucléo tout ce que j'ai raconté ne sert à rien.


    Citation Envoyé par Auteur Voir le message
    @Vincent : au fait, les STM32 font forcément référence aux cartes Nucleo ? Ou on peut trouver des STM32 sur d'autres types de cartes ?
    Alors non les STM32 ne font pas forcément référence aux cartes Nucléo, ST propose aussi des cartes Disco (pour discovery) et des cartes d'évaluation très bien équipées pour certaines : https://www.st.com/en/evaluation-too...oductId=SS1532

    Il y a des cartes d'évaluation qui pourraient facilement faire office de petit PC (pas aussi performant qu'un Raspberry) car on peut y loger un noyau Linux ou un RTOS sur des micros qui pédalent à 168MHz. Pour faire une petite interface homme machine c'est parfait.




    @ziyad88,
    C'est à l'école que tu apprends à utiliser un microcontrôleur de cette manière (Man vs Datasheet) ? C'est les vrais warriors qui programment comme ça

    Sans plaisanter, aujourd'hui il y a des outils de configuration visuelle comme STM32CubeMX qui fait le job et évite de se palucher la doc du micro mais c'est très bien ce que tu fais car ça n'est que comme ça qu'on migre sur les micros ARM des autres fabricants sans soucis particuliers. Les outils de configurations visuelles ont la fâcheuse tendance à t'enfermer un peu chez un seul fabricant et ça peut être un problème le jour où tu trouves des micros ARM moins chers et mieux adaptés, pour ton design, chez les concurrents (Texas Instruments ou NXP entres autres)

    A+
    Tiens moi au courant si ça fonctionne ou pas.

  10. #10
    Candidat au Club
    Homme Profil pro
    Frigoriste
    Inscrit en
    Novembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Frigoriste
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2014
    Messages : 4
    Par défaut
    Bonjour,

    Alors merci à tous pour vos réponses.

    Il s'agit bien d'une carte NUCLEO avec la Led sur PA5.

    Vincent, tes explications sont très claires et instructives,
    Si j'ai bien compris l'état par défaut des bits 10 et 11 du registre "MODER" sont à "11" (reset state) le pin 5 est en mode analogique par défaut,
    Il faut donc mettre le bit 10 à 1 et le bit 11 à 0 pour être en mode sortie digitale.

    J'ai donc essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     GPIOA->MODER &= 0xFFFFF7FF;
    et cette fois-ci ça fonctionne !

    Je sais que je peux passer par CubeMX, j'ai déjà testé en générant un code avec la bonne config des Pins et j'ai réussi à faire clignoter la LED avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HAL_Delay(30);
    HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
    Si je me casse la tête à faire comme ça, c'est pour comprendre comment ça fonctionne à l'intérieur, je n'ai pas étudié dans le domaine, je ne suis qu'un amateur passionné.
    Je faisait quelques montages sur Arduino mais j'ai décidé de passer au STM32 car plus performant.
    D'ailleurs je me demandais si on peux utiliser les même librairies que celles utilisées sur l'IDE Arduino ?


    Citation Envoyé par Vincent PETIT
    Personnellement je n'aime pas ce style d'écriture, j'ai fais comme ça parce que j'ai repris le programme initial du premier message.
    Bah maintenant je me rappelle bien pourquoi je n'aime pas ce style d'écriture
    Qu'y a t-il comme autre méthode pour écrire ?

    Et quelle est la différence entre |= et &= dans le code ?

    Merci encore.

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 498
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ziyad88 Voir le message
    Si je me casse la tête à faire comme ça, c'est pour comprendre comment ça fonctionne à l'intérieur, je n'ai pas étudié dans le domaine, je ne suis qu'un amateur passionné.
    Franchement, ça ne sert pas à grand chose. Il y a tellement de chose à faire pour faire clignoter une LED sur STM32 que le faire manuellement n'a pas grand intérêt.

    Si tu veux faire joujou avec des registres pour voir comment ça fonctionne, utilise un micro tout simple (par exemple un MSP430 de TI http://www.ti.com/tool/MSP-EXP430G2). C'est pareil sur STM32, juste qu'il y a beaucoup plus de chose à faire pour arriver au résultat.

    D'ailleurs, puisque tu as un code qui fonctionne avec STM32CubeMX, tu peux regarder ce qu'il y a dedans et voir ce qu'il te manque...

  12. #12
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 256
    Par défaut
    Salut ziyad88 et à tout le groupe,

    Je réponds au reste de tes questions :


    Citation Envoyé par ziyad88
    D'ailleurs je me demandais si on peux utiliser les même librairies que celles utilisées sur l'IDE Arduino ?
    Directement non, il faudrait les réécrire pour les adapter au micro ARM mais comme le dit Bktero, il y a dans STM32CubeMX des fonctions que tu peux aller chercher. Une alternative est d'aller sur le site Mbed, c'est une plateforme de compilation + gestion de bibliothèques de fonctions/exemples en ligne et très conséquente.

    Citation Envoyé par ziyad88
    Et quelle est la différence entre |= et &= dans le code ?
    Je te renvoie vers un cours de langage C, ça sera bien mieux expliqué.


    Citation Envoyé par ziyad88
    Qu'y a t-il comme autre méthode pour écrire ?
    C'est une question de goût mais là où beaucoup de monde va écrire :
    GPIOA->ODR |= (1 << 5); /* mise à 1 du bit n°5 */ moi je préfère GPIOA->ODR |= 0x20; /* mise à 1 du bit n°5 */ ce qui revient exactement au même.

    Et là où d'autres écriront
    GPIOA->ODR &= ~(1 << 5); /* mise à 0 du bit n°5 */ moi j'écrirai GPIOA->ODR &= 0xDF; /* mise à 0 du bit n°5 */ ce qui revient exactement au même.

    De toute façon le compilateur traduira ~(1 << 5); en 0xDF; moi je le fais tout de suite mais c'est une question d'habitude avec la manipulation binaire vers hexa.


    Penses bien à cliquer sur le bouton "Résolu", en bas de la fenêtre, si tu juges que c'est le cas.
    C'est important pour le fonctionnement du forum, ça permet à n'importe qui de voir qu'une solution a été trouvé. La personne sait tout de suite que même s'il y a 50 messages ça vaut le coup de tout lire

    Si tu ne reviens plus dans quelques jours je le ferai pour toi puisque ça fonctionne.
    A+

  13. #13
    Candidat au Club
    Homme Profil pro
    Frigoriste
    Inscrit en
    Novembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Frigoriste
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2014
    Messages : 4
    Par défaut
    Bonjour à tous,

    Merci Vincent pour ces réponses, ça me va très bien, sujet résolu.

    À Bientôt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. LED Clavier
    Par LordBob dans le forum Linux
    Réponses: 5
    Dernier message: 15/03/2006, 15h44
  2. Affichage LED
    Par chourmo dans le forum Composants VCL
    Réponses: 7
    Dernier message: 06/02/2006, 17h15
  3. [Débutant creation de composant] Créer une LED numérique
    Par C_Marteau dans le forum C++Builder
    Réponses: 8
    Dernier message: 14/06/2005, 22h23
  4. [TP]Créer une animation leds clavier
    Par Thomas748 dans le forum Turbo Pascal
    Réponses: 16
    Dernier message: 27/11/2004, 21h18
  5. [TP]blink
    Par néo333 dans le forum Turbo Pascal
    Réponses: 47
    Dernier message: 13/11/2003, 19h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo