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

Arduino Discussion :

Ecriture dans les registres ESP32


Sujet :

Arduino

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Apprenti Ingénieur RF
    Inscrit en
    Octobre 2021
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Apprenti Ingénieur RF

    Informations forums :
    Inscription : Octobre 2021
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Ecriture dans les registres ESP32
    Bonjour,

    J'ai un ESP-WROOM-32 que je contrôle avec l'IDE Arduino, et je souhaiterais contrôler directement les registres afin de commander une sortie GPIO à une fréquence bien plus rapide que ce que peux offrir le "digitalWrite", or, je ne sais pas du tout quelles lignes de commande utiliser et quelles librairies installer/appeler.

    Merci d'avance pour votre aide.

  2. #2
    Membre régulier
    Homme Profil pro
    Retraité de l'électronique analogique
    Inscrit en
    Avril 2021
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité de l'électronique analogique

    Informations forums :
    Inscription : Avril 2021
    Messages : 43
    Points : 98
    Points
    98
    Par défaut
    Réponse un peu tardive, je découvre ce sujet.

    C'est possible, j'ai trouvé cette solution sur internet, je l'ai testé et cela fonctionne et même très bien.

    REG_WRITE est une macro qui simplifie l'écriture dans un registre.
    Les registres GPIO sont décrits dans le document Espressif : ESP32 Technical References Manual ( 718 pages, désolé)
    Les pages concernant les GPIO vont de 44 à 52.

    Exemple pratique :

    Déclaration d'une E/S en sortie :

    E/S comprise entre 0 et 31 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    REG_WRITE(GPIO_ENABLE_REG, BITX);     => X étant le numéro du gpio

    E/S comprise entre 32 et 39 :
    Remplacer ENABLE par ENABLE1.

    Mettre une sortie à 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    REG_WRITE(GPIO_OUT_W1TS_REG, BITX) ;  // S pour Set
    Mettre à 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    REG_WRITE(GPIO_OUT_W1TC_REG, BITX) ;  // C pour Clear
    Mesures :
    appareil de mesure : analyseur logique clone Saleae
    digitalWrite => ~330ns
    Registes => ~ 50 ns

    Rappel nano/Uno => 3700 ns

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 830
    Points
    4 830
    Par défaut
    Citation Envoyé par Bernard_68 Voir le message
    Rappel nano/Uno => 3700 ns
    En écriture dans les registres c'est 125ns. (2 périodes de la fréquence de fonctionnement de 16MHz)
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PORTX |= _BV(n); // pour mettre à un
    PORTX &= ~_BV(n); // pour mettre à zéro
    PINX |= _BV(n); // pour inverser la sortie
    Remplacer X par la lettre du port (A, B, C ou D) et n par le numéro de la broche du port. Par exemple la Pin 13 (la led) c'est X->B et n->5,
    PORTA, PORTB, PORTC, PORTD, PINA, PINB, PINC, PIND sont les registres. Ils doivent être écrit d'un tenant. Il n'est pas possible de composer leur nom par le code.

    Pour avoir cette efficacité cela doit être codé en dur, c'est une obligation de l'architecture AVR. Le nom du registre et l'indice (le n) de la broche ne peuvent pas être des variables ni même des constantes, tout au plus un #DEFINE.

    Delias

  4. #4
    Membre régulier
    Homme Profil pro
    Retraité de l'électronique analogique
    Inscrit en
    Avril 2021
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité de l'électronique analogique

    Informations forums :
    Inscription : Avril 2021
    Messages : 43
    Points : 98
    Points
    98
    Par défaut
    Oui, j'aurais pu être plus précis.
    Les 3700 ns sont à comparer aux 330 ns (fonction digitalWrite() )

    D'autre part, l'écriture par les registres de l'ESP32 fait probablement moins que ~50 ns.
    J'ai précisé que l'appareil de mesure est un clone de Saleae de fréquence max 24 MHz, que Sigrok avec Pulseview arrive à pousser jusqu'à 48 MHz, soit échantillonnage toutes les 20 ns.
    À noter que le décodeur de protocole ne fonctionne pas à 48 MHz, ce n'est pas gênant.
    Mesure imprécise qui a le mérite de montrer que l'écriture sur les registres fonctionne.

    Il faudrait refaire la mesure avec un matériel plus performant.

    J'aurais bien aimé trouver l'arbre des horloges pour un ESP32 pour comparer ce qui est comparable.

    Avec un STM32 l'information est disponible.
    L'horloge appliquée sur les circuits GPIO n'est pas l'horloge du micro et on peut connaitre sa valeur, les GPIO tournent avec une fréquence d'horloge inférieure.

    Mais Expressif c'est Espressif, la doc n'est pas au niveau du produit.

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/05/2011, 06h33
  2. Réponses: 3
    Dernier message: 07/07/2007, 10h35
  3. écrire et lire dans les registre
    Par patou41000 dans le forum C++/CLI
    Réponses: 2
    Dernier message: 19/06/2007, 08h19
  4. Réponses: 4
    Dernier message: 24/08/2006, 23h26
  5. Réponses: 1
    Dernier message: 29/11/2005, 10h10

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