Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Invité régulier
    Inscrit en
    avril 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : avril 2008
    Messages : 28
    Points : 9
    Points
    9

    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 :
    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
    Invité régulier
    Inscrit en
    avril 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : avril 2008
    Messages : 28
    Points : 9
    Points
    9

    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 chevronné Avatar de Elijha
    Homme Profil pro Laurent Nahoum
    Ingénieur développement matériel électronique
    Inscrit en
    avril 2003
    Messages
    293
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent Nahoum
    Âge : 45
    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 : 293
    Points : 608
    Points
    608

    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
    Invité régulier
    Inscrit en
    avril 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : avril 2008
    Messages : 28
    Points : 9
    Points
    9

    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 chevronné Avatar de Elijha
    Homme Profil pro Laurent Nahoum
    Ingénieur développement matériel électronique
    Inscrit en
    avril 2003
    Messages
    293
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent Nahoum
    Âge : 45
    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 : 293
    Points : 608
    Points
    608

    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 :
    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
    Invité régulier
    Inscrit en
    avril 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : avril 2008
    Messages : 28
    Points : 9
    Points
    9

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •