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 :

Explication : GPIOA->MODER &= ~((3UL << 2*0) );


Sujet :

Embarqué

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Points : 27
    Points
    27
    Par défaut Explication : GPIOA->MODER &= ~((3UL << 2*0) );
    Bonjour,

    Donc ma question est simple quelqu'un peut il m'expliquer le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      GPIOA->MODER    &= ~((3UL << 2*0)  );  
    
      const unsigned long led_mask[] = {1UL << 12, 1UL << 13, 1UL << 14, 1UL << 15};
    
      GPIOD->OTYPER   &= ~((1UL <<   12) |
    En effet je ne comprend pas du tout l'utilité de ces fonctions.

    Je ne sais pas ce que représente 1UL; 3UL...

    Et encore moins 3UL << 2*0;.

    Ce code est utilisé dans KEIL µVision 4 pour paramétrer un STM32F4. Il s'agit du code d'exemple.

    Merci.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    J'ai trouvé quelques réponses !!

    Donc 1UL permet de définir la constante 1 sous la forme Unsigned Long!!

    Quand aux opération variable << 2 * 0 cela revient à variable << 0.

    Donc là je ne vois toujours pas à quoi cela sert...

    Sinon juste pour rappel :
    x &= y signifie x = x & y il s'agit d'une comparaison bit à bit.

    x << 2 est un décalage de bit de 2 en gros imaginons
    int x = 1;
    x << 2;

    x vaut maintenant 4.

  3. #3
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Bonsoir.

    Premièrement: GPIOA-> MODER &= ~(3UL << (2*0))
    Comme tu l'as trouvé la seconde expression est le calcul d'un masque. 3 décalé de 0 vers la gauche donne 3. Ce qui change c'est le signe ~ qui inverse tous les bits de ton expression. Dans ton cas un long non signé 3 devient (en hexadécimal) FFFFFFFEh. En effectuant l'opération binaire & avec la valeur du registre GPIOA-> MODER cela va forcer les deux premiers bits à 0 (bit #0 et #1).
    Pour les mettre à 1, tu pourras utiliser le même masque. Exemple: GPIOA-> MODER |= (3UL << (2*0))

    C'est une écriture relativement courante pour positionner des bits à 1 ou à 0 en gardant le même masque et s'éviter un calcul fastidieu.

    Deuxièmement: les masques de led
    D'après les masques déclarés, tu peu en déduire les valeurs hexadécimal.
    1UL << 12 = 10000000h
    1UL << 13 = 20000000h
    Etc.
    Donc avec ce que j'ai expliqué ci dessus tu peu (je présume) allumer ou éteindre l'une des quatre led par les opérations suivantes:
    Allumer la led 1 : GPIOA-> MODER |= led_mask[0] ;
    Éteindre la led 3 : GPIOA-> MODER &= led_mask[2] ;
    Plus compliqué:
    Allumer la led 2 et 4 : GPIOA-> MODER |= led_mask[1]|led_mask[3] ;

    Tous ceci n'est qu' une combinaison de masques bit à bit. Pour tester cela je t'invite à faire un programme à côté en affichant les valeurs des masques, ainsi que le résultat des opérations.

    Bonne continuation.
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Elijha,
    Merci pour les explications, cela confirme ce que j'avais plus ou moins compris.
    J'ai fais le test justement sur un petit bout de code avec affichage des masques ce qui m'a permis de comprendre un peu.

    Néanmoins tes explications ont un peu plus allumé ma lanterne par contre juste pour être sure :
    A quoi peut servir cette écriture ?
    GPIOA-> MODER &= ~(3UL << (2*0))
    Vu que l'on décale de 0, pourquoi ne pas simplement mettre ?
    GPIOA-> MODER &= ~(3UL)

  5. #5
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Bonjour,

    Citation Envoyé par Sangfeust Voir le message
    A quoi peut servir cette écriture ?
    Vu que l'on décale de 0, pourquoi ne pas simplement mettre ?
    GPIOA-> MODER &= ~(3UL)
    On peu mettre simplement GPIOA-> MODER &= ~(3UL), mais je pense que l'auteur de ce code c'est laissé une possibilité de modifier facilement les deux bits à setter ou reseter.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    GPIOA-> MODER &= ~(3UL << (2*0)) ;    // Reset des bits #0 et 1
    GPIOA-> MODER &= ~(3UL << (2*1))  ;   // Reset des bits #2 et 3
    /*
       etc.
    */
    Bonne continuation.
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    C'est ce que je me disais mais bon cela me choquais un peu quand même.

    Merci pour les explications.

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

Discussions similaires

  1. Explication procédure stockée
    Par underworld dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2002, 10h51
  2. Recherche code d'un fifo,ou explication
    Par don-diego dans le forum C
    Réponses: 8
    Dernier message: 25/07/2002, 10h26
  3. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18

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