Précédent   Forum du club des développeurs et IT Pro > Général Développement > Programmation système > Embarqué
Embarqué Forum d'entraide sur la programmation des systèmes embarqués
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 05/10/2012, 15h08   #1
Sangfeust
Invité régulier
 
Inscription : avril 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 15
Points : 5
Points : 5
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.
Sangfeust est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2012, 16h18   #2
Sangfeust
Invité régulier
 
Inscription : avril 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 15
Points : 5
Points : 5
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.
Sangfeust est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/10/2012, 21h55   #3
Elijha
Membre expérimenté
 
Avatar de Elijha
 
Homme Laurent Nahoum
Ingénieur développement matériel électronique
Inscription : avril 2003
Messages : 282
Détails du profil
Informations personnelles :
Nom : Homme Laurent Nahoum
Âge : 43
Localisation : France, Val d'Oise (Île de France)

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

Informations forums :
Inscription : avril 2003
Messages : 282
Points : 597
Points : 597
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)
Elijha est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/10/2012, 16h47   #4
Sangfeust
Invité régulier
 
Inscription : avril 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 15
Points : 5
Points : 5
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 ?
Citation:
GPIOA-> MODER &= ~(3UL << (2*0))
Vu que l'on décale de 0, pourquoi ne pas simplement mettre ?
GPIOA-> MODER &= ~(3UL)
Sangfeust est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/10/2012, 18h50   #5
Elijha
Membre expérimenté
 
Avatar de Elijha
 
Homme Laurent Nahoum
Ingénieur développement matériel électronique
Inscription : avril 2003
Messages : 282
Détails du profil
Informations personnelles :
Nom : Homme Laurent Nahoum
Âge : 43
Localisation : France, Val d'Oise (Île de France)

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

Informations forums :
Inscription : avril 2003
Messages : 282
Points : 597
Points : 597
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)
Elijha est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/10/2012, 08h07   #6
Sangfeust
Invité régulier
 
Inscription : avril 2008
Messages : 15
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 15
Points : 5
Points : 5
C'est ce que je me disais mais bon cela me choquais un peu quand même.

Merci pour les explications.
Sangfeust est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 22h43.


 
 
 
 
Partenaires

Hébergement Web